@dbx-tools/appkit-model-gateway 0.9.128 → 0.9.131

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
@@ -28,6 +28,11 @@ Use the standalone CLI when a tool expects an OpenAI-compatible base URL:
28
28
  dbx model-gateway --profile PROFILE --port 4000
29
29
  ```
30
30
 
31
+ Add `--prefer-system-models` to route non-exact Responses requests, including
32
+ Codex traffic, through `system.ai.*` AI Gateway services instead of workspace
33
+ serving endpoints. Codex model slugs follow the same choice. The flag defaults to
34
+ off, and an exact endpoint id or `system.ai.*` name always wins.
35
+
31
36
  Configure the client with `http://127.0.0.1:4000/v1`. For an embedded AppKit
32
37
  route, use the app origin plus `/api/model-gateway/v1`.
33
38
 
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/appkit-model-gateway";
6
- export const PACKAGE_VERSION = "0.9.128";
6
+ export const PACKAGE_VERSION = "0.9.131";
7
7
  export * as gateway from "./src/gateway.ts";
8
8
  export * as models from "./src/models.ts";
9
9
  export * as plugin from "./src/plugin.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
2
- export declare const PACKAGE_VERSION = "0.9.128";
2
+ export declare const PACKAGE_VERSION = "0.9.131";
3
3
  export * as gateway from "./src/gateway.ts";
4
4
  export * as models from "./src/models.ts";
5
5
  export * as plugin from "./src/plugin.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
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/appkit-model-gateway";
5
- export const PACKAGE_VERSION = "0.9.128";
5
+ export const PACKAGE_VERSION = "0.9.131";
6
6
  export * as gateway from "./src/gateway.js";
7
7
  export * as models from "./src/models.js";
8
8
  export * as plugin from "./src/plugin.js";
@@ -16,4 +16,4 @@ export { ModelGatewayError, ModelGateway } from "./src/gateway.js";
16
16
  export { ModelGatewayPlugin, modelGateway } from "./src/plugin.js";
17
17
  export { DatabricksModelRegistry } from "./src/registry.js";
18
18
  export { UnsupportedGatewayFeatureError } from "./src/router.js";
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tb2RlbC1nYXRld2F5XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTI4XCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHJlYXNvbmluZ0FkYXB0IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCAqIGFzIHJlZ2lzdHJ5IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVyIGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlcyBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvdHJhbnNsYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zcG9ydCBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlFcnJvciwgTW9kZWxHYXRld2F5IH0gZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlQbHVnaW4sIG1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZGFwdGVkSW5mZXJlbmNlQm9keSB9IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCB7IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5IH0gZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucywgTW9kZWxSZWdpc3RyeSwgTW9kZWxSZWdpc3RyeU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB7IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvciB9IGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1RyYW5zcG9ydFJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG4iXX0=
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tb2RlbC1nYXRld2F5XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTMxXCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHJlYXNvbmluZ0FkYXB0IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCAqIGFzIHJlZ2lzdHJ5IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVyIGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlcyBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvdHJhbnNsYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zcG9ydCBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlFcnJvciwgTW9kZWxHYXRld2F5IH0gZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlQbHVnaW4sIG1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZGFwdGVkSW5mZXJlbmNlQm9keSB9IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCB7IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5IH0gZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucywgTW9kZWxSZWdpc3RyeSwgTW9kZWxSZWdpc3RyeU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB7IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvciB9IGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1RyYW5zcG9ydFJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG4iXX0=
@@ -12,6 +12,7 @@ export interface ModelGatewayOptions {
12
12
  readonly overrides?: readonly ModelCapabilityOverride[];
13
13
  readonly model?: string;
14
14
  readonly modelClass?: ModelClassType;
15
+ readonly preferSystemModels?: boolean;
15
16
  }
16
17
  /** Error carrying an HTTP status and protocol-safe message. */
17
18
  export declare class ModelGatewayError extends Error {
@@ -23,6 +24,7 @@ export declare class ModelGateway {
23
24
  private readonly registry;
24
25
  private readonly model?;
25
26
  private readonly modelClass?;
27
+ private readonly preferSystemModels;
26
28
  constructor(options?: ModelGatewayOptions, registry?: ModelRegistry);
27
29
  /** Return the live OpenAI model list, including Codex metadata when requested. */
28
30
  models(originator?: string, search?: string): Promise<ModelListResponse>;
@@ -26,14 +26,19 @@ export class ModelGateway {
26
26
  registry;
27
27
  model;
28
28
  modelClass;
29
+ preferSystemModels;
29
30
  constructor(options = {}, registry) {
30
31
  const registryOptions = {
31
32
  ...(options.cacheTtlMs !== undefined ? { ttlMs: options.cacheTtlMs } : {}),
32
33
  ...(options.overrides ? { overrides: options.overrides } : {}),
34
+ ...(options.preferSystemModels !== undefined
35
+ ? { preferSystemModels: options.preferSystemModels }
36
+ : {}),
33
37
  };
34
38
  this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
35
39
  this.model = options.model;
36
40
  this.modelClass = options.modelClass;
41
+ this.preferSystemModels = options.preferSystemModels ?? false;
37
42
  }
38
43
  /** Return the live OpenAI model list, including Codex metadata when requested. */
39
44
  async models(originator, search) {
@@ -42,7 +47,7 @@ export class ModelGateway {
42
47
  const query = search?.trim();
43
48
  const targets = query ? await this.registry.search(query) : await this.registry.list();
44
49
  logger.debug("listed models", { codex, count: targets.length });
45
- return listModelsPayload(targets, codex, query !== undefined && query.length > 0);
50
+ return listModelsPayload(targets, codex, query !== undefined && query.length > 0, this.preferSystemModels);
46
51
  }
47
52
  /** Resolve and execute one inference request. */
48
53
  async inference(protocol, body, headers, signal) {
@@ -69,11 +74,11 @@ export class ModelGateway {
69
74
  ? `Model not found: ${selection.model}`
70
75
  : "No model matches the requested class");
71
76
  }
72
- const requestedModel = selection.model ?? target.id;
73
77
  const route = resolveRoute({
74
78
  clientProtocol: protocol,
75
- requestedModel,
79
+ ...(selection.model ? { requestedModel: selection.model } : {}),
76
80
  originator: headers.get("originator") ?? undefined,
81
+ preferSystemModels: this.preferSystemModels,
77
82
  features,
78
83
  target,
79
84
  });
@@ -162,4 +167,4 @@ function logResponse(upstreamProtocol, model, response) {
162
167
  else
163
168
  logger.warn("upstream request failed", details);
164
169
  }
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FFakIsTUFBTSx5QkFBeUIsQ0FBQztBQVFqQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUYsT0FBTyxFQUNMLHVCQUF1QixHQUd4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFVbEQsK0RBQStEO0FBQy9ELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBRS9CO0lBRFgsWUFDVyxNQUFjLEVBQ3ZCLE9BQWU7UUFFZixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFITixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBSXZCLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sT0FBTyxZQUFZO0lBQ04sUUFBUSxDQUFnQjtJQUN4QixLQUFLLENBQVU7SUFDZixVQUFVLENBQWtCO0lBRTdDLFlBQVksVUFBK0IsRUFBRSxFQUFFLFFBQXdCO1FBQ3JFLE1BQU0sZUFB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QUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByb3RvY29sLWluZGVwZW5kZW50IGdhdGV3YXkgc2VydmljZSB1c2VkIGJ5IHBsdWdpbiBhbmQgc3RhbmRhbG9uZSByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICBNb2RlbENsYXNzU2NoZW1hLFxuICB0eXBlIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1R5cGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuICBDbGllbnRQcm90b2NvbCxcbiAgR2F0ZXdheVJvdXRlLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxMaXN0UmVzcG9uc2UsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmltcG9ydCB7IGxpc3RNb2RlbHNQYXlsb2FkIH0gZnJvbSBcIi4vbW9kZWxzLnRzXCI7XG5pbXBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5pbXBvcnQge1xuICBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgaXNDb2RleE9yaWdpbmF0b3IsIHJlcXVlc3RlZEZlYXR1cmVzLCByZXNvbHZlUm91dGUgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vdHJhbnNsYXRpb24udHNcIjtcbmltcG9ydCB7IGZldGNoRGF0YWJyaWNrcywgZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyB9IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXlcIik7XG5cbi8qKiBNb2RlbCBnYXRld2F5IHJ1bnRpbWUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNhY2hlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGU7XG59XG5cbi8qKiBFcnJvciBjYXJyeWluZyBhbiBIVFRQIHN0YXR1cyBhbmQgcHJvdG9jb2wtc2FmZSBtZXNzYWdlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBzdGF0dXM6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiTW9kZWxHYXRld2F5RXJyb3JcIjtcbiAgfVxufVxuXG4vKiogQXBwS2l0LXNjb3BlZCBtb2RlbCBnYXRld2F5IHdpdGggZHluYW1pYyBtb2RlbCBkaXNjb3ZlcnkgYW5kIHN0cmVhbWluZyBpbmZlcmVuY2UuICovXG5leHBvcnQgY2xhc3MgTW9kZWxHYXRld2F5IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeTogTW9kZWxSZWdpc3RyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGU7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9LCByZWdpc3RyeT86IE1vZGVsUmVnaXN0cnkpIHtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge1xuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVUdGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogb3B0aW9ucy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5vdmVycmlkZXMgPyB7IG92ZXJyaWRlczogb3B0aW9ucy5vdmVycmlkZXMgfSA6IHt9KSxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeSA/PyBuZXcgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgICB0aGlzLm1vZGVsID0gb3B0aW9ucy5tb2RlbDtcbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBvcHRpb25zLm1vZGVsQ2xhc3M7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhvcmlnaW5hdG9yPzogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgcXVlcnkgPSBzZWFyY2g/LnRyaW0oKTtcbiAgICBjb25zdCB0YXJnZXRzID0gcXVlcnkgPyBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnNlYXJjaChxdWVyeSkgOiBhd2FpdCB0aGlzLnJlZ2lzdHJ5Lmxpc3QoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgbW9kZWxzXCIsIHsgY29kZXgsIGNvdW50OiB0YXJnZXRzLmxlbmd0aCB9KTtcbiAgICByZXR1cm4gbGlzdE1vZGVsc1BheWxvYWQodGFyZ2V0cywgY29kZXgsIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgcXVlcnkubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBhbmQgZXhlY3V0ZSBvbmUgaW5mZXJlbmNlIHJlcXVlc3QuICovXG4gIGFzeW5jIGluZmVyZW5jZShcbiAgICBwcm90b2NvbDogQ2xpZW50UHJvdG9jb2wsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHNhbml0aXplZEJvZHkgPSBzYW5pdGl6ZUluZmVyZW5jZUJvZHkoYm9keSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICAgICAgc2FuaXRpemVkQm9keSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB7XG4gICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLm1vZGVsQ2xhc3MsXG4gICAgICB9LFxuICAgICAgcHJvdG9jb2wsXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZpbmcgcmVxdWVzdFwiLCB7XG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogc2VsZWN0aW9uLm1vZGVsLFxuICAgICAgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiBzYW5pdGl6ZWRCb2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcXVlc3RlZEZlYXR1cmVzKHNhbml0aXplZEJvZHkpO1xuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMucmVnaXN0cnkucmVzb2x2ZShzZWxlY3Rpb24ubW9kZWwsIHtcbiAgICAgIC4uLihwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiID8geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9IDoge30pLFxuICAgICAgLi4uKHNlbGVjdGlvbi5tb2RlbENsYXNzID8geyBtb2RlbENsYXNzOiBzZWxlY3Rpb24ubW9kZWxDbGFzcyB9IDoge30pLFxuICAgICAgLi4uKGZlYXR1cmVzLnRvb2xzID8geyByZXF1aXJlc1Rvb2xzOiB0cnVlIH0gOiB7fSksXG4gICAgfSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNDA0LFxuICAgICAgICBzZWxlY3Rpb24ubW9kZWxcbiAgICAgICAgICA/IGBNb2RlbCBub3QgZm91bmQ6ICR7c2VsZWN0aW9uLm1vZGVsfWBcbiAgICAgICAgICA6IFwiTm8gbW9kZWwgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIGNsYXNzXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ZWRNb2RlbCA9IHNlbGVjdGlvbi5tb2RlbCA/PyB0YXJnZXQuaWQ7XG4gICAgY29uc3Qgcm91dGUgPSByZXNvbHZlUm91dGUoe1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgcmVxdWVzdGVkTW9kZWwsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICB0YXJnZXQsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicm91dGVkXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiByb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWRhcHRlZCA9IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nKHRhcmdldC5pZCwgc2FuaXRpemVkQm9keSk7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCBhZGFwdGVkLmJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgY29uc3QgcmV0cnlCb2R5ID0gYXdhaXQgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5KHtcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICBib2R5OiBzYW5pdGl6ZWRCb2R5LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBwcmV2aW91c1dpcmVFZmZvcnQ6IGFkYXB0ZWQud2lyZUVmZm9ydCxcbiAgICB9KTtcbiAgICBpZiAocmV0cnlCb2R5KSB7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIHJldHJ5Qm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICB9XG5cbiAgICBsb2dSZXNwb25zZShyb3V0ZS51cHN0cmVhbVByb3RvY29sLCB0YXJnZXQuaWQsIHJlc3BvbnNlKTtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgY29uc3QgZm9yd2FyZGVkID0gZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgICBmb3J3YXJkZWQuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBmb3J3YXJkZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVmcmVzaCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIG1vZGVsIGNhdGFsb2d1ZVwiKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZvcndhcmQoXG4gICAgcm91dGU6IEdhdGV3YXlSb3V0ZSxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdChyb3V0ZSwgYm9keSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBhbiBleHBsaWNpdCBudWxsIHRlbXBlcmF0dXJlIHdoaWxlIHByZXNlcnZpbmcgb21pdHRlZCBhbmQgbnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoYm9keS50ZW1wZXJhdHVyZSAhPT0gbnVsbCkgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogUmVzb2x2ZSByZXF1ZXN0LCBoZWFkZXIsIGNvbmZpZ3VyZWQsIGFuZCBwcm90b2NvbCBtb2RlbC1zZWxlY3Rpb24gaW5wdXRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGV3YXlNb2RlbFNlbGVjdGlvbihcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICBoZWFkZXJzOiBIZWFkZXJzLFxuICBkZWZhdWx0czogeyByZWFkb25seSBtb2RlbD86IHN0cmluZzsgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlIH0gPSB7fSxcbiAgcHJvdG9jb2w/OiBDbGllbnRQcm90b2NvbCxcbik6IHsgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7IHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZSB9IHtcbiAgY29uc3QgbW9kZWwgPSB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiAmJiBib2R5Lm1vZGVsLnRyaW0oKSA/IGJvZHkubW9kZWwudHJpbSgpIDogdW5kZWZpbmVkO1xuICBjb25zdCBoZWFkZXIgPSBoZWFkZXJzLmdldChcIngtZGJ4LXRvb2xzLW1vZGVsLWNsYXNzXCIpPy50cmltKCk7XG4gIGNvbnN0IHBhcnNlZENsYXNzID0gaGVhZGVyID8gTW9kZWxDbGFzc1NjaGVtYS5zYWZlUGFyc2UoaGVhZGVyKSA6IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlZENsYXNzICYmICFwYXJzZWRDbGFzcy5zdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgYEludmFsaWQgbW9kZWwgY2xhc3M6ICR7aGVhZGVyfWApO1xuICB9XG4gIGlmIChtb2RlbCAmJiBwYXJzZWRDbGFzcz8uZGF0YSkge1xuICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwiTW9kZWwgYW5kIG1vZGVsIGNsYXNzIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIik7XG4gIH1cbiAgaWYgKG1vZGVsKSByZXR1cm4geyBtb2RlbCB9O1xuICBpZiAocGFyc2VkQ2xhc3M/LmRhdGEpIHJldHVybiB7IG1vZGVsQ2xhc3M6IHBhcnNlZENsYXNzLmRhdGEgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsKSByZXR1cm4geyBtb2RlbDogZGVmYXVsdHMubW9kZWwgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsQ2xhc3MpIHJldHVybiB7IG1vZGVsQ2xhc3M6IGRlZmF1bHRzLm1vZGVsQ2xhc3MgfTtcbiAgaWYgKHByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIpIHJldHVybiB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH07XG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gbG9nUmVzcG9uc2UodXBzdHJlYW1Qcm90b2NvbDogc3RyaW5nLCBtb2RlbDogc3RyaW5nLCByZXNwb25zZTogUmVzcG9uc2UpOiB2b2lkIHtcbiAgY29uc3QgZGV0YWlscyA9IHtcbiAgICBjb250ZW50VHlwZTogcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIiksXG4gICAgbW9kZWwsXG4gICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgdXBzdHJlYW1Qcm90b2NvbCxcbiAgfTtcbiAgaWYgKHJlc3BvbnNlLm9rKSBsb2dnZXIuZGVidWcoXCJ1cHN0cmVhbSByZXNwb25zZVwiLCBkZXRhaWxzKTtcbiAgZWxzZSBsb2dnZXIud2FybihcInVwc3RyZWFtIHJlcXVlc3QgZmFpbGVkXCIsIGRldGFpbHMpO1xufVxuIl19
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FFakIsTUFBTSx5QkFBeUIsQ0FBQztBQVFqQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUYsT0FBTyxFQUNMLHVCQUF1QixHQUd4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFXbEQsK0RBQStEO0FBQy9ELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBRS9CO0lBRFgsWUFDVyxNQUFjLEVBQ3ZCLE9BQWU7UUFFZixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFITixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBSXZCLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sT0FBTyxZQUFZO0lBQ04sUUFBUSxDQUFnQjtJQUN4QixLQUFLLENBQVU7SUFDZixVQUFVLENBQWtCO0lBQzVCLGtCQUFrQixDQUFVO0lBRTdDLFlBQVksVUFBK0IsRUFBRSxFQUFFLFFB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RSxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLGdCQUF3QixFQUFFLEtBQWEsRUFBRSxRQUFrQjtJQUM5RSxNQUFNLE9BQU8sR0FBRztRQUNkLFdBQVcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFDakQsS0FBSztRQUNMLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixnQkFBZ0I7S0FDakIsQ0FBQztJQUNGLElBQUksUUFBUSxDQUFDLEVBQUU7UUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDOztRQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByb3RvY29sLWluZGVwZW5kZW50IGdhdGV3YXkgc2VydmljZSB1c2VkIGJ5IHBsdWdpbiBhbmQgc3RhbmRhbG9uZSByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICBNb2RlbENsYXNzU2NoZW1hLFxuICB0eXBlIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1R5cGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuICBDbGllbnRQcm90b2NvbCxcbiAgR2F0ZXdheVJvdXRlLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxMaXN0UmVzcG9uc2UsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmltcG9ydCB7IGxpc3RNb2RlbHNQYXlsb2FkIH0gZnJvbSBcIi4vbW9kZWxzLnRzXCI7XG5pbXBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5pbXBvcnQge1xuICBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgaXNDb2RleE9yaWdpbmF0b3IsIHJlcXVlc3RlZEZlYXR1cmVzLCByZXNvbHZlUm91dGUgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vdHJhbnNsYXRpb24udHNcIjtcbmltcG9ydCB7IGZldGNoRGF0YWJyaWNrcywgZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyB9IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXlcIik7XG5cbi8qKiBNb2RlbCBnYXRld2F5IHJ1bnRpbWUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNhY2hlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGU7XG4gIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVscz86IGJvb2xlYW47XG59XG5cbi8qKiBFcnJvciBjYXJyeWluZyBhbiBIVFRQIHN0YXR1cyBhbmQgcHJvdG9jb2wtc2FmZSBtZXNzYWdlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBzdGF0dXM6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiTW9kZWxHYXRld2F5RXJyb3JcIjtcbiAgfVxufVxuXG4vKiogQXBwS2l0LXNjb3BlZCBtb2RlbCBnYXRld2F5IHdpdGggZHluYW1pYyBtb2RlbCBkaXNjb3ZlcnkgYW5kIHN0cmVhbWluZyBpbmZlcmVuY2UuICovXG5leHBvcnQgY2xhc3MgTW9kZWxHYXRld2F5IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeTogTW9kZWxSZWdpc3RyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsR2F0ZXdheU9wdGlvbnMgPSB7fSwgcmVnaXN0cnk/OiBNb2RlbFJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgcmVnaXN0cnlPcHRpb25zOiBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgICAgIC4uLihvcHRpb25zLmNhY2hlVHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsTXM6IG9wdGlvbnMuY2FjaGVUdGxNcyB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnMub3ZlcnJpZGVzID8geyBvdmVycmlkZXM6IG9wdGlvbnMub3ZlcnJpZGVzIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgcHJlZmVyU3lzdGVtTW9kZWxzOiBvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG4gICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5ID8/IG5ldyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeShyZWdpc3RyeU9wdGlvbnMpO1xuICAgIHRoaXMubW9kZWwgPSBvcHRpb25zLm1vZGVsO1xuICAgIHRoaXMubW9kZWxDbGFzcyA9IG9wdGlvbnMubW9kZWxDbGFzcztcbiAgICB0aGlzLnByZWZlclN5c3RlbU1vZGVscyA9IG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgbGl2ZSBPcGVuQUkgbW9kZWwgbGlzdCwgaW5jbHVkaW5nIENvZGV4IG1ldGFkYXRhIHdoZW4gcmVxdWVzdGVkLiAqL1xuICBhc3luYyBtb2RlbHMob3JpZ2luYXRvcj86IHN0cmluZywgc2VhcmNoPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbExpc3RSZXNwb25zZT4ge1xuICAgIGNvbnN0IGNvZGV4ID0gaXNDb2RleE9yaWdpbmF0b3Iob3JpZ2luYXRvcik7XG4gICAgbG9nZ2VyLmRlYnVnKFwibGlzdGluZyBtb2RlbHNcIiwgeyBjb2RleCwgc2VhcmNoIH0pO1xuICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoPy50cmltKCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IHF1ZXJ5ID8gYXdhaXQgdGhpcy5yZWdpc3RyeS5zZWFyY2gocXVlcnkpIDogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibGlzdGVkIG1vZGVsc1wiLCB7IGNvZGV4LCBjb3VudDogdGFyZ2V0cy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIGxpc3RNb2RlbHNQYXlsb2FkKFxuICAgICAgdGFyZ2V0cyxcbiAgICAgIGNvZGV4LFxuICAgICAgcXVlcnkgIT09IHVuZGVmaW5lZCAmJiBxdWVyeS5sZW5ndGggPiAwLFxuICAgICAgdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGFuZCBleGVjdXRlIG9uZSBpbmZlcmVuY2UgcmVxdWVzdC4gKi9cbiAgYXN5bmMgaW5mZXJlbmNlKFxuICAgIHByb3RvY29sOiBDbGllbnRQcm90b2NvbCxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkQm9keSA9IHNhbml0aXplSW5mZXJlbmNlQm9keShib2R5KTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBnYXRld2F5TW9kZWxTZWxlY3Rpb24oXG4gICAgICBzYW5pdGl6ZWRCb2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIHtcbiAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMubW9kZWxDbGFzcyxcbiAgICAgIH0sXG4gICAgICBwcm90b2NvbCxcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmluZyByZXF1ZXN0XCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiBzZWxlY3Rpb24ubW9kZWwsXG4gICAgICBtb2RlbENsYXNzOiBzZWxlY3Rpb24ubW9kZWxDbGFzcyxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBzdHJlYW06IHNhbml0aXplZEJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGZlYXR1cmVzID0gcmVxdWVzdGVkRmVhdHVyZXMoc2FuaXRpemVkQm9keSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5yZWdpc3RyeS5yZXNvbHZlKHNlbGVjdGlvbi5tb2RlbCwge1xuICAgICAgLi4uKHByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIgPyB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH0gOiB7fSksXG4gICAgICAuLi4oc2VsZWN0aW9uLm1vZGVsQ2xhc3MgPyB7IG1vZGVsQ2xhc3M6IHNlbGVjdGlvbi5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgICAuLi4oZmVhdHVyZXMudG9vbHMgPyB7IHJlcXVpcmVzVG9vbHM6IHRydWUgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKFxuICAgICAgICA0MDQsXG4gICAgICAgIHNlbGVjdGlvbi5tb2RlbFxuICAgICAgICAgID8gYE1vZGVsIG5vdCBmb3VuZDogJHtzZWxlY3Rpb24ubW9kZWx9YFxuICAgICAgICAgIDogXCJObyBtb2RlbCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgY2xhc3NcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHJvdXRlID0gcmVzb2x2ZVJvdXRlKHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIC4uLihzZWxlY3Rpb24ubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiBzZWxlY3Rpb24ubW9kZWwgfSA6IHt9KSxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICB0YXJnZXQsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicm91dGVkXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiByb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWRhcHRlZCA9IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nKHRhcmdldC5pZCwgc2FuaXRpemVkQm9keSk7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCBhZGFwdGVkLmJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgY29uc3QgcmV0cnlCb2R5ID0gYXdhaXQgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5KHtcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICBib2R5OiBzYW5pdGl6ZWRCb2R5LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBwcmV2aW91c1dpcmVFZmZvcnQ6IGFkYXB0ZWQud2lyZUVmZm9ydCxcbiAgICB9KTtcbiAgICBpZiAocmV0cnlCb2R5KSB7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIHJldHJ5Qm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICB9XG5cbiAgICBsb2dSZXNwb25zZShyb3V0ZS51cHN0cmVhbVByb3RvY29sLCB0YXJnZXQuaWQsIHJlc3BvbnNlKTtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgY29uc3QgZm9yd2FyZGVkID0gZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgICBmb3J3YXJkZWQuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBmb3J3YXJkZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVmcmVzaCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIG1vZGVsIGNhdGFsb2d1ZVwiKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZvcndhcmQoXG4gICAgcm91dGU6IEdhdGV3YXlSb3V0ZSxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdChyb3V0ZSwgYm9keSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBhbiBleHBsaWNpdCBudWxsIHRlbXBlcmF0dXJlIHdoaWxlIHByZXNlcnZpbmcgb21pdHRlZCBhbmQgbnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoYm9keS50ZW1wZXJhdHVyZSAhPT0gbnVsbCkgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogUmVzb2x2ZSByZXF1ZXN0LCBoZWFkZXIsIGNvbmZpZ3VyZWQsIGFuZCBwcm90b2NvbCBtb2RlbC1zZWxlY3Rpb24gaW5wdXRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGV3YXlNb2RlbFNlbGVjdGlvbihcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICBoZWFkZXJzOiBIZWFkZXJzLFxuICBkZWZhdWx0czogeyByZWFkb25seSBtb2RlbD86IHN0cmluZzsgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlIH0gPSB7fSxcbiAgcHJvdG9jb2w/OiBDbGllbnRQcm90b2NvbCxcbik6IHsgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7IHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZSB9IHtcbiAgY29uc3QgbW9kZWwgPSB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiAmJiBib2R5Lm1vZGVsLnRyaW0oKSA/IGJvZHkubW9kZWwudHJpbSgpIDogdW5kZWZpbmVkO1xuICBjb25zdCBoZWFkZXIgPSBoZWFkZXJzLmdldChcIngtZGJ4LXRvb2xzLW1vZGVsLWNsYXNzXCIpPy50cmltKCk7XG4gIGNvbnN0IHBhcnNlZENsYXNzID0gaGVhZGVyID8gTW9kZWxDbGFzc1NjaGVtYS5zYWZlUGFyc2UoaGVhZGVyKSA6IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlZENsYXNzICYmICFwYXJzZWRDbGFzcy5zdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgYEludmFsaWQgbW9kZWwgY2xhc3M6ICR7aGVhZGVyfWApO1xuICB9XG4gIGlmIChtb2RlbCAmJiBwYXJzZWRDbGFzcz8uZGF0YSkge1xuICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwiTW9kZWwgYW5kIG1vZGVsIGNsYXNzIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIik7XG4gIH1cbiAgaWYgKG1vZGVsKSByZXR1cm4geyBtb2RlbCB9O1xuICBpZiAocGFyc2VkQ2xhc3M/LmRhdGEpIHJldHVybiB7IG1vZGVsQ2xhc3M6IHBhcnNlZENsYXNzLmRhdGEgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsKSByZXR1cm4geyBtb2RlbDogZGVmYXVsdHMubW9kZWwgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsQ2xhc3MpIHJldHVybiB7IG1vZGVsQ2xhc3M6IGRlZmF1bHRzLm1vZGVsQ2xhc3MgfTtcbiAgaWYgKHByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIpIHJldHVybiB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH07XG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gbG9nUmVzcG9uc2UodXBzdHJlYW1Qcm90b2NvbDogc3RyaW5nLCBtb2RlbDogc3RyaW5nLCByZXNwb25zZTogUmVzcG9uc2UpOiB2b2lkIHtcbiAgY29uc3QgZGV0YWlscyA9IHtcbiAgICBjb250ZW50VHlwZTogcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIiksXG4gICAgbW9kZWwsXG4gICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgdXBzdHJlYW1Qcm90b2NvbCxcbiAgfTtcbiAgaWYgKHJlc3BvbnNlLm9rKSBsb2dnZXIuZGVidWcoXCJ1cHN0cmVhbSByZXNwb25zZVwiLCBkZXRhaWxzKTtcbiAgZWxzZSBsb2dnZXIud2FybihcInVwc3RyZWFtIHJlcXVlc3QgZmFpbGVkXCIsIGRldGFpbHMpO1xufVxuIl19
@@ -5,8 +5,8 @@
5
5
  */
6
6
  import type { CodexModelListResponse, ModelListResponse, ModelTarget, OpenAIModelListResponse } from "@dbx-tools/shared-model-gateway";
7
7
  /** Build the combined OpenAI and optional Codex model catalogue. */
8
- export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean): CodexModelListResponse;
9
- export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean): OpenAIModelListResponse;
10
- export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean): ModelListResponse;
11
- /** Codex `/v1/models` slug for a resolved gateway target. */
12
- export declare function codexModelSlug(target: ModelTarget): string;
8
+ export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean, preferSystemModels?: boolean): CodexModelListResponse;
9
+ export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean, preferSystemModels?: boolean): OpenAIModelListResponse;
10
+ export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean, preferSystemModels?: boolean): ModelListResponse;
11
+ /** Codex `/v1/models` slug: the `system.ai.*` service when preferred, else the endpoint id. */
12
+ export declare function codexModelSlug(target: ModelTarget, preferSystemModels: boolean): string;
package/lib/src/models.js CHANGED
@@ -15,7 +15,7 @@ const REASONING_DESCRIPTIONS = {
15
15
  xhigh: "Use an extra-high reasoning budget",
16
16
  max: "Use the largest available reasoning budget",
17
17
  };
