@elaraai/e3-cli 0.0.2-beta.9 → 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/LICENSE.md +4 -0
- package/README.md +169 -46
- package/dist/src/cli.js +197 -73
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/auth.d.ts +23 -0
- package/dist/src/commands/auth.d.ts.map +1 -0
- package/dist/src/commands/auth.js +200 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/complete.d.ts +14 -0
- package/dist/src/commands/complete.d.ts.map +1 -0
- package/dist/src/commands/complete.js +166 -0
- package/dist/src/commands/complete.js.map +1 -0
- package/dist/src/commands/complete.spec.d.ts +6 -0
- package/dist/src/commands/complete.spec.d.ts.map +1 -0
- package/dist/src/commands/complete.spec.js +63 -0
- package/dist/src/commands/complete.spec.js.map +1 -0
- package/dist/src/commands/completion-install.d.ts +47 -0
- package/dist/src/commands/completion-install.d.ts.map +1 -0
- package/dist/src/commands/completion-install.js +141 -0
- package/dist/src/commands/completion-install.js.map +1 -0
- package/dist/src/commands/completion-install.spec.d.ts +6 -0
- package/dist/src/commands/completion-install.spec.d.ts.map +1 -0
- package/dist/src/commands/completion-install.spec.js +136 -0
- package/dist/src/commands/completion-install.spec.js.map +1 -0
- package/dist/src/commands/completion.d.ts +12 -0
- package/dist/src/commands/completion.d.ts.map +1 -0
- package/dist/src/commands/completion.js +75 -0
- package/dist/src/commands/completion.js.map +1 -0
- package/dist/src/commands/completion.spec.d.ts +6 -0
- package/dist/src/commands/completion.spec.d.ts.map +1 -0
- package/dist/src/commands/completion.spec.js +48 -0
- package/dist/src/commands/completion.spec.js.map +1 -0
- package/dist/src/commands/convert.impl.spec.d.ts +6 -0
- package/dist/src/commands/convert.impl.spec.d.ts.map +1 -0
- package/dist/src/commands/convert.impl.spec.js +245 -0
- package/dist/src/commands/convert.impl.spec.js.map +1 -0
- package/dist/src/commands/dataset-status.d.ts +9 -0
- package/dist/src/commands/dataset-status.d.ts.map +1 -0
- package/dist/src/commands/dataset-status.js +77 -0
- package/dist/src/commands/dataset-status.js.map +1 -0
- package/dist/src/commands/find.d.ts +17 -0
- package/dist/src/commands/find.d.ts.map +1 -0
- package/dist/src/commands/find.js +59 -0
- package/dist/src/commands/find.js.map +1 -0
- package/dist/src/commands/find.spec.d.ts +6 -0
- package/dist/src/commands/find.spec.d.ts.map +1 -0
- package/dist/src/commands/find.spec.js +43 -0
- package/dist/src/commands/find.spec.js.map +1 -0
- package/dist/src/commands/get.d.ts +3 -0
- package/dist/src/commands/get.d.ts.map +1 -1
- package/dist/src/commands/get.js +43 -20
- package/dist/src/commands/get.js.map +1 -1
- package/dist/src/commands/get.spec.d.ts +6 -0
- package/dist/src/commands/get.spec.d.ts.map +1 -0
- package/dist/src/commands/get.spec.js +28 -0
- package/dist/src/commands/get.spec.js.map +1 -0
- package/dist/src/commands/list.d.ts +6 -2
- package/dist/src/commands/list.d.ts.map +1 -1
- package/dist/src/commands/list.js +189 -30
- package/dist/src/commands/list.js.map +1 -1
- package/dist/src/commands/logs.d.ts.map +1 -1
- package/dist/src/commands/logs.js +96 -70
- package/dist/src/commands/logs.js.map +1 -1
- package/dist/src/commands/package.d.ts.map +1 -1
- package/dist/src/commands/package.js +78 -18
- package/dist/src/commands/package.js.map +1 -1
- package/dist/src/commands/repo.d.ts +44 -0
- package/dist/src/commands/repo.d.ts.map +1 -0
- package/dist/src/commands/repo.js +278 -0
- package/dist/src/commands/repo.js.map +1 -0
- package/dist/src/commands/run.d.ts +12 -0
- package/dist/src/commands/run.d.ts.map +1 -1
- package/dist/src/commands/run.js +21 -13
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/run.spec.d.ts +6 -0
- package/dist/src/commands/run.spec.d.ts.map +1 -0
- package/dist/src/commands/run.spec.js +39 -0
- package/dist/src/commands/run.spec.js.map +1 -0
- package/dist/src/commands/set.d.ts +1 -0
- package/dist/src/commands/set.d.ts.map +1 -1
- package/dist/src/commands/set.js +33 -32
- package/dist/src/commands/set.js.map +1 -1
- package/dist/src/commands/start.d.ts.map +1 -1
- package/dist/src/commands/start.js +270 -52
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/watch.d.ts +5 -2
- package/dist/src/commands/watch.d.ts.map +1 -1
- package/dist/src/commands/watch.js +32 -26
- package/dist/src/commands/watch.js.map +1 -1
- package/dist/src/commands/workspace.d.ts +12 -1
- package/dist/src/commands/workspace.d.ts.map +1 -1
- package/dist/src/commands/workspace.js +332 -38
- package/dist/src/commands/workspace.js.map +1 -1
- package/dist/src/credentials.d.ts +123 -0
- package/dist/src/credentials.d.ts.map +1 -0
- package/dist/src/credentials.js +213 -0
- package/dist/src/credentials.js.map +1 -0
- package/dist/src/format.d.ts +18 -0
- package/dist/src/format.d.ts.map +1 -0
- package/dist/src/format.js +43 -0
- package/dist/src/format.js.map +1 -0
- package/dist/src/path-resolver.d.ts +86 -0
- package/dist/src/path-resolver.d.ts.map +1 -0
- package/dist/src/path-resolver.js +241 -0
- package/dist/src/path-resolver.js.map +1 -0
- package/dist/src/path-resolver.spec.d.ts +6 -0
- package/dist/src/path-resolver.spec.d.ts.map +1 -0
- package/dist/src/path-resolver.spec.js +247 -0
- package/dist/src/path-resolver.spec.js.map +1 -0
- package/dist/src/utils.d.ts +76 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +104 -1
- package/dist/src/utils.js.map +1 -1
- package/dist/src/utils.spec.d.ts +6 -0
- package/dist/src/utils.spec.d.ts.map +1 -0
- package/dist/src/utils.spec.js +199 -0
- package/dist/src/utils.spec.js.map +1 -0
- package/package.json +22 -18
- package/scripts/postinstall.cjs +26 -0
- package/dist/src/commands/gc.d.ts +0 -12
- package/dist/src/commands/gc.d.ts.map +0 -1
- package/dist/src/commands/gc.js +0 -44
- package/dist/src/commands/gc.js.map +0 -1
- package/dist/src/commands/init.d.ts +0 -9
- package/dist/src/commands/init.d.ts.map +0 -1
- package/dist/src/commands/init.js +0 -33
- package/dist/src/commands/init.js.map +0 -1
- package/dist/src/commands/status.d.ts +0 -9
- package/dist/src/commands/status.d.ts.map +0 -1
- package/dist/src/commands/status.js +0 -157
- package/dist/src/commands/status.js.map +0 -1
- package/dist/src/commands/tree.d.ts +0 -14
- package/dist/src/commands/tree.d.ts.map +0 -1
- package/dist/src/commands/tree.js +0 -77
- package/dist/src/commands/tree.js.map +0 -1
package/dist/src/cli.js
CHANGED
|
@@ -6,157 +6,281 @@
|
|
|
6
6
|
/**
|
|
7
7
|
* e3 CLI - East Execution Engine command-line interface
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Top-level command tree:
|
|
10
|
+
*
|
|
11
|
+
* repo create | remove | status | gc | list
|
|
12
|
+
* package import | export | list | remove
|
|
13
|
+
* workspace create | remove | list | status | deploy | export
|
|
14
|
+
* dataset get | set | list | status | find
|
|
15
|
+
* task logs | list
|
|
16
|
+
* dataflow run
|
|
17
|
+
* auth login | logout | status | token | whoami
|
|
18
|
+
* run <pkg.task> <inputs...> -o <out> (ad-hoc)
|
|
19
|
+
* watch <source> [<ws>]
|
|
20
|
+
* convert <input> [...]
|
|
21
|
+
*
|
|
22
|
+
* Every command that takes <repo> accepts a local path or http(s) URL — the
|
|
23
|
+
* transport is detected from the argument.
|
|
10
24
|
*/
|
|
11
25
|
import { createRequire } from 'node:module';
|
|
12
26
|
import { Command } from 'commander';
|
|
13
|
-
import { initCommand } from './commands/init.js';
|
|
14
27
|
const require = createRequire(import.meta.url);
|
|
15
28
|
const packageJson = require('../../package.json');
|
|
29
|
+
import { repoCommand } from './commands/repo.js';
|
|
16
30
|
import { packageCommand } from './commands/package.js';
|
|
17
31
|
import { workspaceCommand } from './commands/workspace.js';
|
|
18
32
|
import { listCommand } from './commands/list.js';
|
|
19
|
-
import { treeCommand } from './commands/tree.js';
|
|
20
33
|
import { getCommand } from './commands/get.js';
|
|
21
34
|
import { setCommand } from './commands/set.js';
|
|
22
35
|
import { startCommand } from './commands/start.js';
|
|
23
36
|
import { runCommand } from './commands/run.js';
|
|
24
37
|
import { logsCommand } from './commands/logs.js';
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
38
|
+
import { datasetStatusCommand } from './commands/dataset-status.js';
|
|
39
|
+
import { findCommand } from './commands/find.js';
|
|
27
40
|
import { convertCommand } from './commands/convert.js';
|
|
28
41
|
import { watchCommand } from './commands/watch.js';
|
|
42
|
+
import { createAuthCommand } from './commands/auth.js';
|
|
43
|
+
import { completionCommand } from './commands/completion.js';
|
|
44
|
+
import { installCommand as completionInstall, uninstallCommand as completionUninstall } from './commands/completion-install.js';
|
|
45
|
+
import { completeCommand } from './commands/complete.js';
|
|
46
|
+
import { withDefaultRepo, defaultRepoArg } from './utils.js';
|
|
29
47
|
const program = new Command();
|
|
30
48
|
program
|
|
31
49
|
.name('e3')
|
|
32
50
|
.description('East Execution Engine - Execute tasks across multiple runtimes')
|
|
33
51
|
.version(packageJson.version);
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
.description('Initialize a new e3 repository')
|
|
38
|
-
.action(initCommand);
|
|
39
|
-
program
|
|
40
|
-
.command('status <repo> [workspace]')
|
|
41
|
-
.description('Show repository status, or detailed workspace status if workspace provided')
|
|
42
|
-
.action(statusCommand);
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// repo
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
43
55
|
program
|
|
44
|
-
.command('
|
|
56
|
+
.command('repo')
|
|
57
|
+
.description('Repository operations')
|
|
58
|
+
.addCommand(new Command('create')
|
|
59
|
+
.description('Create a new repository')
|
|
60
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
61
|
+
.action(withDefaultRepo(repoCommand.create)))
|
|
62
|
+
.addCommand(new Command('remove')
|
|
63
|
+
.description('Remove a repository')
|
|
64
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
65
|
+
.option('-r, --recursive', 'Remove all workspaces first')
|
|
66
|
+
.action(withDefaultRepo(repoCommand.remove)))
|
|
67
|
+
.addCommand(new Command('status')
|
|
68
|
+
.description('Show repository status')
|
|
69
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
70
|
+
.action(withDefaultRepo(repoCommand.status)))
|
|
71
|
+
.addCommand(new Command('gc')
|
|
45
72
|
.description('Remove unreferenced objects')
|
|
73
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
46
74
|
.option('--dry-run', 'Report what would be deleted without deleting')
|
|
47
75
|
.option('--min-age <ms>', 'Minimum file age in ms before deletion', '60000')
|
|
48
|
-
.action(
|
|
49
|
-
|
|
76
|
+
.action(withDefaultRepo(repoCommand.gc)))
|
|
77
|
+
.addCommand(new Command('list')
|
|
78
|
+
.description('List repositories on a server')
|
|
79
|
+
.argument('<server>', 'Server URL (e.g., http://localhost:3000)')
|
|
80
|
+
.action(repoCommand.list));
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// package
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
50
84
|
program
|
|
51
85
|
.command('package')
|
|
52
86
|
.description('Package operations')
|
|
53
87
|
.addCommand(new Command('import')
|
|
54
88
|
.description('Import package from .zip file')
|
|
55
|
-
.argument('
|
|
89
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
56
90
|
.argument('<zipPath>', 'Path to .zip file')
|
|
57
|
-
.action(packageCommand.import))
|
|
91
|
+
.action(withDefaultRepo(packageCommand.import)))
|
|
58
92
|
.addCommand(new Command('export')
|
|
59
93
|
.description('Export package to .zip file')
|
|
60
|
-
.argument('
|
|
94
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
61
95
|
.argument('<pkg>', 'Package name[@version]')
|
|
62
96
|
.argument('<zipPath>', 'Output .zip path')
|
|
63
|
-
.action(packageCommand.export))
|
|
97
|
+
.action(withDefaultRepo(packageCommand.export)))
|
|
64
98
|
.addCommand(new Command('list')
|
|
65
99
|
.description('List installed packages')
|
|
66
|
-
.argument('
|
|
67
|
-
.action(packageCommand.list))
|
|
100
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
101
|
+
.action(withDefaultRepo(packageCommand.list)))
|
|
68
102
|
.addCommand(new Command('remove')
|
|
69
103
|
.description('Remove a package')
|
|
70
|
-
.argument('
|
|
104
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
71
105
|
.argument('<pkg>', 'Package name[@version]')
|
|
72
|
-
.action(packageCommand.remove));
|
|
73
|
-
//
|
|
106
|
+
.action(withDefaultRepo(packageCommand.remove)));
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// workspace
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
74
110
|
program
|
|
75
111
|
.command('workspace')
|
|
76
112
|
.description('Workspace operations')
|
|
77
113
|
.addCommand(new Command('create')
|
|
78
114
|
.description('Create an empty workspace')
|
|
79
|
-
.argument('
|
|
115
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
80
116
|
.argument('<name>', 'Workspace name')
|
|
81
|
-
.action(workspaceCommand.create))
|
|
117
|
+
.action(withDefaultRepo(workspaceCommand.create)))
|
|
82
118
|
.addCommand(new Command('deploy')
|
|
83
119
|
.description('Deploy a package to a workspace')
|
|
84
|
-
.argument('
|
|
120
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
85
121
|
.argument('<ws>', 'Workspace name')
|
|
86
|
-
.argument('
|
|
87
|
-
.
|
|
122
|
+
.argument('[pkg]', 'Package name[@version] (omit when using --from-zip)')
|
|
123
|
+
.option('--from-zip <path>', 'Import the zip and deploy (creates the workspace if needed)')
|
|
124
|
+
.action(withDefaultRepo(workspaceCommand.deploy)))
|
|
88
125
|
.addCommand(new Command('export')
|
|
89
126
|
.description('Export workspace as a package')
|
|
90
|
-
.argument('
|
|
127
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
91
128
|
.argument('<ws>', 'Workspace name')
|
|
92
129
|
.argument('<zipPath>', 'Output .zip path')
|
|
93
130
|
.option('--name <name>', 'Package name (default: deployed package name)')
|
|
94
131
|
.option('--version <version>', 'Package version (default: auto-generated)')
|
|
95
|
-
.action(workspaceCommand.export))
|
|
132
|
+
.action(withDefaultRepo(workspaceCommand.export)))
|
|
96
133
|
.addCommand(new Command('list')
|
|
97
134
|
.description('List workspaces')
|
|
98
|
-
.argument('
|
|
99
|
-
.action(workspaceCommand.list))
|
|
135
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
136
|
+
.action(withDefaultRepo(workspaceCommand.list)))
|
|
100
137
|
.addCommand(new Command('remove')
|
|
101
138
|
.description('Remove a workspace')
|
|
102
|
-
.argument('
|
|
139
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
103
140
|
.argument('<ws>', 'Workspace name')
|
|
104
|
-
.action(workspaceCommand.remove))
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.
|
|
108
|
-
.
|
|
109
|
-
.action(
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
.option('--depth <n>', 'Maximum depth to display')
|
|
114
|
-
.option('--types', 'Show dataset types')
|
|
115
|
-
.action(treeCommand);
|
|
141
|
+
.action(withDefaultRepo(workspaceCommand.remove)))
|
|
142
|
+
.addCommand(new Command('status')
|
|
143
|
+
.description('Show detailed workspace status (tasks, datasets, locks)')
|
|
144
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
145
|
+
.argument('<ws>', 'Workspace name')
|
|
146
|
+
.action(withDefaultRepo(workspaceCommand.status)));
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// dataset
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
116
150
|
program
|
|
117
|
-
.command('
|
|
118
|
-
.description('
|
|
151
|
+
.command('dataset')
|
|
152
|
+
.description('Dataset operations within a workspace')
|
|
153
|
+
.addCommand(new Command('get')
|
|
154
|
+
.description('Print a dataset value (path: <ws>.<name>)')
|
|
155
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
156
|
+
.argument('<path>', 'Dataset path (<ws>.<name>)')
|
|
119
157
|
.option('-f, --format <format>', 'Output format: east, json, beast2', 'east')
|
|
120
|
-
.action(getCommand)
|
|
121
|
-
|
|
122
|
-
.
|
|
123
|
-
.
|
|
124
|
-
.
|
|
125
|
-
.
|
|
126
|
-
|
|
158
|
+
.action(withDefaultRepo(getCommand)))
|
|
159
|
+
.addCommand(new Command('set')
|
|
160
|
+
.description('Set a dataset value from a file (path: <ws>.<name>)')
|
|
161
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
162
|
+
.argument('<path>', 'Dataset path (<ws>.<name>)')
|
|
163
|
+
.argument('<file>', 'Path to .east, .beast2, .json, or .csv file')
|
|
164
|
+
.option('--type <typespec>', 'Inline .east type specification (required for .json/.csv)')
|
|
165
|
+
.option('--type-file <path>', 'Read .east type specification from a file (alternative to --type)')
|
|
166
|
+
.action(withDefaultRepo(setCommand)))
|
|
167
|
+
.addCommand(new Command('list')
|
|
168
|
+
.description('List dataset paths in a workspace')
|
|
169
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
170
|
+
.argument('<ws>', 'Workspace name')
|
|
171
|
+
.option('-l, --long', 'Show kind/type/status/size columns')
|
|
172
|
+
.action(withDefaultRepo(listCommand)))
|
|
173
|
+
.addCommand(new Command('status')
|
|
174
|
+
.description('Show status of a single dataset')
|
|
175
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
176
|
+
.argument('<path>', 'Dataset path (<ws>.<name>)')
|
|
177
|
+
.action(withDefaultRepo(datasetStatusCommand)))
|
|
178
|
+
.addCommand(new Command('find')
|
|
179
|
+
.description('Search dataset names by substring or glob pattern')
|
|
180
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
181
|
+
.argument('<ws>', 'Workspace name')
|
|
182
|
+
.argument('<pattern>', 'Substring or glob (`*`, `?`)')
|
|
183
|
+
.action(withDefaultRepo(findCommand)));
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
// task
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
127
187
|
program
|
|
128
|
-
.command('
|
|
129
|
-
.description('
|
|
130
|
-
.
|
|
131
|
-
.
|
|
132
|
-
.
|
|
188
|
+
.command('task')
|
|
189
|
+
.description('Task operations within a workspace')
|
|
190
|
+
.addCommand(new Command('list')
|
|
191
|
+
.description('List tasks in a workspace with execution status')
|
|
192
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
193
|
+
.argument('<ws>', 'Workspace name')
|
|
194
|
+
.action((repo, ws) => logsCommand(defaultRepoArg(repo), ws, {})))
|
|
195
|
+
.addCommand(new Command('logs')
|
|
196
|
+
.description('View logs for a task')
|
|
197
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
198
|
+
.argument('<path>', 'Task path (<ws>.<task>)')
|
|
199
|
+
.option('--follow', 'Follow log output')
|
|
200
|
+
.action(withDefaultRepo(logsCommand)));
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// dataflow
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
133
204
|
program
|
|
134
|
-
.command('
|
|
135
|
-
.description('
|
|
205
|
+
.command('dataflow')
|
|
206
|
+
.description('Workspace dataflow execution')
|
|
207
|
+
.addCommand(new Command('run')
|
|
208
|
+
.description('Execute the workspace dataflow')
|
|
209
|
+
.argument('[repo]', 'Repository path or URL (default: $E3_REPO or .)')
|
|
210
|
+
.argument('<ws>', 'Workspace name')
|
|
136
211
|
.option('--filter <pattern>', 'Only run tasks matching pattern')
|
|
137
212
|
.option('--concurrency <n>', 'Max concurrent tasks', '4')
|
|
138
213
|
.option('--force', 'Force re-execution even if cached')
|
|
139
|
-
.action(startCommand);
|
|
214
|
+
.action(withDefaultRepo(startCommand)));
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// auth
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
program.addCommand(createAuthCommand());
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// run (ad-hoc) — uses pkg.task dot syntax
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
140
222
|
program
|
|
141
|
-
.command('
|
|
223
|
+
.command('run')
|
|
224
|
+
.description('Run a task ad-hoc from a package (task: pkg.task or pkg@version.task)')
|
|
225
|
+
.argument('<repo>', 'Repository path or URL')
|
|
226
|
+
.argument('<task>', 'Task specifier: pkg.task or pkg@version.task')
|
|
227
|
+
.argument('[inputs...]', 'Input file paths (.beast2)')
|
|
228
|
+
.option('-o, --output <path>', 'Output file path')
|
|
229
|
+
.option('--force', 'Force re-execution even if cached')
|
|
230
|
+
.action(runCommand);
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
// watch — source first, workspace second
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
program
|
|
235
|
+
.command('watch')
|
|
142
236
|
.description('Watch a TypeScript file and auto-deploy on changes')
|
|
237
|
+
.argument('<source>', 'TypeScript file to watch')
|
|
238
|
+
.argument('<repo>', 'Repository path or URL')
|
|
239
|
+
.argument('<workspace>', 'Workspace name')
|
|
143
240
|
.option('--start', 'Execute dataflow after each deploy')
|
|
144
241
|
.option('--concurrency <n>', 'Max concurrent tasks when using --start', '4')
|
|
145
242
|
.option('--abort-on-change', 'Abort running execution when file changes')
|
|
146
243
|
.action(watchCommand);
|
|
244
|
+
// ---------------------------------------------------------------------------
|
|
245
|
+
// convert
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
147
247
|
program
|
|
148
|
-
.command('
|
|
149
|
-
.description('View task logs (path format: ws or ws.taskName)')
|
|
150
|
-
.option('--follow', 'Follow log output')
|
|
151
|
-
.action(logsCommand);
|
|
152
|
-
// Utility commands
|
|
153
|
-
program
|
|
154
|
-
.command('convert [input]')
|
|
248
|
+
.command('convert')
|
|
155
249
|
.description('Convert between .east, .json, and .beast2 formats')
|
|
250
|
+
.argument('[input]', 'Input file path (default: read from stdin)')
|
|
156
251
|
.option('--from <format>', 'Input format: east, json, beast2 (default: auto-detect)')
|
|
157
252
|
.option('--to <format>', 'Output format: east, json, beast2', 'east')
|
|
158
253
|
.option('-o, --output <path>', 'Output file path (default: stdout)')
|
|
159
254
|
.option('--type <typespec>', 'Type specification in .east format')
|
|
160
255
|
.action(convertCommand);
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
// completion (shell scripts) + __complete (hidden handler for the scripts)
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
program
|
|
260
|
+
.command('completion')
|
|
261
|
+
.description('Shell tab-completion: install, uninstall, or print scripts')
|
|
262
|
+
.addCommand(new Command('install')
|
|
263
|
+
.description('Auto-detect shell and wire up completion in your rc file')
|
|
264
|
+
.option('--shell <shell>', 'Override shell detection: bash | zsh | fish')
|
|
265
|
+
.option('--quiet', 'Suppress output on success')
|
|
266
|
+
.action(completionInstall))
|
|
267
|
+
.addCommand(new Command('uninstall')
|
|
268
|
+
.description('Remove completion from your shell rc file')
|
|
269
|
+
.option('--shell <shell>', 'Override shell detection: bash | zsh | fish')
|
|
270
|
+
.action(completionUninstall))
|
|
271
|
+
.addCommand(new Command('bash')
|
|
272
|
+
.description('Print bash completion script (use `install` to wire it up automatically)')
|
|
273
|
+
.action(() => completionCommand('bash')))
|
|
274
|
+
.addCommand(new Command('zsh')
|
|
275
|
+
.description('Print zsh completion script')
|
|
276
|
+
.action(() => completionCommand('zsh')))
|
|
277
|
+
.addCommand(new Command('fish')
|
|
278
|
+
.description('Print fish completion script')
|
|
279
|
+
.action(() => completionCommand('fish')));
|
|
280
|
+
program
|
|
281
|
+
.command('__complete', { hidden: true })
|
|
282
|
+
.argument('<cword>', 'Index of the word being completed (0-based)')
|
|
283
|
+
.argument('[words...]', 'Words on the command line, excluding the leading e3')
|
|
284
|
+
.action(completeCommand);
|
|
161
285
|
program.parse();
|
|
162
286
|
//# sourceMappingURL=cli.js.map
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Authentication commands for e3 CLI.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
/**
|
|
10
|
+
* Create the auth command group.
|
|
11
|
+
*
|
|
12
|
+
* Includes login/logout/status/token/whoami all nested under `e3 auth`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createAuthCommand(): Command;
|
|
15
|
+
/**
|
|
16
|
+
* Create the login command.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createLoginCommand(): Command;
|
|
19
|
+
/**
|
|
20
|
+
* Create the logout command.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createLogoutCommand(): Command;
|
|
23
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2CpC;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAkF3C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAsE5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAa7C"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Authentication commands for e3 CLI.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { fetchDiscovery, startDeviceAuth, pollForTokens, setCredential, removeCredential, listCredentials, getCredential, getValidToken, isExpired, decodeJwtPayload, normalizeServerUrl, } from '../credentials.js';
|
|
10
|
+
import { formatError, exitError } from '../utils.js';
|
|
11
|
+
/**
|
|
12
|
+
* Try to open a URL in the default browser.
|
|
13
|
+
*/
|
|
14
|
+
async function openBrowser(url) {
|
|
15
|
+
const { exec } = await import('node:child_process');
|
|
16
|
+
const { platform } = await import('node:os');
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
let command;
|
|
19
|
+
switch (platform()) {
|
|
20
|
+
case 'darwin':
|
|
21
|
+
command = `open "${url}"`;
|
|
22
|
+
break;
|
|
23
|
+
case 'win32':
|
|
24
|
+
command = `start "" "${url}"`;
|
|
25
|
+
break;
|
|
26
|
+
default:
|
|
27
|
+
command = `xdg-open "${url}"`;
|
|
28
|
+
}
|
|
29
|
+
exec(command, (error) => {
|
|
30
|
+
resolve(!error);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create the auth command group.
|
|
36
|
+
*
|
|
37
|
+
* Includes login/logout/status/token/whoami all nested under `e3 auth`.
|
|
38
|
+
*/
|
|
39
|
+
export function createAuthCommand() {
|
|
40
|
+
const auth = new Command('auth')
|
|
41
|
+
.description('Authentication commands');
|
|
42
|
+
auth.addCommand(createLoginCommand());
|
|
43
|
+
auth.addCommand(createLogoutCommand());
|
|
44
|
+
// e3 auth status - List all saved credentials
|
|
45
|
+
auth
|
|
46
|
+
.command('status')
|
|
47
|
+
.description('List saved credentials')
|
|
48
|
+
.action(() => {
|
|
49
|
+
const creds = listCredentials();
|
|
50
|
+
if (creds.length === 0) {
|
|
51
|
+
console.log('No saved credentials.');
|
|
52
|
+
console.log('Run: e3 login <server>');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
console.log('Saved credentials:\n');
|
|
56
|
+
for (const { server, expiresAt } of creds) {
|
|
57
|
+
const expired = isExpired(expiresAt);
|
|
58
|
+
const status = expired ? '(expired)' : '(valid)';
|
|
59
|
+
console.log(` ${server} ${status}`);
|
|
60
|
+
console.log(` Token expires: ${expiresAt}`);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// e3 auth token <server> - Print access token for use with curl
|
|
64
|
+
auth
|
|
65
|
+
.command('token')
|
|
66
|
+
.description('Print access token for a server (for curl/debugging)')
|
|
67
|
+
.argument('<server>', 'Server URL')
|
|
68
|
+
.action(async (server) => {
|
|
69
|
+
const serverUrl = normalizeServerUrl(server);
|
|
70
|
+
try {
|
|
71
|
+
// getValidToken handles refresh automatically if token is expired
|
|
72
|
+
const token = await getValidToken(serverUrl);
|
|
73
|
+
// Print just the token, suitable for: curl -H "Authorization: Bearer $(e3 auth token <server>)"
|
|
74
|
+
console.log(token);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
exitError(formatError(err));
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// e3 auth whoami [server] - Show current identity
|
|
81
|
+
auth
|
|
82
|
+
.command('whoami')
|
|
83
|
+
.description('Show current identity')
|
|
84
|
+
.argument('[server]', 'Server URL')
|
|
85
|
+
.action((server) => {
|
|
86
|
+
const creds = listCredentials();
|
|
87
|
+
if (creds.length === 0) {
|
|
88
|
+
console.log('Not logged in to any servers.');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const servers = server ? [server] : creds.map((c) => c.server);
|
|
92
|
+
for (const serverUrl of servers) {
|
|
93
|
+
const credential = getCredential(serverUrl);
|
|
94
|
+
if (!credential) {
|
|
95
|
+
console.log(`${serverUrl}: Not logged in`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const payload = decodeJwtPayload(credential.accessToken);
|
|
100
|
+
const expired = isExpired(credential.expiresAt);
|
|
101
|
+
const status = expired ? '(token expired)' : '';
|
|
102
|
+
console.log(`${serverUrl}: ${status}`);
|
|
103
|
+
console.log(` Subject: ${payload.sub ?? 'unknown'}`);
|
|
104
|
+
if (payload.email) {
|
|
105
|
+
console.log(` Email: ${payload.email}`);
|
|
106
|
+
}
|
|
107
|
+
console.log(` Issuer: ${payload.iss ?? 'unknown'}`);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
console.log(`${serverUrl}: Invalid token`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return auth;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create the login command.
|
|
118
|
+
*/
|
|
119
|
+
export function createLoginCommand() {
|
|
120
|
+
return new Command('login')
|
|
121
|
+
.description('Log in to a server using OAuth2 Device Flow')
|
|
122
|
+
.argument('<server>', 'Server URL (e.g., http://localhost:3000)')
|
|
123
|
+
.option('--no-browser', 'Do not open browser (for CI/headless environments)')
|
|
124
|
+
.action(async (server, options) => {
|
|
125
|
+
const serverUrl = normalizeServerUrl(server);
|
|
126
|
+
console.log(`Logging in to ${serverUrl}...`);
|
|
127
|
+
// Fetch OIDC discovery document
|
|
128
|
+
let discovery;
|
|
129
|
+
try {
|
|
130
|
+
discovery = await fetchDiscovery(serverUrl);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
exitError(`Failed to connect to server: ${formatError(err)}\nMake sure the server is running with --oidc enabled.`);
|
|
134
|
+
}
|
|
135
|
+
// Start device authorization
|
|
136
|
+
let deviceAuth;
|
|
137
|
+
try {
|
|
138
|
+
deviceAuth = await startDeviceAuth(discovery);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
exitError(`Failed to start login: ${formatError(err)}`);
|
|
142
|
+
}
|
|
143
|
+
// Display user code and URL (unless in quiet CI mode)
|
|
144
|
+
if (options.browser) {
|
|
145
|
+
console.log('\nTo complete login:');
|
|
146
|
+
console.log(` 1. Open: ${deviceAuth.verification_uri}`);
|
|
147
|
+
console.log(` 2. Enter code: ${deviceAuth.user_code}`);
|
|
148
|
+
console.log(`\nOr visit this URL directly:`);
|
|
149
|
+
console.log(` ${deviceAuth.verification_uri_complete}`);
|
|
150
|
+
// Try to open browser
|
|
151
|
+
const opened = await openBrowser(deviceAuth.verification_uri_complete);
|
|
152
|
+
if (opened) {
|
|
153
|
+
console.log('\nBrowser opened. Waiting for approval...');
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
console.log('\nWaiting for approval...');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
console.log('Waiting for server approval (--no-browser mode)...');
|
|
161
|
+
}
|
|
162
|
+
// Poll for tokens
|
|
163
|
+
try {
|
|
164
|
+
const tokens = await pollForTokens(discovery, deviceAuth.device_code, deviceAuth.interval, deviceAuth.expires_in);
|
|
165
|
+
// Save credentials
|
|
166
|
+
const entry = {
|
|
167
|
+
accessToken: tokens.access_token,
|
|
168
|
+
refreshToken: tokens.refresh_token,
|
|
169
|
+
expiresAt: new Date(Date.now() + tokens.expires_in * 1000).toISOString(),
|
|
170
|
+
};
|
|
171
|
+
setCredential(serverUrl, entry);
|
|
172
|
+
// Show identity
|
|
173
|
+
const payload = decodeJwtPayload(tokens.access_token);
|
|
174
|
+
console.log(`\nSuccessfully logged in as: ${payload.sub ?? 'unknown'}`);
|
|
175
|
+
console.log(`Token expires: ${entry.expiresAt}`);
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
exitError(`Login failed: ${formatError(err)}`);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Create the logout command.
|
|
184
|
+
*/
|
|
185
|
+
export function createLogoutCommand() {
|
|
186
|
+
return new Command('logout')
|
|
187
|
+
.description('Log out from a server')
|
|
188
|
+
.argument('<server>', 'Server URL')
|
|
189
|
+
.action((server) => {
|
|
190
|
+
const serverUrl = normalizeServerUrl(server);
|
|
191
|
+
const removed = removeCredential(serverUrl);
|
|
192
|
+
if (removed) {
|
|
193
|
+
console.log(`Logged out from ${serverUrl}`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
console.log(`Not logged in to ${serverUrl}`);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,kBAAkB,GAEnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAE7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAe,CAAC;QACpB,QAAQ,QAAQ,EAAE,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC;gBAC1B,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;gBAC9B,MAAM;YACR;gBACE,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACtB,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAC7B,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAEvC,8CAA8C;IAC9C,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,KAAK,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,KAAK,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,gEAAgE;IAChE,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,sDAAsD,CAAC;SACnE,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,kEAAkE;YAClE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;YAC7C,gGAAgG;YAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,kDAAkD;IAClD,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uBAAuB,CAAC;SACpC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC;SAClC,MAAM,CAAC,CAAC,MAAe,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/D,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,iBAAiB,CAAC,CAAC;gBAC3C,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;gBACtD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC3C,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,iBAAiB,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;SACxB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,QAAQ,CAAC,UAAU,EAAE,0CAA0C,CAAC;SAChE,MAAM,CAAC,cAAc,EAAE,oDAAoD,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAA6B,EAAE,EAAE;QAC9D,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,KAAK,CAAC,CAAC;QAE7C,gCAAgC;QAChC,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,gCAAgC,WAAW,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtH,CAAC;QAED,6BAA6B;QAC7B,IAAI,UAAU,CAAC;QACf,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,0BAA0B,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,sDAAsD;QACtD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,yBAAyB,EAAE,CAAC,CAAC;YAEzD,sBAAsB;YACtB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC;YACvE,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,SAAS,EACT,UAAU,CAAC,WAAW,EACtB,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,UAAU,CACtB,CAAC;YAEF,mBAAmB;YACnB,MAAM,KAAK,GAAoB;gBAC7B,WAAW,EAAE,MAAM,CAAC,YAAY;gBAChC,YAAY,EAAE,MAAM,CAAC,aAAa;gBAClC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;aACzE,CAAC;YACF,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEhC,gBAAgB;YAChB,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,gCAAgC,OAAO,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,iBAAiB,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,uBAAuB,CAAC;SACpC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC;SAClC,MAAM,CAAC,CAAC,MAAc,EAAE,EAAE;QACzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|