@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.
- package/README.md +91 -221
- package/dist/index.js +1660 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -50
- package/LICENSE +0 -201
- package/dist/commands/index.mjs +0 -21
- package/dist/commands/index.mjs.map +0 -1
- package/dist/commands/keystore/create.mjs +0 -74
- package/dist/commands/keystore/create.mjs.map +0 -1
- package/dist/commands/keystore/decrypt.mjs +0 -71
- package/dist/commands/keystore/decrypt.mjs.map +0 -1
- package/dist/commands/keystore/import.mjs +0 -84
- package/dist/commands/keystore/import.mjs.map +0 -1
- package/dist/commands/keystore/index.mjs +0 -28
- package/dist/commands/keystore/index.mjs.map +0 -1
- package/dist/commands/keystore/info.mjs +0 -62
- package/dist/commands/keystore/info.mjs.map +0 -1
- package/dist/commands/keystore/list.mjs +0 -46
- package/dist/commands/keystore/list.mjs.map +0 -1
- package/dist/commands/keystore/remove.mjs +0 -51
- package/dist/commands/keystore/remove.mjs.map +0 -1
- package/dist/commands/mcp/index.mjs +0 -13
- package/dist/commands/mcp/index.mjs.map +0 -1
- package/dist/commands/mcp/start.mjs +0 -82
- package/dist/commands/mcp/start.mjs.map +0 -1
- package/dist/commands/schema/index.mjs +0 -53
- package/dist/commands/schema/index.mjs.map +0 -1
- package/dist/commands/session-key/create/index.mjs +0 -87
- package/dist/commands/session-key/create/index.mjs.map +0 -1
- package/dist/commands/session-key/create/prompts/base.mjs +0 -52
- package/dist/commands/session-key/create/prompts/base.mjs.map +0 -1
- package/dist/commands/session-key/create/prompts/call.mjs +0 -85
- package/dist/commands/session-key/create/prompts/call.mjs.map +0 -1
- package/dist/commands/session-key/create/prompts/common.mjs +0 -27
- package/dist/commands/session-key/create/prompts/common.mjs.map +0 -1
- package/dist/commands/session-key/create/prompts/gas.mjs +0 -19
- package/dist/commands/session-key/create/prompts/gas.mjs.map +0 -1
- package/dist/commands/session-key/create/prompts/index.mjs +0 -44
- package/dist/commands/session-key/create/prompts/index.mjs.map +0 -1
- package/dist/commands/session-key/create/prompts/rate-limit.mjs +0 -40
- package/dist/commands/session-key/create/prompts/rate-limit.mjs.map +0 -1
- package/dist/commands/session-key/create/prompts/signature-caller.mjs +0 -26
- package/dist/commands/session-key/create/prompts/signature-caller.mjs.map +0 -1
- package/dist/commands/session-key/create/prompts/timestamp.mjs +0 -32
- package/dist/commands/session-key/create/prompts/timestamp.mjs.map +0 -1
- package/dist/commands/session-key/index.mjs +0 -26
- package/dist/commands/session-key/index.mjs.map +0 -1
- package/dist/commands/session-key/info.mjs +0 -64
- package/dist/commands/session-key/info.mjs.map +0 -1
- package/dist/commands/session-key/list.mjs +0 -54
- package/dist/commands/session-key/list.mjs.map +0 -1
- package/dist/commands/session-key/remove.mjs +0 -51
- package/dist/commands/session-key/remove.mjs.map +0 -1
- package/dist/commands/session-key/status.mjs +0 -64
- package/dist/commands/session-key/status.mjs.map +0 -1
- package/dist/commands/smart-account/create.mjs +0 -94
- package/dist/commands/smart-account/create.mjs.map +0 -1
- package/dist/commands/smart-account/import.mjs +0 -45
- package/dist/commands/smart-account/import.mjs.map +0 -1
- package/dist/commands/smart-account/index.mjs +0 -30
- package/dist/commands/smart-account/index.mjs.map +0 -1
- package/dist/commands/smart-account/info.mjs +0 -66
- package/dist/commands/smart-account/info.mjs.map +0 -1
- package/dist/commands/smart-account/list.mjs +0 -48
- package/dist/commands/smart-account/list.mjs.map +0 -1
- package/dist/commands/smart-account/remove.mjs +0 -54
- package/dist/commands/smart-account/remove.mjs.map +0 -1
- package/dist/commands/smart-account/status.mjs +0 -63
- package/dist/commands/smart-account/status.mjs.map +0 -1
- package/dist/dto/index.mjs +0 -6
- package/dist/dto/keystore.mjs +0 -44
- package/dist/dto/keystore.mjs.map +0 -1
- package/dist/dto/mcp.mjs +0 -13
- package/dist/dto/mcp.mjs.map +0 -1
- package/dist/dto/session-key.mjs +0 -54
- package/dist/dto/session-key.mjs.map +0 -1
- package/dist/dto/smart-account.mjs +0 -45
- package/dist/dto/smart-account.mjs.map +0 -1
- package/dist/flags/global.mjs +0 -29
- package/dist/flags/global.mjs.map +0 -1
- package/dist/flags/shared.mjs +0 -11
- package/dist/flags/shared.mjs.map +0 -1
- package/dist/helpers/humanize.mjs +0 -153
- package/dist/helpers/humanize.mjs.map +0 -1
- package/dist/helpers/paths.mjs +0 -31
- package/dist/helpers/paths.mjs.map +0 -1
- package/dist/helpers/policy.mjs +0 -89
- package/dist/helpers/policy.mjs.map +0 -1
- package/dist/helpers/pretty.mjs +0 -71
- package/dist/helpers/pretty.mjs.map +0 -1
- package/dist/index.d.mts +0 -2
- package/dist/index.mjs +0 -36
- package/dist/index.mjs.map +0 -1
- package/dist/layers/config.mjs +0 -124
- package/dist/layers/config.mjs.map +0 -1
- package/dist/layers/index.mjs +0 -11
- package/dist/layers/keystore.mjs +0 -225
- package/dist/layers/keystore.mjs.map +0 -1
- package/dist/layers/mcp-context.mjs +0 -8
- package/dist/layers/mcp-context.mjs.map +0 -1
- package/dist/layers/mcp.mjs +0 -31
- package/dist/layers/mcp.mjs.map +0 -1
- package/dist/layers/output.mjs +0 -21
- package/dist/layers/output.mjs.map +0 -1
- package/dist/layers/prompt.mjs +0 -78
- package/dist/layers/prompt.mjs.map +0 -1
- package/dist/layers/session-key.mjs +0 -218
- package/dist/layers/session-key.mjs.map +0 -1
- package/dist/layers/smart-account.mjs +0 -175
- package/dist/layers/smart-account.mjs.map +0 -1
- package/dist/layers/web3.mjs +0 -83
- package/dist/layers/web3.mjs.map +0 -1
- package/dist/mcp/helpers/common.mjs +0 -9
- package/dist/mcp/helpers/common.mjs.map +0 -1
- package/dist/mcp/helpers/index.mjs +0 -4
- package/dist/mcp/helpers/session-key.mjs +0 -129
- package/dist/mcp/helpers/session-key.mjs.map +0 -1
- package/dist/mcp/index.mjs +0 -43
- package/dist/mcp/index.mjs.map +0 -1
- package/dist/mcp/mcp.mjs +0 -15
- package/dist/mcp/mcp.mjs.map +0 -1
- package/dist/mcp/tools/account/address.mjs +0 -20
- package/dist/mcp/tools/account/address.mjs.map +0 -1
- package/dist/mcp/tools/account/get-balance.mjs +0 -54
- package/dist/mcp/tools/account/get-balance.mjs.map +0 -1
- package/dist/mcp/tools/account/index.mjs +0 -15
- package/dist/mcp/tools/account/index.mjs.map +0 -1
- package/dist/mcp/tools/read/index.mjs +0 -11
- package/dist/mcp/tools/read/index.mjs.map +0 -1
- package/dist/mcp/tools/read/read-contract.mjs +0 -49
- package/dist/mcp/tools/read/read-contract.mjs.map +0 -1
- package/dist/mcp/tools/transaction/execute-transaction.mjs +0 -38
- package/dist/mcp/tools/transaction/execute-transaction.mjs.map +0 -1
- package/dist/mcp/tools/transaction/index.mjs +0 -15
- package/dist/mcp/tools/transaction/index.mjs.map +0 -1
- package/dist/mcp/tools/transaction/native-transfer.mjs +0 -59
- package/dist/mcp/tools/transaction/native-transfer.mjs.map +0 -1
- package/dist/schema/chain.mjs +0 -124
- package/dist/schema/chain.mjs.map +0 -1
- package/dist/schema/common.mjs +0 -29
- package/dist/schema/common.mjs.map +0 -1
- package/dist/schema/index.mjs +0 -5
- package/dist/schema/policy.mjs +0 -114
- package/dist/schema/policy.mjs.map +0 -1
- package/dist/schema/tx.mjs +0 -19
- package/dist/schema/tx.mjs.map +0 -1
- package/dist/types/index.mjs +0 -11
- package/dist/types/index.mjs.map +0 -1
package/dist/flags/shared.mjs
DELETED
|
@@ -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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"}
|
package/dist/helpers/paths.mjs
DELETED
|
@@ -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"}
|
package/dist/helpers/policy.mjs
DELETED
|
@@ -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"}
|
package/dist/helpers/pretty.mjs
DELETED
|
@@ -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
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
|
package/dist/index.mjs.map
DELETED
|
@@ -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"}
|
package/dist/layers/config.mjs
DELETED
|
@@ -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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"}
|
package/dist/layers/index.mjs
DELETED
|
@@ -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 {};
|