@dbx-tools/cli 0.6.131 → 0.6.133

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,9 +1,9 @@
1
1
  # @dbx-tools/cli
2
2
 
3
- The single `dbx` CLI: workspace lifecycle, Model Serving proxy, AppKit env, and
4
- a gated public tunnel.
3
+ The single `dbx` CLI: workspace lifecycle, Model Serving proxy, AppKit env,
4
+ local token brokering, and a gated public tunnel.
5
5
 
6
- This package installs one command, `dbx` (aliased `dbx-tools`), with four
6
+ This package installs one command, `dbx` (aliased `dbx-tools`), with five
7
7
  groups:
8
8
 
9
9
  | Command | What it does |
@@ -12,6 +12,7 @@ groups:
12
12
  | `dbx model-proxy` | Local OpenAI-compatible proxy in front of Databricks Model Serving. |
13
13
  | `dbx appkit env` | Print the environment an AppKit app resolves, as eval-able shell output. |
14
14
  | `dbx tunnel` | Front any command with a public portr tunnel and an email-OTP gate. |
15
+ | `dbx token` | Broker short-lived provider tokens for host and container clients. |
15
16
 
16
17
  Key features:
17
18
 
@@ -29,10 +30,11 @@ Key features:
29
30
  Every feature group lives in its own package -
30
31
  [`@dbx-tools/cli-model-proxy`](../model-proxy),
31
32
  [`@dbx-tools/cli-appkit-env`](../appkit-env), and
32
- [`@dbx-tools/cli-tunnel`](../tunnel) - and is imported LAZILY, only once its name
33
- is matched, so `dbx dev` never pays to load the Databricks SDK, AppKit, or the
34
- SMTP stack. Run `dbx <group> --help` for a group's own flags; each forwards
35
- `--help` to the child program rather than answering it at the root.
33
+ [`@dbx-tools/cli-tunnel`](../tunnel), and [`@dbx-tools/cli-token`](../token) -
34
+ and is imported LAZILY, only once its name is matched, so `dbx dev` never pays
35
+ to load the Databricks SDK, AppKit, SMTP, keychain, or X.509 stack. Run
36
+ `dbx <group> --help` for a group's own flags; each forwards `--help` to the child
37
+ program rather than answering it at the root.
36
38
 
37
39
  ## Bootstrap A Workspace
38
40
 
@@ -85,6 +87,18 @@ See [`@dbx-tools/cli-model-proxy`](../model-proxy) and
85
87
  [`@dbx-tools/cli-appkit-env`](../appkit-env) for the full flag surface, auth
86
88
  resolution, and output formats.
87
89
 
90
+ ## Broker Local Provider Tokens
91
+
92
+ ```sh
93
+ dbx token serve --google --auth jwt --bind-docker
94
+ dbx token client-token container-client --scope https://www.googleapis.com/auth/gmail.modify
95
+ dbx token access-token --client container-client
96
+ ```
97
+
98
+ The broker keeps Google ADC under gcloud, caches access tokens only in memory,
99
+ and defaults to mTLS. See [`@dbx-tools/cli-token`](../token) for service
100
+ installation, client authorization, Docker, Podman, and configuration.
101
+
88
102
  ## Put A Gated Public URL In Front Of A Command
89
103
 
