@dbx-tools/cli 0.9.38 → 0.9.43

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 CHANGED
@@ -1,39 +1,61 @@
1
1
  # @dbx-tools/cli
2
2
 
3
- The `dbx` CLI for workspace lifecycle, AppKit env, Databricks OAuth, and a
4
- gated public tunnel.
5
-
6
- Available commands:
7
-
8
- | Command | What it does |
9
- | -------------------- | ------------------------------------------------------------------------ |
10
- | `dbx dev` | Bootstrap or repair a dbx-tools workspace, then forward to projen. |
11
- | `dbx appkit env` | Print the environment an AppKit app resolves, as eval-able shell output. |
12
- | `dbx auth` | Generate U2M or M2M OAuth tokens with secure credential storage. |
13
- | `dbx tunnel` | Front any command with a public portr tunnel and an email-OTP gate. |
14
- | `dbx lakebase-proxy` | Run the loopback PostgreSQL proxy for Databricks Lakebase. |
15
-
16
- Key features:
17
-
18
- - Bootstrap path that scaffolds bun/projen into an empty or partially-set-up
19
- folder, including the initial install and synth.
20
- - Toolchain repair for a cloned repo whose generated files and `node_modules`
21
- are gitignored.
22
- - Transparent forwarding to projen for any task once the workspace is ready.
23
- - Custom-registry forcing that survives bun's own resolution rules, applied only
24
- when the effective registry is not npmjs.
25
- - Importable CLI/root/bun helpers for tests and thin wrapper commands.
26
-
27
- Every feature group lives in its own package:
28
- [`@dbx-tools/cli-appkit-env`](../appkit-env),
29
- [`@dbx-tools/cli-auth`](../auth), and
30
- [`@dbx-tools/cli-tunnel`](../tunnel). Each package is imported LAZILY, only once
31
- its name is matched, so `dbx dev` never pays to load AppKit, OAuth, SMTP, or
32
- X.509 code. Run
33
- `dbx <group> --help` for a group's own flags; each forwards `--help` to the child
34
- program rather than answering it at the root.
35
-
36
- The Lakebase proxy command runs the pure Node implementation.
3
+ Use one CLI to authenticate with Databricks, connect local PostgreSQL tools to
4
+ Lakebase, serve Databricks models to coding agents, run graph memory, and share
5
+ applications through a gated public URL.
6
+
7
+ ## Install And Connect
8
+
9
+ ```sh
10
+ bun add --global @dbx-tools/cli
11
+ dbx auth login --profile MY-PROFILE
12
+ dbx auth status --profile MY-PROFILE
13
+ ```
14
+
15
+ `dbx-tools` is an alias for `dbx`. Choose a configured Databricks profile for
16
+ workspace commands; the examples use `MY-PROFILE` as a placeholder.
17
+
18
+ ## Serve Models To Local Tools
19
+
20
+ ```sh
21
+ dbx model-gateway --profile MY-PROFILE --port 4000
22
+ ```
23
+
24
+ Point an OpenAI-compatible client at `http://127.0.0.1:4000/v1`. See
25
+ [model gateway](../model-gateway#command-reference) for all options and desktop
26
+ service commands.
27
+
28
+ ## Connect To Lakebase
29
+
30
+ ```sh
31
+ dbx lakebase-proxy --profile MY-PROFILE --port 5432
32
+ ```
33
+
34
+ Connect your PostgreSQL client to the loopback listener. See
35
+ [Lakebase proxy](../lakebase-proxy#command-reference) for target selection,
36
+ connection URLs, and service commands.
37
+
38
+ ## Add Memory Or Share An App
39
+
40
+ ```sh
41
+ dbx graphiti --profile MY-PROFILE
42
+ dbx tunnel --allow example.com -- bun src/server.ts
43
+ ```
44
+
45
+ [Graphiti](../graphiti#command-reference) provides graph memory for agents.
46
+ [Tunnel](../tunnel#command-reference) adds a public URL with passwordless access
47
+ to an existing process. Each guide includes setup requirements and a generated
48
+ command reference.
49
+
50
+ ## Export AppKit Configuration
51
+
52
+ ```sh
53
+ eval "$(dbx appkit env --quiet)"
54
+ ```
55
+
56
+ Use the resolved AppKit environment before starting another process. See
57
+ [AppKit environment](../appkit-env#command-reference) for JSON and Windows
58
+ output, and [authentication](../auth#command-reference) for token commands.
37
59
 
38
60
  ## Bootstrap A Workspace
39
61
 
@@ -41,97 +63,158 @@ The Lakebase proxy command runs the pure Node implementation.
41
63
  dbx dev sync
42
64
  ```
43
65
 
44
- In an empty folder this creates the minimum bun/projen structure needed for
45
- `@dbx-tools/projen`, installs the toolchain, and runs the first synth. In a
46
- freshly cloned repo it seeds the missing toolchain and synthesizes. This is the
47
- case projen cannot handle on its own, because there are no tasks to run yet.
66
+ In an empty folder, this creates and initializes a Bun/Projen workspace. In a
67
+ cloned workspace, it installs missing tooling before running the requested task.
68
+ Arguments after `dev` are forwarded to Projen.
69
+
70
+ Once the workspace is initialized, use its tasks directly:
71
+
72
+ ```sh
73
+ bun run sync
74
+ bun run sync -- --watch
75
+ bun run barrels
76
+ bun run openapi
77
+ ```
48
78
 
49
- The three cases `dbx dev` dispatches on, in order:
79
+ See [`@dbx-tools/projen`](../../../../projen) for workspace configuration and
80
+ generation. The command reference below lists the top-level groups; each linked
81
+ package guide documents that group's complete options and subcommands.
50
82
 
51
- | Workspace state | What happens |
52
- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
53
- | No `.projenrc.ts` | Full bootstrap: scaffold, install, initial synth. |
54
- | `.projenrc.ts` but no installed toolchain | Seed the toolchain, run the initial synth, then install. Task args are not forwarded, because the tasks they name do not exist until the first synth. |
55
- | Established workspace | Ensure deps, bring the engine up to this CLI's version, forward the args to projen. |
83
+ <!-- cli-reference:start -->
56
84
 
57
- Everything after `dev` is forwarded verbatim, flags included - `dbx dev sync
58
- --watch` runs the `sync` task with `--watch`. `dev` is an explicit subcommand
59
- rather than the bare root action so a projen task name can never collide with a
60
- sibling command group.
85
+ ## Command Reference
61
86
 
62
- ## After Bootstrap, Use The Projen Tasks
87
+ ### `dbx`
63
88
 
64
- The engine registers its commands as projen tasks on the workspace root, so run
65
- them directly instead of going through this CLI:
89
+ Databricks developer tools: workspace lifecycle, AppKit env, auth, tunnels, and local proxies
66
90
 
67
91
  ```sh
68
- bun run sync # one-shot full synth
69
- bun run sync -- --watch # projenrc + barrels + openapi watchers
70
- bun run barrels # rebuild every package-root index.ts barrel
71
- bun run openapi # generate the openapi packages from tsoa controllers
72
- bun run clean # remove generated (read-only) files; -y to skip the picker
92
+ dbx [command]
73
93
  ```
74
94
 
75
- `dbx dev <task>` still works and forwards to the same projen task, but the
76
- `bun run` form is the documented one for an established workspace.
95
+ #### Commands
96
+
97
+ | Command | Description |
98
+ | -------------------------- | ------------------------------------------------------------------ |
99
+ | `dev [projenArgs...]` | Bootstrap or repair a dbx-tools workspace, then forward to projen |
100
+ | `appkit [args...]` | AppKit helpers (env: print the environment an AppKit app resolves) |
101
+ | `auth [args...]` | Authenticate to Databricks and manage OAuth tokens |
102
+ | `tunnel [args...]` | Run a public portr tunnel with an email-OTP gate |
103
+ | `falkor-db [args...]` | Run embedded FalkorDB with optional Databricks Volume backups |
104
+ | `lakebase-proxy [args...]` | Run the Node Databricks Lakebase PostgreSQL proxy |
105
+ | `model-gateway [args...]` | Run the foreground AppKit Databricks model gateway |
106
+ | `graphiti [args...]` | Run Graphiti or manage its current-user desktop service |
77
107
 
78
- ## Resolve AppKit Env
108
+ ### `dbx dev`
109
+
110
+ Bootstrap or repair a dbx-tools workspace, then forward to projen
79
111
 
80
112
  ```sh
81
- eval "$(dbx appkit env --quiet)"
113
+ dbx dev [projenArgs...]
82
114
  ```
83
115
 
84
- See [`@dbx-tools/cli-appkit-env`](../appkit-env) for output formats and
85
- configuration behavior.
116
+ #### Arguments
86
117
 
87
- ## Authenticate With Databricks User OAuth
118
+ | Argument | Description |
119
+ | ------------ | --------------------------------------------- |
120
+ | `projenArgs` | projen task and arguments (e.g. sync --watch) |
121
+
122
+ ### `dbx appkit`
123
+
124
+ AppKit helpers (env: print the environment an AppKit app resolves)
88
125
 
89
126
  ```sh
90
- dbx auth login --profile my-workspace
91
- dbx auth token --profile my-workspace
92
- dbx auth status --profile my-workspace
127
+ dbx appkit [args...]
93
128
  ```
94
129
 
95
- The auth command uses `@dbx-tools/auth` for preferred U2M browser OAuth, M2M
96
- client credentials, refresh, locking, and file or memory
97
- storage. See [`@dbx-tools/cli-auth`](../auth) for the complete command and
98
- option surface.
130
+ #### Arguments
131
+
132
+ | Argument | Description |
133
+ | -------- | ----------------------------- |
134
+ | `args` | arguments forwarded to appkit |
99
135
 
100
- ## Put A Gated Public URL In Front Of A Command
136
+ ### `dbx auth`
137
+
138
+ Authenticate to Databricks and manage OAuth tokens
101
139
 
102
140
  ```sh
103
- dbx tunnel status --allow databricks.com
104
- dbx tunnel --allow databricks.com -- bun src/server.ts
141
+ dbx auth [args...]
105
142
  ```
106
143
 
107
- `dbx tunnel` claims the public port, moves the wrapped command to a private
108
- loopback port, and reverse-proxies between them so an email one-time-code gate
109
- sits in front of traffic the command never has to know about. The command does
110
- not have to be a Node server - anything that honors `PORT` /
111
- `DATABRICKS_APP_PORT` works. An AppKit app should prefer the in-process plugin
112
- path instead; see [`@dbx-tools/cli-tunnel`](../tunnel) for that comparison, the
113
- full flag table, and the request flow.
144
+ #### Arguments
145
+
146
+ | Argument | Description |
147
+ | -------- | --------------------------- |
148
+ | `args` | arguments forwarded to auth |
114
149
 
115
- ## Use The CLI Internals
150
+ ### `dbx tunnel`
116
151
 
117
- ```ts
118
- import { cli, root, bun } from "@dbx-tools/cli";
152
+ Run a public portr tunnel with an email-OTP gate
119
153
 
120
- await cli.prepareAndRunProjen(["sync"]);
121
- const workspaceRoot = await root.findWorkspaceRoot();
122
- bun.runProjen(["barrels"], workspaceRoot);
154
+ ```sh
155
+ dbx tunnel [args...]
123
156
  ```
124
157
 
125
- Importing internals is mainly useful for tests or wrapper scripts; most users
126
- should run the `dbx` bin.
158
+ #### Arguments
159
+
160
+ | Argument | Description |
161
+ | -------- | ----------------------------- |
162
+ | `args` | arguments forwarded to tunnel |
163
+
164
+ ### `dbx falkor-db`
165
+
166
+ Run embedded FalkorDB with optional Databricks Volume backups
167
+
168
+ ```sh
169
+ dbx falkor-db [args...]
170
+ ```
171
+
172
+ #### Arguments
173
+
174
+ | Argument | Description |
175
+ | -------- | -------------------------------- |
176
+ | `args` | arguments forwarded to falkor-db |
177
+
178
+ ### `dbx lakebase-proxy`
179
+
180
+ Run the Node Databricks Lakebase PostgreSQL proxy
181
+
182
+ ```sh
183
+ dbx lakebase-proxy [args...]
184
+ ```
185
+
186
+ #### Arguments
187
+
188
+ | Argument | Description |
189
+ | -------- | ------------------------------------- |
190
+ | `args` | arguments forwarded to lakebase-proxy |
191
+
192
+ ### `dbx model-gateway`
193
+
194
+ Run the foreground AppKit Databricks model gateway
195
+
196
+ ```sh
197
+ dbx model-gateway [args...]
198
+ ```
199
+
200
+ #### Arguments
201
+
202
+ | Argument | Description |
203
+ | -------- | ------------------------------------ |
204
+ | `args` | arguments forwarded to model-gateway |
205
+
206
+ ### `dbx graphiti`
207
+
208
+ Run Graphiti or manage its current-user desktop service
209
+
210
+ ```sh
211
+ dbx graphiti [args...]
212
+ ```
127
213
 
128
- ## Modules
214
+ #### Arguments
129
215
 
130
- - `cli` - the root commander program (`buildProgram()`, `runCli()`) and the
131
- `dev` implementation `prepareAndRunProjen()`.
132
- - `bootstrap` - empty-workspace bootstrap, toolchain seeding, and the initial synth.
133
- - `root` - workspace-root detection and bootstrap/install checks.
134
- - `bun` - bun discovery, workspace install, registry forcing, and projen delegation.
216
+ | Argument | Description |
217
+ | -------- | ------------------------------- |
218
+ | `args` | arguments forwarded to graphiti |
135
219
 
136
- The reusable project classes and generators live in
137
- [`@dbx-tools/projen`](../../../../projen).
220
+ <!-- cli-reference:end -->
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cli";
6
- export const PACKAGE_VERSION = "0.9.38";
6
+ export const PACKAGE_VERSION = "0.9.43";
7
7
  export * as bootstrap from "./src/bootstrap.ts";
8
8
  export * as bun from "./src/bun.ts";
9
9
  export * as cli from "./src/cli.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli";
2
- export declare const PACKAGE_VERSION = "0.9.38";
2
+ export declare const PACKAGE_VERSION = "0.9.43";
3
3
  export * as bootstrap from "./src/bootstrap.ts";
4
4
  export * as bun from "./src/bun.ts";
5
5
  export * as cli from "./src/cli.ts";
package/lib/index.js CHANGED
@@ -2,11 +2,11 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cli";
5
- export const PACKAGE_VERSION = "0.9.38";
5
+ export const PACKAGE_VERSION = "0.9.43";
6
6
  export * as bootstrap from "./src/bootstrap.js";
7
7
  export * as bun from "./src/bun.js";
8
8
  export * as cli from "./src/cli.js";
9
9
  export * as root from "./src/root.js";
10
10
  export { resolveBunArgv } from "./src/bun.js";
11
11
  export { workspaceRoot } from "./src/root.js";
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGlcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4zOFwiO1xuZXhwb3J0ICogYXMgYm9vdHN0cmFwIGZyb20gXCIuL3NyYy9ib290c3RyYXAudHNcIjtcbmV4cG9ydCAqIGFzIGJ1biBmcm9tIFwiLi9zcmMvYnVuLnRzXCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgcm9vdCBmcm9tIFwiLi9zcmMvcm9vdC50c1wiO1xuZXhwb3J0IHsgcmVzb2x2ZUJ1bkFyZ3YgfSBmcm9tIFwiLi9zcmMvYnVuLnRzXCI7XG5leHBvcnQgeyB3b3Jrc3BhY2VSb290IH0gZnJvbSBcIi4vc3JjL3Jvb3QudHNcIjtcbiJdfQ==
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGlcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS40M1wiO1xuZXhwb3J0ICogYXMgYm9vdHN0cmFwIGZyb20gXCIuL3NyYy9ib290c3RyYXAudHNcIjtcbmV4cG9ydCAqIGFzIGJ1biBmcm9tIFwiLi9zcmMvYnVuLnRzXCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgcm9vdCBmcm9tIFwiLi9zcmMvcm9vdC50c1wiO1xuZXhwb3J0IHsgcmVzb2x2ZUJ1bkFyZ3YgfSBmcm9tIFwiLi9zcmMvYnVuLnRzXCI7XG5leHBvcnQgeyB3b3Jrc3BhY2VSb290IH0gZnJvbSBcIi4vc3JjL3Jvb3QudHNcIjtcbiJdfQ==
package/lib/src/cli.js CHANGED
@@ -4,6 +4,7 @@
4
4
  * `dev` bootstraps or repairs a workspace and forwards to projen.
5
5
  * `appkit` provides AppKit environment helpers.
6
6
  * `auth` manages Databricks OAuth and access tokens.
7
+ * `falkor-db` runs an embedded foreground graph database.
7
8
  * `tunnel` runs a public portr tunnel with passwordless access gating.
8
9
  *
9
10
  * Feature commands load their sibling packages only when selected and forward
@@ -87,6 +88,7 @@ export function buildProgram(name = PROGRAM_NAMES[0]) {
87
88
  addForwardedCommand(program, "appkit", "AppKit helpers (env: print the environment an AppKit app resolves)", async () => (await import("@dbx-tools/cli-appkit-env/cli")).buildProgram);
88
89
  addForwardedCommand(program, "auth", "Authenticate to Databricks and manage OAuth tokens", async () => (await import("@dbx-tools/cli-auth/cli")).buildProgram);
89
90
  addForwardedCommand(program, "tunnel", "Run a public portr tunnel with an email-OTP gate", async () => (await import("@dbx-tools/cli-tunnel/cli")).buildProgram);
91
+ addForwardedCommand(program, "falkor-db", "Run embedded FalkorDB with optional Databricks Volume backups", async () => (await import("@dbx-tools/cli-falkor-db/cli")).buildProgram);
90
92
  addForwardedCommand(program, "lakebase-proxy", "Run the Node Databricks Lakebase PostgreSQL proxy", async () => (await import("@dbx-tools/cli-lakebase-proxy/cli")).buildProgram);
91
93
  addForwardedCommand(program, "model-gateway", "Run the foreground AppKit Databricks model gateway", async () => (await import("@dbx-tools/cli-model-gateway/cli")).buildProgram);
92
94
  addForwardedCommand(program, "graphiti", "Run Graphiti or manage its current-user desktop service", async () => (await import("@dbx-tools/cli-graphiti/cli")).buildProgram);
@@ -104,4 +106,4 @@ function programName(argv) {
104
106
  export async function runCli(argv) {
105
107
  await buildProgram(programName(argv)).parseAsync(argv);
106
108
  }
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGFBQWEsR0FDZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTlFLHNFQUFzRTtBQUN0RSxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQVUsQ0FBQztBQUVwRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxVQUFvQixFQUFFLFFBQWlCO0lBQy9FLE1BQU0sSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDekIsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixPQUFPO0lBQ1QsQ0FBQztJQUNELG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFD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QkFBNkIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUN2RSxDQUFDO0lBRUYsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsV0FBVyxDQUFDLElBQWM7SUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDekYsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQUMsSUFBYztJQUN6QyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbWFuZGVyIGVudHJ5IGZvciBgZGJ4YCBhbmQgaXRzIGBkYngtdG9vbHNgIGFsaWFzLlxuICpcbiAqIGBkZXZgIGJvb3RzdHJhcHMgb3IgcmVwYWlycyBhIHdvcmtzcGFjZSBhbmQgZm9yd2FyZHMgdG8gcHJvamVuLlxuICogYGFwcGtpdGAgcHJvdmlkZXMgQXBwS2l0IGVudmlyb25tZW50IGhlbHBlcnMuXG4gKiBgYXV0aGAgbWFuYWdlcyBEYXRhYnJpY2tzIE9BdXRoIGFuZCBhY2Nlc3MgdG9rZW5zLlxuICogYHR1bm5lbGAgcnVucyBhIHB1YmxpYyBwb3J0ciB0dW5uZWwgd2l0aCBwYXNzd29yZGxlc3MgYWNjZXNzIGdhdGluZy5cbiAqXG4gKiBGZWF0dXJlIGNvbW1hbmRzIGxvYWQgdGhlaXIgc2libGluZyBwYWNrYWdlcyBvbmx5IHdoZW4gc2VsZWN0ZWQgYW5kIGZvcndhcmRcbiAqIHRoZWlyIGNvbXBsZXRlIGFyZ3VtZW50IGxpc3QsIGluY2x1ZGluZyBgLS1oZWxwYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGJhc2VuYW1lIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7XG4gIGJvb3RzdHJhcFdvcmtzcGFjZSxcbiAgZW5zdXJlRW5naW5lQ3VycmVudCxcbiAgcnVuSW5pdGlhbFN5bnRoLFxuICBzZWVkVG9vbGNoYWluLFxufSBmcm9tIFwiLi9ib290c3RyYXAudHNcIjtcbmltcG9ydCB7IGVuc3VyZVdvcmtzcGFjZVJlYWR5LCBydW5CdW4sIHJ1blByb2plbiB9IGZyb20gXCIuL2J1bi50c1wiO1xuaW1wb3J0IHsgZmluZFdvcmtzcGFjZVJvb3QsIG5lZWRzQm9vdHN0cmFwLCBuZWVkc1Rvb2xjaGFpbiB9IGZyb20gXCIuL3Jvb3QudHNcIjtcblxuLyoqIENvbW1hbmRzIHRoZSBiaW4gZXhwb3NlcywgYW5kIHRoZSBuYW1lcyBoZWxwIGlzIHJlbmRlcmVkIHVuZGVyLiAqL1xuY29uc3QgUFJPR1JBTV9OQU1FUyA9IFtcImRieFwiLCBcImRieC10b29sc1wiXSBhcyBjb25zdDtcblxuLyoqXG4gKiBQcmVwYXJlIHRoZSB3b3Jrc3BhY2UgYXQgYHJvb3RgLCB0aGVuIHJ1biBwcm9qZW4gKHZpYSBidW4pIHdpdGggYHByb2plbkFyZ3NgLlxuICpcbiAqIFRocmVlIGNhc2VzLCBpbiBvcmRlcjpcbiAqICAgLSBubyBgLnByb2plbnJjLnRzYCBhdCBhbGwgLT4gZnVsbCBib290c3RyYXAgKHNjYWZmb2xkICsgaW5zdGFsbCArIHN5bnRoKSxcbiAqICAgICB3aGljaCBhbHJlYWR5IHJ1bnMgdGhlIGluaXRpYWwgc3ludGg7IG5vdGhpbmcgbW9yZSB0byBmb3J3YXJkLlxuICogICAtIGEgYC5wcm9qZW5yYy50c2AgYnV0IHRoZSBlbmdpbmUvdG9vbGNoYWluIGlzbid0IGluc3RhbGxlZCAoZS5nLiBhIGZyZXNobHlcbiAqICAgICBjb3BpZWQgcHJvamVjdCB3aG9zZSBnZW5lcmF0ZWQgZmlsZXMgKyBtYW5pZmVzdHMgYXJlIGdpdGlnbm9yZWQpIC0+IHNlZWRcbiAqICAgICB0aGUgdG9vbGNoYWluLCB0aGVuIHJ1biB0aGUgSU5JVElBTCBzeW50aCBkaXJlY3RseSAodGhlIHByb2plbiB0YXNrcyB0aGVcbiAqICAgICBhcmdzIHdvdWxkIG5hbWUsIGxpa2UgYHN5bmNgLCBkb24ndCBleGlzdCB1bnRpbCBgLnByb2plbnJjLnRzYCBoYXMgcnVuXG4gKiAgICAgb25jZSksIGFuZCBpbnN0YWxsLiBEb24ndCBmb3J3YXJkIGBwcm9qZW5BcmdzYCAtIHRoZSBzeW50aCBpcyB0aGUgd29yay5cbiAqICAgLSBvdGhlcndpc2UgKGVzdGFibGlzaGVkIHdvcmtzcGFjZSkgLT4gZW5zdXJlIGRlcHMsIGJyaW5nIHRoZSBlbmdpbmUgdXAgdG9cbiAqICAgICB0aGlzIENMSSdzIHZlcnNpb24sIHRoZW4gZm9yd2FyZCB0byBwcm9qZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlQW5kUnVuUHJvamVuKHByb2plbkFyZ3M6IHN0cmluZ1tdLCBzdGFydERpcj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gYXdhaXQgZmluZFdvcmtzcGFjZVJvb3Qoc3RhcnREaXIpO1xuICBpZiAobmVlZHNCb290c3RyYXAocm9vdCkpIHtcbiAgICBib290c3RyYXBXb3Jrc3BhY2Uocm9vdCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChuZWVkc1Rvb2xjaGFpbihyb290KSkge1xuICAgIHNlZWRUb29sY2hhaW4ocm9vdCk7XG4gICAgcnVuSW5pdGlhbFN5bnRoKHJvb3QpO1xuICAgIHJ1bkJ1bihbXCJpbnN0YWxsXCJdLCByb290KTtcbiAgICByZXR1cm47XG4gIH1cbiAgZW5zdXJlV29ya3NwYWNlUmVhZHkocm9vdCk7XG4gIGVuc3VyZUVuZ2luZUN1cnJlbnQocm9vdCk7XG4gIHJ1blByb2plbihwcm9qZW5BcmdzLCByb290KTtcbn1cblxuLyoqXG4gKiBNb3VudCBgbmFtZWAgYXMgYSBjb21tYW5kIHRoYXQgY2FwdHVyZXMgZXZlcnkgZm9sbG93aW5nIHRva2VuIHZlcmJhdGltIGFuZFxuICogaGFuZHMgaXQgdG8gdGhlIHByb2dyYW0gYGxvYWQoKWAgcmVzb2x2ZXMuIGBoZWxwT3B0aW9uKGZhbHNlKWAgaXMgd2hhdCBsZXRzXG4gKiBgLS1oZWxwYCB0aHJvdWdoIHRvIHRoZSBjaGlsZCBpbnN0ZWFkIG9mIGJlaW5nIGFuc3dlcmVkIGhlcmUsIGFuZCB0aGUgY2hpbGRcbiAqIHByb2dyYW0gb3ducyBpdHMgb3duIGZsYWdzLCBzbyB0aGlzIHdyYXBwZXIgbmV2ZXIgaGFzIHRvIHJlc3RhdGUgdGhlbS5cbiAqL1xuZnVuY3Rpb24gYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgcHJvZ3JhbTogQ29tbWFuZCxcbiAgbmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICBsb2FkOiAoKSA9PiBQcm9taXNlPChuYW1lOiBzdHJpbmcpID0+IENvbW1hbmQ+LFxuKTogdm9pZCB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChuYW1lKVxuICAgIC5kZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAuYXJndW1lbnQoXCJbYXJncy4uLl1cIiwgYGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gJHtuYW1lfWApXG4gICAgLmFsbG93VW5rbm93bk9wdGlvbigpXG4gICAgLmFsbG93RXhjZXNzQXJndW1lbnRzKClcbiAgICAuaGVscE9wdGlvbihmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChhcmdzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRQcm9ncmFtID0gYXdhaXQgbG9hZCgpO1xuICAgICAgYXdhaXQgYnVpbGRQcm9ncmFtKGAke3Byb2dyYW0ubmFtZSgpfSAke25hbWV9YCkucGFyc2VBc3luYyhhcmdzLCB7IGZyb206IFwidXNlclwiIH0pO1xuICAgIH0pO1xufVxuXG4vKiogQnVpbGQgdGhlIGBkYnhgIGNvbW1hbmRlciBwcm9ncmFtIChubyBzaWRlIGVmZmVjdHMgdW50aWwgcGFyc2VkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb2dyYW0obmFtZTogc3RyaW5nID0gUFJPR1JBTV9OQU1FU1swXSk6IENvbW1hbmQge1xuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKVxuICAgIC5uYW1lKG5hbWUpXG4gICAgLmRlc2NyaXB0aW9uKFxuICAgICAgXCJEYXRhYnJpY2tzIGRldmVsb3BlciB0b29sczogd29ya3NwYWNlIGxpZmVjeWNsZSwgQXBwS2l0IGVudiwgYXV0aCwgdHVubmVscywgYW5kIGxvY2FsIHByb3hpZXNcIixcbiAgICApXG4gICAgLnNob3dIZWxwQWZ0ZXJFcnJvcigpXG4gICAgLmhlbHBPcHRpb24oXCItaCwgLS1oZWxwXCIsIGBTaG93ICR7bmFtZX0gaGVscGApO1xuXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkJvb3RzdHJhcCBvciByZXBhaXIgYSBkYngtdG9vbHMgd29ya3NwYWNlLCB0aGVuIGZvcndhcmQgdG8gcHJvamVuXCIpXG4gICAgLmFyZ3VtZW50KFwiW3Byb2plbkFyZ3MuLi5dXCIsIFwicHJvamVuIHRhc2sgYW5kIGFyZ3VtZW50cyAoZS5nLiBzeW5jIC0td2F0Y2gpXCIpXG4gICAgLmFsbG93VW5rbm93bk9wdGlvbigpXG4gICAgLmFsbG93RXhjZXNzQXJndW1lbnRzKClcbiAgICAuaGVscE9wdGlvbihmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChwcm9qZW5BcmdzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgYXdhaXQgcHJlcGFyZUFuZFJ1blByb2plbihwcm9qZW5BcmdzKTtcbiAgICB9KTtcblxuICBhZGRGb3J3YXJkZWRDb21tYW5kKFxuICAgIHByb2dyYW0sXG4gICAgXCJhcHBraXRcIixcbiAgICBcIkFwcEtpdCBoZWxwZXJzIChlbnY6IHByaW50IHRoZSBlbnZpcm9ubWVudCBhbiBBcHBLaXQgYXBwIHJlc29sdmVzKVwiLFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBpbXBvcnQoXCJAZGJ4LXRvb2xzL2NsaS1hcHBraXQtZW52L2NsaVwiKSkuYnVpbGRQcm9ncmFtLFxuICApO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcImF1dGhcIixcbiAgICBcIkF1dGhlbnRpY2F0ZSB0byBEYXRhYnJpY2tzIGFuZCBtYW5hZ2UgT0F1dGggdG9rZW5zXCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLWF1dGgvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgICBwcm9ncmFtLFxuICAgIFwidHVubmVsXCIsXG4gICAgXCJSdW4gYSBwdWJsaWMgcG9ydHIgdHVubmVsIHdpdGggYW4gZW1haWwtT1RQIGdhdGVcIixcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9jbGktdHVubmVsL2NsaVwiKSkuYnVpbGRQcm9ncmFtLFxuICApO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcImxha2ViYXNlLXByb3h5XCIsXG4gICAgXCJSdW4gdGhlIE5vZGUgRGF0YWJyaWNrcyBMYWtlYmFzZSBQb3N0Z3JlU1FMIHByb3h5XCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLWxha2ViYXNlLXByb3h5L2NsaVwiKSkuYnVpbGRQcm9ncmFtLFxuICApO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcIm1vZGVsLWdhdGV3YXlcIixcbiAgICBcIlJ1biB0aGUgZm9yZWdyb3VuZCBBcHBLaXQgRGF0YWJyaWNrcyBtb2RlbCBnYXRld2F5XCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLW1vZGVsLWdhdGV3YXkvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgICBwcm9ncmFtLFxuICAgIFwiZ3JhcGhpdGlcIixcbiAgICBcIlJ1biBHcmFwaGl0aSBvciBtYW5hZ2UgaXRzIGN1cnJlbnQtdXNlciBkZXNrdG9wIHNlcnZpY2VcIixcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9jbGktZ3JhcGhpdGkvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgcmV0dXJuIHByb2dyYW07XG59XG5cbi8qKlxuICogUHJvZ3JhbSBuYW1lIGZvciBoZWxwIG91dHB1dDogd2hpY2hldmVyIGJpbiB0aGUgdXNlciBhY3R1YWxseSB0eXBlZCwgc29cbiAqIGBkYngtdG9vbHMgLS1oZWxwYCBkb2Vzbid0IGRvY3VtZW50IGl0c2VsZiBhcyBgZGJ4YC4gRmFsbHMgYmFjayB0byBgZGJ4YC5cbiAqL1xuZnVuY3Rpb24gcHJvZ3JhbU5hbWUoYXJndjogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBpbnZva2VkID0gYXJndlsxXSA/IGJhc2VuYW1lKGFyZ3ZbMV0pLnJlcGxhY2UoL1xcLig/OltjbV0/W2p0XXMpJC8sIFwiXCIpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gUFJPR1JBTV9OQU1FUy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSA9PT0gaW52b2tlZCkgPz8gUFJPR1JBTV9OQU1FU1swXTtcbn1cblxuLyoqIFBhcnNlIGBhcmd2YCAoYSBgcHJvY2Vzcy5hcmd2YCkgYW5kIHJ1biB0aGUgbWF0Y2hpbmcgY29tbWFuZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5DbGkoYXJndjogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRQcm9ncmFtKHByb2dyYW1OYW1lKGFyZ3YpKS5wYXJzZUFzeW5jKGFyZ3YpO1xufVxuIl19
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixhQUFhLEdBQ2QsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU5RSxzRUFBc0U7QUFDdEUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFVLENBQUM7QUFFcEQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsVUFBb0IsRUFBRSxRQUFpQjtJQUMvRSxNQUFNLElBQUksR0FBRyxNQUFNLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDekIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsT0FBTztJQUNULENBQUM7SUFDRCxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUIsT0FBTztJQUNULENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FB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a0NBQWtDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FDNUUsQ0FBQztJQUVGLG1CQUFtQixDQUNqQixPQUFPLEVBQ1AsVUFBVSxFQUNWLHlEQUF5RCxFQUN6RCxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FDdkUsQ0FBQztJQUVGLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFjO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3pGLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUFDLElBQWM7SUFDekMsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1hbmRlciBlbnRyeSBmb3IgYGRieGAgYW5kIGl0cyBgZGJ4LXRvb2xzYCBhbGlhcy5cbiAqXG4gKiBgZGV2YCBib290c3RyYXBzIG9yIHJlcGFpcnMgYSB3b3Jrc3BhY2UgYW5kIGZvcndhcmRzIHRvIHByb2plbi5cbiAqIGBhcHBraXRgIHByb3ZpZGVzIEFwcEtpdCBlbnZpcm9ubWVudCBoZWxwZXJzLlxuICogYGF1dGhgIG1hbmFnZXMgRGF0YWJyaWNrcyBPQXV0aCBhbmQgYWNjZXNzIHRva2Vucy5cbiAqIGBmYWxrb3ItZGJgIHJ1bnMgYW4gZW1iZWRkZWQgZm9yZWdyb3VuZCBncmFwaCBkYXRhYmFzZS5cbiAqIGB0dW5uZWxgIHJ1bnMgYSBwdWJsaWMgcG9ydHIgdHVubmVsIHdpdGggcGFzc3dvcmRsZXNzIGFjY2VzcyBnYXRpbmcuXG4gKlxuICogRmVhdHVyZSBjb21tYW5kcyBsb2FkIHRoZWlyIHNpYmxpbmcgcGFja2FnZXMgb25seSB3aGVuIHNlbGVjdGVkIGFuZCBmb3J3YXJkXG4gKiB0aGVpciBjb21wbGV0ZSBhcmd1bWVudCBsaXN0LCBpbmNsdWRpbmcgYC0taGVscGAuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBiYXNlbmFtZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQge1xuICBib290c3RyYXBXb3Jrc3BhY2UsXG4gIGVuc3VyZUVuZ2luZUN1cnJlbnQsXG4gIHJ1bkluaXRpYWxTeW50aCxcbiAgc2VlZFRvb2xjaGFpbixcbn0gZnJvbSBcIi4vYm9vdHN0cmFwLnRzXCI7XG5pbXBvcnQgeyBlbnN1cmVXb3Jrc3BhY2VSZWFkeSwgcnVuQnVuLCBydW5Qcm9qZW4gfSBmcm9tIFwiLi9idW4udHNcIjtcbmltcG9ydCB7IGZpbmRXb3Jrc3BhY2VSb290LCBuZWVkc0Jvb3RzdHJhcCwgbmVlZHNUb29sY2hhaW4gfSBmcm9tIFwiLi9yb290LnRzXCI7XG5cbi8qKiBDb21tYW5kcyB0aGUgYmluIGV4cG9zZXMsIGFuZCB0aGUgbmFtZXMgaGVscCBpcyByZW5kZXJlZCB1bmRlci4gKi9cbmNvbnN0IFBST0dSQU1fTkFNRVMgPSBbXCJkYnhcIiwgXCJkYngtdG9vbHNcIl0gYXMgY29uc3Q7XG5cbi8qKlxuICogUHJlcGFyZSB0aGUgd29ya3NwYWNlIGF0IGByb290YCwgdGhlbiBydW4gcHJvamVuICh2aWEgYnVuKSB3aXRoIGBwcm9qZW5BcmdzYC5cbiAqXG4gKiBUaHJlZSBjYXNlcywgaW4gb3JkZXI6XG4gKiAgIC0gbm8gYC5wcm9qZW5yYy50c2AgYXQgYWxsIC0+IGZ1bGwgYm9vdHN0cmFwIChzY2FmZm9sZCArIGluc3RhbGwgKyBzeW50aCksXG4gKiAgICAgd2hpY2ggYWxyZWFkeSBydW5zIHRoZSBpbml0aWFsIHN5bnRoOyBub3RoaW5nIG1vcmUgdG8gZm9yd2FyZC5cbiAqICAgLSBhIGAucHJvamVucmMudHNgIGJ1dCB0aGUgZW5naW5lL3Rvb2xjaGFpbiBpc24ndCBpbnN0YWxsZWQgKGUuZy4gYSBmcmVzaGx5XG4gKiAgICAgY29waWVkIHByb2plY3Qgd2hvc2UgZ2VuZXJhdGVkIGZpbGVzICsgbWFuaWZlc3RzIGFyZSBnaXRpZ25vcmVkKSAtPiBzZWVkXG4gKiAgICAgdGhlIHRvb2xjaGFpbiwgdGhlbiBydW4gdGhlIElOSVRJQUwgc3ludGggZGlyZWN0bHkgKHRoZSBwcm9qZW4gdGFza3MgdGhlXG4gKiAgICAgYXJncyB3b3VsZCBuYW1lLCBsaWtlIGBzeW5jYCwgZG9uJ3QgZXhpc3QgdW50aWwgYC5wcm9qZW5yYy50c2AgaGFzIHJ1blxuICogICAgIG9uY2UpLCBhbmQgaW5zdGFsbC4gRG9uJ3QgZm9yd2FyZCBgcHJvamVuQXJnc2AgLSB0aGUgc3ludGggaXMgdGhlIHdvcmsuXG4gKiAgIC0gb3RoZXJ3aXNlIChlc3RhYmxpc2hlZCB3b3Jrc3BhY2UpIC0+IGVuc3VyZSBkZXBzLCBicmluZyB0aGUgZW5naW5lIHVwIHRvXG4gKiAgICAgdGhpcyBDTEkncyB2ZXJzaW9uLCB0aGVuIGZvcndhcmQgdG8gcHJvamVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUFuZFJ1blByb2plbihwcm9qZW5BcmdzOiBzdHJpbmdbXSwgc3RhcnREaXI/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgcm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KHN0YXJ0RGlyKTtcbiAgaWYgKG5lZWRzQm9vdHN0cmFwKHJvb3QpKSB7XG4gICAgYm9vdHN0cmFwV29ya3NwYWNlKHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobmVlZHNUb29sY2hhaW4ocm9vdCkpIHtcbiAgICBzZWVkVG9vbGNoYWluKHJvb3QpO1xuICAgIHJ1bkluaXRpYWxTeW50aChyb290KTtcbiAgICBydW5CdW4oW1wiaW5zdGFsbFwiXSwgcm9vdCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVuc3VyZVdvcmtzcGFjZVJlYWR5KHJvb3QpO1xuICBlbnN1cmVFbmdpbmVDdXJyZW50KHJvb3QpO1xuICBydW5Qcm9qZW4ocHJvamVuQXJncywgcm9vdCk7XG59XG5cbi8qKlxuICogTW91bnQgYG5hbWVgIGFzIGEgY29tbWFuZCB0aGF0IGNhcHR1cmVzIGV2ZXJ5IGZvbGxvd2luZyB0b2tlbiB2ZXJiYXRpbSBhbmRcbiAqIGhhbmRzIGl0IHRvIHRoZSBwcm9ncmFtIGBsb2FkKClgIHJlc29sdmVzLiBgaGVscE9wdGlvbihmYWxzZSlgIGlzIHdoYXQgbGV0c1xuICogYC0taGVscGAgdGhyb3VnaCB0byB0aGUgY2hpbGQgaW5zdGVhZCBvZiBiZWluZyBhbnN3ZXJlZCBoZXJlLCBhbmQgdGhlIGNoaWxkXG4gKiBwcm9ncmFtIG93bnMgaXRzIG93biBmbGFncywgc28gdGhpcyB3cmFwcGVyIG5ldmVyIGhhcyB0byByZXN0YXRlIHRoZW0uXG4gKi9cbmZ1bmN0aW9uIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gIHByb2dyYW06IENvbW1hbmQsXG4gIG5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgbG9hZDogKCkgPT4gUHJvbWlzZTwobmFtZTogc3RyaW5nKSA9PiBDb21tYW5kPixcbik6IHZvaWQge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQobmFtZSlcbiAgICAuZGVzY3JpcHRpb24oZGVzY3JpcHRpb24pXG4gICAgLmFyZ3VtZW50KFwiW2FyZ3MuLi5dXCIsIGBhcmd1bWVudHMgZm9yd2FyZGVkIHRvICR7bmFtZX1gKVxuICAgIC5hbGxvd1Vua25vd25PcHRpb24oKVxuICAgIC5hbGxvd0V4Y2Vzc0FyZ3VtZW50cygpXG4gICAgLmhlbHBPcHRpb24oZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAoYXJnczogc3RyaW5nW10pID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkUHJvZ3JhbSA9IGF3YWl0IGxvYWQoKTtcbiAgICAgIGF3YWl0IGJ1aWxkUHJvZ3JhbShgJHtwcm9ncmFtLm5hbWUoKX0gJHtuYW1lfWApLnBhcnNlQXN5bmMoYXJncywgeyBmcm9tOiBcInVzZXJcIiB9KTtcbiAgICB9KTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBgZGJ4YCBjb21tYW5kZXIgcHJvZ3JhbSAobm8gc2lkZSBlZmZlY3RzIHVudGlsIHBhcnNlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcm9ncmFtKG5hbWU6IHN0cmluZyA9IFBST0dSQU1fTkFNRVNbMF0pOiBDb21tYW5kIHtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcbiAgICAubmFtZShuYW1lKVxuICAgIC5kZXNjcmlwdGlvbihcbiAgICAgIFwiRGF0YWJyaWNrcyBkZXZlbG9wZXIgdG9vbHM6IHdvcmtzcGFjZSBsaWZlY3ljbGUsIEFwcEtpdCBlbnYsIGF1dGgsIHR1bm5lbHMsIGFuZCBsb2NhbCBwcm94aWVzXCIsXG4gICAgKVxuICAgIC5zaG93SGVscEFmdGVyRXJyb3IoKVxuICAgIC5oZWxwT3B0aW9uKFwiLWgsIC0taGVscFwiLCBgU2hvdyAke25hbWV9IGhlbHBgKTtcblxuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJkZXZcIilcbiAgICAuZGVzY3JpcHRpb24oXCJCb290c3RyYXAgb3IgcmVwYWlyIGEgZGJ4LXRvb2xzIHdvcmtzcGFjZSwgdGhlbiBmb3J3YXJkIHRvIHByb2plblwiKVxuICAgIC5hcmd1bWVudChcIltwcm9qZW5BcmdzLi4uXVwiLCBcInByb2plbiB0YXNrIGFuZCBhcmd1bWVudHMgKGUuZy4gc3luYyAtLXdhdGNoKVwiKVxuICAgIC5hbGxvd1Vua25vd25PcHRpb24oKVxuICAgIC5hbGxvd0V4Y2Vzc0FyZ3VtZW50cygpXG4gICAgLmhlbHBPcHRpb24oZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAocHJvamVuQXJnczogc3RyaW5nW10pID0+IHtcbiAgICAgIGF3YWl0IHByZXBhcmVBbmRSdW5Qcm9qZW4ocHJvamVuQXJncyk7XG4gICAgfSk7XG5cbiAgYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgICBwcm9ncmFtLFxuICAgIFwiYXBwa2l0XCIsXG4gICAgXCJBcHBLaXQgaGVscGVycyAoZW52OiBwcmludCB0aGUgZW52aXJvbm1lbnQgYW4gQXBwS2l0IGFwcCByZXNvbHZlcylcIixcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9jbGktYXBwa2l0LWVudi9jbGlcIikpLmJ1aWxkUHJvZ3JhbSxcbiAgKTtcblxuICBhZGRGb3J3YXJkZWRDb21tYW5kKFxuICAgIHByb2dyYW0sXG4gICAgXCJhdXRoXCIsXG4gICAgXCJBdXRoZW50aWNhdGUgdG8gRGF0YWJyaWNrcyBhbmQgbWFuYWdlIE9BdXRoIHRva2Vuc1wiLFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBpbXBvcnQoXCJAZGJ4LXRvb2xzL2NsaS1hdXRoL2NsaVwiKSkuYnVpbGRQcm9ncmFtLFxuICApO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcInR1bm5lbFwiLFxuICAgIFwiUnVuIGEgcHVibGljIHBvcnRyIHR1bm5lbCB3aXRoIGFuIGVtYWlsLU9UUCBnYXRlXCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLXR1bm5lbC9jbGlcIikpLmJ1aWxkUHJvZ3JhbSxcbiAgKTtcblxuICBhZGRGb3J3YXJkZWRDb21tYW5kKFxuICAgIHByb2dyYW0sXG4gICAgXCJmYWxrb3ItZGJcIixcbiAgICBcIlJ1biBlbWJlZGRlZCBGYWxrb3JEQiB3aXRoIG9wdGlvbmFsIERhdGFicmlja3MgVm9sdW1lIGJhY2t1cHNcIixcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9jbGktZmFsa29yLWRiL2NsaVwiKSkuYnVpbGRQcm9ncmFtLFxuICApO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcImxha2ViYXNlLXByb3h5XCIsXG4gICAgXCJSdW4gdGhlIE5vZGUgRGF0YWJyaWNrcyBMYWtlYmFzZSBQb3N0Z3JlU1FMIHByb3h5XCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLWxha2ViYXNlLXByb3h5L2NsaVwiKSkuYnVpbGRQcm9ncmFtLFxuICApO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcIm1vZGVsLWdhdGV3YXlcIixcbiAgICBcIlJ1biB0aGUgZm9yZWdyb3VuZCBBcHBLaXQgRGF0YWJyaWNrcyBtb2RlbCBnYXRld2F5XCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLW1vZGVsLWdhdGV3YXkvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgICBwcm9ncmFtLFxuICAgIFwiZ3JhcGhpdGlcIixcbiAgICBcIlJ1biBHcmFwaGl0aSBvciBtYW5hZ2UgaXRzIGN1cnJlbnQtdXNlciBkZXNrdG9wIHNlcnZpY2VcIixcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9jbGktZ3JhcGhpdGkvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgcmV0dXJuIHByb2dyYW07XG59XG5cbi8qKlxuICogUHJvZ3JhbSBuYW1lIGZvciBoZWxwIG91dHB1dDogd2hpY2hldmVyIGJpbiB0aGUgdXNlciBhY3R1YWxseSB0eXBlZCwgc29cbiAqIGBkYngtdG9vbHMgLS1oZWxwYCBkb2Vzbid0IGRvY3VtZW50IGl0c2VsZiBhcyBgZGJ4YC4gRmFsbHMgYmFjayB0byBgZGJ4YC5cbiAqL1xuZnVuY3Rpb24gcHJvZ3JhbU5hbWUoYXJndjogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBpbnZva2VkID0gYXJndlsxXSA/IGJhc2VuYW1lKGFyZ3ZbMV0pLnJlcGxhY2UoL1xcLig/OltjbV0/W2p0XXMpJC8sIFwiXCIpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gUFJPR1JBTV9OQU1FUy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSA9PT0gaW52b2tlZCkgPz8gUFJPR1JBTV9OQU1FU1swXTtcbn1cblxuLyoqIFBhcnNlIGBhcmd2YCAoYSBgcHJvY2Vzcy5hcmd2YCkgYW5kIHJ1biB0aGUgbWF0Y2hpbmcgY29tbWFuZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5DbGkoYXJndjogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRQcm9ncmFtKHByb2dyYW1OYW1lKGFyZ3YpKS5wYXJzZUFzeW5jKGFyZ3YpO1xufVxuIl19
package/package.json CHANGED
@@ -28,14 +28,15 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "@clack/prompts": "^1.7.0",
31
- "@dbx-tools/cli-appkit-env": "^0.9.38",
32
- "@dbx-tools/cli-auth": "^0.9.38",
33
- "@dbx-tools/cli-graphiti": "^0.9.38",
34
- "@dbx-tools/cli-lakebase-proxy": "^0.9.38",
35
- "@dbx-tools/cli-model-gateway": "^0.9.38",
36
- "@dbx-tools/cli-tunnel": "^0.9.38",
37
- "@dbx-tools/core": "^0.9.38",
38
- "@dbx-tools/shared-core": "^0.9.38",
31
+ "@dbx-tools/cli-appkit-env": "^0.9.43",
32
+ "@dbx-tools/cli-auth": "^0.9.43",
33
+ "@dbx-tools/cli-falkor-db": "^0.9.43",
34
+ "@dbx-tools/cli-graphiti": "^0.9.43",
35
+ "@dbx-tools/cli-lakebase-proxy": "^0.9.43",
36
+ "@dbx-tools/cli-model-gateway": "^0.9.43",
37
+ "@dbx-tools/cli-tunnel": "^0.9.43",
38
+ "@dbx-tools/core": "^0.9.43",
39
+ "@dbx-tools/shared-core": "^0.9.43",
39
40
  "commander": "^15.0.0"
40
41
  },
41
42
  "main": "./lib/index.js",
@@ -72,7 +73,7 @@
72
73
  "./package.json": "./package.json"
73
74
  }
74
75
  },
75
- "version": "0.9.38",
76
+ "version": "0.9.43",
76
77
  "types": "./lib/index.d.ts",
77
78
  "dbxToolsConfig": {
78
79
  "tags": [
package/src/cli.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  * `dev` bootstraps or repairs a workspace and forwards to projen.
5
5
  * `appkit` provides AppKit environment helpers.
6
6
  * `auth` manages Databricks OAuth and access tokens.
7
+ * `falkor-db` runs an embedded foreground graph database.
7
8
  * `tunnel` runs a public portr tunnel with passwordless access gating.
8
9
  *
9
10
  * Feature commands load their sibling packages only when selected and forward
@@ -123,6 +124,13 @@ export function buildProgram(name: string = PROGRAM_NAMES[0]): Command {
123
124
  async () => (await import("@dbx-tools/cli-tunnel/cli")).buildProgram,
124
125
  );
125
126
 
127
+ addForwardedCommand(
128
+ program,
129
+ "falkor-db",
130
+ "Run embedded FalkorDB with optional Databricks Volume backups",
131
+ async () => (await import("@dbx-tools/cli-falkor-db/cli")).buildProgram,
132
+ );
133
+
126
134
  addForwardedCommand(
127
135
  program,
128
136
  "lakebase-proxy",