18
- export function listModelsPayload(targets, includeCodex, preserveOrder = false) {
18
+ export function listModelsPayload(targets, includeCodex, preserveOrder = false, preferSystemModels = false) {
19
19
  const available = targets
20
20
  .filter((target) => target.endpoint?.status?.deprecated !== true)
21
21
  .filter((target) => !includeCodex || hasChatClass(target));
@@ -24,7 +24,7 @@ export function listModelsPayload(targets, includeCodex, preserveOrder = false)
24
24
  }
25
25
  if (includeCodex) {
26
26
  return {
27
- models: available.map((target, index) => codexModel(target, index + 1)),
27
+ models: available.map((target, index) => codexModel(target, index + 1, preferSystemModels)),
28
28
  };
29
29
  }
30
30
  return {
@@ -54,17 +54,17 @@ function openAiModel(target) {
54
54
  },
55
55
  };
56
56
  }
57
- /** Codex `/v1/models` slug for a resolved gateway target. */
58
- export function codexModelSlug(target) {
59
- const model = target.capabilities.aiGatewayCodex && target.modelServiceName
57
+ /** Codex `/v1/models` slug: the `system.ai.*` service when preferred, else the endpoint id. */
58
+ export function codexModelSlug(target, preferSystemModels) {
59
+ const model = preferSystemModels && target.capabilities.aiGatewayCodex && target.modelServiceName
60
60
  ? target.modelServiceName
61
61
  : target.id;
62
62
  return `databricks/${model}`;
63
63
  }
64
- function codexModel(target, priority) {
64
+ function codexModel(target, priority, preferSystemModels) {
65
65
  const efforts = target.reasoningEfforts;
66
66
  return {
67
- slug: codexModelSlug(target),
67
+ slug: codexModelSlug(target, preferSystemModels),
68
68
  display_name: target.displayName,
69
69
  description: target.endpoint?.description ?? "Databricks model service",
70
70
  base_instructions: CODEX_BASE_INSTRUCTIONS,
@@ -160,4 +160,4 @@ function hasChatClass(target) {
160
160
  const modelClass = target.endpoint?.class;
161
161
  return modelClass !== undefined && isChatClass(modelClass);
162
162
  }
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFVdkUsTUFBTSx1QkFBdUIsR0FDM0IsdUhBQXVILENBQUM7QUFFMUgsTUFBTSxzQkFBc0IsR0FBcUM7SUFDL0QsSUFBSSxFQUFFLDRCQUE0QjtJQUNsQyxPQUFPLEVBQUUsNkNBQTZDO0lBQ3RELEdBQUcsRUFBRSw0QkFBNEI7SUFDakMsTUFBTSxFQUFFLCtCQUErQjtJQUN2QyxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLEtBQUssRUFBRSxvQ0FBb0M7SUFDM0MsR0FBRyxFQUFFLDRDQUE0QztDQUNsRCxDQUFDO0FBa0JGLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBK0IsRUFDL0IsWUFBcUIsRUFDckIsYUFBYSxHQUFHLEtBQUs7SUFFckIsTUFBTSxTQUFTLEdBQUcsT0FBTztTQUN0QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsS0FBSyxJQUFJLENBQUM7U0FDaEUsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUM3Qix1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQ3JFLENBQUM7SUFD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TSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdCLElBQUksS0FBSyxLQUFLLEtBQUs7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsT0FBTyxNQUFNLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDekQsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsTUFBbUI7SUFDNUMsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEtBQUssbUJBQW1CLENBQUM7QUFDbEcsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsSUFBWSxFQUFFLEtBQWE7SUFDeEQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFtQjtJQUN2QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztJQUMxQyxPQUFPLFVBQVUsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9wZW5BSSBhbmQgQ29kZXggbW9kZWwtbGlzdCBwYXlsb2FkcyBkZXJpdmVkIGZyb20gdGhlIGxpdmUgcmVnaXN0cnkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGlzQ2hhdENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWwvY2xhc3Nlc1wiO1xuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsRmFtaWx5UmFuayB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsL3BvbGljeVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb2RleE1vZGVsLFxuICBDb2RleE1vZGVsTGlzdFJlc3BvbnNlLFxuICBNb2RlbExpc3RSZXNwb25zZSxcbiAgTW9kZWxUYXJnZXQsXG4gIE9wZW5BSU1vZGVsLFxuICBPcGVuQUlNb2RlbExpc3RSZXNwb25zZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuY29uc3QgQ09ERVhfQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBjb2RpbmcgYWdlbnQuIEZvbGxvdyB0aGUgdXNlcidzIGluc3RydWN0aW9ucyBhbmQgdXNlIHRoZSBhdmFpbGFibGUgdG9vbHMgdG8gd29yayBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5LlwiO1xuXG5jb25zdCBSRUFTT05JTkdfREVTQ1JJUFRJT05TOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgbm9uZTogXCJEaXNhYmxlIGV4cGxpY2l0IHJlYXNvbmluZ1wiLFxuICBtaW5pbWFsOiBcIlVzZSB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIHJlYXNvbmluZyBidWRnZXRcIixcbiAgbG93OiBcIlVzZSBhIGxvdyByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIG1lZGl1bTogXCJVc2UgYSBtZWRpdW0gcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBoaWdoOiBcIlVzZSBhIGhpZ2ggcmVhc29uaW5nIGJ1ZGdldFwiLFxuICB4aGlnaDogXCJVc2UgYW4gZXh0cmEtaGlnaCByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIG1heDogXCJVc2UgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIHJlYXNvbmluZyBidWRnZXRcIixcbn07XG5cbi8qKiBCdWlsZCB0aGUgY29tYmluZWQgT3BlbkFJIGFuZCBvcHRpb25hbCBDb2RleCBtb2RlbCBjYXRhbG9ndWUuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogdHJ1ZSxcbiAgcHJlc2VydmVPcmRlcj86IGJvb2xlYW4sXG4pOiBDb2RleE1vZGVsTGlzdFJlc3BvbnNlO1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2RlbHNQYXlsb2FkKFxuICB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdLFxuICBpbmNsdWRlQ29kZXg6IGZhbHNlLFxuICBwcmVzZXJ2ZU9yZGVyPzogYm9vbGVhbixcbik6IE9wZW5BSU1vZGVsTGlzdFJlc3BvbnNlO1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2RlbHNQYXlsb2FkKFxuICB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdLFxuICBpbmNsdWRlQ29kZXg6IGJvb2xlYW4sXG4gIHByZXNlcnZlT3JkZXI/OiBib29sZWFuLFxuKTogTW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogYm9vbGVhbixcbiAgcHJlc2VydmVPcmRlciA9IGZhbHNlLFxuKTogTW9kZWxMaXN0UmVzcG9uc2Uge1xuICBjb25zdCBhdmFpbGFibGUgPSB0YXJnZXRzXG4gICAgLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cz8uZGVwcmVjYXRlZCAhPT0gdHJ1ZSlcbiAgICAuZmlsdGVyKCh0YXJnZXQpID0+ICFpbmNsdWRlQ29kZXggfHwgaGFzQ2hhdENsYXNzKHRhcmdldCkpO1xuICBpZiAoIXByZXNlcnZlT3JkZXIpIHtcbiAgICBhdmFpbGFibGUuc29ydCgobGVmdCwgcmlnaHQpID0+XG4gICAgICBjb21wYXJlQ2F0YWxvZ3VlVGFyZ2V0cyhsZWZ0LCByaWdodCwgKHRhcmdldCkgPT4gdGFyZ2V0LmRpc3BsYXlOYW1lKSxcbiAgICApO1xuICB9XG4gIGlmIChpbmNsdWRlQ29kZXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBhdmFpbGFibGUubWFwKCh0YXJnZXQsIGluZGV4KSA9PiBjb2RleE1vZGVsKHRhcmdldCwgaW5kZXggKyAxKSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9iamVjdDogXCJsaXN0XCIsXG4gICAgZGF0YTogYXZhaWxhYmxlLm1hcChvcGVuQWlNb2RlbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9wZW5BaU1vZGVsKHRhcmdldDogTW9kZWxUYXJnZXQpOiBPcGVuQUlNb2RlbCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHRhcmdldC5pZCxcbiAgICBvYmplY3Q6IFwibW9kZWxcIixcbiAgICBjcmVhdGVkOiAwLFxuICAgIG93bmVkX2J5OiBcImRhdGFicmlja3NcIixcbiAgICBuYW1lOiB0YXJnZXQuZGlzcGxheU5hbWUsXG4gICAgdGFzazogdGFyZ2V0LmVuZHBvaW50Py50YXNrLFxuICAgIHN0YXR1czogdGFyZ2V0LmVuZHBvaW50Py5zdGF0dXMgPz8geyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgdG9vbHM6IHRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMsXG4gICAgICByZWFzb25pbmc6IHRhcmdldC5yZWFzb25pbmdFZmZvcnRzLFxuICAgICAgcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyxcbiAgICAgIG9wZW5fcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMsXG4gICAgICBhbnRocm9waWM6IHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljLFxuICAgICAgZW1iZWRkaW5nczogdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzLFxuICAgICAgYWlfZ2F0ZXdheV9jb2RleDogdGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCxcbiAgICAgIHN0cmVhbWluZzogdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJlYW1pbmcsXG4gICAgICB3ZWJfc2VhcmNoOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogQ29kZXggYC92MS9tb2RlbHNgIHNsdWcgZm9yIGEgcmVzb2x2ZWQgZ2F0ZXdheSB0YXJnZXQuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhNb2RlbFNsdWcodGFyZ2V0OiBNb2RlbFRhcmdldCk6IHN0cmluZyB7XG4gIGNvbnN0IG1vZGVsID1cbiAgICB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4ICYmIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA/IHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA6IHRhcmdldC5pZDtcbiAgcmV0dXJuIGBkYXRhYnJpY2tzLyR7bW9kZWx9YDtcbn1cblxuZnVuY3Rpb24gY29kZXhNb2RlbCh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBwcmlvcml0eTogbnVtYmVyKTogQ29kZXhNb2RlbCB7XG4gIGNvbnN0IGVmZm9ydHMgPSB0YXJnZXQucmVhc29uaW5nRWZmb3J0cztcbiAgcmV0dXJuIHtcbiAgICBzbHVnOiBjb2RleE1vZGVsU2x1Zyh0YXJnZXQpLFxuICAgIGRpc3BsYXlfbmFtZTogdGFyZ2V0LmRpc3BsYXlOYW1lLFxuICAgIGRlc2NyaXB0aW9uOiB0YXJnZXQuZW5kcG9pbnQ/LmRlc2NyaXB0aW9uID8/IFwiRGF0YWJyaWNrcyBtb2RlbCBzZXJ2aWNlXCIsXG4gICAgYmFzZV9pbnN0cnVjdGlvbnM6IENPREVYX0JBU0VfSU5TVFJVQ1RJT05TLFxuICAgIHN0YXR1czogdGFyZ2V0LmVuZHBvaW50Py5zdGF0dXMgPz8geyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIHN1cHBvcnRlZF9yZWFzb25pbmdfbGV2ZWxzOiBlZmZvcnRzLm1hcCgoZWZmb3J0KSA9PiAoe1xuICAgICAgZWZmb3J0LFxuICAgICAgZGVzY3JpcHRpb246IFJFQVNPTklOR19ERVNDUklQVElPTlNbZWZmb3J0XSA/PyBgVXNlIHRoZSAke2VmZm9ydH0gcmVhc29uaW5nIGJ1ZGdldGAsXG4gICAgfSkpLFxuICAgIC4uLihlZmZvcnRzLmxlbmd0aCA+IDBcbiAgICAgID8geyBkZWZhdWx0X3JlYXNvbmluZ19sZXZlbDogZWZmb3J0cy5pbmNsdWRlcyhcIm1lZGl1bVwiKSA/IFwibWVkaXVtXCIgOiBlZmZvcnRzWzBdIH1cbiAgICAgIDoge30pLFxuICAgIHNoZWxsX3R5cGU6IFwidW5pZmllZF9leGVjXCIsXG4gICAgdmlzaWJpbGl0eTogXCJsaXN0XCIsXG4gICAgc3VwcG9ydGVkX2luX2FwaTogdHJ1ZSxcbiAgICBwcmlvcml0eSxcbiAgICBhdmFpbGFiaWxpdHlfbnV4OiBudWxsLFxuICAgIHVwZ3JhZGU6IG51bGwsXG4gICAgc3VwcG9ydF92ZXJib3NpdHk6IGZhbHNlLFxuICAgIGRlZmF1bHRfdmVyYm9zaXR5OiBudWxsLFxuICAgIGFwcGx5X3BhdGNoX3Rvb2xfdHlwZTogdGFyZ2V0LmNhcGFiaWxpdGllcy5jdXN0b21Ub29scyA/IFwiZnJlZWZvcm1cIiA6IG51bGwsXG4gICAgdHJ1bmNhdGlvbl9wb2xpY3k6IHsgbW9kZTogXCJ0b2tlbnNcIiwgbGltaXQ6IDEyOF8wMDAgfSxcbiAgICBjb250ZXh0X3dpbmRvdzogbnVsbCxcbiAgICBleHBlcmltZW50YWxfc3VwcG9ydGVkX3Rvb2xzOiBbXSxcbiAgICBpbnB1dF9tb2RhbGl0aWVzOiBbXCJ0ZXh0XCJdLFxuICAgIHdlYl9zZWFyY2hfdG9vbF90eXBlOiBcInRleHRcIixcbiAgICBzdXBwb3J0c19zZWFyY2hfdG9vbDogdGFyZ2V0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gsXG4gICAgc3VwcG9ydHNfaW1hZ2VfZGV0YWlsX29yaWdpbmFsOiBmYWxzZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBPcmRlciBsaXN0ZWQgbW9kZWxzIGluIHRocmVlIGdyb3VwczogbWFqb3ItcHJvdmlkZXIgY2hhdCBmYW1pbGllcywgdGhlXG4gKiByZW1haW5pbmcgY2hhdCBtb2RlbHMsIHRoZW4gZW1iZWRkaW5ncy4gRmFtaWxpZXMga2VlcCBhIGZpeGVkIHByb3ZpZGVyXG4gKiBvcmRlcjsgZWFjaCBmYW1pbHkgYW5kIHRoZSBsYXRlciBncm91cHMgc29ydCBieSB0aGUgcHVibGlzaGVkIGxhYmVsXG4gKiAoYGRpc3BsYXlfbmFtZWAgZm9yIENvZGV4LCBgbmFtZWAgb3RoZXJ3aXNlKS4gTnVtZXJpYyBzZWdtZW50cyBzb3J0XG4gKiBuYXR1cmFsbHkgc28gXCJWZW8gMy4xXCIgcHJlY2VkZXMgXCJWZW8gMy4xMFwiLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQ2F0YWxvZ3VlVGFyZ2V0cyhcbiAgbGVmdDogTW9kZWxUYXJnZXQsXG4gIHJpZ2h0OiBNb2RlbFRhcmdldCxcbiAgbGFiZWw6ICh0YXJnZXQ6IE1vZGVsVGFyZ2V0KSA9PiBzdHJpbmcsXG4pOiBudW1iZXIge1xuICBjb25zdCBncm91cCA9IGNhdGFsb2d1ZUdyb3VwKGxlZnQpIC0gY2F0YWxvZ3VlR3JvdXAocmlnaHQpO1xuICBpZiAoZ3JvdXAgIT09IDApIHJldHVybiBncm91cDtcbiAgY29uc3QgbGVmdEZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseShsZWZ0KTtcbiAgY29uc3QgcmlnaHRGYW1pbHkgPSBjYXRhbG9ndWVGYW1pbHkocmlnaHQpO1xuICBpZiAobGVmdEZhbWlseSAmJiByaWdodEZhbWlseSkge1xuICAgIGNvbnN0IGZhbWlseU9yZGVyID0gbW9kZWxGYW1pbHlSYW5rKGxlZnRGYW1pbHkpIC0gbW9kZWxGYW1pbHlSYW5rKHJpZ2h0RmFtaWx5KTtcbiAgICBpZiAoZmFtaWx5T3JkZXIgIT09IDApIHJldHVybiBmYW1pbHlPcmRlcjtcbiAgfVxuICByZXR1cm4gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxhYmVsKGxlZnQpLCBsYWJlbChyaWdodCkpO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVHcm91cCh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogbnVtYmVyIHtcbiAgaWYgKGlzRW1iZWRkaW5nVGFyZ2V0KHRhcmdldCkpIHJldHVybiAyO1xuICByZXR1cm4gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldCkgPyAwIDogMTtcbn1cblxuY29uc3QgSURFTlRJVFlfUFJFRklYRVMgPSBuZXcgU2V0KFtcbiAgXCJkYXRhYnJpY2tzXCIsXG4gIFwic3lzdGVtXCIsXG4gIFwiYWlcIixcbiAgXCJtZXRhXCIsXG4gIFwiZ29vZ2xlXCIsXG4gIFwib3BlbmFpXCIsXG4gIFwiYW50aHJvcGljXCIsXG5dKTtcblxuZnVuY3Rpb24gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldDogTW9kZWxUYXJnZXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFbWJlZGRpbmdUYXJnZXQodGFyZ2V0KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBbdGFyZ2V0LmRpc3BsYXlOYW1lLCB0YXJnZXQuaWQsIHRhcmdldC5lbmRwb2ludD8ubmFtZV0pIHtcbiAgICBpZiAoIWlkZW50aXR5KSBjb250aW51ZTtcbiAgICBjb25zdCBmYW1pbHkgPSBjYXRhbG9ndWVGYW1pbHlGcm9tSWRlbnRpdHkoaWRlbnRpdHkpO1xuICAgIGlmIChmYW1pbHkpIHJldHVybiBmYW1pbHk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlRmFtaWx5RnJvbUlkZW50aXR5KGlkZW50aXR5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBpZGVudGl0eS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9bYS16MC05XSsvZykgPz8gW107XG4gIGNvbnN0IHN0YXJ0ID0gdG9rZW5zLmZpbmQoKHRva2VuKSA9PiAhSURFTlRJVFlfUFJFRklYRVMuaGFzKHRva2VuKSk7XG4gIGlmICghc3RhcnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChzdGFydCA9PT0gXCJ2ZW9cIikgcmV0dXJuIFwiZ2VtaW5pXCI7XG4gIGNvbnN0IGZhbWlseSA9IG1vZGVsRmFtaWx5KGlkZW50aXR5KTtcbiAgcmV0dXJuIGZhbWlseSAmJiBzdGFydCA9PT0gZmFtaWx5ID8gZmFtaWx5IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0VtYmVkZGluZ1RhcmdldCh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogYm9vbGVhbiB7XG4gIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3MgPT09IHRydWUgfHwgdGFyZ2V0LmVuZHBvaW50Py50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVDYXRhbG9ndWVMYWJlbChsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0LCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6IFwiYmFzZVwiIH0pO1xufVxuXG5mdW5jdGlvbiBoYXNDaGF0Q2xhc3ModGFyZ2V0OiBNb2RlbFRhcmdldCk6IGJvb2xlYW4ge1xuICBjb25zdCBtb2RlbENsYXNzID0gdGFyZ2V0LmVuZHBvaW50Py5jbGFzcztcbiAgcmV0dXJuIG1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCAmJiBpc0NoYXRDbGFzcyhtb2RlbENsYXNzKTtcbn1cbiJdfQ==
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFVdkUsTUFBTSx1QkFBdUIsR0FDM0IsdUhBQXVILENBQUM7QUFFMUgsTUFBTSxzQkFBc0IsR0FBcUM7SUFDL0QsSUFBSSxFQUFFLDRCQUE0QjtJQUNsQyxPQUFPLEVBQUUsNkNBQTZDO0lBQ3RELEdBQUcsRUFBRSw0QkFBNEI7SUFDakMsTUFBTSxFQUFFLCtCQUErQjtJQUN2QyxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLEtBQUssRUFBRSxvQ0FBb0M7SUFDM0MsR0FBRyxFQUFFLDRDQUE0QztDQUNsRCxDQUFDO0FBcUJGLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBK0IsRUFDL0IsWUFBcUIsRUFDckIsYUFBYSxHQUFHLEtBQUssRUFDckIsa0JBQWtCLEdBQUcsS0FBSztJQUUxQixNQUFNLFNBQVMsR0FBRyxPQUFPO1NBQ3RCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxLQUFLLElBQUksQ0FBQztTQUNoRSxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQzdCLHVCQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxX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IHBheWxvYWRzIGRlcml2ZWQgZnJvbSB0aGUgbGl2ZSByZWdpc3RyeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaXNDaGF0Q2xhc3MgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbC9jbGFzc2VzXCI7XG5pbXBvcnQgeyBtb2RlbEZhbWlseSwgbW9kZWxGYW1pbHlSYW5rIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWwvcG9saWN5XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvZGV4TW9kZWwsXG4gIENvZGV4TW9kZWxMaXN0UmVzcG9uc2UsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxuICBNb2RlbFRhcmdldCxcbiAgT3BlbkFJTW9kZWwsXG4gIE9wZW5BSU1vZGVsTGlzdFJlc3BvbnNlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5jb25zdCBDT0RFWF9CQVNFX0lOU1RSVUNUSU9OUyA9XG4gIFwiWW91IGFyZSBhIGNvZGluZyBhZ2VudC4gRm9sbG93IHRoZSB1c2VyJ3MgaW5zdHJ1Y3Rpb25zIGFuZCB1c2UgdGhlIGF2YWlsYWJsZSB0b29scyB0byB3b3JrIGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkuXCI7XG5cbmNvbnN0IFJFQVNPTklOR19ERVNDUklQVElPTlM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICBub25lOiBcIkRpc2FibGUgZXhwbGljaXQgcmVhc29uaW5nXCIsXG4gIG1pbmltYWw6IFwiVXNlIHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBsb3c6IFwiVXNlIGEgbG93IHJlYXNvbmluZyBidWRnZXRcIixcbiAgbWVkaXVtOiBcIlVzZSBhIG1lZGl1bSByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIGhpZ2g6IFwiVXNlIGEgaGlnaCByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIHhoaWdoOiBcIlVzZSBhbiBleHRyYS1oaWdoIHJlYXNvbmluZyBidWRnZXRcIixcbiAgbWF4OiBcIlVzZSB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgcmVhc29uaW5nIGJ1ZGdldFwiLFxufTtcblxuLyoqIEJ1aWxkIHRoZSBjb21iaW5lZCBPcGVuQUkgYW5kIG9wdGlvbmFsIENvZGV4IG1vZGVsIGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiB0cnVlLFxuICBwcmVzZXJ2ZU9yZGVyPzogYm9vbGVhbixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbixcbik6IENvZGV4TW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogZmFsc2UsXG4gIHByZXNlcnZlT3JkZXI/OiBib29sZWFuLFxuICBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuLFxuKTogT3BlbkFJTW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogYm9vbGVhbixcbiAgcHJlc2VydmVPcmRlcj86IGJvb2xlYW4sXG4gIHByZWZlclN5c3RlbU1vZGVscz86IGJvb2xlYW4sXG4pOiBNb2RlbExpc3RSZXNwb25zZTtcbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiBib29sZWFuLFxuICBwcmVzZXJ2ZU9yZGVyID0gZmFsc2UsXG4gIHByZWZlclN5c3RlbU1vZGVscyA9IGZhbHNlLFxuKTogTW9kZWxMaXN0UmVzcG9uc2Uge1xuICBjb25zdCBhdmFpbGFibGUgPSB0YXJnZXRzXG4gICAgLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cz8uZGVwcmVjYXRlZCAhPT0gdHJ1ZSlcbiAgICAuZmlsdGVyKCh0YXJnZXQpID0+ICFpbmNsdWRlQ29kZXggfHwgaGFzQ2hhdENsYXNzKHRhcmdldCkpO1xuICBpZiAoIXByZXNlcnZlT3JkZXIpIHtcbiAgICBhdmFpbGFibGUuc29ydCgobGVmdCwgcmlnaHQpID0+XG4gICAgICBjb21wYXJlQ2F0YWxvZ3VlVGFyZ2V0cyhsZWZ0LCByaWdodCwgKHRhcmdldCkgPT4gdGFyZ2V0LmRpc3BsYXlOYW1lKSxcbiAgICApO1xuICB9XG4gIGlmIChpbmNsdWRlQ29kZXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBhdmFpbGFibGUubWFwKCh0YXJnZXQsIGluZGV4KSA9PiBjb2RleE1vZGVsKHRhcmdldCwgaW5kZXggKyAxLCBwcmVmZXJTeXN0ZW1Nb2RlbHMpKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgb2JqZWN0OiBcImxpc3RcIixcbiAgICBkYXRhOiBhdmFpbGFibGUubWFwKG9wZW5BaU1vZGVsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gb3BlbkFpTW9kZWwodGFyZ2V0OiBNb2RlbFRhcmdldCk6IE9wZW5BSU1vZGVsIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdGFyZ2V0LmlkLFxuICAgIG9iamVjdDogXCJtb2RlbFwiLFxuICAgIGNyZWF0ZWQ6IDAsXG4gICAgb3duZWRfYnk6IFwiZGF0YWJyaWNrc1wiLFxuICAgIG5hbWU6IHRhcmdldC5kaXNwbGF5TmFtZSxcbiAgICB0YXNrOiB0YXJnZXQuZW5kcG9pbnQ/LnRhc2ssXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICB0b29sczogdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scyxcbiAgICAgIHJlYXNvbmluZzogdGFyZ2V0LnJlYXNvbmluZ0VmZm9ydHMsXG4gICAgICByZXNwb25zZXM6IHRhcmdldC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzLFxuICAgICAgb3Blbl9yZXNwb25zZXM6IHRhcmdldC5jYXBhYmlsaXRpZXMub3BlblJlc3BvbnNlcyxcbiAgICAgIGFudGhyb3BpYzogdGFyZ2V0LmNhcGFiaWxpdGllcy5hbnRocm9waWMsXG4gICAgICBlbWJlZGRpbmdzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3MsXG4gICAgICBhaV9nYXRld2F5X2NvZGV4OiB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4LFxuICAgICAgc3RyZWFtaW5nOiB0YXJnZXQuY2FwYWJpbGl0aWVzLnN0cmVhbWluZyxcbiAgICAgIHdlYl9zZWFyY2g6IHRhcmdldC5jYXBhYmlsaXRpZXMud2ViU2VhcmNoLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKiBDb2RleCBgL3YxL21vZGVsc2Agc2x1ZzogdGhlIGBzeXN0ZW0uYWkuKmAgc2VydmljZSB3aGVuIHByZWZlcnJlZCwgZWxzZSB0aGUgZW5kcG9pbnQgaWQuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhNb2RlbFNsdWcodGFyZ2V0OiBNb2RlbFRhcmdldCwgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgbW9kZWwgPVxuICAgIHByZWZlclN5c3RlbU1vZGVscyAmJiB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4ICYmIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA/IHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA6IHRhcmdldC5pZDtcbiAgcmV0dXJuIGBkYXRhYnJpY2tzLyR7bW9kZWx9YDtcbn1cblxuZnVuY3Rpb24gY29kZXhNb2RlbChcbiAgdGFyZ2V0OiBNb2RlbFRhcmdldCxcbiAgcHJpb3JpdHk6IG51bWJlcixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuLFxuKTogQ29kZXhNb2RlbCB7XG4gIGNvbnN0IGVmZm9ydHMgPSB0YXJnZXQucmVhc29uaW5nRWZmb3J0cztcbiAgcmV0dXJuIHtcbiAgICBzbHVnOiBjb2RleE1vZGVsU2x1Zyh0YXJnZXQsIHByZWZlclN5c3RlbU1vZGVscyksXG4gICAgZGlzcGxheV9uYW1lOiB0YXJnZXQuZGlzcGxheU5hbWUsXG4gICAgZGVzY3JpcHRpb246IHRhcmdldC5lbmRwb2ludD8uZGVzY3JpcHRpb24gPz8gXCJEYXRhYnJpY2tzIG1vZGVsIHNlcnZpY2VcIixcbiAgICBiYXNlX2luc3RydWN0aW9uczogQ09ERVhfQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHM6IGVmZm9ydHMubWFwKChlZmZvcnQpID0+ICh7XG4gICAgICBlZmZvcnQsXG4gICAgICBkZXNjcmlwdGlvbjogUkVBU09OSU5HX0RFU0NSSVBUSU9OU1tlZmZvcnRdID8/IGBVc2UgdGhlICR7ZWZmb3J0fSByZWFzb25pbmcgYnVkZ2V0YCxcbiAgICB9KSksXG4gICAgLi4uKGVmZm9ydHMubGVuZ3RoID4gMFxuICAgICAgPyB7IGRlZmF1bHRfcmVhc29uaW5nX2xldmVsOiBlZmZvcnRzLmluY2x1ZGVzKFwibWVkaXVtXCIpID8gXCJtZWRpdW1cIiA6IGVmZm9ydHNbMF0gfVxuICAgICAgOiB7fSksXG4gICAgc2hlbGxfdHlwZTogXCJ1bmlmaWVkX2V4ZWNcIixcbiAgICB2aXNpYmlsaXR5OiBcImxpc3RcIixcbiAgICBzdXBwb3J0ZWRfaW5fYXBpOiB0cnVlLFxuICAgIHByaW9yaXR5LFxuICAgIGF2YWlsYWJpbGl0eV9udXg6IG51bGwsXG4gICAgdXBncmFkZTogbnVsbCxcbiAgICBzdXBwb3J0X3ZlcmJvc2l0eTogZmFsc2UsXG4gICAgZGVmYXVsdF92ZXJib3NpdHk6IG51bGwsXG4gICAgYXBwbHlfcGF0Y2hfdG9vbF90eXBlOiB0YXJnZXQuY2FwYWJpbGl0aWVzLmN1c3RvbVRvb2xzID8gXCJmcmVlZm9ybVwiIDogbnVsbCxcbiAgICB0cnVuY2F0aW9uX3BvbGljeTogeyBtb2RlOiBcInRva2Vuc1wiLCBsaW1pdDogMTI4XzAwMCB9LFxuICAgIGNvbnRleHRfd2luZG93OiBudWxsLFxuICAgIGV4cGVyaW1lbnRhbF9zdXBwb3J0ZWRfdG9vbHM6IFtdLFxuICAgIGlucHV0X21vZGFsaXRpZXM6IFtcInRleHRcIl0sXG4gICAgd2ViX3NlYXJjaF90b29sX3R5cGU6IFwidGV4dFwiLFxuICAgIHN1cHBvcnRzX3NlYXJjaF90b29sOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICBzdXBwb3J0c19pbWFnZV9kZXRhaWxfb3JpZ2luYWw6IGZhbHNlLFxuICB9O1xufVxuXG4vKipcbiAqIE9yZGVyIGxpc3RlZCBtb2RlbHMgaW4gdGhyZWUgZ3JvdXBzOiBtYWpvci1wcm92aWRlciBjaGF0IGZhbWlsaWVzLCB0aGVcbiAqIHJlbWFpbmluZyBjaGF0IG1vZGVscywgdGhlbiBlbWJlZGRpbmdzLiBGYW1pbGllcyBrZWVwIGEgZml4ZWQgcHJvdmlkZXJcbiAqIG9yZGVyOyBlYWNoIGZhbWlseSBhbmQgdGhlIGxhdGVyIGdyb3VwcyBzb3J0IGJ5IHRoZSBwdWJsaXNoZWQgbGFiZWxcbiAqIChgZGlzcGxheV9uYW1lYCBmb3IgQ29kZXgsIGBuYW1lYCBvdGhlcndpc2UpLiBOdW1lcmljIHNlZ21lbnRzIHNvcnRcbiAqIG5hdHVyYWxseSBzbyBcIlZlbyAzLjFcIiBwcmVjZWRlcyBcIlZlbyAzLjEwXCIuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVDYXRhbG9ndWVUYXJnZXRzKFxuICBsZWZ0OiBNb2RlbFRhcmdldCxcbiAgcmlnaHQ6IE1vZGVsVGFyZ2V0LFxuICBsYWJlbDogKHRhcmdldDogTW9kZWxUYXJnZXQpID0+IHN0cmluZyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGdyb3VwID0gY2F0YWxvZ3VlR3JvdXAobGVmdCkgLSBjYXRhbG9ndWVHcm91cChyaWdodCk7XG4gIGlmIChncm91cCAhPT0gMCkgcmV0dXJuIGdyb3VwO1xuICBjb25zdCBsZWZ0RmFtaWx5ID0gY2F0YWxvZ3VlRmFtaWx5KGxlZnQpO1xuICBjb25zdCByaWdodEZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseShyaWdodCk7XG4gIGlmIChsZWZ0RmFtaWx5ICYmIHJpZ2h0RmFtaWx5KSB7XG4gICAgY29uc3QgZmFtaWx5T3JkZXIgPSBtb2RlbEZhbWlseVJhbmsobGVmdEZhbWlseSkgLSBtb2RlbEZhbWlseVJhbmsocmlnaHRGYW1pbHkpO1xuICAgIGlmIChmYW1pbHlPcmRlciAhPT0gMCkgcmV0dXJuIGZhbWlseU9yZGVyO1xuICB9XG4gIHJldHVybiBjb21wYXJlQ2F0YWxvZ3VlTGFiZWwobGFiZWwobGVmdCksIGxhYmVsKHJpZ2h0KSk7XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZUdyb3VwKHRhcmdldDogTW9kZWxUYXJnZXQpOiBudW1iZXIge1xuICBpZiAoaXNFbWJlZGRpbmdUYXJnZXQodGFyZ2V0KSkgcmV0dXJuIDI7XG4gIHJldHVybiBjYXRhbG9ndWVGYW1pbHkodGFyZ2V0KSA/IDAgOiAxO1xufVxuXG5jb25zdCBJREVOVElUWV9QUkVGSVhFUyA9IG5ldyBTZXQoW1xuICBcImRhdGFicmlja3NcIixcbiAgXCJzeXN0ZW1cIixcbiAgXCJhaVwiLFxuICBcIm1ldGFcIixcbiAgXCJnb29nbGVcIixcbiAgXCJvcGVuYWlcIixcbiAgXCJhbnRocm9waWNcIixcbl0pO1xuXG5mdW5jdGlvbiBjYXRhbG9ndWVGYW1pbHkodGFyZ2V0OiBNb2RlbFRhcmdldCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0VtYmVkZGluZ1RhcmdldCh0YXJnZXQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIFt0YXJnZXQuZGlzcGxheU5hbWUsIHRhcmdldC5pZCwgdGFyZ2V0LmVuZHBvaW50Py5uYW1lXSkge1xuICAgIGlmICghaWRlbnRpdHkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseUZyb21JZGVudGl0eShpZGVudGl0eSk7XG4gICAgaWYgKGZhbWlseSkgcmV0dXJuIGZhbWlseTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVGYW1pbHlGcm9tSWRlbnRpdHkoaWRlbnRpdHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IGlkZW50aXR5LnRvTG93ZXJDYXNlKCkubWF0Y2goL1thLXowLTldKy9nKSA/PyBbXTtcbiAgY29uc3Qgc3RhcnQgPSB0b2tlbnMuZmluZCgodG9rZW4pID0+ICFJREVOVElUWV9QUkVGSVhFUy5oYXModG9rZW4pKTtcbiAgaWYgKCFzdGFydCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHN0YXJ0ID09PSBcInZlb1wiKSByZXR1cm4gXCJnZW1pbmlcIjtcbiAgY29uc3QgZmFtaWx5ID0gbW9kZWxGYW1pbHkoaWRlbnRpdHkpO1xuICByZXR1cm4gZmFtaWx5ICYmIHN0YXJ0ID09PSBmYW1pbHkgPyBmYW1pbHkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzRW1iZWRkaW5nVGFyZ2V0KHRhcmdldDogTW9kZWxUYXJnZXQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncyA9PT0gdHJ1ZSB8fCB0YXJnZXQuZW5kcG9pbnQ/LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxlZnQ6IHN0cmluZywgcmlnaHQ6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlLCBzZW5zaXRpdml0eTogXCJiYXNlXCIgfSk7XG59XG5cbmZ1bmN0aW9uIGhhc0NoYXRDbGFzcyh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSB0YXJnZXQuZW5kcG9pbnQ/LmNsYXNzO1xuICByZXR1cm4gbW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkICYmIGlzQ2hhdENsYXNzKG1vZGVsQ2xhc3MpO1xufVxuIl19
package/lib/src/plugin.js CHANGED
@@ -18,6 +18,9 @@ export class ModelGatewayPlugin extends Plugin {
18
18
  ...(config.overrides ? { overrides: config.overrides } : {}),
19
19
  ...(config.model ? { model: config.model } : {}),
20
20
  ...(config.modelClass ? { modelClass: config.modelClass } : {}),
21
+ ...(config.preferSystemModels !== undefined
22
+ ? { preferSystemModels: config.preferSystemModels }
23
+ : {}),
21
24
  });
22
25
  }
23
26
  injectRoutes(router) {
@@ -69,4 +72,4 @@ export class ModelGatewayPlugin extends Plugin {
69
72
  }
70
73
  /** AppKit plugin factory for the Databricks model gateway. */
71
74
  export const modelGateway = toPlugin(ModelGatewayPlugin);
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLGNBQWMsRUFDZCxNQUFNLEVBQ04sUUFBUSxHQUdULE1BQU0sb0JBQW9CLENBQUM7QUFJNUIsT0FBTyxFQUFFLFlBQVksRUFBNEIsTUFBTSxjQUFjLENBQUM7QUFDdEUsT0FBTyxRQUFRLE1BQU0saUJBQWlCLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBS3BFLCtFQUErRTtBQUMvRSxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsTUFBZ0M7SUFDdEUsTUFBTSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQWlCLFFBQVEsQ0FBQyxDQUFDO0lBRTFDLE9BQU8sQ0FBZTtJQUV2QyxZQUFZLFNBQW1DLEVBQUU7UUFDL0MsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQztZQUM5QixHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2hFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUSxZQUFZLENBQUMsTUFBa0I7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxVQUFVO1lBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUM1RCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFFLFlBQVk7WUFDbEIsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1NBQy9ELENBQUMsQ0FBQztRQUNILEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkMsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxhQUFhLENBQUM7WUFDMUQsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixDQUFDO1lBQ2xELENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsQ0FBQztZQUNsRCxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQztTQUM3QyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDakIsSUFBSTtnQkFDSixNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJO2dCQUNKLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUM7YUFDNUUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUF3QixFQUFFLFFBQTBCO1FBQy9ELE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsS0FBSyxDQUFDLFNBQVMsQ0FDYixRQUF3QixFQUN4QixPQUF3QixFQUN4QixRQUEwQjtRQUUxQixNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRVEsT0FBTztRQUNkLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDO0lBQ0osQ0FBQzs7QUFHSCw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgbW9kZWwtZ2F0ZXdheSBwbHVnaW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGRlZmluZU1hbmlmZXN0LFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICB0eXBlIEJhc2VQbHVnaW5Db25maWcsXG4gIHR5cGUgSUFwcFJvdXRlcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRQcm90b2NvbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7IE1vZGVsR2F0ZXdheSwgdHlwZSBNb2RlbEdhdGV3YXlPcHRpb25zIH0gZnJvbSBcIi4vZ2F0ZXdheS50c1wiO1xuaW1wb3J0IG1hbmlmZXN0IGZyb20gXCIuL21hbmlmZXN0Lmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7IHNlbmRIZWFsdGgsIHNlbmRJbmZlcmVuY2UsIHNlbmRNb2RlbHMgfSBmcm9tIFwiLi9yb3V0ZXMudHNcIjtcblxuLyoqIEFwcEtpdCBjb25maWd1cmF0aW9uIGZvciB0aGUgbW9kZWwtZ2F0ZXdheSBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcsIE1vZGVsR2F0ZXdheU9wdGlvbnMge31cblxuLyoqIEFwcEtpdCBwbHVnaW4gZXhwb3NpbmcgZHluYW1pYyBtb2RlbCBkaXNjb3ZlcnkgYW5kIGNvbXBhdGliaWxpdHkgcm91dGVzLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheVBsdWdpbiBleHRlbmRzIFBsdWdpbjxNb2RlbEdhdGV3YXlQbHVnaW5Db25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0gZGVmaW5lTWFuaWZlc3Q8XCJtb2RlbEdhdGV3YXlcIj4obWFuaWZlc3QpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2F0ZXdheTogTW9kZWxHYXRld2F5O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuICAgIHRoaXMuZ2F0ZXdheSA9IG5ldyBNb2RlbEdhdGV3YXkoe1xuICAgICAgLi4uKGNvbmZpZy5jYWNoZVR0bE1zICE9PSB1bmRlZmluZWQgPyB7IGNhY2hlVHRsTXM6IGNvbmZpZy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLm92ZXJyaWRlcyA/IHsgb3ZlcnJpZGVzOiBjb25maWcub3ZlcnJpZGVzIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLm1vZGVsID8geyBtb2RlbDogY29uZmlnLm1vZGVsIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLm1vZGVsQ2xhc3MgPyB7IG1vZGVsQ2xhc3M6IGNvbmZpZy5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiaGVhbHRoXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBcIi9oZWFsdGh6XCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoX3JlcXVlc3QsIHJlc3BvbnNlKSA9PiBzZW5kSGVhbHRoKHJlc3BvbnNlKSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJtb2RlbHNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IFwiL3YxL21vZGVsc1wiLFxuICAgICAgaGFuZGxlcjogKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB0aGlzLm1vZGVscyhyZXF1ZXN0LCByZXNwb25zZSksXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgcGF0aCwgcHJvdG9jb2xdIG9mIFtcbiAgICAgIFtcImNoYXRDb21wbGV0aW9uc1wiLCBcIi92MS9jaGF0L2NvbXBsZXRpb25zXCIsIFwib3BlbmFpLWNoYXRcIl0sXG4gICAgICBbXCJyZXNwb25zZXNcIiwgXCIvdjEvcmVzcG9uc2VzXCIsIFwib3BlbmFpLXJlc3BvbnNlc1wiXSxcbiAgICAgIFtcIm1lc3NhZ2VzXCIsIFwiL3YxL21lc3NhZ2VzXCIsIFwiYW50aHJvcGljLW1lc3NhZ2VzXCJdLFxuICAgICAgW1wiZW1iZWRkaW5nc1wiLCBcIi92MS9lbWJlZGRpbmdzXCIsIFwib3BlbmFpLWVtYmVkZGluZ3NcIl0sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgaGFuZGxlcjogKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB0aGlzLmluZmVyZW5jZShwcm90b2NvbCwgcmVxdWVzdCwgcmVzcG9uc2UpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlbmQgdGhlIGFjdGl2ZSBwcmluY2lwYWwncyBtb2RlbCBjYXRhbG9ndWUuICovXG4gIGFzeW5jIG1vZGVscyhyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QsIHJlc3BvbnNlOiBleHByZXNzLlJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc2VuZE1vZGVscyh0aGlzLmdhdGV3YXksIHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIG9uZSBjb21wYXRpYmlsaXR5IHJlcXVlc3QgaW4gdGhlIGFjdGl2ZSBBcHBLaXQgaWRlbnRpdHkgc2NvcGUuICovXG4gIGFzeW5jIGluZmVyZW5jZShcbiAgICBwcm90b2NvbDogQ2xpZW50UHJvdG9jb2wsXG4gICAgcmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlc3BvbnNlOiBleHByZXNzLlJlc3BvbnNlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzZW5kSW5mZXJlbmNlKHRoaXMuZ2F0ZXdheSwgcHJvdG9jb2wsIHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKiBSZWZyZXNoIHRoZSBhY3RpdmUgcHJpbmNpcGFsJ3MgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ2F0ZXdheS5yZWZyZXNoKCk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbHM6IHRoaXMubW9kZWxzLFxuICAgICAgaW5mZXJlbmNlOiB0aGlzLmluZmVyZW5jZSxcbiAgICAgIHJlZnJlc2g6IHRoaXMucmVmcmVzaCxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBBcHBLaXQgcGx1Z2luIGZhY3RvcnkgZm9yIHRoZSBEYXRhYnJpY2tzIG1vZGVsIGdhdGV3YXkuICovXG5leHBvcnQgY29uc3QgbW9kZWxHYXRld2F5ID0gdG9QbHVnaW4oTW9kZWxHYXRld2F5UGx1Z2luKTtcbiJdfQ==
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLGNBQWMsRUFDZCxNQUFNLEVBQ04sUUFBUSxHQUdULE1BQU0sb0JBQW9CLENBQUM7QUFJNUIsT0FBTyxFQUFFLFlBQVksRUFBNEIsTUFBTSxjQUFjLENBQUM7QUFDdEUsT0FBTyxRQUFRLE1BQU0saUJBQWlCLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBS3BFLCtFQUErRTtBQUMvRSxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsTUFBZ0M7SUFDdEUsTUFBTSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQWlCLFFBQVEsQ0FBQyxDQUFDO0lBRTFDLE9BQU8sQ0FBZTtJQUV2QyxZQUFZLFNBQW1DLEVBQUU7UUFDL0MsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQztZQUM5QixHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9ELEdBQUcsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEtBQUssU0FBUztnQkFDekMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixFQUFFO2dCQUNuRCxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVRLFlBQVksQ0FBQyxNQUFrQjtRQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFFLFVBQVU7WUFDaEIsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQzVELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUUsWUFBWTtZQUNsQixPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7U0FDL0QsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQyxDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixFQUFFLGFBQWEsQ0FBQztZQUMxRCxDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLENBQUM7WUFDbEQsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixDQUFDO1lBQ2xELENBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDO1NBQzdDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUNqQixJQUFJO2dCQUNKLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUk7Z0JBQ0osT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQzthQUM1RSxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQXdCLEVBQUUsUUFBMEI7UUFDL0QsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxLQUFLLENBQUMsU0FBUyxDQUNiLFFBQXdCLEVBQ3hCLE9BQXdCLEVBQ3hCLFFBQTBCO1FBRTFCLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFUSxPQUFPO1FBQ2QsT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3RCLENBQUM7SUFDSixDQUFDOztBQUdILDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdCBtb2RlbC1nYXRld2F5IHBsdWdpbi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgZGVmaW5lTWFuaWZlc3QsXG4gIFBsdWdpbixcbiAgdG9QbHVnaW4sXG4gIHR5cGUgQmFzZVBsdWdpbkNvbmZpZyxcbiAgdHlwZSBJQXBwUm91dGVyLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IENsaWVudFByb3RvY29sIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgTW9kZWxHYXRld2F5LCB0eXBlIE1vZGVsR2F0ZXdheU9wdGlvbnMgfSBmcm9tIFwiLi9nYXRld2F5LnRzXCI7XG5pbXBvcnQgbWFuaWZlc3QgZnJvbSBcIi4vbWFuaWZlc3QuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHsgc2VuZEhlYWx0aCwgc2VuZEluZmVyZW5jZSwgc2VuZE1vZGVscyB9IGZyb20gXCIuL3JvdXRlcy50c1wiO1xuXG4vKiogQXBwS2l0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBtb2RlbC1nYXRld2F5IHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZywgTW9kZWxHYXRld2F5T3B0aW9ucyB7fVxuXG4vKiogQXBwS2l0IHBsdWdpbiBleHBvc2luZyBkeW5hbWljIG1vZGVsIGRpc2NvdmVyeSBhbmQgY29tcGF0aWJpbGl0eSByb3V0ZXMuICovXG5leHBvcnQgY2xhc3MgTW9kZWxHYXRld2F5UGx1Z2luIGV4dGVuZHMgUGx1Z2luPE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSBkZWZpbmVNYW5pZmVzdDxcIm1vZGVsR2F0ZXdheVwiPihtYW5pZmVzdCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBnYXRld2F5OiBNb2RlbEdhdGV3YXk7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBNb2RlbEdhdGV3YXlQbHVnaW5Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgdGhpcy5nYXRld2F5ID0gbmV3IE1vZGVsR2F0ZXdheSh7XG4gICAgICAuLi4oY29uZmlnLmNhY2hlVHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgY2FjaGVUdGxNczogY29uZmlnLmNhY2hlVHRsTXMgfSA6IHt9KSxcbiAgICAgIC4uLihjb25maWcub3ZlcnJpZGVzID8geyBvdmVycmlkZXM6IGNvbmZpZy5vdmVycmlkZXMgfSA6IHt9KSxcbiAgICAgIC4uLihjb25maWcubW9kZWwgPyB7IG1vZGVsOiBjb25maWcubW9kZWwgfSA6IHt9KSxcbiAgICAgIC4uLihjb25maWcubW9kZWxDbGFzcyA/IHsgbW9kZWxDbGFzczogY29uZmlnLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAgIC4uLihjb25maWcucHJlZmVyU3lzdGVtTW9kZWxzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHByZWZlclN5c3RlbU1vZGVsczogY29uZmlnLnByZWZlclN5c3RlbU1vZGVscyB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImhlYWx0aFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogXCIvaGVhbHRoelwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4gc2VuZEhlYWx0aChyZXNwb25zZSksXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibW9kZWxzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBcIi92MS9tb2RlbHNcIixcbiAgICAgIGhhbmRsZXI6IChyZXF1ZXN0LCByZXNwb25zZSkgPT4gdGhpcy5tb2RlbHMocmVxdWVzdCwgcmVzcG9uc2UpLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHBhdGgsIHByb3RvY29sXSBvZiBbXG4gICAgICBbXCJjaGF0Q29tcGxldGlvbnNcIiwgXCIvdjEvY2hhdC9jb21wbGV0aW9uc1wiLCBcIm9wZW5haS1jaGF0XCJdLFxuICAgICAgW1wicmVzcG9uc2VzXCIsIFwiL3YxL3Jlc3BvbnNlc1wiLCBcIm9wZW5haS1yZXNwb25zZXNcIl0sXG4gICAgICBbXCJtZXNzYWdlc1wiLCBcIi92MS9tZXNzYWdlc1wiLCBcImFudGhyb3BpYy1tZXNzYWdlc1wiXSxcbiAgICAgIFtcImVtYmVkZGluZ3NcIiwgXCIvdjEvZW1iZWRkaW5nc1wiLCBcIm9wZW5haS1lbWJlZGRpbmdzXCJdLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGhhbmRsZXI6IChyZXF1ZXN0LCByZXNwb25zZSkgPT4gdGhpcy5pbmZlcmVuY2UocHJvdG9jb2wsIHJlcXVlc3QsIHJlc3BvbnNlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZW5kIHRoZSBhY3RpdmUgcHJpbmNpcGFsJ3MgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuICBhc3luYyBtb2RlbHMocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0LCByZXNwb25zZTogZXhwcmVzcy5SZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHNlbmRNb2RlbHModGhpcy5nYXRld2F5LCByZXF1ZXN0LCByZXNwb25zZSk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBvbmUgY29tcGF0aWJpbGl0eSByZXF1ZXN0IGluIHRoZSBhY3RpdmUgQXBwS2l0IGlkZW50aXR5IHNjb3BlLiAqL1xuICBhc3luYyBpbmZlcmVuY2UoXG4gICAgcHJvdG9jb2w6IENsaWVudFByb3RvY29sLFxuICAgIHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXNwb25zZTogZXhwcmVzcy5SZXNwb25zZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc2VuZEluZmVyZW5jZSh0aGlzLmdhdGV3YXksIHByb3RvY29sLCByZXF1ZXN0LCByZXNwb25zZSk7XG4gIH1cblxuICAvKiogUmVmcmVzaCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdhdGV3YXkucmVmcmVzaCgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZXhwb3J0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiB0aGlzLm1vZGVscyxcbiAgICAgIGluZmVyZW5jZTogdGhpcy5pbmZlcmVuY2UsXG4gICAgICByZWZyZXNoOiB0aGlzLnJlZnJlc2gsXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQXBwS2l0IHBsdWdpbiBmYWN0b3J5IGZvciB0aGUgRGF0YWJyaWNrcyBtb2RlbCBnYXRld2F5LiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsR2F0ZXdheSA9IHRvUGx1Z2luKE1vZGVsR2F0ZXdheVBsdWdpbik7XG4iXX0=
@@ -19,6 +19,7 @@ export interface ModelRegistry {
19
19
  export interface ModelRegistryOptions {
20
20
  readonly ttlMs?: number;
21
21
  readonly overrides?: readonly ModelCapabilityOverride[];
22
+ readonly preferSystemModels?: boolean;
22
23
  /** Discover models with this client instead of the AppKit execution context. */
23
24
  readonly client?: WorkspaceClient;
24
25
  }
@@ -26,6 +27,7 @@ export interface ModelRegistryOptions {
26
27
  export declare class DatabricksModelRegistry implements ModelRegistry {
27
28
  private readonly ttlMs;
28
29
  private readonly overrides;
30
+ private readonly preferSystemModels;
29
31
  private readonly client;
30
32
  constructor(options?: ModelRegistryOptions);
31
33
  list(): Promise<ModelTarget[]>;
@@ -13,10 +13,12 @@ const logger = log.logger("appkit/model-gateway/registry");
13
13
  export class DatabricksModelRegistry {
14
14
  ttlMs;
15
15
  overrides;
16
+ preferSystemModels;
16
17
  client;
17
18
  constructor(options = {}) {
18
19
  this.ttlMs = positiveTtl(options.ttlMs);
19
20
  this.overrides = options.overrides ?? [];
21
+ this.preferSystemModels = options.preferSystemModels ?? false;
20
22
  this.client = options.client;
21
23
  }
22
24
  async list() {
@@ -34,9 +36,13 @@ export class DatabricksModelRegistry {
34
36
  async resolve(model, options = {}) {
35
37
  const requested = model === undefined ? undefined : unqualifiedModel(model);
36
38
  const targets = await this.list();
37
- const exact = requested === undefined
39
+ const exactId = requested === undefined
40
+ ? undefined
41
+ : targets.find((target) => target.id.localeCompare(requested, undefined, { sensitivity: "accent" }) === 0);
42
+ const exactAlias = requested === undefined
38
43
  ? undefined
39
44
  : targets.find((target) => target.aliases.some((alias) => alias.localeCompare(requested, undefined, { sensitivity: "accent" }) === 0));
45
+ const exact = exactId ?? exactAlias;
40
46
  if (exact && matchesResolveOptions(exact, options)) {
41
47
  logger.debug("resolved exact model", { requested, resolved: exact.id });
42
48
  return exact;
@@ -47,6 +53,8 @@ export class DatabricksModelRegistry {
47
53
  const resolved = modelResolve.resolveModel(endpoints, {
48
54
  ...(requested !== undefined ? { explicit: requested } : {}),
49
55
  ...options,
56
+ }, {
57
+ preferSystemModels: this.preferSystemModels,
50
58
  });
51
59
  const target = targets.find((candidate) => candidate.id === resolved.modelId);
52
60
  logger.debug("resolved fuzzy model", {
@@ -63,10 +71,14 @@ export class DatabricksModelRegistry {
63
71
  .map((target) => target.endpoint)
64
72
  .filter((endpoint) => endpoint !== undefined);
65
73
  const ranked = [
66
- ...modelResolve.lookupModels(endpoints, { search: query }),
74
+ ...modelResolve.lookupModels(endpoints, { search: query }, {
75
+ preferSystemModels: this.preferSystemModels,
76
+ }),
67
77
  ...modelResolve.lookupModels(endpoints, {
68
78
  search: query,
69
79
  modelClass: ModelClass.Embedding,
80
+ }, {
81
+ preferSystemModels: this.preferSystemModels,
70
82
  }),
71
83
  ].sort((left, right) => (left.score ?? 0) - (right.score ?? 0));
72
84
  return ranked
@@ -87,7 +99,7 @@ export class DatabricksModelRegistry {
87
99
  const published = metadata.modelCapabilitiesFor(endpoint);
88
100
  const family = endpoint.family?.toLowerCase();
89
101
  const openAiFamily = family === "gpt" || family === "openai" || endpoint.name.includes("codex");
90
- const modelServiceName = normalizedModelServiceName(endpoint.modelServiceName);
102
+ const modelServiceName = policy.modelServiceName(endpoint.modelServiceName);
91
103
  const embeddings = endpoint.class === ModelClass.Embedding || endpoint.task === "llm/v1/embeddings";
92
104
  const capabilities = {
93
105
  responses: !embeddings && (openAiFamily || published.responses),
@@ -156,18 +168,6 @@ function positiveTtl(value = DEFAULT_CACHE_TTL_MS) {
156
168
  }
157
169
  return value;
158
170
  }
159
- function normalizedModelServiceName(value) {
160
- const normalized = value?.trim().replace(/^databricks\//, "");
161
- if (!normalized)
162
- return undefined;
163
- if (normalized.startsWith("system.ai.databricks-")) {
164
- return `system.ai.${normalized.slice("system.ai.databricks-".length)}`;
165
- }
166
- if (normalized.startsWith("databricks-")) {
167
- return `system.ai.${normalized.slice("databricks-".length)}`;
168
- }
169
- return normalized;
170
- }
171
171
  function matchesResolveOptions(target, options) {
172
172
  if (options.requiresTools && !target.capabilities.tools)
173
173
  return false;
@@ -177,4 +177,4 @@ function matchesResolveOptions(target, options) {
177
177
  return target.capabilities.chat;
178
178
  return true;
179
179
  }
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sT0FBTyxJQUFJLFlBQVksR0FFeEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsR0FHWCxNQUFNLG1DQUFtQyxDQUFDO0FBTzNDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQTJCM0Qsb0VBQW9FO0FBQ3BFLE1BQU0sT0FBTyx1QkFBdUI7SUFDakIsS0FBSyxDQUFTO0lBQ2QsU0FBUyxDQUFxQztJQUM5QyxNQUFNLENBQThCO0lBRXJELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RSxN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SSxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2xDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7UUFDbkQsT0FBTyxhQUFhLFVBQVUsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDekMsT0FBTyxhQUFhLFVBQVUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLE1BQW1CLEVBQUUsT0FBb0M7SUFDdEYsSUFBSSxPQUFPLENBQUMsYUFBYSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEUsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztJQUN2RixJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDdEUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXF1ZXN0LXNjb3BlZCBEYXRhYnJpY2tzIG1vZGVsIGRpc2NvdmVyeSBmb3IgdGhlIEFwcEtpdCBnYXRld2F5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0LCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIG1ldGFkYXRhLFxuICBtb2RlbENhdGFsb2csXG4gIHBvbGljeSxcbiAgcmVzb2x2ZSBhcyBtb2RlbFJlc29sdmUsXG4gIHR5cGUgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zLFxufSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsVGFyZ2V0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5jb25zdCBERUZBVUxUX0NBQ0hFX1RUTF9NUyA9IDYwXzAwMDtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS9yZWdpc3RyeVwiKTtcblxuLyoqIFJlc29sdXRpb24gY29udHJvbHMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsIHBvbGljeSBvd25lci4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyA9IFBpY2s8UmVzb2x2ZU1vZGVsSW5wdXQsIFwibW9kZWxDbGFzc1wiIHwgXCJyZXF1aXJlc1Rvb2xzXCI+O1xuXG4vKiogRHluYW1pYyBtb2RlbCBjYXRhbG9ndWUgdXNlZCBieSByZXF1ZXN0IHJvdXRpbmcgYW5kIG1vZGVsLWxpc3QgcmVzcG9uc2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5IHtcbiAgbGlzdCgpOiBQcm9taXNlPE1vZGVsVGFyZ2V0W10+O1xuICBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHJlc29sdmUobW9kZWw/OiBzdHJpbmcsIG9wdGlvbnM/OiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMpOiBQcm9taXNlPE1vZGVsVGFyZ2V0IHwgdW5kZWZpbmVkPjtcbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3Ige0BsaW5rIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSZWdpc3RyeU9wdGlvbnMge1xuICByZWFkb25seSB0dGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogcmVhZG9ubHkgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGVbXTtcbiAgLyoqIERpc2NvdmVyIG1vZGVscyB3aXRoIHRoaXMgY2xpZW50IGluc3RlYWQgb2YgdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbiAgcmVhZG9ubHkgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50O1xufVxuXG5pbnRlcmZhY2UgUmVnaXN0cnlDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgaWRlbnRpdHk/OiBzdHJpbmc7XG59XG5cbi8qKiBNb2RlbCByZWdpc3RyeSBiYWNrZWQgYnkgdGhlIGFjdGl2ZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgaW1wbGVtZW50cyBNb2RlbFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJyaWRlczogcmVhZG9ubHkgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGVbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy50dGxNcyA9IHBvc2l0aXZlVHRsKG9wdGlvbnMudHRsTXMpO1xuICAgIHRoaXMub3ZlcnJpZGVzID0gb3B0aW9ucy5vdmVycmlkZXMgPz8gW107XG4gICAgdGhpcy5jbGllbnQgPSBvcHRpb25zLmNsaWVudDtcbiAgfVxuXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY29udGV4dCgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxvYWRpbmcgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0LCB0dGxNczogdGhpcy50dGxNcyB9KTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBjb250ZXh0LmNsaWVudCxcbiAgICAgIGNvbnRleHQuaG9zdCxcbiAgICAgIGNhdGFsb2d1ZU9wdGlvbnMoY29udGV4dCwgdGhpcy50dGxNcyksXG4gICAgKTtcbiAgICBjb25zdCB0YXJnZXRzID0gZW5kcG9pbnRzLm1hcCgoZW5kcG9pbnQpID0+IHRoaXMudGFyZ2V0KGVuZHBvaW50KSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibG9hZGVkIGNhdGFsb2d1ZVwiLCB7XG4gICAgICBlbmRwb2ludENvdW50OiBlbmRwb2ludHMubGVuZ3RoLFxuICAgICAgaG9zdDogY29udGV4dC5ob3N0LFxuICAgICAgdGFyZ2V0Q291bnQ6IHRhcmdldHMubGVuZ3RoLFxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXRzO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZShcbiAgICBtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPE1vZGVsVGFyZ2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcmVxdWVzdGVkID0gbW9kZWwgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHVucXVhbGlmaWVkTW9kZWwobW9kZWwpO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBleGFjdCA9XG4gICAgICByZXF1ZXN0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHRhcmdldHMuZmluZCgodGFyZ2V0KSA9PlxuICAgICAgICAgICAgdGFyZ2V0LmFsaWFzZXMuc29tZShcbiAgICAgICAgICAgICAgKGFsaWFzKSA9PiBhbGlhcy5sb2NhbGVDb21wYXJlKHJlcXVlc3RlZCwgdW5kZWZpbmVkLCB7IHNlbnNpdGl2aXR5OiBcImFjY2VudFwiIH0pID09PSAwLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgIGlmIChleGFjdCAmJiBtYXRjaGVzUmVzb2x2ZU9wdGlvbnMoZXhhY3QsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBleGFjdCBtb2RlbFwiLCB7IHJlcXVlc3RlZCwgcmVzb2x2ZWQ6IGV4YWN0LmlkIH0pO1xuICAgICAgcmV0dXJuIGV4YWN0O1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50cyA9IHRhcmdldHNcbiAgICAgIC5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50KVxuICAgICAgLmZpbHRlcigoZW5kcG9pbnQpOiBlbmRwb2ludCBpcyBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0+IGVuZHBvaW50ICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlc29sdmVkID0gbW9kZWxSZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIC4uLihyZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHsgZXhwbGljaXQ6IHJlcXVlc3RlZCB9IDoge30pLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSByZXNvbHZlZC5tb2RlbElkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBmdXp6eSBtb2RlbFwiLCB7XG4gICAgICByZXF1ZXN0ZWQsXG4gICAgICByZXNvbHZlZDogdGFyZ2V0Py5pZCxcbiAgICAgIHNvdXJjZTogcmVzb2x2ZWQuc291cmNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBieUlkID0gbmV3IE1hcCh0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBbdGFyZ2V0LmlkLCB0YXJnZXRdKSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gdGFyZ2V0c1xuICAgICAgLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQpXG4gICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcmFua2VkID0gW1xuICAgICAgLi4ubW9kZWxSZXNvbHZlLmxvb2t1cE1vZGVscyhlbmRwb2ludHMsIHsgc2VhcmNoOiBxdWVyeSB9KSxcbiAgICAgIC4uLm1vZGVsUmVzb2x2ZS5sb29rdXBNb2RlbHMoZW5kcG9pbnRzLCB7XG4gICAgICAgIHNlYXJjaDogcXVlcnksXG4gICAgICAgIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nLFxuICAgICAgfSksXG4gICAgXS5zb3J0KChsZWZ0LCByaWdodCkgPT4gKGxlZnQuc2NvcmUgPz8gMCkgLSAocmlnaHQuc2NvcmUgPz8gMCkpO1xuICAgIHJldHVybiByYW5rZWRcbiAgICAgIC5tYXAoKHsgZW5kcG9pbnQgfSkgPT4gYnlJZC5nZXQoZW5kcG9pbnQubmFtZSkpXG4gICAgICAuZmlsdGVyKCh0YXJnZXQpOiB0YXJnZXQgaXMgTW9kZWxUYXJnZXQgPT4gdGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAodGFyZ2V0LCBpbmRleCwgYWxsKSA9PiBhbGwuZmluZEluZGV4KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gdGFyZ2V0LmlkKSA9PT0gaW5kZXgsXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jb250ZXh0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2xlYXJpbmcgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0IH0pO1xuICAgIGlmIChjb250ZXh0LmlkZW50aXR5KSB7XG4gICAgICBhd2FpdCBtb2RlbENhdGFsb2cuY2xlYXJTZXJ2aW5nRW5kcG9pbnRzQ2FjaGUoY29udGV4dC5ob3N0LCBjb250ZXh0LmlkZW50aXR5KTtcbiAgICB9XG4gICAgYXdhaXQgbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKFxuICAgICAgY29udGV4dC5jbGllbnQsXG4gICAgICBjb250ZXh0Lmhvc3QsXG4gICAgICBjYXRhbG9ndWVPcHRpb25zKGNvbnRleHQsIHRoaXMudHRsTXMpLFxuICAgICk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVmcmVzaGVkIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdGFyZ2V0KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxUYXJnZXQge1xuICAgIGNvbnN0IHB1Ymxpc2hlZCA9IG1ldGFkYXRhLm1vZGVsQ2FwYWJpbGl0aWVzRm9yKGVuZHBvaW50KTtcbiAgICBjb25zdCBmYW1pbHkgPSBlbmRwb2ludC5mYW1pbHk/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgb3BlbkFpRmFtaWx5ID0gZmFtaWx5ID09PSBcImdwdFwiIHx8IGZhbWlseSA9PT0gXCJvcGVuYWlcIiB8fCBlbmRwb2ludC5uYW1lLmluY2x1ZGVzKFwiY29kZXhcIik7XG4gICAgY29uc3QgbW9kZWxTZXJ2aWNlTmFtZSA9IG5vcm1hbGl6ZWRNb2RlbFNlcnZpY2VOYW1lKGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPVxuICAgICAgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIHx8IGVuZHBvaW50LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcbiAgICBjb25zdCBjYXBhYmlsaXRpZXM6IE1vZGVsQ2FwYWJpbGl0aWVzID0ge1xuICAgICAgcmVzcG9uc2VzOiAhZW1iZWRkaW5ncyAmJiAob3BlbkFpRmFtaWx5IHx8IHB1Ymxpc2hlZC5yZXNwb25zZXMpLFxuICAgICAgb3BlblJlc3BvbnNlczogIWVtYmVkZGluZ3MgJiYgIW9wZW5BaUZhbWlseSxcbiAgICAgIGNoYXQ6ICFlbWJlZGRpbmdzLFxuICAgICAgYW50aHJvcGljOiBmYW1pbHkgPT09IFwiY2xhdWRlXCIsXG4gICAgICBlbWJlZGRpbmdzLFxuICAgICAgYWlHYXRld2F5Q29kZXg6XG4gICAgICAgICFlbWJlZGRpbmdzICYmIEJvb2xlYW4obW9kZWxTZXJ2aWNlTmFtZSkgJiYgZmFtaWx5ICE9PSBcImNsYXVkZVwiICYmIGZhbWlseSAhPT0gXCJnZW1pbmlcIixcbiAgICAgIHRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgcmVhc29uaW5nOiBwb2xpY3kubW9kZWxSZWFzb25pbmdFZmZvcnRzKGVuZHBvaW50Lm5hbWUpLmxlbmd0aCA+IDAsXG4gICAgICBzdHJlYW1pbmc6IHRydWUsXG4gICAgICBwYXJhbGxlbFRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgY3VzdG9tVG9vbHM6IHB1Ymxpc2hlZC5hcHBseVBhdGNoIHx8IGVuZHBvaW50Lm5hbWUuaW5jbHVkZXMoXCJjb2RleFwiKSxcbiAgICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUsXG4gICAgICB3ZWJTZWFyY2g6IHB1Ymxpc2hlZC53ZWJTZWFyY2gsXG4gICAgfTtcbiAgICBjb25zdCBhbGlhc2VzID0gbmV3IFNldChcbiAgICAgIFtcbiAgICAgICAgZW5kcG9pbnQubmFtZSxcbiAgICAgICAgZW5kcG9pbnQuZGlzcGxheU5hbWUsXG4gICAgICAgIGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUsXG4gICAgICAgIG1vZGVsU2VydmljZU5hbWUsXG4gICAgICAgIC4uLk9iamVjdC52YWx1ZXMoZW5kcG9pbnQuc2VydmljZU5hbWVzID8/IHt9KSxcbiAgICAgIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlPy50cmltKCkpKSxcbiAgICApO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5vdmVycmlkZXMuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+XG4gICAgICAgIGNhbmRpZGF0ZS5tb2RlbCA9PT0gZW5kcG9pbnQubmFtZSB8fFxuICAgICAgICBbLi4uYWxpYXNlc10uc29tZSgoYWxpYXMpID0+IGFsaWFzID09PSBjYW5kaWRhdGUubW9kZWwpLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBlbmRwb2ludC5uYW1lLFxuICAgICAgYWxpYXNlczogWy4uLmFsaWFzZXNdLFxuICAgICAgZGlzcGxheU5hbWU6IGVuZHBvaW50LmRpc3BsYXlOYW1lID8/IGVuZHBvaW50Lm5hbWUsXG4gICAgICAuLi4oZW5kcG9pbnQuZmFtaWx5ID8geyBmYW1pbHk6IGVuZHBvaW50LmZhbWlseSB9IDoge30pLFxuICAgICAgLi4uKG1vZGVsU2VydmljZU5hbWUgPyB7IG1vZGVsU2VydmljZU5hbWUgfSA6IHt9KSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgY2FwYWJpbGl0aWVzOiB7IC4uLmNhcGFiaWxpdGllcywgLi4ub3ZlcnJpZGU/LmNhcGFiaWxpdGllcyB9LFxuICAgICAgcmVhc29uaW5nRWZmb3J0czogZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cyA/PyBbXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250ZXh0KCk6IFByb21pc2U8UmVnaXN0cnlDb250ZXh0PiB7XG4gICAgaWYgKHRoaXMuY2xpZW50KSB7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IHRoaXMuY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICByZXR1cm4geyBjbGllbnQ6IHRoaXMuY2xpZW50LCBob3N0IH07XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyeUNvbnRleHQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVPcHRpb25zKGNvbnRleHQ6IFJlZ2lzdHJ5Q29udGV4dCwgdHRsTXM6IG51bWJlcik6IExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgdHRsTXMsXG4gICAgLi4uKGNvbnRleHQuaWRlbnRpdHkgPyB7IGNhY2hlSWRlbnRpdHk6IGNvbnRleHQuaWRlbnRpdHkgfSA6IHt9KSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVnaXN0cnlDb250ZXh0KCk6IFByb21pc2U8UmVnaXN0cnlDb250ZXh0PiB7XG4gIGNvbnN0IGNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY29udGV4dC5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnQ6IGNvbnRleHQuY2xpZW50LFxuICAgIGhvc3QsXG4gICAgaWRlbnRpdHk6IFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkLFxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnF1YWxpZmllZE1vZGVsKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZWwudHJpbSgpLnJlcGxhY2UoL14oPzpkYnh8ZGF0YWJyaWNrcylcXC8vaSwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aXZlVHRsKHZhbHVlID0gREVGQVVMVF9DQUNIRV9UVExfTVMpOiBudW1iZXIge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1vZGVsIHJlZ2lzdHJ5IHR0bE1zIG11c3QgYmUgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplZE1vZGVsU2VydmljZU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZT8udHJpbSgpLnJlcGxhY2UoL15kYXRhYnJpY2tzXFwvLywgXCJcIik7XG4gIGlmICghbm9ybWFsaXplZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcInN5c3RlbS5haS5kYXRhYnJpY2tzLVwiKSkge1xuICAgIHJldHVybiBgc3lzdGVtLmFpLiR7bm9ybWFsaXplZC5zbGljZShcInN5c3RlbS5haS5kYXRhYnJpY2tzLVwiLmxlbmd0aCl9YDtcbiAgfVxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwiZGF0YWJyaWNrcy1cIikpIHtcbiAgICByZXR1cm4gYHN5c3RlbS5haS4ke25vcm1hbGl6ZWQuc2xpY2UoXCJkYXRhYnJpY2tzLVwiLmxlbmd0aCl9YDtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlc1Jlc29sdmVPcHRpb25zKHRhcmdldDogTW9kZWxUYXJnZXQsIG9wdGlvbnM6IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBpZiAob3B0aW9ucy5yZXF1aXJlc1Rvb2xzICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLnRvb2xzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChvcHRpb25zLm1vZGVsQ2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nKSByZXR1cm4gdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzO1xuICBpZiAob3B0aW9ucy5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQpIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmNoYXQ7XG4gIHJldHVybiB0cnVlO1xufVxuIl19
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sT0FBTyxJQUFJLFlBQVksR0FFeEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsR0FHWCxNQUFNLG1DQUFtQyxDQUFDO0FBTzNDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQTRCM0Qsb0VBQW9FO0FBQ3BFLE1BQU0sT0FBTyx1QkFBdUI7SUFDakIsS0FBSyxDQUFTO0lBQ2QsU0FBUyxDQUFxQztJQUM5QyxrQkFBa0IsQ0FBVTtJQUM1QixNQUFNLENBQThCO0lBRXJELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFF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QUk7UUFDSixRQUFRLEVBQUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWE7S0FDdkUsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQWE7SUFDckMsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEdBQUcsb0JBQW9CO0lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBbUIsRUFBRSxPQUFvQztJQUN0RixJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO0lBQ3ZGLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUN0RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcXVlc3Qtc2NvcGVkIERhdGFicmlja3MgbW9kZWwgZGlzY292ZXJ5IGZvciB0aGUgQXBwS2l0IGdhdGV3YXkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQsIHR5cGUgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgbWV0YWRhdGEsXG4gIG1vZGVsQ2F0YWxvZyxcbiAgcG9saWN5LFxuICByZXNvbHZlIGFzIG1vZGVsUmVzb2x2ZSxcbiAgdHlwZSBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyxcbiAgdHlwZSBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxUYXJnZXQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IERFRkFVTFRfQ0FDSEVfVFRMX01TID0gNjBfMDAwO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L3JlZ2lzdHJ5XCIpO1xuXG4vKiogUmVzb2x1dGlvbiBjb250cm9scyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWwgcG9saWN5IG93bmVyLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0gUGljazxSZXNvbHZlTW9kZWxJbnB1dCwgXCJtb2RlbENsYXNzXCIgfCBcInJlcXVpcmVzVG9vbHNcIj47XG5cbi8qKiBEeW5hbWljIG1vZGVsIGNhdGFsb2d1ZSB1c2VkIGJ5IHJlcXVlc3Qgcm91dGluZyBhbmQgbW9kZWwtbGlzdCByZXNwb25zZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnkge1xuICBsaXN0KCk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHNlYXJjaChxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPjtcbiAgcmVzb2x2ZShtb2RlbD86IHN0cmluZywgb3B0aW9ucz86IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyk6IFByb21pc2U8TW9kZWxUYXJnZXQgfCB1bmRlZmluZWQ+O1xuICByZWZyZXNoKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciB7QGxpbmsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnl9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHR0bE1zPzogbnVtYmVyO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuO1xuICAvKiogRGlzY292ZXIgbW9kZWxzIHdpdGggdGhpcyBjbGllbnQgaW5zdGVhZCBvZiB0aGUgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xuICByZWFkb25seSBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG59XG5cbmludGVyZmFjZSBSZWdpc3RyeUNvbnRleHQge1xuICByZWFkb25seSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBpZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIE1vZGVsIHJlZ2lzdHJ5IGJhY2tlZCBieSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSBpbXBsZW1lbnRzIE1vZGVsUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3ZlcnJpZGVzOiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVsczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy50dGxNcyA9IHBvc2l0aXZlVHRsKG9wdGlvbnMudHRsTXMpO1xuICAgIHRoaXMub3ZlcnJpZGVzID0gb3B0aW9ucy5vdmVycmlkZXMgPz8gW107XG4gICAgdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPSBvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyA/PyBmYWxzZTtcbiAgICB0aGlzLmNsaWVudCA9IG9wdGlvbnMuY2xpZW50O1xuICB9XG5cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPE1vZGVsVGFyZ2V0W10+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jb250ZXh0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibG9hZGluZyBjYXRhbG9ndWVcIiwgeyBob3N0OiBjb250ZXh0Lmhvc3QsIHR0bE1zOiB0aGlzLnR0bE1zIH0pO1xuICAgIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhcbiAgICAgIGNvbnRleHQuY2xpZW50LFxuICAgICAgY29udGV4dC5ob3N0LFxuICAgICAgY2F0YWxvZ3VlT3B0aW9ucyhjb250ZXh0LCB0aGlzLnR0bE1zKSxcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBlbmRwb2ludHMubWFwKChlbmRwb2ludCkgPT4gdGhpcy50YXJnZXQoZW5kcG9pbnQpKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgY2F0YWxvZ3VlXCIsIHtcbiAgICAgIGVuZHBvaW50Q291bnQ6IGVuZHBvaW50cy5sZW5ndGgsXG4gICAgICBob3N0OiBjb250ZXh0Lmhvc3QsXG4gICAgICB0YXJnZXRDb3VudDogdGFyZ2V0cy5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldHM7XG4gIH1cblxuICBhc3luYyByZXNvbHZlKFxuICAgIG1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8TW9kZWxUYXJnZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSBtb2RlbCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdW5xdWFsaWZpZWRNb2RlbChtb2RlbCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGV4YWN0SWQgPVxuICAgICAgcmVxdWVzdGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiB0YXJnZXRzLmZpbmQoXG4gICAgICAgICAgICAodGFyZ2V0KSA9PlxuICAgICAgICAgICAgICB0YXJnZXQuaWQubG9jYWxlQ29tcGFyZShyZXF1ZXN0ZWQsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogXCJhY2NlbnRcIiB9KSA9PT0gMCxcbiAgICAgICAgICApO1xuICAgIGNvbnN0IGV4YWN0QWxpYXMgPVxuICAgICAgcmVxdWVzdGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiB0YXJnZXRzLmZpbmQoKHRhcmdldCkgPT5cbiAgICAgICAgICAgIHRhcmdldC5hbGlhc2VzLnNvbWUoXG4gICAgICAgICAgICAgIChhbGlhcykgPT4gYWxpYXMubG9jYWxlQ29tcGFyZShyZXF1ZXN0ZWQsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogXCJhY2NlbnRcIiB9KSA9PT0gMCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICBjb25zdCBleGFjdCA9IGV4YWN0SWQgPz8gZXhhY3RBbGlhcztcbiAgICBpZiAoZXhhY3QgJiYgbWF0Y2hlc1Jlc29sdmVPcHRpb25zKGV4YWN0LCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2ZWQgZXhhY3QgbW9kZWxcIiwgeyByZXF1ZXN0ZWQsIHJlc29sdmVkOiBleGFjdC5pZCB9KTtcbiAgICAgIHJldHVybiBleGFjdDtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludHMgPSB0YXJnZXRzXG4gICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXNvbHZlZCA9IG1vZGVsUmVzb2x2ZS5yZXNvbHZlTW9kZWwoXG4gICAgICBlbmRwb2ludHMsXG4gICAgICB7XG4gICAgICAgIC4uLihyZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHsgZXhwbGljaXQ6IHJlcXVlc3RlZCB9IDoge30pLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcHJlZmVyU3lzdGVtTW9kZWxzOiB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSByZXNvbHZlZC5tb2RlbElkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBmdXp6eSBtb2RlbFwiLCB7XG4gICAgICByZXF1ZXN0ZWQsXG4gICAgICByZXNvbHZlZDogdGFyZ2V0Py5pZCxcbiAgICAgIHNvdXJjZTogcmVzb2x2ZWQuc291cmNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBieUlkID0gbmV3IE1hcCh0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBbdGFyZ2V0LmlkLCB0YXJnZXRdKSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gdGFyZ2V0c1xuICAgICAgLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQpXG4gICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcmFua2VkID0gW1xuICAgICAgLi4ubW9kZWxSZXNvbHZlLmxvb2t1cE1vZGVscyhcbiAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICB7IHNlYXJjaDogcXVlcnkgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICAgLi4ubW9kZWxSZXNvbHZlLmxvb2t1cE1vZGVscyhcbiAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICB7XG4gICAgICAgICAgc2VhcmNoOiBxdWVyeSxcbiAgICAgICAgICBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgIF0uc29ydCgobGVmdCwgcmlnaHQpID0+IChsZWZ0LnNjb3JlID8/IDApIC0gKHJpZ2h0LnNjb3JlID8/IDApKTtcbiAgICByZXR1cm4gcmFua2VkXG4gICAgICAubWFwKCh7IGVuZHBvaW50IH0pID0+IGJ5SWQuZ2V0KGVuZHBvaW50Lm5hbWUpKVxuICAgICAgLmZpbHRlcigodGFyZ2V0KTogdGFyZ2V0IGlzIE1vZGVsVGFyZ2V0ID0+IHRhcmdldCAhPT0gdW5kZWZpbmVkKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHRhcmdldCwgaW5kZXgsIGFsbCkgPT4gYWxsLmZpbmRJbmRleCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHRhcmdldC5pZCkgPT09IGluZGV4LFxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY29udGV4dCgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNsZWFyaW5nIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCB9KTtcbiAgICBpZiAoY29udGV4dC5pZGVudGl0eSkge1xuICAgICAgYXdhaXQgbW9kZWxDYXRhbG9nLmNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKGNvbnRleHQuaG9zdCwgY29udGV4dC5pZGVudGl0eSk7XG4gICAgfVxuICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhcbiAgICAgIGNvbnRleHQuY2xpZW50LFxuICAgICAgY29udGV4dC5ob3N0LFxuICAgICAgY2F0YWxvZ3VlT3B0aW9ucyhjb250ZXh0LCB0aGlzLnR0bE1zKSxcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlZnJlc2hlZCBjYXRhbG9ndWVcIiwgeyBob3N0OiBjb250ZXh0Lmhvc3QgfSk7XG4gIH1cblxuICBwcml2YXRlIHRhcmdldChlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsVGFyZ2V0IHtcbiAgICBjb25zdCBwdWJsaXNoZWQgPSBtZXRhZGF0YS5tb2RlbENhcGFiaWxpdGllc0ZvcihlbmRwb2ludCk7XG4gICAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnQuZmFtaWx5Py50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG9wZW5BaUZhbWlseSA9IGZhbWlseSA9PT0gXCJncHRcIiB8fCBmYW1pbHkgPT09IFwib3BlbmFpXCIgfHwgZW5kcG9pbnQubmFtZS5pbmNsdWRlcyhcImNvZGV4XCIpO1xuICAgIGNvbnN0IG1vZGVsU2VydmljZU5hbWUgPSBwb2xpY3kubW9kZWxTZXJ2aWNlTmFtZShlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lKTtcbiAgICBjb25zdCBlbWJlZGRpbmdzID1cbiAgICAgIGVuZHBvaW50LmNsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZyB8fCBlbmRwb2ludC50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG4gICAgY29uc3QgY2FwYWJpbGl0aWVzOiBNb2RlbENhcGFiaWxpdGllcyA9IHtcbiAgICAgIHJlc3BvbnNlczogIWVtYmVkZGluZ3MgJiYgKG9wZW5BaUZhbWlseSB8fCBwdWJsaXNoZWQucmVzcG9uc2VzKSxcbiAgICAgIG9wZW5SZXNwb25zZXM6ICFlbWJlZGRpbmdzICYmICFvcGVuQWlGYW1pbHksXG4gICAgICBjaGF0OiAhZW1iZWRkaW5ncyxcbiAgICAgIGFudGhyb3BpYzogZmFtaWx5ID09PSBcImNsYXVkZVwiLFxuICAgICAgZW1iZWRkaW5ncyxcbiAgICAgIGFpR2F0ZXdheUNvZGV4OlxuICAgICAgICAhZW1iZWRkaW5ncyAmJiBCb29sZWFuKG1vZGVsU2VydmljZU5hbWUpICYmIGZhbWlseSAhPT0gXCJjbGF1ZGVcIiAmJiBmYW1pbHkgIT09IFwiZ2VtaW5pXCIsXG4gICAgICB0b29sczogZW5kcG9pbnQuc3VwcG9ydHNUb29scyA9PT0gdHJ1ZSxcbiAgICAgIHJlYXNvbmluZzogcG9saWN5Lm1vZGVsUmVhc29uaW5nRWZmb3J0cyhlbmRwb2ludC5uYW1lKS5sZW5ndGggPiAwLFxuICAgICAgc3RyZWFtaW5nOiB0cnVlLFxuICAgICAgcGFyYWxsZWxUb29sczogZW5kcG9pbnQuc3VwcG9ydHNUb29scyA9PT0gdHJ1ZSxcbiAgICAgIGN1c3RvbVRvb2xzOiBwdWJsaXNoZWQuYXBwbHlQYXRjaCB8fCBlbmRwb2ludC5uYW1lLmluY2x1ZGVzKFwiY29kZXhcIiksXG4gICAgICBzdHJ1Y3R1cmVkT3V0cHV0OiB0cnVlLFxuICAgICAgd2ViU2VhcmNoOiBwdWJsaXNoZWQud2ViU2VhcmNoLFxuICAgIH07XG4gICAgY29uc3QgYWxpYXNlcyA9IG5ldyBTZXQoXG4gICAgICBbXG4gICAgICAgIGVuZHBvaW50Lm5hbWUsXG4gICAgICAgIGVuZHBvaW50LmRpc3BsYXlOYW1lLFxuICAgICAgICBlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lLFxuICAgICAgICBtb2RlbFNlcnZpY2VOYW1lLFxuICAgICAgICAuLi5PYmplY3QudmFsdWVzKGVuZHBvaW50LnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gICAgICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZT8udHJpbSgpKSksXG4gICAgKTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMub3ZlcnJpZGVzLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICBjYW5kaWRhdGUubW9kZWwgPT09IGVuZHBvaW50Lm5hbWUgfHxcbiAgICAgICAgWy4uLmFsaWFzZXNdLnNvbWUoKGFsaWFzKSA9PiBhbGlhcyA9PT0gY2FuZGlkYXRlLm1vZGVsKSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZW5kcG9pbnQubmFtZSxcbiAgICAgIGFsaWFzZXM6IFsuLi5hbGlhc2VzXSxcbiAgICAgIGRpc3BsYXlOYW1lOiBlbmRwb2ludC5kaXNwbGF5TmFtZSA/PyBlbmRwb2ludC5uYW1lLFxuICAgICAgLi4uKGVuZHBvaW50LmZhbWlseSA/IHsgZmFtaWx5OiBlbmRwb2ludC5mYW1pbHkgfSA6IHt9KSxcbiAgICAgIC4uLihtb2RlbFNlcnZpY2VOYW1lID8geyBtb2RlbFNlcnZpY2VOYW1lIH0gOiB7fSksXG4gICAgICBlbmRwb2ludCxcbiAgICAgIGNhcGFiaWxpdGllczogeyAuLi5jYXBhYmlsaXRpZXMsIC4uLm92ZXJyaWRlPy5jYXBhYmlsaXRpZXMgfSxcbiAgICAgIHJlYXNvbmluZ0VmZm9ydHM6IGVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHMgPz8gW10sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGV4dCgpOiBQcm9taXNlPFJlZ2lzdHJ5Q29udGV4dD4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkge1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCB0aGlzLmNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgcmV0dXJuIHsgY2xpZW50OiB0aGlzLmNsaWVudCwgaG9zdCB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVnaXN0cnlDb250ZXh0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlT3B0aW9ucyhjb250ZXh0OiBSZWdpc3RyeUNvbnRleHQsIHR0bE1zOiBudW1iZXIpOiBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIHR0bE1zLFxuICAgIC4uLihjb250ZXh0LmlkZW50aXR5ID8geyBjYWNoZUlkZW50aXR5OiBjb250ZXh0LmlkZW50aXR5IH0gOiB7fSksXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdHJ5Q29udGV4dCgpOiBQcm9taXNlPFJlZ2lzdHJ5Q29udGV4dD4ge1xuICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIHJldHVybiB7XG4gICAgY2xpZW50OiBjb250ZXh0LmNsaWVudCxcbiAgICBob3N0LFxuICAgIGlkZW50aXR5OiBcInVzZXJJZFwiIGluIGNvbnRleHQgPyBjb250ZXh0LnVzZXJJZCA6IGNvbnRleHQuc2VydmljZVVzZXJJZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5xdWFsaWZpZWRNb2RlbChtb2RlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG1vZGVsLnRyaW0oKS5yZXBsYWNlKC9eKD86ZGJ4fGRhdGFicmlja3MpXFwvL2ksIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZVR0bCh2YWx1ZSA9IERFRkFVTFRfQ0FDSEVfVFRMX01TKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNb2RlbCByZWdpc3RyeSB0dGxNcyBtdXN0IGJlIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNSZXNvbHZlT3B0aW9ucyh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKG9wdGlvbnMucmVxdWlyZXNUb29scyAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scykgcmV0dXJuIGZhbHNlO1xuICBpZiAob3B0aW9ucy5tb2RlbENsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZykgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncztcbiAgaWYgKG9wdGlvbnMubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGFyZ2V0LmNhcGFiaWxpdGllcy5jaGF0O1xuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
package/lib/src/router.js CHANGED
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { policy } from "@dbx-tools/model";
6
7
  import { object } from "@dbx-tools/shared-core";
7
8
  /** Error returned when preserving a requested protocol feature is impossible. */
8
9
  export class UnsupportedGatewayFeatureError extends Error {
@@ -16,7 +17,7 @@ export class UnsupportedGatewayFeatureError extends Error {
16
17
  }
17
18
  /** Select the lowest-overhead upstream that preserves the client contract. */
18
19
  export function resolveRoute(input) {
19
- const { clientProtocol, requestedModel, features, target } = input;
20
+ const { clientProtocol, features, target } = input;
20
21
  if (clientProtocol === "openai-embeddings") {
21
22
  if (!target.capabilities.embeddings) {
22
23
  throw new UnsupportedGatewayFeatureError(["embeddings"]);
@@ -25,9 +26,8 @@ export function resolveRoute(input) {
25
26
  }
26
27
  if (clientProtocol === "openai-responses") {
27
28
  rejectStatefulResponses(features);
28
- if (isCodexOriginator(input.originator) &&
29
- canUseAiGatewayCodex(target, features) &&
30
- !requestedServingEndpoint(requestedModel, target)) {
29
+ if (canUseAiGatewayCodex(target, features) &&
30
+ policy.prefersSystemModelService(input.requestedModel, target.id, target.modelServiceName, input.preferSystemModels === true)) {
31
31
  return directRoute(input, "databricks-ai-gateway-codex", target.modelServiceName);
32
32
  }
33
33
  if (target.capabilities.responses && supportsDirectResponses(target, features)) {
@@ -129,8 +129,4 @@ function canUseAiGatewayCodex(target, features) {
129
129
  return (Boolean(target.capabilities.aiGatewayCodex && target.modelServiceName) &&
130
130
  supportsDirectResponses(target, features));
131
131
  }
132
- /** Serving-endpoint ids stay on Databricks Responses; aliases and model-service slugs use Codex. */
133
- function requestedServingEndpoint(requestedModel, target) {
134
- return requestedModel.trim().replace(/^(?:dbx|databricks)\//i, "") === target.id;
135
- }
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBU2hELGlGQUFpRjtBQUNqRixNQUFNLE9BQU8sOEJBQStCLFNBQVEsS0FBSztJQUdsQztJQUZaLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFFdEIsWUFBcUIsUUFBMkI7UUFDOUMsS0FBSyxDQUFDLDBEQUEwRCxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQURwRSxhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQUU5QyxJQUFJLENBQUMsSUFBSSxHQUFHLGdDQUFnQyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQUVELDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQXdCO0lBQ25ELE1BQU0sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDbkUsSUFBSSxjQUFjLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksOEJBQThCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLGNBQWMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQ0UsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNuQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFD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S0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQ25GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1cmUgY2FwYWJpbGl0eS1kcml2ZW4gcm91dGUgc2VsZWN0aW9uIGZvciBtb2RlbC1nYXRld2F5IHJlcXVlc3RzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBHYXRld2F5Um91dGUsXG4gIE1vZGVsVGFyZ2V0LFxuICBSZXF1ZXN0ZWRGZWF0dXJlcyxcbiAgUmVzb2x2ZVJvdXRlSW5wdXQsXG4gIFVwc3RyZWFtUHJvdG9jb2wsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbi8qKiBFcnJvciByZXR1cm5lZCB3aGVuIHByZXNlcnZpbmcgYSByZXF1ZXN0ZWQgcHJvdG9jb2wgZmVhdHVyZSBpcyBpbXBvc3NpYmxlLiAqL1xuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RhdHVzID0gNDAwO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZlYXR1cmVzOiByZWFkb25seSBzdHJpbmdbXSkge1xuICAgIHN1cGVyKGBUaGUgc2VsZWN0ZWQgbW9kZWwgY2Fubm90IHByZXNlcnZlIHJlcXVlc3RlZCBmZWF0dXJlczogJHtmZWF0dXJlcy5qb2luKFwiLCBcIil9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3JcIjtcbiAgfVxufVxuXG4vKiogU2VsZWN0IHRoZSBsb3dlc3Qtb3ZlcmhlYWQgdXBzdHJlYW0gdGhhdCBwcmVzZXJ2ZXMgdGhlIGNsaWVudCBjb250cmFjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUm91dGUoaW5wdXQ6IFJlc29sdmVSb3V0ZUlucHV0KTogR2F0ZXdheVJvdXRlIHtcbiAgY29uc3QgeyBjbGllbnRQcm90b2NvbCwgcmVxdWVzdGVkTW9kZWwsIGZlYXR1cmVzLCB0YXJnZXQgfSA9IGlucHV0O1xuICBpZiAoY2xpZW50UHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikge1xuICAgIGlmICghdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yKFtcImVtYmVkZGluZ3NcIl0pO1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1lbWJlZGRpbmdzXCIsIHRhcmdldC5pZCk7XG4gIH1cbiAgaWYgKGNsaWVudFByb3RvY29sID09PSBcIm9wZW5haS1yZXNwb25zZXNcIikge1xuICAgIHJlamVjdFN0YXRlZnVsUmVzcG9uc2VzKGZlYXR1cmVzKTtcbiAgICBpZiAoXG4gICAgICBpc0NvZGV4T3JpZ2luYXRvcihpbnB1dC5vcmlnaW5hdG9yKSAmJlxuICAgICAgY2FuVXNlQWlHYXRld2F5Q29kZXgodGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAgICFyZXF1ZXN0ZWRTZXJ2aW5nRW5kcG9pbnQocmVxdWVzdGVkTW9kZWwsIHRhcmdldClcbiAgICApIHtcbiAgICAgIHJldHVybiBkaXJlY3RSb3V0ZShpbnB1dCwgXCJkYXRhYnJpY2tzLWFpLWdhdGV3YXktY29kZXhcIiwgdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWUhKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzICYmIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1yZXNwb25zZXNcIiwgdGFyZ2V0LmlkKTtcbiAgICB9XG4gICAgaWYgKGNhblVzZUFpR2F0ZXdheUNvZGV4KHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1haS1nYXRld2F5LWNvZGV4XCIsIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lISk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMgJiYgc3VwcG9ydHNPcGVuUmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1vcGVuLXJlc3BvbnNlc1wiLCB0YXJnZXQuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbiAgfVxuXG4gIGlmIChjbGllbnRQcm90b2NvbCA9PT0gXCJvcGVuYWktY2hhdFwiKSB7XG4gICAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdCAmJiBzdXBwb3J0c1Rvb2xzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1jaGF0XCIsIHRhcmdldC5pZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkUm91dGUoaW5wdXQpO1xuICB9XG5cbiAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljICYmIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykpIHtcbiAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1hbnRocm9waWNcIiwgdGFyZ2V0LmlkKTtcbiAgfVxuICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbn1cblxuLyoqIERldGVjdCByb3V0ZS1hZmZlY3RpbmcgZmVhdHVyZXMgZnJvbSBhbiBPcGVuQUkgb3IgQW50aHJvcGljIHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ZWRGZWF0dXJlcyhib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBSZXF1ZXN0ZWRGZWF0dXJlcyB7XG4gIGNvbnN0IHRvb2xzID0gQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSA/IGJvZHkudG9vbHMgOiBbXTtcbiAgY29uc3QgdG9vbFR5cGVzID0gdG9vbHNcbiAgICAuZmlsdGVyKCh0b29sKTogdG9vbCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiBvYmplY3QuaXNSZWNvcmQodG9vbCkpXG4gICAgLm1hcCgodG9vbCkgPT4gdG9vbC50eXBlKTtcbiAgY29uc3QgdGV4dCA9IG9iamVjdC5pc1JlY29yZChib2R5LnRleHQpID8gYm9keS50ZXh0IDoge307XG4gIGNvbnN0IGZvcm1hdCA9IG9iamVjdC5pc1JlY29yZCh0ZXh0LmZvcm1hdCkgPyB0ZXh0LmZvcm1hdC50eXBlIDogdGV4dC5mb3JtYXQ7XG4gIHJldHVybiB7XG4gICAgYmFja2dyb3VuZDogYm9keS5iYWNrZ3JvdW5kID09PSB0cnVlLFxuICAgIGN1c3RvbVRvb2xzOiB0b29sVHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJjdXN0b21cIiksXG4gICAgcGFyYWxsZWxUb29sczogYm9keS5wYXJhbGxlbF90b29sX2NhbGxzID09PSB0cnVlLFxuICAgIHByZXZpb3VzUmVzcG9uc2U6XG4gICAgICB0eXBlb2YgYm9keS5wcmV2aW91c19yZXNwb25zZV9pZCA9PT0gXCJzdHJpbmdcIiAmJiBib2R5LnByZXZpb3VzX3Jlc3BvbnNlX2lkLmxlbmd0aCA+IDAsXG4gICAgcmVhc29uaW5nOiBvYmplY3QuaXNSZWNvcmQoYm9keS5yZWFzb25pbmcpIHx8IGJvZHkucmVhc29uaW5nX2VmZm9ydCAhPT0gdW5kZWZpbmVkLFxuICAgIHN0b3JhZ2U6IGJvZHkuc3RvcmUgPT09IHRydWUsXG4gICAgc3RydWN0dXJlZE91dHB1dDogZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgZm9ybWF0ICE9PSBcInRleHRcIixcbiAgICB0b29sczogdG9vbHMubGVuZ3RoID4gMCxcbiAgICB1bnN1cHBvcnRlZE9wZW5SZXNwb25zZXNUb29sczogdG9vbFR5cGVzLnNvbWUoXG4gICAgICAodHlwZSkgPT4gdHlwZSAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGUgIT09IFwid2ViX3NlYXJjaFwiICYmIHR5cGUgIT09IFwid2ViX3NlYXJjaF9wcmV2aWV3XCIsXG4gICAgKSxcbiAgICB3ZWJTZWFyY2g6IHRvb2xUeXBlcy5zb21lKCh0eXBlKSA9PiB0eXBlID09PSBcIndlYl9zZWFyY2hcIiB8fCB0eXBlID09PSBcIndlYl9zZWFyY2hfcHJldmlld1wiKSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGFuIE9yaWdpbmF0b3IgaGVhZGVyIHNlbGVjdHMgQ29kZXggY29tcGF0aWJpbGl0eSBiZWhhdmlvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9yaWdpbmF0b3I/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJjb2RleFwiKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGlyZWN0Um91dGUoXG4gIGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCxcbiAgdXBzdHJlYW1Qcm90b2NvbDogRXhjbHVkZTxVcHN0cmVhbVByb3RvY29sLCBcImFpLXNka1wiPixcbiAgdXBzdHJlYW1Nb2RlbDogc3RyaW5nLFxuKTogR2F0ZXdheVJvdXRlIHtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnRQcm90b2NvbDogaW5wdXQuY2xpZW50UHJvdG9jb2wsXG4gICAgdXBzdHJlYW1Qcm90b2NvbCxcbiAgICB0YXJnZXQ6IGlucHV0LnRhcmdldCxcbiAgICB1cHN0cmVhbU1vZGVsLFxuICAgIHRyYW5zbGF0ZVJlcXVlc3Q6IGZhbHNlLFxuICAgIHRyYW5zbGF0ZVJlc3BvbnNlOiBmYWxzZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlZFJvdXRlKGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCk6IEdhdGV3YXlSb3V0ZSB7XG4gIHJldHVybiB7XG4gICAgY2xpZW50UHJvdG9jb2w6IGlucHV0LmNsaWVudFByb3RvY29sLFxuICAgIHVwc3RyZWFtUHJvdG9jb2w6IFwiYWktc2RrXCIsXG4gICAgdGFyZ2V0OiBpbnB1dC50YXJnZXQsXG4gICAgdXBzdHJlYW1Nb2RlbDogaW5wdXQudGFyZ2V0LmlkLFxuICAgIHRyYW5zbGF0ZVJlcXVlc3Q6IHRydWUsXG4gICAgdHJhbnNsYXRlUmVzcG9uc2U6IHRydWUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAoIWZlYXR1cmVzLmN1c3RvbVRvb2xzIHx8IHRhcmdldC5jYXBhYmlsaXRpZXMuY3VzdG9tVG9vbHMpICYmXG4gICAgKCFmZWF0dXJlcy5zdHJ1Y3R1cmVkT3V0cHV0IHx8IHRhcmdldC5jYXBhYmlsaXRpZXMuc3RydWN0dXJlZE91dHB1dClcbiAgKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNPcGVuUmVzcG9uc2VzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAhZmVhdHVyZXMuY3VzdG9tVG9vbHMgJiZcbiAgICAhZmVhdHVyZXMucHJldmlvdXNSZXNwb25zZSAmJlxuICAgICFmZWF0dXJlcy5zdG9yYWdlICYmXG4gICAgIWZlYXR1cmVzLmJhY2tncm91bmQgJiZcbiAgICAhZmVhdHVyZXMudW5zdXBwb3J0ZWRPcGVuUmVzcG9uc2VzVG9vbHMgJiZcbiAgICAoIWZlYXR1cmVzLndlYlNlYXJjaCB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCkgJiZcbiAgICAoIWZlYXR1cmVzLnN0cnVjdHVyZWRPdXRwdXQgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJ1Y3R1cmVkT3V0cHV0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c1Rvb2xzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgICghZmVhdHVyZXMudG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scykgJiZcbiAgICAoIWZlYXR1cmVzLnBhcmFsbGVsVG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5wYXJhbGxlbFRvb2xzKVxuICApO1xufVxuXG5mdW5jdGlvbiByZWplY3RTdGF0ZWZ1bFJlc3BvbnNlcyhmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiB2b2lkIHtcbiAgY29uc3QgdW5zdXBwb3J0ZWQgPSBbXG4gICAgLi4uKGZlYXR1cmVzLnByZXZpb3VzUmVzcG9uc2UgPyBbXCJwcmV2aW91c19yZXNwb25zZV9pZFwiXSA6IFtdKSxcbiAgICAuLi4oZmVhdHVyZXMuc3RvcmFnZSA/IFtcInN0b3JlXCJdIDogW10pLFxuICAgIC4uLihmZWF0dXJlcy5iYWNrZ3JvdW5kID8gW1wiYmFja2dyb3VuZFwiXSA6IFtdKSxcbiAgXTtcbiAgaWYgKHVuc3VwcG9ydGVkLmxlbmd0aCA+IDApIHRocm93IG5ldyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IodW5zdXBwb3J0ZWQpO1xufVxuXG5mdW5jdGlvbiBjYW5Vc2VBaUdhdGV3YXlDb2RleCh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBCb29sZWFuKHRhcmdldC5jYXBhYmlsaXRpZXMuYWlHYXRld2F5Q29kZXggJiYgdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWUpICYmXG4gICAgc3VwcG9ydHNEaXJlY3RSZXNwb25zZXModGFyZ2V0LCBmZWF0dXJlcylcbiAgKTtcbn1cblxuLyoqIFNlcnZpbmctZW5kcG9pbnQgaWRzIHN0YXkgb24gRGF0YWJyaWNrcyBSZXNwb25zZXM7IGFsaWFzZXMgYW5kIG1vZGVsLXNlcnZpY2Ugc2x1Z3MgdXNlIENvZGV4LiAqL1xuZnVuY3Rpb24gcmVxdWVzdGVkU2VydmluZ0VuZHBvaW50KHJlcXVlc3RlZE1vZGVsOiBzdHJpbmcsIHRhcmdldDogTW9kZWxUYXJnZXQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcXVlc3RlZE1vZGVsLnRyaW0oKS5yZXBsYWNlKC9eKD86ZGJ4fGRhdGFicmlja3MpXFwvL2ksIFwiXCIpID09PSB0YXJnZXQuaWQ7XG59XG4iXX0=
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVNoRCxpRkFBaUY7QUFDakYsTUFBTSxPQUFPLDhCQUErQixTQUFRLEtBQUs7SUFHbEM7SUFGWixNQUFNLEdBQUcsR0FBRyxDQUFDO0lBRXRCLFlBQXFCLFFBQTJCO1FBQzlDLEtBQUssQ0FBQywwREFBMEQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFEcEUsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFFOUMsSUFBSSxDQUFDLElBQUksR0FBRyxnQ0FBZ0MsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUF3QjtJQUNuRCxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDbkQsSUFBSSxjQUFjLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksOEJBQThCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLGNBQWMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQ0Usb0JBQW9CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztZQUN0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LWRyaXZlbiByb3V0ZSBzZWxlY3Rpb24gZm9yIG1vZGVsLWdhdGV3YXkgcmVxdWVzdHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBvbGljeSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBHYXRld2F5Um91dGUsXG4gIE1vZGVsVGFyZ2V0LFxuICBSZXF1ZXN0ZWRGZWF0dXJlcyxcbiAgUmVzb2x2ZVJvdXRlSW5wdXQsXG4gIFVwc3RyZWFtUHJvdG9jb2wsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbi8qKiBFcnJvciByZXR1cm5lZCB3aGVuIHByZXNlcnZpbmcgYSByZXF1ZXN0ZWQgcHJvdG9jb2wgZmVhdHVyZSBpcyBpbXBvc3NpYmxlLiAqL1xuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RhdHVzID0gNDAwO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZlYXR1cmVzOiByZWFkb25seSBzdHJpbmdbXSkge1xuICAgIHN1cGVyKGBUaGUgc2VsZWN0ZWQgbW9kZWwgY2Fubm90IHByZXNlcnZlIHJlcXVlc3RlZCBmZWF0dXJlczogJHtmZWF0dXJlcy5qb2luKFwiLCBcIil9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3JcIjtcbiAgfVxufVxuXG4vKiogU2VsZWN0IHRoZSBsb3dlc3Qtb3ZlcmhlYWQgdXBzdHJlYW0gdGhhdCBwcmVzZXJ2ZXMgdGhlIGNsaWVudCBjb250cmFjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUm91dGUoaW5wdXQ6IFJlc29sdmVSb3V0ZUlucHV0KTogR2F0ZXdheVJvdXRlIHtcbiAgY29uc3QgeyBjbGllbnRQcm90b2NvbCwgZmVhdHVyZXMsIHRhcmdldCB9ID0gaW5wdXQ7XG4gIGlmIChjbGllbnRQcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiKSB7XG4gICAgaWYgKCF0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3MpIHtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IoW1wiZW1iZWRkaW5nc1wiXSk7XG4gICAgfVxuICAgIHJldHVybiBkaXJlY3RSb3V0ZShpbnB1dCwgXCJkYXRhYnJpY2tzLWVtYmVkZGluZ3NcIiwgdGFyZ2V0LmlkKTtcbiAgfVxuICBpZiAoY2xpZW50UHJvdG9jb2wgPT09IFwib3BlbmFpLXJlc3BvbnNlc1wiKSB7XG4gICAgcmVqZWN0U3RhdGVmdWxSZXNwb25zZXMoZmVhdHVyZXMpO1xuICAgIGlmIChcbiAgICAgIGNhblVzZUFpR2F0ZXdheUNvZGV4KHRhcmdldCwgZmVhdHVyZXMpICYmXG4gICAgICBwb2xpY3kucHJlZmVyc1N5c3RlbU1vZGVsU2VydmljZShcbiAgICAgICAgaW5wdXQucmVxdWVzdGVkTW9kZWwsXG4gICAgICAgIHRhcmdldC5pZCxcbiAgICAgICAgdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWUhLFxuICAgICAgICBpbnB1dC5wcmVmZXJTeXN0ZW1Nb2RlbHMgPT09IHRydWUsXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1haS1nYXRld2F5LWNvZGV4XCIsIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lISk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyAmJiBzdXBwb3J0c0RpcmVjdFJlc3BvbnNlcyh0YXJnZXQsIGZlYXR1cmVzKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtcmVzcG9uc2VzXCIsIHRhcmdldC5pZCk7XG4gICAgfVxuICAgIGlmIChjYW5Vc2VBaUdhdGV3YXlDb2RleCh0YXJnZXQsIGZlYXR1cmVzKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtYWktZ2F0ZXdheS1jb2RleFwiLCB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZSEpO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0LmNhcGFiaWxpdGllcy5vcGVuUmVzcG9uc2VzICYmIHN1cHBvcnRzT3BlblJlc3BvbnNlcyh0YXJnZXQsIGZlYXR1cmVzKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3Mtb3Blbi1yZXNwb25zZXNcIiwgdGFyZ2V0LmlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWRSb3V0ZShpbnB1dCk7XG4gIH1cblxuICBpZiAoY2xpZW50UHJvdG9jb2wgPT09IFwib3BlbmFpLWNoYXRcIikge1xuICAgIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLmNoYXQgJiYgc3VwcG9ydHNUb29scyh0YXJnZXQsIGZlYXR1cmVzKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtY2hhdFwiLCB0YXJnZXQuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbiAgfVxuXG4gIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLmFudGhyb3BpYyAmJiBzdXBwb3J0c1Rvb2xzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtYW50aHJvcGljXCIsIHRhcmdldC5pZCk7XG4gIH1cbiAgcmV0dXJuIHRyYW5zbGF0ZWRSb3V0ZShpbnB1dCk7XG59XG5cbi8qKiBEZXRlY3Qgcm91dGUtYWZmZWN0aW5nIGZlYXR1cmVzIGZyb20gYW4gT3BlbkFJIG9yIEFudGhyb3BpYyByZXF1ZXN0IGJvZHkuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdGVkRmVhdHVyZXMoYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogUmVxdWVzdGVkRmVhdHVyZXMge1xuICBjb25zdCB0b29scyA9IEFycmF5LmlzQXJyYXkoYm9keS50b29scykgPyBib2R5LnRvb2xzIDogW107XG4gIGNvbnN0IHRvb2xUeXBlcyA9IHRvb2xzXG4gICAgLmZpbHRlcigodG9vbCk6IHRvb2wgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gb2JqZWN0LmlzUmVjb3JkKHRvb2wpKVxuICAgIC5tYXAoKHRvb2wpID0+IHRvb2wudHlwZSk7XG4gIGNvbnN0IHRleHQgPSBvYmplY3QuaXNSZWNvcmQoYm9keS50ZXh0KSA/IGJvZHkudGV4dCA6IHt9O1xuICBjb25zdCBmb3JtYXQgPSBvYmplY3QuaXNSZWNvcmQodGV4dC5mb3JtYXQpID8gdGV4dC5mb3JtYXQudHlwZSA6IHRleHQuZm9ybWF0O1xuICByZXR1cm4ge1xuICAgIGJhY2tncm91bmQ6IGJvZHkuYmFja2dyb3VuZCA9PT0gdHJ1ZSxcbiAgICBjdXN0b21Ub29sczogdG9vbFR5cGVzLnNvbWUoKHR5cGUpID0+IHR5cGUgPT09IFwiY3VzdG9tXCIpLFxuICAgIHBhcmFsbGVsVG9vbHM6IGJvZHkucGFyYWxsZWxfdG9vbF9jYWxscyA9PT0gdHJ1ZSxcbiAgICBwcmV2aW91c1Jlc3BvbnNlOlxuICAgICAgdHlwZW9mIGJvZHkucHJldmlvdXNfcmVzcG9uc2VfaWQgPT09IFwic3RyaW5nXCIgJiYgYm9keS5wcmV2aW91c19yZXNwb25zZV9pZC5sZW5ndGggPiAwLFxuICAgIHJlYXNvbmluZzogb2JqZWN0LmlzUmVjb3JkKGJvZHkucmVhc29uaW5nKSB8fCBib2R5LnJlYXNvbmluZ19lZmZvcnQgIT09IHVuZGVmaW5lZCxcbiAgICBzdG9yYWdlOiBib2R5LnN0b3JlID09PSB0cnVlLFxuICAgIHN0cnVjdHVyZWRPdXRwdXQ6IGZvcm1hdCAhPT0gdW5kZWZpbmVkICYmIGZvcm1hdCAhPT0gXCJ0ZXh0XCIsXG4gICAgdG9vbHM6IHRvb2xzLmxlbmd0aCA+IDAsXG4gICAgdW5zdXBwb3J0ZWRPcGVuUmVzcG9uc2VzVG9vbHM6IHRvb2xUeXBlcy5zb21lKFxuICAgICAgKHR5cGUpID0+IHR5cGUgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlICE9PSBcIndlYl9zZWFyY2hcIiAmJiB0eXBlICE9PSBcIndlYl9zZWFyY2hfcHJldmlld1wiLFxuICAgICksXG4gICAgd2ViU2VhcmNoOiB0b29sVHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJ3ZWJfc2VhcmNoXCIgfHwgdHlwZSA9PT0gXCJ3ZWJfc2VhcmNoX3ByZXZpZXdcIiksXG4gIH07XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhbiBPcmlnaW5hdG9yIGhlYWRlciBzZWxlY3RzIENvZGV4IGNvbXBhdGliaWxpdHkgYmVoYXZpb3IuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb2RleE9yaWdpbmF0b3Iob3JpZ2luYXRvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcmlnaW5hdG9yPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiY29kZXhcIikgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGRpcmVjdFJvdXRlKFxuICBpbnB1dDogUmVzb2x2ZVJvdXRlSW5wdXQsXG4gIHVwc3RyZWFtUHJvdG9jb2w6IEV4Y2x1ZGU8VXBzdHJlYW1Qcm90b2NvbCwgXCJhaS1zZGtcIj4sXG4gIHVwc3RyZWFtTW9kZWw6IHN0cmluZyxcbik6IEdhdGV3YXlSb3V0ZSB7XG4gIHJldHVybiB7XG4gICAgY2xpZW50UHJvdG9jb2w6IGlucHV0LmNsaWVudFByb3RvY29sLFxuICAgIHVwc3RyZWFtUHJvdG9jb2wsXG4gICAgdGFyZ2V0OiBpbnB1dC50YXJnZXQsXG4gICAgdXBzdHJlYW1Nb2RlbCxcbiAgICB0cmFuc2xhdGVSZXF1ZXN0OiBmYWxzZSxcbiAgICB0cmFuc2xhdGVSZXNwb25zZTogZmFsc2UsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZWRSb3V0ZShpbnB1dDogUmVzb2x2ZVJvdXRlSW5wdXQpOiBHYXRld2F5Um91dGUge1xuICByZXR1cm4ge1xuICAgIGNsaWVudFByb3RvY29sOiBpbnB1dC5jbGllbnRQcm90b2NvbCxcbiAgICB1cHN0cmVhbVByb3RvY29sOiBcImFpLXNka1wiLFxuICAgIHRhcmdldDogaW5wdXQudGFyZ2V0LFxuICAgIHVwc3RyZWFtTW9kZWw6IGlucHV0LnRhcmdldC5pZCxcbiAgICB0cmFuc2xhdGVSZXF1ZXN0OiB0cnVlLFxuICAgIHRyYW5zbGF0ZVJlc3BvbnNlOiB0cnVlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0RpcmVjdFJlc3BvbnNlcyh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBzdXBwb3J0c1Rvb2xzKHRhcmdldCwgZmVhdHVyZXMpICYmXG4gICAgKCFmZWF0dXJlcy5jdXN0b21Ub29scyB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLmN1c3RvbVRvb2xzKSAmJlxuICAgICghZmVhdHVyZXMuc3RydWN0dXJlZE91dHB1dCB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLnN0cnVjdHVyZWRPdXRwdXQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzT3BlblJlc3BvbnNlcyh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBzdXBwb3J0c1Rvb2xzKHRhcmdldCwgZmVhdHVyZXMpICYmXG4gICAgIWZlYXR1cmVzLmN1c3RvbVRvb2xzICYmXG4gICAgIWZlYXR1cmVzLnByZXZpb3VzUmVzcG9uc2UgJiZcbiAgICAhZmVhdHVyZXMuc3RvcmFnZSAmJlxuICAgICFmZWF0dXJlcy5iYWNrZ3JvdW5kICYmXG4gICAgIWZlYXR1cmVzLnVuc3VwcG9ydGVkT3BlblJlc3BvbnNlc1Rvb2xzICYmXG4gICAgKCFmZWF0dXJlcy53ZWJTZWFyY2ggfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpICYmXG4gICAgKCFmZWF0dXJlcy5zdHJ1Y3R1cmVkT3V0cHV0IHx8IHRhcmdldC5jYXBhYmlsaXRpZXMuc3RydWN0dXJlZE91dHB1dClcbiAgKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNUb29scyh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAoIWZlYXR1cmVzLnRvb2xzIHx8IHRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMpICYmXG4gICAgKCFmZWF0dXJlcy5wYXJhbGxlbFRvb2xzIHx8IHRhcmdldC5jYXBhYmlsaXRpZXMucGFyYWxsZWxUb29scylcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVqZWN0U3RhdGVmdWxSZXNwb25zZXMoZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzKTogdm9pZCB7XG4gIGNvbnN0IHVuc3VwcG9ydGVkID0gW1xuICAgIC4uLihmZWF0dXJlcy5wcmV2aW91c1Jlc3BvbnNlID8gW1wicHJldmlvdXNfcmVzcG9uc2VfaWRcIl0gOiBbXSksXG4gICAgLi4uKGZlYXR1cmVzLnN0b3JhZ2UgPyBbXCJzdG9yZVwiXSA6IFtdKSxcbiAgICAuLi4oZmVhdHVyZXMuYmFja2dyb3VuZCA/IFtcImJhY2tncm91bmRcIl0gOiBbXSksXG4gIF07XG4gIGlmICh1bnN1cHBvcnRlZC5sZW5ndGggPiAwKSB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yKHVuc3VwcG9ydGVkKTtcbn1cblxuZnVuY3Rpb24gY2FuVXNlQWlHYXRld2F5Q29kZXgodGFyZ2V0OiBNb2RlbFRhcmdldCwgZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgQm9vbGVhbih0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4ICYmIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lKSAmJlxuICAgIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpXG4gICk7XG59XG4iXX0=
package/package.json CHANGED
@@ -27,12 +27,12 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@databricks/appkit": "0.81.0",
30
- "@dbx-tools/databricks": "^0.9.128",
31
- "@dbx-tools/model": "^0.9.128",
32
- "@dbx-tools/model-protocol": "^0.9.128",
33
- "@dbx-tools/shared-core": "^0.9.128",
34
- "@dbx-tools/shared-model": "^0.9.128",
35
- "@dbx-tools/shared-model-gateway": "^0.9.128",
30
+ "@dbx-tools/databricks": "^0.9.131",
31
+ "@dbx-tools/model": "^0.9.131",
32
+ "@dbx-tools/model-protocol": "^0.9.131",
33
+ "@dbx-tools/shared-core": "^0.9.131",
34
+ "@dbx-tools/shared-model": "^0.9.131",
35
+ "@dbx-tools/shared-model-gateway": "^0.9.131",
36
36
  "ai": "^7.0.0",
37
37
  "zod": "4.3.6"
38
38
  },
@@ -90,7 +90,7 @@
90
90
  "./package.json": "./package.json"
91
91
  }
92
92
  },
93
- "version": "0.9.128",
93
+ "version": "0.9.131",
94
94
  "types": "./lib/index.d.ts",
95
95
  "dbxToolsConfig": {
96
96
  "tags": [
package/src/gateway.ts CHANGED
@@ -36,6 +36,7 @@ export interface ModelGatewayOptions {
36
36
  readonly overrides?: readonly ModelCapabilityOverride[];
37
37
  readonly model?: string;
38
38
  readonly modelClass?: ModelClassType;
39
+ readonly preferSystemModels?: boolean;
39
40
  }
40
41
 
41
42
  /** Error carrying an HTTP status and protocol-safe message. */
@@ -54,15 +55,20 @@ export class ModelGateway {
54
55
  private readonly registry: ModelRegistry;
55
56
  private readonly model?: string;
56
57
  private readonly modelClass?: ModelClassType;
58
+ private readonly preferSystemModels: boolean;
57
59
 
58
60
  constructor(options: ModelGatewayOptions = {}, registry?: ModelRegistry) {
59
61
  const registryOptions: ModelRegistryOptions = {
60
62
  ...(options.cacheTtlMs !== undefined ? { ttlMs: options.cacheTtlMs } : {}),
61
63
  ...(options.overrides ? { overrides: options.overrides } : {}),
64
+ ...(options.preferSystemModels !== undefined
65
+ ? { preferSystemModels: options.preferSystemModels }
66
+ : {}),
62
67
  };
63
68
  this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
64
69
  this.model = options.model;
65
70
  this.modelClass = options.modelClass;
71
+ this.preferSystemModels = options.preferSystemModels ?? false;
66
72
  }
67
73
 
68
74
  /** Return the live OpenAI model list, including Codex metadata when requested. */
@@ -72,7 +78,12 @@ export class ModelGateway {
72
78
  const query = search?.trim();
73
79
  const targets = query ? await this.registry.search(query) : await this.registry.list();
74
80
  logger.debug("listed models", { codex, count: targets.length });
75
- return listModelsPayload(targets, codex, query !== undefined && query.length > 0);
81
+ return listModelsPayload(
82
+ targets,
83
+ codex,
84
+ query !== undefined && query.length > 0,
85
+ this.preferSystemModels,
86
+ );
76
87
  }
77
88
 
78
89
  /** Resolve and execute one inference request. */
@@ -113,11 +124,11 @@ export class ModelGateway {
113
124
  : "No model matches the requested class",
114
125
  );
115
126
  }
116
- const requestedModel = selection.model ?? target.id;
117
127
  const route = resolveRoute({
118
128
  clientProtocol: protocol,
119
- requestedModel,
129
+ ...(selection.model ? { requestedModel: selection.model } : {}),
120
130
  originator: headers.get("originator") ?? undefined,
131
+ preferSystemModels: this.preferSystemModels,
121
132
  features,
122
133
  target,
123
134
  });
package/src/models.ts CHANGED
@@ -33,21 +33,25 @@ export function listModelsPayload(
33
33
  targets: readonly ModelTarget[],
34
34
  includeCodex: true,
35
35
  preserveOrder?: boolean,
36
+ preferSystemModels?: boolean,
36
37
  ): CodexModelListResponse;
37
38
  export function listModelsPayload(
38
39
  targets: readonly ModelTarget[],
39
40
  includeCodex: false,
40
41
  preserveOrder?: boolean,
42
+ preferSystemModels?: boolean,
41
43
  ): OpenAIModelListResponse;
42
44
  export function listModelsPayload(
43
45
  targets: readonly ModelTarget[],
44
46
  includeCodex: boolean,
45
47
  preserveOrder?: boolean,
48
+ preferSystemModels?: boolean,
46
49
  ): ModelListResponse;
47
50
  export function listModelsPayload(
48
51
  targets: readonly ModelTarget[],
49
52
  includeCodex: boolean,
50
53
  preserveOrder = false,
54
+ preferSystemModels = false,
51
55
  ): ModelListResponse {
52
56
  const available = targets
53
57
  .filter((target) => target.endpoint?.status?.deprecated !== true)
@@ -59,7 +63,7 @@ export function listModelsPayload(
59
63
  }
60
64
  if (includeCodex) {
61
65
  return {
62
- models: available.map((target, index) => codexModel(target, index + 1)),
66
+ models: available.map((target, index) => codexModel(target, index + 1, preferSystemModels)),
63
67
  };
64
68
  }
65
69
  return {
@@ -91,19 +95,23 @@ function openAiModel(target: ModelTarget): OpenAIModel {
91
95
  };
92
96
  }
93
97
 
94
- /** Codex `/v1/models` slug for a resolved gateway target. */
95
- export function codexModelSlug(target: ModelTarget): string {
98
+ /** Codex `/v1/models` slug: the `system.ai.*` service when preferred, else the endpoint id. */
99
+ export function codexModelSlug(target: ModelTarget, preferSystemModels: boolean): string {
96
100
  const model =
97
- target.capabilities.aiGatewayCodex && target.modelServiceName
101
+ preferSystemModels && target.capabilities.aiGatewayCodex && target.modelServiceName
98
102
  ? target.modelServiceName
99
103
  : target.id;
100
104
  return `databricks/${model}`;
101
105
  }
102
106
 
103
- function codexModel(target: ModelTarget, priority: number): CodexModel {
107
+ function codexModel(
108
+ target: ModelTarget,
109
+ priority: number,
110
+ preferSystemModels: boolean,
111
+ ): CodexModel {
104
112
  const efforts = target.reasoningEfforts;
105
113
  return {
106
- slug: codexModelSlug(target),
114
+ slug: codexModelSlug(target, preferSystemModels),
107
115
  display_name: target.displayName,
108
116
  description: target.endpoint?.description ?? "Databricks model service",
109
117
  base_instructions: CODEX_BASE_INSTRUCTIONS,
package/src/plugin.ts CHANGED
@@ -34,6 +34,9 @@ export class ModelGatewayPlugin extends Plugin<ModelGatewayPluginConfig> {
34
34
  ...(config.overrides ? { overrides: config.overrides } : {}),
35
35
  ...(config.model ? { model: config.model } : {}),
36
36
  ...(config.modelClass ? { modelClass: config.modelClass } : {}),
37
+ ...(config.preferSystemModels !== undefined
38
+ ? { preferSystemModels: config.preferSystemModels }
39
+ : {}),
37
40
  });
38
41
  }
39
42
 
package/src/registry.ts CHANGED
@@ -42,6 +42,7 @@ export interface ModelRegistry {
42
42
  export interface ModelRegistryOptions {
43
43
  readonly ttlMs?: number;
44
44
  readonly overrides?: readonly ModelCapabilityOverride[];
45
+ readonly preferSystemModels?: boolean;
45
46
  /** Discover models with this client instead of the AppKit execution context. */
46
47
  readonly client?: WorkspaceClient;
47
48
  }
@@ -56,11 +57,13 @@ interface RegistryContext {
56
57
  export class DatabricksModelRegistry implements ModelRegistry {
57
58
  private readonly ttlMs: number;
58
59
  private readonly overrides: readonly ModelCapabilityOverride[];
60
+ private readonly preferSystemModels: boolean;
59
61
  private readonly client: WorkspaceClient | undefined;
60
62
 
61
63
  constructor(options: ModelRegistryOptions = {}) {
62
64
  this.ttlMs = positiveTtl(options.ttlMs);
63
65
  this.overrides = options.overrides ?? [];
66
+ this.preferSystemModels = options.preferSystemModels ?? false;
64
67
  this.client = options.client;
65
68
  }
66
69
 
@@ -87,7 +90,14 @@ export class DatabricksModelRegistry implements ModelRegistry {
87
90
  ): Promise<ModelTarget | undefined> {
88
91
  const requested = model === undefined ? undefined : unqualifiedModel(model);
89
92
  const targets = await this.list();
90
- const exact =
93
+ const exactId =
94
+ requested === undefined
95
+ ? undefined
96
+ : targets.find(
97
+ (target) =>
98
+ target.id.localeCompare(requested, undefined, { sensitivity: "accent" }) === 0,
99
+ );
100
+ const exactAlias =
91
101
  requested === undefined
92
102
  ? undefined
93
103
  : targets.find((target) =>
@@ -95,6 +105,7 @@ export class DatabricksModelRegistry implements ModelRegistry {
95
105
  (alias) => alias.localeCompare(requested, undefined, { sensitivity: "accent" }) === 0,
96
106
  ),
97
107
  );
108
+ const exact = exactId ?? exactAlias;
98
109
  if (exact && matchesResolveOptions(exact, options)) {
99
110
  logger.debug("resolved exact model", { requested, resolved: exact.id });
100
111
  return exact;
@@ -103,10 +114,16 @@ export class DatabricksModelRegistry implements ModelRegistry {
103
114
  const endpoints = targets
104
115
  .map((target) => target.endpoint)
105
116
  .filter((endpoint): endpoint is ServingEndpointSummary => endpoint !== undefined);
106
- const resolved = modelResolve.resolveModel(endpoints, {
107
- ...(requested !== undefined ? { explicit: requested } : {}),
108
- ...options,
109
- });
117
+ const resolved = modelResolve.resolveModel(
118
+ endpoints,
119
+ {
120
+ ...(requested !== undefined ? { explicit: requested } : {}),
121
+ ...options,
122
+ },
123
+ {
124
+ preferSystemModels: this.preferSystemModels,
125
+ },
126
+ );
110
127
  const target = targets.find((candidate) => candidate.id === resolved.modelId);
111
128
  logger.debug("resolved fuzzy model", {
112
129
  requested,
@@ -123,11 +140,23 @@ export class DatabricksModelRegistry implements ModelRegistry {
123
140
  .map((target) => target.endpoint)
124
141
  .filter((endpoint): endpoint is ServingEndpointSummary => endpoint !== undefined);
125
142
  const ranked = [
126
- ...modelResolve.lookupModels(endpoints, { search: query }),
127
- ...modelResolve.lookupModels(endpoints, {
128
- search: query,
129
- modelClass: ModelClass.Embedding,
130
- }),
143
+ ...modelResolve.lookupModels(
144
+ endpoints,
145
+ { search: query },
146
+ {
147
+ preferSystemModels: this.preferSystemModels,
148
+ },
149
+ ),
150
+ ...modelResolve.lookupModels(
151
+ endpoints,
152
+ {
153
+ search: query,
154
+ modelClass: ModelClass.Embedding,
155
+ },
156
+ {
157
+ preferSystemModels: this.preferSystemModels,
158
+ },
159
+ ),
131
160
  ].sort((left, right) => (left.score ?? 0) - (right.score ?? 0));
132
161
  return ranked
133
162
  .map(({ endpoint }) => byId.get(endpoint.name))
@@ -155,7 +184,7 @@ export class DatabricksModelRegistry implements ModelRegistry {
155
184
  const published = metadata.modelCapabilitiesFor(endpoint);
156
185
  const family = endpoint.family?.toLowerCase();
157
186
  const openAiFamily = family === "gpt" || family === "openai" || endpoint.name.includes("codex");
158
- const modelServiceName = normalizedModelServiceName(endpoint.modelServiceName);
187
+ const modelServiceName = policy.modelServiceName(endpoint.modelServiceName);
159
188
  const embeddings =
160
189
  endpoint.class === ModelClass.Embedding || endpoint.task === "llm/v1/embeddings";
161
190
  const capabilities: ModelCapabilities = {
@@ -237,18 +266,6 @@ function positiveTtl(value = DEFAULT_CACHE_TTL_MS): number {
237
266
  return value;
238
267
  }
239
268
 
240
- function normalizedModelServiceName(value: string | undefined): string | undefined {
241
- const normalized = value?.trim().replace(/^databricks\//, "");
242
- if (!normalized) return undefined;
243
- if (normalized.startsWith("system.ai.databricks-")) {
244
- return `system.ai.${normalized.slice("system.ai.databricks-".length)}`;
245
- }
246
- if (normalized.startsWith("databricks-")) {
247
- return `system.ai.${normalized.slice("databricks-".length)}`;
248
- }
249
- return normalized;
250
- }
251
-
252
269
  function matchesResolveOptions(target: ModelTarget, options: ModelRegistryResolveOptions): boolean {
253
270
  if (options.requiresTools && !target.capabilities.tools) return false;
254
271
  if (options.modelClass === ModelClass.Embedding) return target.capabilities.embeddings;
package/src/router.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  * @module
5
5
  */
6
6
 
7
+ import { policy } from "@dbx-tools/model";
7
8
  import { object } from "@dbx-tools/shared-core";
8
9
  import type {
9
10
  GatewayRoute,
@@ -25,7 +26,7 @@ export class UnsupportedGatewayFeatureError extends Error {
25
26
 
26
27
  /** Select the lowest-overhead upstream that preserves the client contract. */
27
28
  export function resolveRoute(input: ResolveRouteInput): GatewayRoute {
28
- const { clientProtocol, requestedModel, features, target } = input;
29
+ const { clientProtocol, features, target } = input;
29
30
  if (clientProtocol === "openai-embeddings") {
30
31
  if (!target.capabilities.embeddings) {
31
32
  throw new UnsupportedGatewayFeatureError(["embeddings"]);
@@ -35,9 +36,13 @@ export function resolveRoute(input: ResolveRouteInput): GatewayRoute {
35
36
  if (clientProtocol === "openai-responses") {
36
37
  rejectStatefulResponses(features);
37
38
  if (
38
- isCodexOriginator(input.originator) &&
39
39
  canUseAiGatewayCodex(target, features) &&
40
- !requestedServingEndpoint(requestedModel, target)
40
+ policy.prefersSystemModelService(
41
+ input.requestedModel,
42
+ target.id,
43
+ target.modelServiceName!,
44
+ input.preferSystemModels === true,
45
+ )
41
46
  ) {
42
47
  return directRoute(input, "databricks-ai-gateway-codex", target.modelServiceName!);
43
48
  }
@@ -165,8 +170,3 @@ function canUseAiGatewayCodex(target: ModelTarget, features: RequestedFeatures):
165
170
  supportsDirectResponses(target, features)
166
171
  );
167
172
  }
168
-
169
- /** Serving-endpoint ids stay on Databricks Responses; aliases and model-service slugs use Codex. */
170
- function requestedServingEndpoint(requestedModel: string, target: ModelTarget): boolean {
171
- return requestedModel.trim().replace(/^(?:dbx|databricks)\//i, "") === target.id;
172
- }