90
104
  ```sh
package/lib/src/cli.js CHANGED
@@ -1,18 +1,20 @@
1
1
  /**
2
2
  * The single `dbx` (alias `dbx-tools`) commander entry.
3
3
  *
4
- * One bin, three command groups:
4
+ * One bin, five command groups:
5
5
  * - `dev` - workspace lifecycle: detect the root, bootstrap or repair, then
6
6
  * forward whatever follows to projen. This is the passthrough, and it is an
7
7
  * EXPLICIT subcommand rather than the bare root action so a projen task
8
8
  * name can never shadow (or be shadowed by) a sibling command.
9
9
  * - `model-proxy` - the local OpenAI-compatible Model Serving proxy.
10
10
  * - `appkit` - AppKit environment helpers (`appkit env`).
11
+ * - `tunnel` - public portr tunnel with passwordless access gating.
12
+ * - `token` - local provider access-token broker.
11
13
  *
12
- * The two feature groups stay in their own packages (`@dbx-tools/cli-model-proxy`,
13
- * `@dbx-tools/cli-appkit-env`) and are `await import()`ed only once their name is
14
- * matched, so `dbx dev` never loads the Databricks SDK or AppKit. That lazy hop
15
- * is also why they are mounted as ARG-FORWARDING commands instead of
14
+ * The four feature groups stay in sibling packages and are `await import()`ed
15
+ * only once their name is matched, so `dbx dev` never loads the Databricks SDK,
16
+ * AppKit, tunnel, or token-broker dependencies. That lazy hop is also why they
17
+ * are mounted as ARG-FORWARDING commands instead of
16
18
  * `addCommand()`: building a child program eagerly to register it would defeat
17
19
  * the point. Each forwards its own `--help`, so the child prints its real help.
18
20
  *
@@ -78,7 +80,7 @@ function addForwardedCommand(program, name, description, load) {
78
80
  export function buildProgram(name = PROGRAM_NAMES[0]) {
79
81
  const program = new Command()
80
82
  .name(name)
81
- .description("Databricks developer tools: workspace lifecycle, model proxy, AppKit env")
83
+ .description("Databricks developer tools: workspace lifecycle, model proxy, AppKit env, tunnel, and token broker")
82
84
  .showHelpAfterError()
83
85
  .helpOption("-h, --help", `Show ${name} help`);
84
86
  program
@@ -94,6 +96,7 @@ export function buildProgram(name = PROGRAM_NAMES[0]) {
94
96
  addForwardedCommand(program, "model-proxy", "Serve a local OpenAI-compatible proxy in front of Databricks Model Serving", async () => (await import("@dbx-tools/cli-model-proxy/cli")).buildProgram);
95
97
  addForwardedCommand(program, "appkit", "AppKit helpers (env: print the environment an AppKit app resolves)", async () => (await import("@dbx-tools/cli-appkit-env/cli")).buildProgram);
96
98
  addForwardedCommand(program, "tunnel", "Run a public portr tunnel with an email-OTP gate", async () => (await import("@dbx-tools/cli-tunnel/cli")).buildProgram);
99
+ addForwardedCommand(program, "token", "Broker short-lived provider access tokens for local development", async () => (await import("@dbx-tools/cli-token/cli")).buildProgram);
97
100
  return program;
98
101
  }
99
102
  /**
@@ -108,4 +111,4 @@ function programName(argv) {
108
111
  export async function runCli(argv) {
109
112
  await buildProgram(programName(argv)).parseAsync(argv);
110
113
  }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsYUFBYSxHQUNkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFOUUsc0VBQXNFO0FBQ3RFLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBVSxDQUFDO0FBRXBEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG1CQUFtQixDQUFDLFVBQW9CLEVBQUUsUUFBaUI7SUFDL0UsTUFBTSxJQUFJLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFCLE9BQU87SUFDVCxDQUFDO0lBQ0Qsb0JBQW9CLENBQUMsSUFBSSxD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QUFvRTtBQUNwRSxNQUFNLENBQUMsS0FBSyxVQUFVLE1BQU0sQ0FBQyxJQUFjO0lBQ3pDLE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgc2luZ2xlIGBkYnhgIChhbGlhcyBgZGJ4LXRvb2xzYCkgY29tbWFuZGVyIGVudHJ5LlxuICpcbiAqIE9uZSBiaW4sIHRocmVlIGNvbW1hbmQgZ3JvdXBzOlxuICogICAtIGBkZXZgIC0gd29ya3NwYWNlIGxpZmVjeWNsZTogZGV0ZWN0IHRoZSByb290LCBib290c3RyYXAgb3IgcmVwYWlyLCB0aGVuXG4gKiAgICAgZm9yd2FyZCB3aGF0ZXZlciBmb2xsb3dzIHRvIHByb2plbi4gVGhpcyBpcyB0aGUgcGFzc3Rocm91Z2gsIGFuZCBpdCBpcyBhblxuICogICAgIEVYUExJQ0lUIHN1YmNvbW1hbmQgcmF0aGVyIHRoYW4gdGhlIGJhcmUgcm9vdCBhY3Rpb24gc28gYSBwcm9qZW4gdGFza1xuICogICAgIG5hbWUgY2FuIG5ldmVyIHNoYWRvdyAob3IgYmUgc2hhZG93ZWQgYnkpIGEgc2libGluZyBjb21tYW5kLlxuICogICAtIGBtb2RlbC1wcm94eWAgLSB0aGUgbG9jYWwgT3BlbkFJLWNvbXBhdGlibGUgTW9kZWwgU2VydmluZyBwcm94eS5cbiAqICAgLSBgYXBwa2l0YCAtIEFwcEtpdCBlbnZpcm9ubWVudCBoZWxwZXJzIChgYXBwa2l0IGVudmApLlxuICpcbiAqIFRoZSB0d28gZmVhdHVyZSBncm91cHMgc3RheSBpbiB0aGVpciBvd24gcGFja2FnZXMgKGBAZGJ4LXRvb2xzL2NsaS1tb2RlbC1wcm94eWAsXG4gKiBgQGRieC10b29scy9jbGktYXBwa2l0LWVudmApIGFuZCBhcmUgYGF3YWl0IGltcG9ydCgpYGVkIG9ubHkgb25jZSB0aGVpciBuYW1lIGlzXG4gKiBtYXRjaGVkLCBzbyBgZGJ4IGRldmAgbmV2ZXIgbG9hZHMgdGhlIERhdGFicmlja3MgU0RLIG9yIEFwcEtpdC4gVGhhdCBsYXp5IGhvcFxuICogaXMgYWxzbyB3aHkgdGhleSBhcmUgbW91bnRlZCBhcyBBUkctRk9SV0FSRElORyBjb21tYW5kcyBpbnN0ZWFkIG9mXG4gKiBgYWRkQ29tbWFuZCgpYDogYnVpbGRpbmcgYSBjaGlsZCBwcm9ncmFtIGVhZ2VybHkgdG8gcmVnaXN0ZXIgaXQgd291bGQgZGVmZWF0XG4gKiB0aGUgcG9pbnQuIEVhY2ggZm9yd2FyZHMgaXRzIG93biBgLS1oZWxwYCwgc28gdGhlIGNoaWxkIHByaW50cyBpdHMgcmVhbCBoZWxwLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgYmFzZW5hbWUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHtcbiAgYm9vdHN0cmFwV29ya3NwYWNlLFxuICBlbnN1cmVFbmdpbmVDdXJyZW50LFxuICBydW5Jbml0aWFsU3ludGgsXG4gIHNlZWRUb29sY2hhaW4sXG59IGZyb20gXCIuL2Jvb3RzdHJhcC50c1wiO1xuaW1wb3J0IHsgZW5zdXJlV29ya3NwYWNlUmVhZHksIHJ1bkJ1biwgcnVuUHJvamVuIH0gZnJvbSBcIi4vYnVuLnRzXCI7XG5pbXBvcnQgeyBmaW5kV29ya3NwYWNlUm9vdCwgbmVlZHNCb290c3RyYXAsIG5lZWRzVG9vbGNoYWluIH0gZnJvbSBcIi4vcm9vdC50c1wiO1xuXG4vKiogQ29tbWFuZHMgdGhlIGJpbiBleHBvc2VzLCBhbmQgdGhlIG5hbWVzIGhlbHAgaXMgcmVuZGVyZWQgdW5kZXIuICovXG5jb25zdCBQUk9HUkFNX05BTUVTID0gW1wiZGJ4XCIsIFwiZGJ4LXRvb2xzXCJdIGFzIGNvbnN0O1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIHdvcmtzcGFjZSBhdCBgcm9vdGAsIHRoZW4gcnVuIHByb2plbiAodmlhIGJ1bikgd2l0aCBgcHJvamVuQXJnc2AuXG4gKlxuICogVGhyZWUgY2FzZXMsIGluIG9yZGVyOlxuICogICAtIG5vIGAucHJvamVucmMudHNgIGF0IGFsbCAtPiBmdWxsIGJvb3RzdHJhcCAoc2NhZmZvbGQgKyBpbnN0YWxsICsgc3ludGgpLFxuICogICAgIHdoaWNoIGFscmVhZHkgcnVucyB0aGUgaW5pdGlhbCBzeW50aDsgbm90aGluZyBtb3JlIHRvIGZvcndhcmQuXG4gKiAgIC0gYSBgLnByb2plbnJjLnRzYCBidXQgdGhlIGVuZ2luZS90b29sY2hhaW4gaXNuJ3QgaW5zdGFsbGVkIChlLmcuIGEgZnJlc2hseVxuICogICAgIGNvcGllZCBwcm9qZWN0IHdob3NlIGdlbmVyYXRlZCBmaWxlcyArIG1hbmlmZXN0cyBhcmUgZ2l0aWdub3JlZCkgLT4gc2VlZFxuICogICAgIHRoZSB0b29sY2hhaW4sIHRoZW4gcnVuIHRoZSBJTklUSUFMIHN5bnRoIGRpcmVjdGx5ICh0aGUgcHJvamVuIHRhc2tzIHRoZVxuICogICAgIGFyZ3Mgd291bGQgbmFtZSwgbGlrZSBgc3luY2AsIGRvbid0IGV4aXN0IHVudGlsIGAucHJvamVucmMudHNgIGhhcyBydW5cbiAqICAgICBvbmNlKSwgYW5kIGluc3RhbGwuIERvbid0IGZvcndhcmQgYHByb2plbkFyZ3NgIC0gdGhlIHN5bnRoIGlzIHRoZSB3b3JrLlxuICogICAtIG90aGVyd2lzZSAoZXN0YWJsaXNoZWQgd29ya3NwYWNlKSAtPiBlbnN1cmUgZGVwcywgYnJpbmcgdGhlIGVuZ2luZSB1cCB0b1xuICogICAgIHRoaXMgQ0xJJ3MgdmVyc2lvbiwgdGhlbiBmb3J3YXJkIHRvIHByb2plbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVBbmRSdW5Qcm9qZW4ocHJvamVuQXJnczogc3RyaW5nW10sIHN0YXJ0RGlyPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJvb3QgPSBhd2FpdCBmaW5kV29ya3NwYWNlUm9vdChzdGFydERpcik7XG4gIGlmIChuZWVkc0Jvb3RzdHJhcChyb290KSkge1xuICAgIGJvb3RzdHJhcFdvcmtzcGFjZShyb290KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG5lZWRzVG9vbGNoYWluKHJvb3QpKSB7XG4gICAgc2VlZFRvb2xjaGFpbihyb290KTtcbiAgICBydW5Jbml0aWFsU3ludGgocm9vdCk7XG4gICAgcnVuQnVuKFtcImluc3RhbGxcIl0sIHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuICBlbnN1cmVXb3Jrc3BhY2VSZWFkeShyb290KTtcbiAgZW5zdXJlRW5naW5lQ3VycmVudChyb290KTtcbiAgcnVuUHJvamVuKHByb2plbkFyZ3MsIHJvb3QpO1xufVxuXG4vKipcbiAqIE1vdW50IGBuYW1lYCBhcyBhIGNvbW1hbmQgdGhhdCBjYXB0dXJlcyBldmVyeSBmb2xsb3dpbmcgdG9rZW4gdmVyYmF0aW0gYW5kXG4gKiBoYW5kcyBpdCB0byB0aGUgcHJvZ3JhbSBgbG9hZCgpYCByZXNvbHZlcy4gYGhlbHBPcHRpb24oZmFsc2UpYCBpcyB3aGF0IGxldHNcbiAqIGAtLWhlbHBgIHRocm91Z2ggdG8gdGhlIGNoaWxkIGluc3RlYWQgb2YgYmVpbmcgYW5zd2VyZWQgaGVyZSwgYW5kIHRoZSBjaGlsZFxuICogcHJvZ3JhbSBvd25zIGl0cyBvd24gZmxhZ3MsIHNvIHRoaXMgd3JhcHBlciBuZXZlciBoYXMgdG8gcmVzdGF0ZSB0aGVtLlxuICovXG5mdW5jdGlvbiBhZGRGb3J3YXJkZWRDb21tYW5kKFxuICBwcm9ncmFtOiBDb21tYW5kLFxuICBuYW1lOiBzdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gIGxvYWQ6ICgpID0+IFByb21pc2U8KG5hbWU6IHN0cmluZykgPT4gQ29tbWFuZD4sXG4pOiB2b2lkIHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKG5hbWUpXG4gICAgLmRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKVxuICAgIC5hcmd1bWVudChcIlthcmdzLi4uXVwiLCBgYXJndW1lbnRzIGZvcndhcmRlZCB0byAke25hbWV9YClcbiAgICAuYWxsb3dVbmtub3duT3B0aW9uKClcbiAgICAuYWxsb3dFeGNlc3NBcmd1bWVudHMoKVxuICAgIC5oZWxwT3B0aW9uKGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKGFyZ3M6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBjb25zdCBidWlsZFByb2dyYW0gPSBhd2FpdCBsb2FkKCk7XG4gICAgICBhd2FpdCBidWlsZFByb2dyYW0oYCR7cHJvZ3JhbS5uYW1lKCl9ICR7bmFtZX1gKS5wYXJzZUFzeW5jKGFyZ3MsIHsgZnJvbTogXCJ1c2VyXCIgfSk7XG4gICAgfSk7XG59XG5cbi8qKiBCdWlsZCB0aGUgYGRieGAgY29tbWFuZGVyIHByb2dyYW0gKG5vIHNpZGUgZWZmZWN0cyB1bnRpbCBwYXJzZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJvZ3JhbShuYW1lOiBzdHJpbmcgPSBQUk9HUkFNX05BTUVTWzBdKTogQ29tbWFuZCB7XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUobmFtZSlcbiAgICAuZGVzY3JpcHRpb24oXCJEYXRhYnJpY2tzIGRldmVsb3BlciB0b29sczogd29ya3NwYWNlIGxpZmVjeWNsZSwgbW9kZWwgcHJveHksIEFwcEtpdCBlbnZcIilcbiAgICAuc2hvd0hlbHBBZnRlckVycm9yKClcbiAgICAuaGVscE9wdGlvbihcIi1oLCAtLWhlbHBcIiwgYFNob3cgJHtuYW1lfSBoZWxwYCk7XG5cbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiZGV2XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQm9vdHN0cmFwIG9yIHJlcGFpciBhIGRieC10b29scyB3b3Jrc3BhY2UsIHRoZW4gZm9yd2FyZCB0byBwcm9qZW5cIilcbiAgICAuYXJndW1lbnQoXCJbcHJvamVuQXJncy4uLl1cIiwgXCJwcm9qZW4gdGFzayBhbmQgYXJndW1lbnRzIChlLmcuIHN5bmMgLS13YXRjaClcIilcbiAgICAuYWxsb3dVbmtub3duT3B0aW9uKClcbiAgICAuYWxsb3dFeGNlc3NBcmd1bWVudHMoKVxuICAgIC5oZWxwT3B0aW9uKGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKHByb2plbkFyZ3M6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBhd2FpdCBwcmVwYXJlQW5kUnVuUHJvamVuKHByb2plbkFyZ3MpO1xuICAgIH0pO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcIm1vZGVsLXByb3h5XCIsXG4gICAgXCJTZXJ2ZSBhIGxvY2FsIE9wZW5BSS1jb21wYXRpYmxlIHByb3h5IGluIGZyb250IG9mIERhdGFicmlja3MgTW9kZWwgU2VydmluZ1wiLFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBpbXBvcnQoXCJAZGJ4LXRvb2xzL2NsaS1tb2RlbC1wcm94eS9jbGlcIikpLmJ1aWxkUHJvZ3JhbSxcbiAgKTtcblxuICBhZGRGb3J3YXJkZWRDb21tYW5kKFxuICAgIHByb2dyYW0sXG4gICAgXCJhcHBraXRcIixcbiAgICBcIkFwcEtpdCBoZWxwZXJzIChlbnY6IHByaW50IHRoZSBlbnZpcm9ubWVudCBhbiBBcHBLaXQgYXBwIHJlc29sdmVzKVwiLFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBpbXBvcnQoXCJAZGJ4LXRvb2xzL2NsaS1hcHBraXQtZW52L2NsaVwiKSkuYnVpbGRQcm9ncmFtLFxuICApO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcInR1bm5lbFwiLFxuICAgIFwiUnVuIGEgcHVibGljIHBvcnRyIHR1bm5lbCB3aXRoIGFuIGVtYWlsLU9UUCBnYXRlXCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLXR1bm5lbC9jbGlcIikpLmJ1aWxkUHJvZ3JhbSxcbiAgKTtcblxuICByZXR1cm4gcHJvZ3JhbTtcbn1cblxuLyoqXG4gKiBQcm9ncmFtIG5hbWUgZm9yIGhlbHAgb3V0cHV0OiB3aGljaGV2ZXIgYmluIHRoZSB1c2VyIGFjdHVhbGx5IHR5cGVkLCBzb1xuICogYGRieC10b29scyAtLWhlbHBgIGRvZXNuJ3QgZG9jdW1lbnQgaXRzZWxmIGFzIGBkYnhgLiBGYWxscyBiYWNrIHRvIGBkYnhgLlxuICovXG5mdW5jdGlvbiBwcm9ncmFtTmFtZShhcmd2OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGludm9rZWQgPSBhcmd2WzFdID8gYmFzZW5hbWUoYXJndlsxXSkucmVwbGFjZSgvXFwuKD86W2NtXT9banRdcykkLywgXCJcIikgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBQUk9HUkFNX05BTUVTLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBpbnZva2VkKSA/PyBQUk9HUkFNX05BTUVTWzBdO1xufVxuXG4vKiogUGFyc2UgYGFyZ3ZgIChhIGBwcm9jZXNzLmFyZ3ZgKSBhbmQgcnVuIHRoZSBtYXRjaGluZyBjb21tYW5kLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNsaShhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZFByb2dyYW0ocHJvZ3JhbU5hbWUoYXJndikpLnBhcnNlQXN5bmMoYXJndik7XG59XG4iXX0=
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixhQUFhLEdBQ2QsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU5RSxzRUFBc0U7QUFDdEUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFVLENBQUM7QUFFcEQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsVUFBb0IsRUFBRSxRQUFpQjtJQUMvRSxNQUFNLElBQUksR0FBRyxNQUFNLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDekIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsT0FBTztJQUNULENBQUM7SUFDRCxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUIsT0FBTztJQUNULENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxJQUFJ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UyxDQUFDO0lBQ3pGLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUFDLElBQWM7SUFDekMsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBzaW5nbGUgYGRieGAgKGFsaWFzIGBkYngtdG9vbHNgKSBjb21tYW5kZXIgZW50cnkuXG4gKlxuICogT25lIGJpbiwgZml2ZSBjb21tYW5kIGdyb3VwczpcbiAqICAgLSBgZGV2YCAtIHdvcmtzcGFjZSBsaWZlY3ljbGU6IGRldGVjdCB0aGUgcm9vdCwgYm9vdHN0cmFwIG9yIHJlcGFpciwgdGhlblxuICogICAgIGZvcndhcmQgd2hhdGV2ZXIgZm9sbG93cyB0byBwcm9qZW4uIFRoaXMgaXMgdGhlIHBhc3N0aHJvdWdoLCBhbmQgaXQgaXMgYW5cbiAqICAgICBFWFBMSUNJVCBzdWJjb21tYW5kIHJhdGhlciB0aGFuIHRoZSBiYXJlIHJvb3QgYWN0aW9uIHNvIGEgcHJvamVuIHRhc2tcbiAqICAgICBuYW1lIGNhbiBuZXZlciBzaGFkb3cgKG9yIGJlIHNoYWRvd2VkIGJ5KSBhIHNpYmxpbmcgY29tbWFuZC5cbiAqICAgLSBgbW9kZWwtcHJveHlgIC0gdGhlIGxvY2FsIE9wZW5BSS1jb21wYXRpYmxlIE1vZGVsIFNlcnZpbmcgcHJveHkuXG4gKiAgIC0gYGFwcGtpdGAgLSBBcHBLaXQgZW52aXJvbm1lbnQgaGVscGVycyAoYGFwcGtpdCBlbnZgKS5cbiAqICAgLSBgdHVubmVsYCAtIHB1YmxpYyBwb3J0ciB0dW5uZWwgd2l0aCBwYXNzd29yZGxlc3MgYWNjZXNzIGdhdGluZy5cbiAqICAgLSBgdG9rZW5gIC0gbG9jYWwgcHJvdmlkZXIgYWNjZXNzLXRva2VuIGJyb2tlci5cbiAqXG4gKiBUaGUgZm91ciBmZWF0dXJlIGdyb3VwcyBzdGF5IGluIHNpYmxpbmcgcGFja2FnZXMgYW5kIGFyZSBgYXdhaXQgaW1wb3J0KClgZWRcbiAqIG9ubHkgb25jZSB0aGVpciBuYW1lIGlzIG1hdGNoZWQsIHNvIGBkYnggZGV2YCBuZXZlciBsb2FkcyB0aGUgRGF0YWJyaWNrcyBTREssXG4gKiBBcHBLaXQsIHR1bm5lbCwgb3IgdG9rZW4tYnJva2VyIGRlcGVuZGVuY2llcy4gVGhhdCBsYXp5IGhvcCBpcyBhbHNvIHdoeSB0aGV5XG4gKiBhcmUgbW91bnRlZCBhcyBBUkctRk9SV0FSRElORyBjb21tYW5kcyBpbnN0ZWFkIG9mXG4gKiBgYWRkQ29tbWFuZCgpYDogYnVpbGRpbmcgYSBjaGlsZCBwcm9ncmFtIGVhZ2VybHkgdG8gcmVnaXN0ZXIgaXQgd291bGQgZGVmZWF0XG4gKiB0aGUgcG9pbnQuIEVhY2ggZm9yd2FyZHMgaXRzIG93biBgLS1oZWxwYCwgc28gdGhlIGNoaWxkIHByaW50cyBpdHMgcmVhbCBoZWxwLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgYmFzZW5hbWUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHtcbiAgYm9vdHN0cmFwV29ya3NwYWNlLFxuICBlbnN1cmVFbmdpbmVDdXJyZW50LFxuICBydW5Jbml0aWFsU3ludGgsXG4gIHNlZWRUb29sY2hhaW4sXG59IGZyb20gXCIuL2Jvb3RzdHJhcC50c1wiO1xuaW1wb3J0IHsgZW5zdXJlV29ya3NwYWNlUmVhZHksIHJ1bkJ1biwgcnVuUHJvamVuIH0gZnJvbSBcIi4vYnVuLnRzXCI7XG5pbXBvcnQgeyBmaW5kV29ya3NwYWNlUm9vdCwgbmVlZHNCb290c3RyYXAsIG5lZWRzVG9vbGNoYWluIH0gZnJvbSBcIi4vcm9vdC50c1wiO1xuXG4vKiogQ29tbWFuZHMgdGhlIGJpbiBleHBvc2VzLCBhbmQgdGhlIG5hbWVzIGhlbHAgaXMgcmVuZGVyZWQgdW5kZXIuICovXG5jb25zdCBQUk9HUkFNX05BTUVTID0gW1wiZGJ4XCIsIFwiZGJ4LXRvb2xzXCJdIGFzIGNvbnN0O1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIHdvcmtzcGFjZSBhdCBgcm9vdGAsIHRoZW4gcnVuIHByb2plbiAodmlhIGJ1bikgd2l0aCBgcHJvamVuQXJnc2AuXG4gKlxuICogVGhyZWUgY2FzZXMsIGluIG9yZGVyOlxuICogICAtIG5vIGAucHJvamVucmMudHNgIGF0IGFsbCAtPiBmdWxsIGJvb3RzdHJhcCAoc2NhZmZvbGQgKyBpbnN0YWxsICsgc3ludGgpLFxuICogICAgIHdoaWNoIGFscmVhZHkgcnVucyB0aGUgaW5pdGlhbCBzeW50aDsgbm90aGluZyBtb3JlIHRvIGZvcndhcmQuXG4gKiAgIC0gYSBgLnByb2plbnJjLnRzYCBidXQgdGhlIGVuZ2luZS90b29sY2hhaW4gaXNuJ3QgaW5zdGFsbGVkIChlLmcuIGEgZnJlc2hseVxuICogICAgIGNvcGllZCBwcm9qZWN0IHdob3NlIGdlbmVyYXRlZCBmaWxlcyArIG1hbmlmZXN0cyBhcmUgZ2l0aWdub3JlZCkgLT4gc2VlZFxuICogICAgIHRoZSB0b29sY2hhaW4sIHRoZW4gcnVuIHRoZSBJTklUSUFMIHN5bnRoIGRpcmVjdGx5ICh0aGUgcHJvamVuIHRhc2tzIHRoZVxuICogICAgIGFyZ3Mgd291bGQgbmFtZSwgbGlrZSBgc3luY2AsIGRvbid0IGV4aXN0IHVudGlsIGAucHJvamVucmMudHNgIGhhcyBydW5cbiAqICAgICBvbmNlKSwgYW5kIGluc3RhbGwuIERvbid0IGZvcndhcmQgYHByb2plbkFyZ3NgIC0gdGhlIHN5bnRoIGlzIHRoZSB3b3JrLlxuICogICAtIG90aGVyd2lzZSAoZXN0YWJsaXNoZWQgd29ya3NwYWNlKSAtPiBlbnN1cmUgZGVwcywgYnJpbmcgdGhlIGVuZ2luZSB1cCB0b1xuICogICAgIHRoaXMgQ0xJJ3MgdmVyc2lvbiwgdGhlbiBmb3J3YXJkIHRvIHByb2plbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVBbmRSdW5Qcm9qZW4ocHJvamVuQXJnczogc3RyaW5nW10sIHN0YXJ0RGlyPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJvb3QgPSBhd2FpdCBmaW5kV29ya3NwYWNlUm9vdChzdGFydERpcik7XG4gIGlmIChuZWVkc0Jvb3RzdHJhcChyb290KSkge1xuICAgIGJvb3RzdHJhcFdvcmtzcGFjZShyb290KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG5lZWRzVG9vbGNoYWluKHJvb3QpKSB7XG4gICAgc2VlZFRvb2xjaGFpbihyb290KTtcbiAgICBydW5Jbml0aWFsU3ludGgocm9vdCk7XG4gICAgcnVuQnVuKFtcImluc3RhbGxcIl0sIHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuICBlbnN1cmVXb3Jrc3BhY2VSZWFkeShyb290KTtcbiAgZW5zdXJlRW5naW5lQ3VycmVudChyb290KTtcbiAgcnVuUHJvamVuKHByb2plbkFyZ3MsIHJvb3QpO1xufVxuXG4vKipcbiAqIE1vdW50IGBuYW1lYCBhcyBhIGNvbW1hbmQgdGhhdCBjYXB0dXJlcyBldmVyeSBmb2xsb3dpbmcgdG9rZW4gdmVyYmF0aW0gYW5kXG4gKiBoYW5kcyBpdCB0byB0aGUgcHJvZ3JhbSBgbG9hZCgpYCByZXNvbHZlcy4gYGhlbHBPcHRpb24oZmFsc2UpYCBpcyB3aGF0IGxldHNcbiAqIGAtLWhlbHBgIHRocm91Z2ggdG8gdGhlIGNoaWxkIGluc3RlYWQgb2YgYmVpbmcgYW5zd2VyZWQgaGVyZSwgYW5kIHRoZSBjaGlsZFxuICogcHJvZ3JhbSBvd25zIGl0cyBvd24gZmxhZ3MsIHNvIHRoaXMgd3JhcHBlciBuZXZlciBoYXMgdG8gcmVzdGF0ZSB0aGVtLlxuICovXG5mdW5jdGlvbiBhZGRGb3J3YXJkZWRDb21tYW5kKFxuICBwcm9ncmFtOiBDb21tYW5kLFxuICBuYW1lOiBzdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gIGxvYWQ6ICgpID0+IFByb21pc2U8KG5hbWU6IHN0cmluZykgPT4gQ29tbWFuZD4sXG4pOiB2b2lkIHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKG5hbWUpXG4gICAgLmRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKVxuICAgIC5hcmd1bWVudChcIlthcmdzLi4uXVwiLCBgYXJndW1lbnRzIGZvcndhcmRlZCB0byAke25hbWV9YClcbiAgICAuYWxsb3dVbmtub3duT3B0aW9uKClcbiAgICAuYWxsb3dFeGNlc3NBcmd1bWVudHMoKVxuICAgIC5oZWxwT3B0aW9uKGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKGFyZ3M6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBjb25zdCBidWlsZFByb2dyYW0gPSBhd2FpdCBsb2FkKCk7XG4gICAgICBhd2FpdCBidWlsZFByb2dyYW0oYCR7cHJvZ3JhbS5uYW1lKCl9ICR7bmFtZX1gKS5wYXJzZUFzeW5jKGFyZ3MsIHsgZnJvbTogXCJ1c2VyXCIgfSk7XG4gICAgfSk7XG59XG5cbi8qKiBCdWlsZCB0aGUgYGRieGAgY29tbWFuZGVyIHByb2dyYW0gKG5vIHNpZGUgZWZmZWN0cyB1bnRpbCBwYXJzZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJvZ3JhbShuYW1lOiBzdHJpbmcgPSBQUk9HUkFNX05BTUVTWzBdKTogQ29tbWFuZCB7XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUobmFtZSlcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIkRhdGFicmlja3MgZGV2ZWxvcGVyIHRvb2xzOiB3b3Jrc3BhY2UgbGlmZWN5Y2xlLCBtb2RlbCBwcm94eSwgQXBwS2l0IGVudiwgdHVubmVsLCBhbmQgdG9rZW4gYnJva2VyXCIsXG4gICAgKVxuICAgIC5zaG93SGVscEFmdGVyRXJyb3IoKVxuICAgIC5oZWxwT3B0aW9uKFwiLWgsIC0taGVscFwiLCBgU2hvdyAke25hbWV9IGhlbHBgKTtcblxuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJkZXZcIilcbiAgICAuZGVzY3JpcHRpb24oXCJCb290c3RyYXAgb3IgcmVwYWlyIGEgZGJ4LXRvb2xzIHdvcmtzcGFjZSwgdGhlbiBmb3J3YXJkIHRvIHByb2plblwiKVxuICAgIC5hcmd1bWVudChcIltwcm9qZW5BcmdzLi4uXVwiLCBcInByb2plbiB0YXNrIGFuZCBhcmd1bWVudHMgKGUuZy4gc3luYyAtLXdhdGNoKVwiKVxuICAgIC5hbGxvd1Vua25vd25PcHRpb24oKVxuICAgIC5hbGxvd0V4Y2Vzc0FyZ3VtZW50cygpXG4gICAgLmhlbHBPcHRpb24oZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAocHJvamVuQXJnczogc3RyaW5nW10pID0+IHtcbiAgICAgIGF3YWl0IHByZXBhcmVBbmRSdW5Qcm9qZW4ocHJvamVuQXJncyk7XG4gICAgfSk7XG5cbiAgYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgICBwcm9ncmFtLFxuICAgIFwibW9kZWwtcHJveHlcIixcbiAgICBcIlNlcnZlIGEgbG9jYWwgT3BlbkFJLWNvbXBhdGlibGUgcHJveHkgaW4gZnJvbnQgb2YgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nXCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLW1vZGVsLXByb3h5L2NsaVwiKSkuYnVpbGRQcm9ncmFtLFxuICApO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcImFwcGtpdFwiLFxuICAgIFwiQXBwS2l0IGhlbHBlcnMgKGVudjogcHJpbnQgdGhlIGVudmlyb25tZW50IGFuIEFwcEtpdCBhcHAgcmVzb2x2ZXMpXCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLWFwcGtpdC1lbnYvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgICBwcm9ncmFtLFxuICAgIFwidHVubmVsXCIsXG4gICAgXCJSdW4gYSBwdWJsaWMgcG9ydHIgdHVubmVsIHdpdGggYW4gZW1haWwtT1RQIGdhdGVcIixcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9jbGktdHVubmVsL2NsaVwiKSkuYnVpbGRQcm9ncmFtLFxuICApO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcInRva2VuXCIsXG4gICAgXCJCcm9rZXIgc2hvcnQtbGl2ZWQgcHJvdmlkZXIgYWNjZXNzIHRva2VucyBmb3IgbG9jYWwgZGV2ZWxvcG1lbnRcIixcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9jbGktdG9rZW4vY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgcmV0dXJuIHByb2dyYW07XG59XG5cbi8qKlxuICogUHJvZ3JhbSBuYW1lIGZvciBoZWxwIG91dHB1dDogd2hpY2hldmVyIGJpbiB0aGUgdXNlciBhY3R1YWxseSB0eXBlZCwgc29cbiAqIGBkYngtdG9vbHMgLS1oZWxwYCBkb2Vzbid0IGRvY3VtZW50IGl0c2VsZiBhcyBgZGJ4YC4gRmFsbHMgYmFjayB0byBgZGJ4YC5cbiAqL1xuZnVuY3Rpb24gcHJvZ3JhbU5hbWUoYXJndjogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBpbnZva2VkID0gYXJndlsxXSA/IGJhc2VuYW1lKGFyZ3ZbMV0pLnJlcGxhY2UoL1xcLig/OltjbV0/W2p0XXMpJC8sIFwiXCIpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gUFJPR1JBTV9OQU1FUy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSA9PT0gaW52b2tlZCkgPz8gUFJPR1JBTV9OQU1FU1swXTtcbn1cblxuLyoqIFBhcnNlIGBhcmd2YCAoYSBgcHJvY2Vzcy5hcmd2YCkgYW5kIHJ1biB0aGUgbWF0Y2hpbmcgY29tbWFuZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5DbGkoYXJndjogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRQcm9ncmFtKHByb2dyYW1OYW1lKGFyZ3YpKS5wYXJzZUFzeW5jKGFyZ3YpO1xufVxuIl19
package/package.json CHANGED
@@ -28,11 +28,12 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "@clack/prompts": "^1.7.0",
31
- "@dbx-tools/cli-appkit-env": "0.6.131",
32
- "@dbx-tools/cli-model-proxy": "0.6.131",
33
- "@dbx-tools/cli-tunnel": "0.6.131",
34
- "@dbx-tools/core": "0.6.131",
35
- "@dbx-tools/shared-core": "0.6.131",
31
+ "@dbx-tools/cli-appkit-env": "0.6.133",
32
+ "@dbx-tools/cli-model-proxy": "0.6.133",
33
+ "@dbx-tools/cli-token": "0.6.133",
34
+ "@dbx-tools/cli-tunnel": "0.6.133",
35
+ "@dbx-tools/core": "0.6.133",
36
+ "@dbx-tools/shared-core": "0.6.133",
36
37
  "commander": "^15.0.0"
37
38
  },
38
39
  "main": "./lib/index.js",
@@ -69,7 +70,7 @@
69
70
  "./package.json": "./package.json"
70
71
  }
71
72
  },
72
- "version": "0.6.131",
73
+ "version": "0.6.133",
73
74
  "types": "./lib/index.d.ts",
74
75
  "type": "module",
75
76
  "exports": {
package/src/cli.ts CHANGED
@@ -1,18 +1,20 @@
1
1
  /**
2
2
  * The single `dbx` (alias `dbx-tools`) commander entry.
3
3
  *
4
- * One bin, three command groups:
4
+ * One bin, five command groups:
5
5
  * - `dev` - workspace lifecycle: detect the root, bootstrap or repair, then
6
6
  * forward whatever follows to projen. This is the passthrough, and it is an
7
7
  * EXPLICIT subcommand rather than the bare root action so a projen task
8
8
  * name can never shadow (or be shadowed by) a sibling command.
9
9
  * - `model-proxy` - the local OpenAI-compatible Model Serving proxy.
10
10
  * - `appkit` - AppKit environment helpers (`appkit env`).
11
+ * - `tunnel` - public portr tunnel with passwordless access gating.
12
+ * - `token` - local provider access-token broker.
11
13
  *
12
- * The two feature groups stay in their own packages (`@dbx-tools/cli-model-proxy`,
13
- * `@dbx-tools/cli-appkit-env`) and are `await import()`ed only once their name is
14
- * matched, so `dbx dev` never loads the Databricks SDK or AppKit. That lazy hop
15
- * is also why they are mounted as ARG-FORWARDING commands instead of
14
+ * The four feature groups stay in sibling packages and are `await import()`ed
15
+ * only once their name is matched, so `dbx dev` never loads the Databricks SDK,
16
+ * AppKit, tunnel, or token-broker dependencies. That lazy hop is also why they
17
+ * are mounted as ARG-FORWARDING commands instead of
16
18
  * `addCommand()`: building a child program eagerly to register it would defeat
17
19
  * the point. Each forwards its own `--help`, so the child prints its real help.
18
20
  *
@@ -92,7 +94,9 @@ function addForwardedCommand(
92
94
  export function buildProgram(name: string = PROGRAM_NAMES[0]): Command {
93
95
  const program = new Command()
94
96
  .name(name)
95
- .description("Databricks developer tools: workspace lifecycle, model proxy, AppKit env")
97
+ .description(
98
+ "Databricks developer tools: workspace lifecycle, model proxy, AppKit env, tunnel, and token broker",
99
+ )
96
100
  .showHelpAfterError()
97
101
  .helpOption("-h, --help", `Show ${name} help`);
98
102
 
@@ -128,6 +132,13 @@ export function buildProgram(name: string = PROGRAM_NAMES[0]): Command {
128
132
  async () => (await import("@dbx-tools/cli-tunnel/cli")).buildProgram,
129
133
  );
130
134
 
135
+ addForwardedCommand(
136
+ program,
137
+ "token",
138
+ "Broker short-lived provider access tokens for local development",
139
+ async () => (await import("@dbx-tools/cli-token/cli")).buildProgram,
140
+ );
141
+
131
142
  return program;
132
143
  }
133
144