@etree/cli 2.0.1
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 +199 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +220 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +42 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +159 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/member.d.ts +2 -0
- package/dist/commands/member.js +119 -0
- package/dist/commands/member.js.map +1 -0
- package/dist/commands/secret.d.ts +13 -0
- package/dist/commands/secret.js +307 -0
- package/dist/commands/secret.js.map +1 -0
- package/dist/commands/shortcuts.d.ts +7 -0
- package/dist/commands/shortcuts.js +26 -0
- package/dist/commands/shortcuts.js.map +1 -0
- package/dist/commands/wallet.d.ts +2 -0
- package/dist/commands/wallet.js +88 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +15 -0
- package/dist/lib/api.js +40 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +17 -0
- package/dist/lib/config.js +91 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/crypto.d.ts +23 -0
- package/dist/lib/crypto.js +173 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/env-manager.d.ts +11 -0
- package/dist/lib/env-manager.js +88 -0
- package/dist/lib/env-manager.js.map +1 -0
- package/dist/lib/key-store.d.ts +16 -0
- package/dist/lib/key-store.js +83 -0
- package/dist/lib/key-store.js.map +1 -0
- package/dist/test-e2e.d.ts +1 -0
- package/dist/test-e2e.js +84 -0
- package/dist/test-e2e.js.map +1 -0
- package/eslint.config.mjs +4 -0
- package/package.json +30 -0
- package/src/commands/auth.ts +258 -0
- package/src/commands/config.ts +47 -0
- package/src/commands/init.ts +187 -0
- package/src/commands/member.ts +146 -0
- package/src/commands/secret.ts +381 -0
- package/src/commands/shortcuts.ts +25 -0
- package/src/commands/wallet.ts +97 -0
- package/src/index.ts +50 -0
- package/src/lib/api.ts +57 -0
- package/src/lib/config.ts +70 -0
- package/src/lib/crypto.ts +173 -0
- package/src/lib/env-manager.ts +60 -0
- package/src/lib/key-store.ts +51 -0
- package/src/test-e2e.ts +106 -0
- package/tsconfig.json +18 -0
package/README.md
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# 🌲 EnvTree CLI
|
|
2
|
+
|
|
3
|
+
Securely manage, encrypt, and share environment variables across teams — from the command line.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 1. First-time setup
|
|
9
|
+
et init
|
|
10
|
+
|
|
11
|
+
# 2. Create a wallet (a group of secrets)
|
|
12
|
+
et wallet create my-project
|
|
13
|
+
|
|
14
|
+
# 3. Store a secret
|
|
15
|
+
et push my-project DATABASE_URL "postgres://user:pass@host/db"
|
|
16
|
+
|
|
17
|
+
# 4. Sync all secrets to your local .env
|
|
18
|
+
et pull my-project
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
That's it. Your secrets are **end-to-end encrypted** — the server never sees the plaintext.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# From the monorepo
|
|
29
|
+
cd apps/cli
|
|
30
|
+
pnpm build
|
|
31
|
+
pnpm link --global
|
|
32
|
+
|
|
33
|
+
# Now you can use:
|
|
34
|
+
et --help
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
> Both `et` and `envtree` work as command names.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Command Reference
|
|
42
|
+
|
|
43
|
+
### Getting Started
|
|
44
|
+
|
|
45
|
+
| Command | Description |
|
|
46
|
+
| ------------------------------------ | ---------------------------------------------- |
|
|
47
|
+
| `et init` | Guided setup wizard (create account or log in) |
|
|
48
|
+
| `et signup` | Create a new account |
|
|
49
|
+
| `et login` | Log in (interactive) |
|
|
50
|
+
| `et login -e user@email.com -p pass` | Log in (non-interactive, for CI) |
|
|
51
|
+
| `et logout` | Log out |
|
|
52
|
+
| `et whoami` | Show current user info |
|
|
53
|
+
| `et delete-account` | Permanently delete your account |
|
|
54
|
+
|
|
55
|
+
### Secrets (Shortcuts)
|
|
56
|
+
|
|
57
|
+
| Command | Description |
|
|
58
|
+
| -------------------------------- | -------------------------------- |
|
|
59
|
+
| `et push <wallet> <key> <value>` | Encrypt & store a secret |
|
|
60
|
+
| `et pull <wallet>` | Sync all secrets to local `.env` |
|
|
61
|
+
| `et pull <wallet> -o .env.prod` | Write secrets to a specific file |
|
|
62
|
+
|
|
63
|
+
### Secret Management
|
|
64
|
+
|
|
65
|
+
| Command | Description |
|
|
66
|
+
| ----------------------------------------- | -------------------------------------- |
|
|
67
|
+
| `et secret set <wallet> <key> <value>` | Same as `et push` |
|
|
68
|
+
| `et secret update <wallet> <key> <value>` | Update an existing secret |
|
|
69
|
+
| `et secret get <wallet> <key>` | Decrypt & display a single secret |
|
|
70
|
+
| `et secret get <wallet> <key> -s` | Decrypt & save to `.env` |
|
|
71
|
+
| `et secret list <wallet>` | List all secret keys in a wallet |
|
|
72
|
+
| `et secret pull <wallet> --sync` | Sync all secrets to `.env` |
|
|
73
|
+
| `et secret delete <wallet> <key>` | Delete a secret |
|
|
74
|
+
| `et secret share <wallet>` | Re-encrypt all secrets for all members |
|
|
75
|
+
|
|
76
|
+
### Wallets
|
|
77
|
+
|
|
78
|
+
| Command | Description |
|
|
79
|
+
| ------------------------------------------ | --------------------------------- |
|
|
80
|
+
| `et wallet create <name>` | Create a new wallet |
|
|
81
|
+
| `et wallet create <name> -d "description"` | Create with description |
|
|
82
|
+
| `et wallet list` | List all wallets (owned + shared) |
|
|
83
|
+
| `et wallet delete <name>` | Delete a wallet (owner only) |
|
|
84
|
+
|
|
85
|
+
### Team Members
|
|
86
|
+
|
|
87
|
+
| Command | Description |
|
|
88
|
+
| ---------------------------------------- | ---------------------------- |
|
|
89
|
+
| `et member add <wallet> <user>` | Add a member (default: read) |
|
|
90
|
+
| `et member add <wallet> <user> -r write` | Add with write access |
|
|
91
|
+
| `et member add <wallet> <user> -r admin` | Add as admin |
|
|
92
|
+
| `et member list <wallet>` | List wallet members |
|
|
93
|
+
| `et member remove <wallet> <user>` | Remove a member |
|
|
94
|
+
|
|
95
|
+
### Configuration
|
|
96
|
+
|
|
97
|
+
| Command | Description |
|
|
98
|
+
| ---------------------------- | -------------------------- |
|
|
99
|
+
| `et config show` | Show current configuration |
|
|
100
|
+
| `et config set server <url>` | Change the API server URL |
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Typical Workflow
|
|
105
|
+
|
|
106
|
+
### Solo Developer
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
et init # One-time setup
|
|
110
|
+
et wallet create production # Create a wallet
|
|
111
|
+
et push production DB_URL "postgres://…" # Add secrets
|
|
112
|
+
et push production API_KEY "sk-…"
|
|
113
|
+
et pull production # Sync to .env — done!
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Sharing with a Team
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# Owner
|
|
120
|
+
et wallet create staging
|
|
121
|
+
et push staging DB_URL "postgres://…"
|
|
122
|
+
et member add staging alice --role write # Add a teammate
|
|
123
|
+
|
|
124
|
+
# IMPORTANT: Re-encrypt secrets for new member
|
|
125
|
+
et secret share staging
|
|
126
|
+
|
|
127
|
+
# Alice (on her machine)
|
|
128
|
+
et init # One-time setup
|
|
129
|
+
et pull staging # Sync shared secrets
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### CI/CD Pipeline
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Non-interactive login
|
|
136
|
+
et login -e ci@company.com -p "$CI_PASSWORD"
|
|
137
|
+
et pull production -o .env
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## How It Works
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
┌─────────────┐ ┌──────────────┐
|
|
146
|
+
│ Your CLI │ ── encrypt locally ──▶ │ Server │
|
|
147
|
+
│ (et push) │ with recipient's │ (only sees │
|
|
148
|
+
│ │ public key │ ciphertext) │
|
|
149
|
+
└─────────────┘ └──────────────┘
|
|
150
|
+
|
|
151
|
+
┌─────────────┐ ┌──────────────┐
|
|
152
|
+
│ Your CLI │ ◀── download ──────── │ Server │
|
|
153
|
+
│ (et pull) │ decrypt locally │ (returns │
|
|
154
|
+
│ │ with YOUR key │ ciphertext) │
|
|
155
|
+
└─────────────┘ └──────────────┘
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
- **Public key** → stored on server (anyone can encrypt _for_ you)
|
|
159
|
+
- **Private key** → stored at `~/.envtree/private_key` (never leaves your machine)
|
|
160
|
+
- **Encryption** → X25519 SealedBox (NaCl/libsodium)
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Local Files
|
|
165
|
+
|
|
166
|
+
| Path | Purpose |
|
|
167
|
+
| ------------------------ | --------------------------------------- |
|
|
168
|
+
| `~/.envtree/config.json` | Session token, server URL |
|
|
169
|
+
| `~/.envtree/private_key` | Your encryption private key (chmod 600) |
|
|
170
|
+
| `.env` | Local env file created by `et pull` |
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Roles
|
|
175
|
+
|
|
176
|
+
| Role | Read | Write | Manage Members |
|
|
177
|
+
| ------- | ---- | ----- | -------------- |
|
|
178
|
+
| `read` | ✅ | ❌ | ❌ |
|
|
179
|
+
| `write` | ✅ | ✅ | ❌ |
|
|
180
|
+
| `admin` | ✅ | ✅ | ✅ |
|
|
181
|
+
| `owner` | ✅ | ✅ | ✅ |
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Troubleshooting
|
|
186
|
+
|
|
187
|
+
### "Invalid or expired token"
|
|
188
|
+
|
|
189
|
+
Your session has expired. Run `et login` again.
|
|
190
|
+
|
|
191
|
+
### "Secret not found" but `secret list` shows it
|
|
192
|
+
|
|
193
|
+
The secret was encrypted for a different public key. Run `et secret share <wallet>` to re-encrypt for your current key.
|
|
194
|
+
|
|
195
|
+
### Changing server URL
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
et config set server https://api.envtree.dev
|
|
199
|
+
```
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerAuthCommands = registerAuthCommands;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const api_1 = require("../lib/api");
|
|
11
|
+
const config_1 = require("../lib/config");
|
|
12
|
+
const crypto_1 = require("../lib/crypto");
|
|
13
|
+
const key_store_1 = require("../lib/key-store");
|
|
14
|
+
function registerAuthCommands(program) {
|
|
15
|
+
// ── signup ──
|
|
16
|
+
program
|
|
17
|
+
.command("signup")
|
|
18
|
+
.description("Create a new EnvTree account")
|
|
19
|
+
.action(async () => {
|
|
20
|
+
const answers = await inquirer_1.default.prompt([
|
|
21
|
+
{ type: "input", name: "email", message: "Email:" },
|
|
22
|
+
{ type: "input", name: "username", message: "Username:" },
|
|
23
|
+
{
|
|
24
|
+
type: "password",
|
|
25
|
+
name: "password",
|
|
26
|
+
message: "Password:",
|
|
27
|
+
mask: "*",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
type: "password",
|
|
31
|
+
name: "confirmPassword",
|
|
32
|
+
message: "Confirm Password:",
|
|
33
|
+
mask: "*",
|
|
34
|
+
},
|
|
35
|
+
]);
|
|
36
|
+
if (answers.password !== answers.confirmPassword) {
|
|
37
|
+
console.log(chalk_1.default.red("Passwords do not match"));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const spinner = (0, ora_1.default)("Creating account...").start();
|
|
41
|
+
try {
|
|
42
|
+
const result = await (0, api_1.apiRequest)("POST", "/auth/signup", {
|
|
43
|
+
email: answers.email,
|
|
44
|
+
password: answers.password,
|
|
45
|
+
username: answers.username,
|
|
46
|
+
}, false);
|
|
47
|
+
if (!result.session) {
|
|
48
|
+
spinner.succeed("Account created! Please verify your email, then run: et login");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
(0, config_1.saveSession)({
|
|
52
|
+
access_token: result.session.access_token,
|
|
53
|
+
refresh_token: result.session.refresh_token,
|
|
54
|
+
user_id: result.user.id,
|
|
55
|
+
email: answers.email,
|
|
56
|
+
username: answers.username,
|
|
57
|
+
});
|
|
58
|
+
spinner.text = "Generating encryption keys...";
|
|
59
|
+
const keys = await (0, crypto_1.generateKeys)();
|
|
60
|
+
(0, key_store_1.savePrivateKey)(keys.private_key);
|
|
61
|
+
await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
|
|
62
|
+
public_key: keys.public_key,
|
|
63
|
+
});
|
|
64
|
+
spinner.succeed(chalk_1.default.green("Account created & keys generated!"));
|
|
65
|
+
console.log(chalk_1.default.dim(` User: ${answers.username} (${answers.email})`));
|
|
66
|
+
console.log(chalk_1.default.dim(" Private key saved to ~/.envtree/private_key"));
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
spinner.fail(chalk_1.default.red(`Signup failed: ${err.message}`));
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
(0, crypto_1.shutdown)();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
// ── login ──
|
|
76
|
+
program
|
|
77
|
+
.command("login")
|
|
78
|
+
.description("Log in to your EnvTree account")
|
|
79
|
+
.option("-e, --email <email>", "Email (non-interactive)")
|
|
80
|
+
.option("-p, --password <password>", "Password (non-interactive)")
|
|
81
|
+
.action(async (opts) => {
|
|
82
|
+
let email = opts.email;
|
|
83
|
+
let password = opts.password;
|
|
84
|
+
// Interactive mode if flags not provided
|
|
85
|
+
if (!email || !password) {
|
|
86
|
+
const answers = await inquirer_1.default.prompt([
|
|
87
|
+
...(!email
|
|
88
|
+
? [{ type: "input", name: "email", message: "Email:" }]
|
|
89
|
+
: []),
|
|
90
|
+
...(!password
|
|
91
|
+
? [
|
|
92
|
+
{
|
|
93
|
+
type: "password",
|
|
94
|
+
name: "password",
|
|
95
|
+
message: "Password:",
|
|
96
|
+
mask: "*",
|
|
97
|
+
},
|
|
98
|
+
]
|
|
99
|
+
: []),
|
|
100
|
+
]);
|
|
101
|
+
email = email || answers.email;
|
|
102
|
+
password = password || answers.password;
|
|
103
|
+
}
|
|
104
|
+
const spinner = (0, ora_1.default)("Logging in...").start();
|
|
105
|
+
try {
|
|
106
|
+
const result = await (0, api_1.apiRequest)("POST", "/auth/login", { email, password }, false);
|
|
107
|
+
(0, config_1.saveSession)({
|
|
108
|
+
access_token: result.session.access_token,
|
|
109
|
+
refresh_token: result.session.refresh_token,
|
|
110
|
+
user_id: result.user.id,
|
|
111
|
+
email: result.user.email,
|
|
112
|
+
username: email,
|
|
113
|
+
});
|
|
114
|
+
// Fetch profile to get real username
|
|
115
|
+
const profileResult = await (0, api_1.apiRequest)("GET", "/profile/me", undefined, true);
|
|
116
|
+
if (profileResult.profile?.username) {
|
|
117
|
+
(0, config_1.saveSession)({
|
|
118
|
+
access_token: result.session.access_token,
|
|
119
|
+
refresh_token: result.session.refresh_token,
|
|
120
|
+
user_id: result.user.id,
|
|
121
|
+
email: result.user.email,
|
|
122
|
+
username: profileResult.profile.username,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
// Always sync public key with server
|
|
126
|
+
if ((0, key_store_1.hasPrivateKey)()) {
|
|
127
|
+
// Derive public key from existing private key and upload it
|
|
128
|
+
spinner.text = "Syncing encryption keys...";
|
|
129
|
+
const privateKey = require("../lib/key-store").getPrivateKey();
|
|
130
|
+
const publicKey = await (0, crypto_1.derivePublicKey)(privateKey);
|
|
131
|
+
await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
|
|
132
|
+
public_key: publicKey,
|
|
133
|
+
});
|
|
134
|
+
spinner.succeed(chalk_1.default.green("Logged in!"));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Generate a new keypair
|
|
138
|
+
spinner.text = "Generating encryption keys...";
|
|
139
|
+
const keys = await (0, crypto_1.generateKeys)();
|
|
140
|
+
(0, key_store_1.savePrivateKey)(keys.private_key);
|
|
141
|
+
await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
|
|
142
|
+
public_key: keys.public_key,
|
|
143
|
+
});
|
|
144
|
+
spinner.succeed(chalk_1.default.green("Logged in & keys generated!"));
|
|
145
|
+
console.log(chalk_1.default.dim(" Private key saved to ~/.envtree/private_key"));
|
|
146
|
+
}
|
|
147
|
+
console.log(chalk_1.default.dim(` User: ${result.user.email}`));
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
spinner.fail(chalk_1.default.red(`Login failed: ${err.message}`));
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
(0, crypto_1.shutdown)();
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// ── logout ──
|
|
157
|
+
program
|
|
158
|
+
.command("logout")
|
|
159
|
+
.description("Log out of your EnvTree account")
|
|
160
|
+
.action(() => {
|
|
161
|
+
(0, config_1.clearSession)();
|
|
162
|
+
console.log(chalk_1.default.green("Logged out"));
|
|
163
|
+
});
|
|
164
|
+
// ── whoami ──
|
|
165
|
+
program
|
|
166
|
+
.command("whoami")
|
|
167
|
+
.description("Show the current logged-in user")
|
|
168
|
+
.action(async () => {
|
|
169
|
+
const session = (0, config_1.getSession)();
|
|
170
|
+
if (!session) {
|
|
171
|
+
console.log(chalk_1.default.yellow("Not logged in. Run: et login"));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const result = await (0, api_1.apiRequest)("GET", "/profile/me");
|
|
176
|
+
console.log(chalk_1.default.bold("EnvTree User"));
|
|
177
|
+
console.log(` Username: ${result.profile.username}`);
|
|
178
|
+
console.log(` Email: ${result.profile.email}`);
|
|
179
|
+
console.log(` Public Key: ${result.profile.public_key ? result.profile.public_key.substring(0, 20) + "..." : chalk_1.default.yellow("not set")}`);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
console.log(chalk_1.default.dim(` Username: ${session.username}`));
|
|
183
|
+
console.log(chalk_1.default.dim(` Email: ${session.email}`));
|
|
184
|
+
console.log(chalk_1.default.yellow(" (offline — showing cached info)"));
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
// ── delete-account ──
|
|
188
|
+
program
|
|
189
|
+
.command("delete-account")
|
|
190
|
+
.description("Permanently delete your EnvTree account")
|
|
191
|
+
.action(async () => {
|
|
192
|
+
const session = (0, config_1.getSession)();
|
|
193
|
+
if (!session) {
|
|
194
|
+
console.log(chalk_1.default.yellow("Not logged in. Run: et login"));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const { confirm } = await inquirer_1.default.prompt([
|
|
198
|
+
{
|
|
199
|
+
type: "confirm",
|
|
200
|
+
name: "confirm",
|
|
201
|
+
message: chalk_1.default.red("⚠ This will permanently delete your account and all your wallets. Are you sure?"),
|
|
202
|
+
default: false,
|
|
203
|
+
},
|
|
204
|
+
]);
|
|
205
|
+
if (!confirm) {
|
|
206
|
+
console.log(chalk_1.default.dim("Cancelled."));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const spinner = (0, ora_1.default)("Deleting account...").start();
|
|
210
|
+
try {
|
|
211
|
+
await (0, api_1.apiRequest)("DELETE", "/auth/account");
|
|
212
|
+
(0, config_1.clearSession)();
|
|
213
|
+
spinner.succeed(chalk_1.default.green("Account deleted. Goodbye!"));
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerConfigCommands = registerConfigCommands;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const config_1 = require("../lib/config");
|
|
9
|
+
function registerConfigCommands(program) {
|
|
10
|
+
const config = program
|
|
11
|
+
.command("config")
|
|
12
|
+
.description("Manage CLI configuration");
|
|
13
|
+
// ── config show ──
|
|
14
|
+
config
|
|
15
|
+
.command("show")
|
|
16
|
+
.description("Display current configuration")
|
|
17
|
+
.action(() => {
|
|
18
|
+
const cfg = (0, config_1.getConfig)();
|
|
19
|
+
console.log(chalk_1.default.bold("\nEnvTree Config"));
|
|
20
|
+
console.log(` Server: ${chalk_1.default.cyan(cfg.server_url)}`);
|
|
21
|
+
console.log(` Session: ${cfg.session ? chalk_1.default.green("active") + chalk_1.default.dim(` (${cfg.session.email})`) : chalk_1.default.yellow("none")}`);
|
|
22
|
+
console.log(chalk_1.default.dim(` Config: ~/.envtree/config.json`));
|
|
23
|
+
console.log(chalk_1.default.dim(` Keys: ~/.envtree/private_key`));
|
|
24
|
+
console.log("");
|
|
25
|
+
});
|
|
26
|
+
// ── config set ──
|
|
27
|
+
config
|
|
28
|
+
.command("set <key> <value>")
|
|
29
|
+
.description("Set a configuration value (e.g. server URL)")
|
|
30
|
+
.action((key, value) => {
|
|
31
|
+
const cfg = (0, config_1.getConfig)();
|
|
32
|
+
if (key === "server" || key === "server_url") {
|
|
33
|
+
cfg.server_url = value;
|
|
34
|
+
(0, config_1.saveConfig)(cfg);
|
|
35
|
+
console.log(chalk_1.default.green(`Server URL set to: ${value}`));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.log(chalk_1.default.red(`Unknown config key: "${key}". Available: server`));
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;;;;AAIA,wDA0CC;AA7CD,kDAA0B;AAC1B,0CAAsD;AAEtD,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE3C,oBAAoB;IACpB,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,GAAG,GAAG,IAAA,kBAAS,GAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CACT,eAAe,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,eAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACnH,CAAC;QACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAChD,CAAC;QACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAChD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,MAAM;SACH,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAA,kBAAS,GAAE,CAAC;QAExB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAC7C,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC;YACvB,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,wBAAwB,GAAG,sBAAsB,CAAC,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerInitCommand = registerInitCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const api_1 = require("../lib/api");
|
|
11
|
+
const config_1 = require("../lib/config");
|
|
12
|
+
const crypto_1 = require("../lib/crypto");
|
|
13
|
+
const key_store_1 = require("../lib/key-store");
|
|
14
|
+
function registerInitCommand(program) {
|
|
15
|
+
program
|
|
16
|
+
.command("init")
|
|
17
|
+
.description("First-time setup — create an account or log in")
|
|
18
|
+
.action(async () => {
|
|
19
|
+
console.log(chalk_1.default.bold("\n🌲 Welcome to EnvTree!\n"));
|
|
20
|
+
const { action } = await inquirer_1.default.prompt([
|
|
21
|
+
{
|
|
22
|
+
type: "list",
|
|
23
|
+
name: "action",
|
|
24
|
+
message: "What would you like to do?",
|
|
25
|
+
choices: [
|
|
26
|
+
{ name: "Create a new account", value: "signup" },
|
|
27
|
+
{ name: "Log in to existing account", value: "login" },
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
]);
|
|
31
|
+
if (action === "signup") {
|
|
32
|
+
const answers = await inquirer_1.default.prompt([
|
|
33
|
+
{ type: "input", name: "email", message: "Email:" },
|
|
34
|
+
{ type: "input", name: "username", message: "Username:" },
|
|
35
|
+
{
|
|
36
|
+
type: "password",
|
|
37
|
+
name: "password",
|
|
38
|
+
message: "Password:",
|
|
39
|
+
mask: "*",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: "password",
|
|
43
|
+
name: "confirmPassword",
|
|
44
|
+
message: "Confirm Password:",
|
|
45
|
+
mask: "*",
|
|
46
|
+
},
|
|
47
|
+
]);
|
|
48
|
+
if (answers.password !== answers.confirmPassword) {
|
|
49
|
+
console.log(chalk_1.default.red("\n Passwords do not match"));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const spinner = (0, ora_1.default)("Creating account...").start();
|
|
53
|
+
try {
|
|
54
|
+
const result = await (0, api_1.apiRequest)("POST", "/auth/signup", {
|
|
55
|
+
email: answers.email,
|
|
56
|
+
password: answers.password,
|
|
57
|
+
username: answers.username,
|
|
58
|
+
}, false);
|
|
59
|
+
if (!result.session) {
|
|
60
|
+
spinner.succeed("Account created! Check your email, then run: et login");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
(0, config_1.saveSession)({
|
|
64
|
+
access_token: result.session.access_token,
|
|
65
|
+
refresh_token: result.session.refresh_token,
|
|
66
|
+
user_id: result.user.id,
|
|
67
|
+
email: answers.email,
|
|
68
|
+
username: answers.username,
|
|
69
|
+
});
|
|
70
|
+
spinner.text = "Generating encryption keys...";
|
|
71
|
+
const keys = await (0, crypto_1.generateKeys)();
|
|
72
|
+
(0, key_store_1.savePrivateKey)(keys.private_key);
|
|
73
|
+
await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
|
|
74
|
+
public_key: keys.public_key,
|
|
75
|
+
});
|
|
76
|
+
spinner.succeed(chalk_1.default.green("All set! You're ready to go."));
|
|
77
|
+
console.log(chalk_1.default.dim(` User: ${answers.username} (${answers.email})`));
|
|
78
|
+
console.log("");
|
|
79
|
+
console.log(chalk_1.default.bold(" Next steps:"));
|
|
80
|
+
console.log(chalk_1.default.cyan(" et wallet create my-project ") +
|
|
81
|
+
chalk_1.default.dim("Create a wallet"));
|
|
82
|
+
console.log(chalk_1.default.cyan(' et push my-project API_KEY "sk-..." ') +
|
|
83
|
+
chalk_1.default.dim("Store a secret"));
|
|
84
|
+
console.log(chalk_1.default.cyan(" et pull my-project ") +
|
|
85
|
+
chalk_1.default.dim("Sync to .env"));
|
|
86
|
+
console.log("");
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
spinner.fail(chalk_1.default.red(`Signup failed: ${err.message}`));
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
(0, crypto_1.shutdown)();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Login flow
|
|
97
|
+
const answers = await inquirer_1.default.prompt([
|
|
98
|
+
{ type: "input", name: "email", message: "Email:" },
|
|
99
|
+
{
|
|
100
|
+
type: "password",
|
|
101
|
+
name: "password",
|
|
102
|
+
message: "Password:",
|
|
103
|
+
mask: "*",
|
|
104
|
+
},
|
|
105
|
+
]);
|
|
106
|
+
const spinner = (0, ora_1.default)("Logging in...").start();
|
|
107
|
+
try {
|
|
108
|
+
const result = await (0, api_1.apiRequest)("POST", "/auth/login", {
|
|
109
|
+
email: answers.email,
|
|
110
|
+
password: answers.password,
|
|
111
|
+
}, false);
|
|
112
|
+
(0, config_1.saveSession)({
|
|
113
|
+
access_token: result.session.access_token,
|
|
114
|
+
refresh_token: result.session.refresh_token,
|
|
115
|
+
user_id: result.user.id,
|
|
116
|
+
email: result.user.email,
|
|
117
|
+
username: answers.email,
|
|
118
|
+
});
|
|
119
|
+
const profileResult = await (0, api_1.apiRequest)("GET", "/profile/me", undefined, true);
|
|
120
|
+
if (profileResult.profile?.username) {
|
|
121
|
+
(0, config_1.saveSession)({
|
|
122
|
+
access_token: result.session.access_token,
|
|
123
|
+
refresh_token: result.session.refresh_token,
|
|
124
|
+
user_id: result.user.id,
|
|
125
|
+
email: result.user.email,
|
|
126
|
+
username: profileResult.profile.username,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Always sync public key with server
|
|
130
|
+
if ((0, key_store_1.hasPrivateKey)()) {
|
|
131
|
+
spinner.text = "Syncing encryption keys...";
|
|
132
|
+
const pk = (0, key_store_1.getPrivateKey)();
|
|
133
|
+
const publicKey = await (0, crypto_1.derivePublicKey)(pk);
|
|
134
|
+
await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
|
|
135
|
+
public_key: publicKey,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
spinner.text = "Generating encryption keys...";
|
|
140
|
+
const keys = await (0, crypto_1.generateKeys)();
|
|
141
|
+
(0, key_store_1.savePrivateKey)(keys.private_key);
|
|
142
|
+
await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
|
|
143
|
+
public_key: keys.public_key,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
spinner.succeed(chalk_1.default.green("Logged in! You're ready to go."));
|
|
147
|
+
console.log(chalk_1.default.dim(` User: ${result.user.email}`));
|
|
148
|
+
console.log("");
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
spinner.fail(chalk_1.default.red(`Login failed: ${err.message}`));
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
(0, crypto_1.shutdown)();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;AASA,kDAiLC;AAzLD,wDAAgC;AAChC,kDAA0B;AAC1B,8CAAsB;AACtB,oCAAwC;AACxC,0CAA4C;AAC5C,0CAAwE;AACxE,gDAAgF;AAEhF,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAEtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACvC;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,4BAA4B;gBACrC,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACjD,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE;iBACvD;aACF;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;gBACnD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE;gBACzD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,WAAW;oBACpB,IAAI,EAAE,GAAG;iBACV;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,mBAAmB;oBAC5B,IAAI,EAAE,GAAG;iBACV;aACF,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAA,gBAAU,EAC7B,MAAM,EACN,cAAc,EACd;oBACE,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,EACD,KAAK,CACN,CAAC;gBAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,OAAO,CACb,uDAAuD,CACxD,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,IAAA,oBAAW,EAAC;oBACV,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY;oBACzC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;oBAC3C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;oBACvB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,CAAC,CAAC;gBAEH,OAAO,CAAC,IAAI,GAAG,+BAA+B,CAAC;gBAC/C,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAY,GAAE,CAAC;gBAClC,IAAA,0BAAc,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAEjC,MAAM,IAAA,gBAAU,EAAC,KAAK,EAAE,qBAAqB,EAAE;oBAC7C,UAAU,EAAE,IAAI,CAAC,UAAU;iBAC5B,CAAC,CAAC;gBAEH,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBAC7D,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC,CAC7D,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC;oBAC9C,eAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAC/B,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC;oBACrD,eAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAC9B,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC;oBAC9C,eAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAC5B,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC3D,CAAC;oBAAS,CAAC;gBACT,IAAA,iBAAQ,GAAE,CAAC;YACb,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa;YACb,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;gBACnD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,WAAW;oBACpB,IAAI,EAAE,GAAG;iBACV;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAA,gBAAU,EAC7B,MAAM,EACN,aAAa,EACb;oBACE,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,EACD,KAAK,CACN,CAAC;gBAEF,IAAA,oBAAW,EAAC;oBACV,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY;oBACzC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;oBAC3C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;oBACvB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;oBACxB,QAAQ,EAAE,OAAO,CAAC,KAAK;iBACxB,CAAC,CAAC;gBAEH,MAAM,aAAa,GAAG,MAAM,IAAA,gBAAU,EACpC,KAAK,EACL,aAAa,EACb,SAAS,EACT,IAAI,CACL,CAAC;gBACF,IAAI,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;oBACpC,IAAA,oBAAW,EAAC;wBACV,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY;wBACzC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;wBAC3C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;wBACvB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;wBACxB,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,QAAQ;qBACzC,CAAC,CAAC;gBACL,CAAC;gBAED,qCAAqC;gBACrC,IAAI,IAAA,yBAAa,GAAE,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,GAAG,4BAA4B,CAAC;oBAC5C,MAAM,EAAE,GAAG,IAAA,yBAAa,GAAG,CAAC;oBAC5B,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAe,EAAC,EAAE,CAAC,CAAC;oBAC5C,MAAM,IAAA,gBAAU,EAAC,KAAK,EAAE,qBAAqB,EAAE;wBAC7C,UAAU,EAAE,SAAS;qBACtB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,GAAG,+BAA+B,CAAC;oBAC/C,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAY,GAAE,CAAC;oBAClC,IAAA,0BAAc,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACjC,MAAM,IAAA,gBAAU,EAAC,KAAK,EAAE,qBAAqB,EAAE;wBAC7C,UAAU,EAAE,IAAI,CAAC,UAAU;qBAC5B,CAAC,CAAC;gBACL,CAAC;gBAED,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;oBAAS,CAAC;gBACT,IAAA,iBAAQ,GAAE,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|