@dbx-tools/appkit-model-gateway 0.9.60 → 0.9.61

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/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.60";
6
+ export const PACKAGE_VERSION = "0.9.61";
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.60";
2
+ export declare const PACKAGE_VERSION = "0.9.61";
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.60";
5
+ export const PACKAGE_VERSION = "0.9.61";
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";
@@ -18,4 +18,4 @@ export { ModelGatewayError, ModelGateway } from "./src/gateway.js";
18
18
  export { ModelGatewayPlugin, modelGateway } from "./src/plugin.js";
19
19
  export { DatabricksModelRegistry } from "./src/registry.js";
20
20
  export { UnsupportedGatewayFeatureError } from "./src/router.js";
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbW9kZWwtZ2F0ZXdheVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjYwXCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb3RvY29sc0RlY29kZSBmcm9tIFwiLi9zcmMvcHJvdG9jb2xzL2RlY29kZS50c1wiO1xuZXhwb3J0ICogYXMgcHJvdG9jb2xzRW5jb2RlIGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdBZGFwdCBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgKiBhcyByZWdpc3RyeSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlciBmcm9tIFwiLi9zcmMvcm91dGVyLnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXMgZnJvbSBcIi4vc3JjL3JvdXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNsYXRpb24gZnJvbSBcIi4vc3JjL3RyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc3BvcnQgZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5RXJyb3IsIE1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2F0ZXdheS50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5UGx1Z2luLCBtb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRGVjb2RlZEdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3Byb3RvY29scy9kZWNvZGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29tcGxldGVkR2VuZXJhdGlvbiB9IGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkYXB0ZWRJbmZlcmVuY2VCb2R5IH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zLCBNb2RlbFJlZ2lzdHJ5LCBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHsgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yIH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbiJdfQ==
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbW9kZWwtZ2F0ZXdheVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjYxXCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb3RvY29sc0RlY29kZSBmcm9tIFwiLi9zcmMvcHJvdG9jb2xzL2RlY29kZS50c1wiO1xuZXhwb3J0ICogYXMgcHJvdG9jb2xzRW5jb2RlIGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdBZGFwdCBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgKiBhcyByZWdpc3RyeSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlciBmcm9tIFwiLi9zcmMvcm91dGVyLnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXMgZnJvbSBcIi4vc3JjL3JvdXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNsYXRpb24gZnJvbSBcIi4vc3JjL3RyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc3BvcnQgZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5RXJyb3IsIE1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2F0ZXdheS50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5UGx1Z2luLCBtb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRGVjb2RlZEdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3Byb3RvY29scy9kZWNvZGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29tcGxldGVkR2VuZXJhdGlvbiB9IGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkYXB0ZWRJbmZlcmVuY2VCb2R5IH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zLCBNb2RlbFJlZ2lzdHJ5LCBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHsgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yIH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbiJdfQ==
@@ -8,3 +8,5 @@ import type { CodexModelListResponse, ModelListResponse, ModelTarget, OpenAIMode
8
8
  export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean): CodexModelListResponse;
9
9
  export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean): OpenAIModelListResponse;
10
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;
package/lib/src/models.js CHANGED
@@ -54,13 +54,17 @@ function openAiModel(target) {
54
54
  },
55
55
  };
56
56
  }
57
- function codexModel(target, priority) {
57
+ /** Codex `/v1/models` slug for a resolved gateway target. */
58
+ export function codexModelSlug(target) {
58
59
  const model = target.capabilities.aiGatewayCodex && target.modelServiceName
59
60
  ? target.modelServiceName
60
61
  : target.id;
62
+ return `databricks/${model}`;
63
+ }
64
+ function codexModel(target, priority) {
61
65
  const efforts = target.reasoningEfforts;
62
66
  return {
63
- slug: `databricks/${model}`,
67
+ slug: codexModelSlug(target),
64
68
  display_name: target.displayName,
65
69
  description: target.endpoint?.description ?? "Databricks model service",
66
70
  base_instructions: CODEX_BASE_INSTRUCTIONS,
@@ -156,4 +160,4 @@ function hasChatClass(target) {
156
160
  const modelClass = target.endpoint?.class;
157
161
  return modelClass !== undefined && isChatClass(modelClass);
158
162
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFVdkUsTUFBTSx1QkFBdUIsR0FDM0IsdUhBQXVILENBQUM7QUFFMUgsTUFBTSxzQkFBc0IsR0FBcUM7SUFDL0QsSUFBSSxFQUFFLDRCQUE0QjtJQUNsQyxPQUFPLEVBQUUsNkNBQTZDO0lBQ3RELEdBQUcsRUFBRSw0QkFBNEI7SUFDakMsTUFBTSxFQUFFLCtCQUErQjtJQUN2QyxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLEtBQUssRUFBRSxvQ0FBb0M7SUFDM0MsR0FBRyxFQUFFLDRDQUE0QztDQUNsRCxDQUFDO0FBa0JGLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBK0IsRUFDL0IsWUFBcUIsRUFDckIsYUFBYSxHQUFHLEtBQUs7SUFFckIsTUFBTSxTQUFTLEdBQUcsT0FBTztTQUN0QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsS0FBSyxJQUFJLENBQUM7U0FDaEUsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUM3Qix1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQ3JFLENBQUM7SUFD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QUMsQ0FBQyxDQUFDO0lBQ3BFLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsSUFBSSxLQUFLLEtBQUssS0FBSztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxPQUFPLE1BQU0sSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFtQjtJQUM1QyxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksS0FBSyxtQkFBbUIsQ0FBQztBQUNsRyxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtJQUN4RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE1BQW1CO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQzFDLE9BQU8sVUFBVSxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIGFuZCBDb2RleCBtb2RlbC1saXN0IHBheWxvYWRzIGRlcml2ZWQgZnJvbSB0aGUgbGl2ZSByZWdpc3RyeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaXNDaGF0Q2xhc3MgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbC9jbGFzc2VzXCI7XG5pbXBvcnQgeyBtb2RlbEZhbWlseSwgbW9kZWxGYW1pbHlSYW5rIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWwvcG9saWN5XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvZGV4TW9kZWwsXG4gIENvZGV4TW9kZWxMaXN0UmVzcG9uc2UsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxuICBNb2RlbFRhcmdldCxcbiAgT3BlbkFJTW9kZWwsXG4gIE9wZW5BSU1vZGVsTGlzdFJlc3BvbnNlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5jb25zdCBDT0RFWF9CQVNFX0lOU1RSVUNUSU9OUyA9XG4gIFwiWW91IGFyZSBhIGNvZGluZyBhZ2VudC4gRm9sbG93IHRoZSB1c2VyJ3MgaW5zdHJ1Y3Rpb25zIGFuZCB1c2UgdGhlIGF2YWlsYWJsZSB0b29scyB0byB3b3JrIGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkuXCI7XG5cbmNvbnN0IFJFQVNPTklOR19ERVNDUklQVElPTlM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICBub25lOiBcIkRpc2FibGUgZXhwbGljaXQgcmVhc29uaW5nXCIsXG4gIG1pbmltYWw6IFwiVXNlIHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBsb3c6IFwiVXNlIGEgbG93IHJlYXNvbmluZyBidWRnZXRcIixcbiAgbWVkaXVtOiBcIlVzZSBhIG1lZGl1bSByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIGhpZ2g6IFwiVXNlIGEgaGlnaCByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIHhoaWdoOiBcIlVzZSBhbiBleHRyYS1oaWdoIHJlYXNvbmluZyBidWRnZXRcIixcbiAgbWF4OiBcIlVzZSB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgcmVhc29uaW5nIGJ1ZGdldFwiLFxufTtcblxuLyoqIEJ1aWxkIHRoZSBjb21iaW5lZCBPcGVuQUkgYW5kIG9wdGlvbmFsIENvZGV4IG1vZGVsIGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiB0cnVlLFxuICBwcmVzZXJ2ZU9yZGVyPzogYm9vbGVhbixcbik6IENvZGV4TW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogZmFsc2UsXG4gIHByZXNlcnZlT3JkZXI/OiBib29sZWFuLFxuKTogT3BlbkFJTW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogYm9vbGVhbixcbiAgcHJlc2VydmVPcmRlcj86IGJvb2xlYW4sXG4pOiBNb2RlbExpc3RSZXNwb25zZTtcbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiBib29sZWFuLFxuICBwcmVzZXJ2ZU9yZGVyID0gZmFsc2UsXG4pOiBNb2RlbExpc3RSZXNwb25zZSB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IHRhcmdldHNcbiAgICAuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludD8uc3RhdHVzPy5kZXByZWNhdGVkICE9PSB0cnVlKVxuICAgIC5maWx0ZXIoKHRhcmdldCkgPT4gIWluY2x1ZGVDb2RleCB8fCBoYXNDaGF0Q2xhc3ModGFyZ2V0KSk7XG4gIGlmICghcHJlc2VydmVPcmRlcikge1xuICAgIGF2YWlsYWJsZS5zb3J0KChsZWZ0LCByaWdodCkgPT5cbiAgICAgIGNvbXBhcmVDYXRhbG9ndWVUYXJnZXRzKGxlZnQsIHJpZ2h0LCAodGFyZ2V0KSA9PiB0YXJnZXQuZGlzcGxheU5hbWUpLFxuICAgICk7XG4gIH1cbiAgaWYgKGluY2x1ZGVDb2RleCkge1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbHM6IGF2YWlsYWJsZS5tYXAoKHRhcmdldCwgaW5kZXgpID0+IGNvZGV4TW9kZWwodGFyZ2V0LCBpbmRleCArIDEpKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgb2JqZWN0OiBcImxpc3RcIixcbiAgICBkYXRhOiBhdmFpbGFibGUubWFwKG9wZW5BaU1vZGVsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gb3BlbkFpTW9kZWwodGFyZ2V0OiBNb2RlbFRhcmdldCk6IE9wZW5BSU1vZGVsIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdGFyZ2V0LmlkLFxuICAgIG9iamVjdDogXCJtb2RlbFwiLFxuICAgIGNyZWF0ZWQ6IDAsXG4gICAgb3duZWRfYnk6IFwiZGF0YWJyaWNrc1wiLFxuICAgIG5hbWU6IHRhcmdldC5kaXNwbGF5TmFtZSxcbiAgICB0YXNrOiB0YXJnZXQuZW5kcG9pbnQ/LnRhc2ssXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICB0b29sczogdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scyxcbiAgICAgIHJlYXNvbmluZzogdGFyZ2V0LnJlYXNvbmluZ0VmZm9ydHMsXG4gICAgICByZXNwb25zZXM6IHRhcmdldC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzLFxuICAgICAgb3Blbl9yZXNwb25zZXM6IHRhcmdldC5jYXBhYmlsaXRpZXMub3BlblJlc3BvbnNlcyxcbiAgICAgIGFudGhyb3BpYzogdGFyZ2V0LmNhcGFiaWxpdGllcy5hbnRocm9waWMsXG4gICAgICBlbWJlZGRpbmdzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3MsXG4gICAgICBhaV9nYXRld2F5X2NvZGV4OiB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4LFxuICAgICAgc3RyZWFtaW5nOiB0YXJnZXQuY2FwYWJpbGl0aWVzLnN0cmVhbWluZyxcbiAgICAgIHdlYl9zZWFyY2g6IHRhcmdldC5jYXBhYmlsaXRpZXMud2ViU2VhcmNoLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvZGV4TW9kZWwodGFyZ2V0OiBNb2RlbFRhcmdldCwgcHJpb3JpdHk6IG51bWJlcik6IENvZGV4TW9kZWwge1xuICBjb25zdCBtb2RlbCA9XG4gICAgdGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCAmJiB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZVxuICAgICAgPyB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZVxuICAgICAgOiB0YXJnZXQuaWQ7XG4gIGNvbnN0IGVmZm9ydHMgPSB0YXJnZXQucmVhc29uaW5nRWZmb3J0cztcbiAgcmV0dXJuIHtcbiAgICBzbHVnOiBgZGF0YWJyaWNrcy8ke21vZGVsfWAsXG4gICAgZGlzcGxheV9uYW1lOiB0YXJnZXQuZGlzcGxheU5hbWUsXG4gICAgZGVzY3JpcHRpb246IHRhcmdldC5lbmRwb2ludD8uZGVzY3JpcHRpb24gPz8gXCJEYXRhYnJpY2tzIG1vZGVsIHNlcnZpY2VcIixcbiAgICBiYXNlX2luc3RydWN0aW9uczogQ09ERVhfQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHM6IGVmZm9ydHMubWFwKChlZmZvcnQpID0+ICh7XG4gICAgICBlZmZvcnQsXG4gICAgICBkZXNjcmlwdGlvbjogUkVBU09OSU5HX0RFU0NSSVBUSU9OU1tlZmZvcnRdID8/IGBVc2UgdGhlICR7ZWZmb3J0fSByZWFzb25pbmcgYnVkZ2V0YCxcbiAgICB9KSksXG4gICAgLi4uKGVmZm9ydHMubGVuZ3RoID4gMFxuICAgICAgPyB7IGRlZmF1bHRfcmVhc29uaW5nX2xldmVsOiBlZmZvcnRzLmluY2x1ZGVzKFwibWVkaXVtXCIpID8gXCJtZWRpdW1cIiA6IGVmZm9ydHNbMF0gfVxuICAgICAgOiB7fSksXG4gICAgc2hlbGxfdHlwZTogXCJ1bmlmaWVkX2V4ZWNcIixcbiAgICB2aXNpYmlsaXR5OiBcImxpc3RcIixcbiAgICBzdXBwb3J0ZWRfaW5fYXBpOiB0cnVlLFxuICAgIHByaW9yaXR5LFxuICAgIGF2YWlsYWJpbGl0eV9udXg6IG51bGwsXG4gICAgdXBncmFkZTogbnVsbCxcbiAgICBzdXBwb3J0X3ZlcmJvc2l0eTogZmFsc2UsXG4gICAgZGVmYXVsdF92ZXJib3NpdHk6IG51bGwsXG4gICAgYXBwbHlfcGF0Y2hfdG9vbF90eXBlOiB0YXJnZXQuY2FwYWJpbGl0aWVzLmN1c3RvbVRvb2xzID8gXCJmcmVlZm9ybVwiIDogbnVsbCxcbiAgICB0cnVuY2F0aW9uX3BvbGljeTogeyBtb2RlOiBcInRva2Vuc1wiLCBsaW1pdDogMTI4XzAwMCB9LFxuICAgIGNvbnRleHRfd2luZG93OiBudWxsLFxuICAgIGV4cGVyaW1lbnRhbF9zdXBwb3J0ZWRfdG9vbHM6IFtdLFxuICAgIGlucHV0X21vZGFsaXRpZXM6IFtcInRleHRcIl0sXG4gICAgd2ViX3NlYXJjaF90b29sX3R5cGU6IFwidGV4dFwiLFxuICAgIHN1cHBvcnRzX3NlYXJjaF90b29sOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICBzdXBwb3J0c19pbWFnZV9kZXRhaWxfb3JpZ2luYWw6IGZhbHNlLFxuICB9O1xufVxuXG4vKipcbiAqIE9yZGVyIGxpc3RlZCBtb2RlbHMgaW4gdGhyZWUgZ3JvdXBzOiBtYWpvci1wcm92aWRlciBjaGF0IGZhbWlsaWVzLCB0aGVcbiAqIHJlbWFpbmluZyBjaGF0IG1vZGVscywgdGhlbiBlbWJlZGRpbmdzLiBGYW1pbGllcyBrZWVwIGEgZml4ZWQgcHJvdmlkZXJcbiAqIG9yZGVyOyBlYWNoIGZhbWlseSBhbmQgdGhlIGxhdGVyIGdyb3VwcyBzb3J0IGJ5IHRoZSBwdWJsaXNoZWQgbGFiZWxcbiAqIChgZGlzcGxheV9uYW1lYCBmb3IgQ29kZXgsIGBuYW1lYCBvdGhlcndpc2UpLiBOdW1lcmljIHNlZ21lbnRzIHNvcnRcbiAqIG5hdHVyYWxseSBzbyBcIlZlbyAzLjFcIiBwcmVjZWRlcyBcIlZlbyAzLjEwXCIuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVDYXRhbG9ndWVUYXJnZXRzKFxuICBsZWZ0OiBNb2RlbFRhcmdldCxcbiAgcmlnaHQ6IE1vZGVsVGFyZ2V0LFxuICBsYWJlbDogKHRhcmdldDogTW9kZWxUYXJnZXQpID0+IHN0cmluZyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGdyb3VwID0gY2F0YWxvZ3VlR3JvdXAobGVmdCkgLSBjYXRhbG9ndWVHcm91cChyaWdodCk7XG4gIGlmIChncm91cCAhPT0gMCkgcmV0dXJuIGdyb3VwO1xuICBjb25zdCBsZWZ0RmFtaWx5ID0gY2F0YWxvZ3VlRmFtaWx5KGxlZnQpO1xuICBjb25zdCByaWdodEZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseShyaWdodCk7XG4gIGlmIChsZWZ0RmFtaWx5ICYmIHJpZ2h0RmFtaWx5KSB7XG4gICAgY29uc3QgZmFtaWx5T3JkZXIgPSBtb2RlbEZhbWlseVJhbmsobGVmdEZhbWlseSkgLSBtb2RlbEZhbWlseVJhbmsocmlnaHRGYW1pbHkpO1xuICAgIGlmIChmYW1pbHlPcmRlciAhPT0gMCkgcmV0dXJuIGZhbWlseU9yZGVyO1xuICB9XG4gIHJldHVybiBjb21wYXJlQ2F0YWxvZ3VlTGFiZWwobGFiZWwobGVmdCksIGxhYmVsKHJpZ2h0KSk7XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZUdyb3VwKHRhcmdldDogTW9kZWxUYXJnZXQpOiBudW1iZXIge1xuICBpZiAoaXNFbWJlZGRpbmdUYXJnZXQodGFyZ2V0KSkgcmV0dXJuIDI7XG4gIHJldHVybiBjYXRhbG9ndWVGYW1pbHkodGFyZ2V0KSA/IDAgOiAxO1xufVxuXG5jb25zdCBJREVOVElUWV9QUkVGSVhFUyA9IG5ldyBTZXQoW1xuICBcImRhdGFicmlja3NcIixcbiAgXCJzeXN0ZW1cIixcbiAgXCJhaVwiLFxuICBcIm1ldGFcIixcbiAgXCJnb29nbGVcIixcbiAgXCJvcGVuYWlcIixcbiAgXCJhbnRocm9waWNcIixcbl0pO1xuXG5mdW5jdGlvbiBjYXRhbG9ndWVGYW1pbHkodGFyZ2V0OiBNb2RlbFRhcmdldCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0VtYmVkZGluZ1RhcmdldCh0YXJnZXQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIFt0YXJnZXQuZGlzcGxheU5hbWUsIHRhcmdldC5pZCwgdGFyZ2V0LmVuZHBvaW50Py5uYW1lXSkge1xuICAgIGlmICghaWRlbnRpdHkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseUZyb21JZGVudGl0eShpZGVudGl0eSk7XG4gICAgaWYgKGZhbWlseSkgcmV0dXJuIGZhbWlseTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVGYW1pbHlGcm9tSWRlbnRpdHkoaWRlbnRpdHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IGlkZW50aXR5LnRvTG93ZXJDYXNlKCkubWF0Y2goL1thLXowLTldKy9nKSA/PyBbXTtcbiAgY29uc3Qgc3RhcnQgPSB0b2tlbnMuZmluZCgodG9rZW4pID0+ICFJREVOVElUWV9QUkVGSVhFUy5oYXModG9rZW4pKTtcbiAgaWYgKCFzdGFydCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHN0YXJ0ID09PSBcInZlb1wiKSByZXR1cm4gXCJnZW1pbmlcIjtcbiAgY29uc3QgZmFtaWx5ID0gbW9kZWxGYW1pbHkoaWRlbnRpdHkpO1xuICByZXR1cm4gZmFtaWx5ICYmIHN0YXJ0ID09PSBmYW1pbHkgPyBmYW1pbHkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzRW1iZWRkaW5nVGFyZ2V0KHRhcmdldDogTW9kZWxUYXJnZXQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncyA9PT0gdHJ1ZSB8fCB0YXJnZXQuZW5kcG9pbnQ/LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxlZnQ6IHN0cmluZywgcmlnaHQ6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlLCBzZW5zaXRpdml0eTogXCJiYXNlXCIgfSk7XG59XG5cbmZ1bmN0aW9uIGhhc0NoYXRDbGFzcyh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSB0YXJnZXQuZW5kcG9pbnQ/LmNsYXNzO1xuICByZXR1cm4gbW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkICYmIGlzQ2hhdENsYXNzKG1vZGVsQ2xhc3MpO1xufVxuIl19
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFVdkUsTUFBTSx1QkFBdUIsR0FDM0IsdUhBQXVILENBQUM7QUFFMUgsTUFBTSxzQkFBc0IsR0FBcUM7SUFDL0QsSUFBSSxFQUFFLDRCQUE0QjtJQUNsQyxPQUFPLEVBQUUsNkNBQTZDO0lBQ3RELEdBQUcsRUFBRSw0QkFBNEI7SUFDakMsTUFBTSxFQUFFLCtCQUErQjtJQUN2QyxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLEtBQUssRUFBRSxvQ0FBb0M7SUFDM0MsR0FBRyxFQUFFLDRDQUE0QztDQUNsRCxDQUFDO0FBa0JGLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBK0IsRUFDL0IsWUFBcUIsRUFDckIsYUFBYSxHQUFHLEtBQUs7SUFFckIsTUFBTSxTQUFTLEdBQUcsT0FBTztTQUN0QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsS0FBSyxJQUFJLENBQUM7U0FDaEUsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUM3Qix1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQ3JFLENBQUM7SUFD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TSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdCLElBQUksS0FBSyxLQUFLLEtBQUs7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsT0FBTyxNQUFNLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDekQsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsTUFBbUI7SUFDNUMsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEtBQUssbUJBQW1CLENBQUM7QUFDbEcsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsSUFBWSxFQUFFLEtBQWE7SUFDeEQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFtQjtJQUN2QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztJQUMxQyxPQUFPLFVBQVUsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9wZW5BSSBhbmQgQ29kZXggbW9kZWwtbGlzdCBwYXlsb2FkcyBkZXJpdmVkIGZyb20gdGhlIGxpdmUgcmVnaXN0cnkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGlzQ2hhdENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWwvY2xhc3Nlc1wiO1xuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsRmFtaWx5UmFuayB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsL3BvbGljeVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb2RleE1vZGVsLFxuICBDb2RleE1vZGVsTGlzdFJlc3BvbnNlLFxuICBNb2RlbExpc3RSZXNwb25zZSxcbiAgTW9kZWxUYXJnZXQsXG4gIE9wZW5BSU1vZGVsLFxuICBPcGVuQUlNb2RlbExpc3RSZXNwb25zZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuY29uc3QgQ09ERVhfQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBjb2RpbmcgYWdlbnQuIEZvbGxvdyB0aGUgdXNlcidzIGluc3RydWN0aW9ucyBhbmQgdXNlIHRoZSBhdmFpbGFibGUgdG9vbHMgdG8gd29yayBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5LlwiO1xuXG5jb25zdCBSRUFTT05JTkdfREVTQ1JJUFRJT05TOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgbm9uZTogXCJEaXNhYmxlIGV4cGxpY2l0IHJlYXNvbmluZ1wiLFxuICBtaW5pbWFsOiBcIlVzZSB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIHJlYXNvbmluZyBidWRnZXRcIixcbiAgbG93OiBcIlVzZSBhIGxvdyByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIG1lZGl1bTogXCJVc2UgYSBtZWRpdW0gcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBoaWdoOiBcIlVzZSBhIGhpZ2ggcmVhc29uaW5nIGJ1ZGdldFwiLFxuICB4aGlnaDogXCJVc2UgYW4gZXh0cmEtaGlnaCByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIG1heDogXCJVc2UgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIHJlYXNvbmluZyBidWRnZXRcIixcbn07XG5cbi8qKiBCdWlsZCB0aGUgY29tYmluZWQgT3BlbkFJIGFuZCBvcHRpb25hbCBDb2RleCBtb2RlbCBjYXRhbG9ndWUuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogdHJ1ZSxcbiAgcHJlc2VydmVPcmRlcj86IGJvb2xlYW4sXG4pOiBDb2RleE1vZGVsTGlzdFJlc3BvbnNlO1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2RlbHNQYXlsb2FkKFxuICB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdLFxuICBpbmNsdWRlQ29kZXg6IGZhbHNlLFxuICBwcmVzZXJ2ZU9yZGVyPzogYm9vbGVhbixcbik6IE9wZW5BSU1vZGVsTGlzdFJlc3BvbnNlO1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2RlbHNQYXlsb2FkKFxuICB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdLFxuICBpbmNsdWRlQ29kZXg6IGJvb2xlYW4sXG4gIHByZXNlcnZlT3JkZXI/OiBib29sZWFuLFxuKTogTW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogYm9vbGVhbixcbiAgcHJlc2VydmVPcmRlciA9IGZhbHNlLFxuKTogTW9kZWxMaXN0UmVzcG9uc2Uge1xuICBjb25zdCBhdmFpbGFibGUgPSB0YXJnZXRzXG4gICAgLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cz8uZGVwcmVjYXRlZCAhPT0gdHJ1ZSlcbiAgICAuZmlsdGVyKCh0YXJnZXQpID0+ICFpbmNsdWRlQ29kZXggfHwgaGFzQ2hhdENsYXNzKHRhcmdldCkpO1xuICBpZiAoIXByZXNlcnZlT3JkZXIpIHtcbiAgICBhdmFpbGFibGUuc29ydCgobGVmdCwgcmlnaHQpID0+XG4gICAgICBjb21wYXJlQ2F0YWxvZ3VlVGFyZ2V0cyhsZWZ0LCByaWdodCwgKHRhcmdldCkgPT4gdGFyZ2V0LmRpc3BsYXlOYW1lKSxcbiAgICApO1xuICB9XG4gIGlmIChpbmNsdWRlQ29kZXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBhdmFpbGFibGUubWFwKCh0YXJnZXQsIGluZGV4KSA9PiBjb2RleE1vZGVsKHRhcmdldCwgaW5kZXggKyAxKSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9iamVjdDogXCJsaXN0XCIsXG4gICAgZGF0YTogYXZhaWxhYmxlLm1hcChvcGVuQWlNb2RlbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9wZW5BaU1vZGVsKHRhcmdldDogTW9kZWxUYXJnZXQpOiBPcGVuQUlNb2RlbCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHRhcmdldC5pZCxcbiAgICBvYmplY3Q6IFwibW9kZWxcIixcbiAgICBjcmVhdGVkOiAwLFxuICAgIG93bmVkX2J5OiBcImRhdGFicmlja3NcIixcbiAgICBuYW1lOiB0YXJnZXQuZGlzcGxheU5hbWUsXG4gICAgdGFzazogdGFyZ2V0LmVuZHBvaW50Py50YXNrLFxuICAgIHN0YXR1czogdGFyZ2V0LmVuZHBvaW50Py5zdGF0dXMgPz8geyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgdG9vbHM6IHRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMsXG4gICAgICByZWFzb25pbmc6IHRhcmdldC5yZWFzb25pbmdFZmZvcnRzLFxuICAgICAgcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyxcbiAgICAgIG9wZW5fcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMsXG4gICAgICBhbnRocm9waWM6IHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljLFxuICAgICAgZW1iZWRkaW5nczogdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzLFxuICAgICAgYWlfZ2F0ZXdheV9jb2RleDogdGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCxcbiAgICAgIHN0cmVhbWluZzogdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJlYW1pbmcsXG4gICAgICB3ZWJfc2VhcmNoOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogQ29kZXggYC92MS9tb2RlbHNgIHNsdWcgZm9yIGEgcmVzb2x2ZWQgZ2F0ZXdheSB0YXJnZXQuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhNb2RlbFNsdWcodGFyZ2V0OiBNb2RlbFRhcmdldCk6IHN0cmluZyB7XG4gIGNvbnN0IG1vZGVsID1cbiAgICB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4ICYmIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA/IHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA6IHRhcmdldC5pZDtcbiAgcmV0dXJuIGBkYXRhYnJpY2tzLyR7bW9kZWx9YDtcbn1cblxuZnVuY3Rpb24gY29kZXhNb2RlbCh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBwcmlvcml0eTogbnVtYmVyKTogQ29kZXhNb2RlbCB7XG4gIGNvbnN0IGVmZm9ydHMgPSB0YXJnZXQucmVhc29uaW5nRWZmb3J0cztcbiAgcmV0dXJuIHtcbiAgICBzbHVnOiBjb2RleE1vZGVsU2x1Zyh0YXJnZXQpLFxuICAgIGRpc3BsYXlfbmFtZTogdGFyZ2V0LmRpc3BsYXlOYW1lLFxuICAgIGRlc2NyaXB0aW9uOiB0YXJnZXQuZW5kcG9pbnQ/LmRlc2NyaXB0aW9uID8/IFwiRGF0YWJyaWNrcyBtb2RlbCBzZXJ2aWNlXCIsXG4gICAgYmFzZV9pbnN0cnVjdGlvbnM6IENPREVYX0JBU0VfSU5TVFJVQ1RJT05TLFxuICAgIHN0YXR1czogdGFyZ2V0LmVuZHBvaW50Py5zdGF0dXMgPz8geyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIHN1cHBvcnRlZF9yZWFzb25pbmdfbGV2ZWxzOiBlZmZvcnRzLm1hcCgoZWZmb3J0KSA9PiAoe1xuICAgICAgZWZmb3J0LFxuICAgICAgZGVzY3JpcHRpb246IFJFQVNPTklOR19ERVNDUklQVElPTlNbZWZmb3J0XSA/PyBgVXNlIHRoZSAke2VmZm9ydH0gcmVhc29uaW5nIGJ1ZGdldGAsXG4gICAgfSkpLFxuICAgIC4uLihlZmZvcnRzLmxlbmd0aCA+IDBcbiAgICAgID8geyBkZWZhdWx0X3JlYXNvbmluZ19sZXZlbDogZWZmb3J0cy5pbmNsdWRlcyhcIm1lZGl1bVwiKSA/IFwibWVkaXVtXCIgOiBlZmZvcnRzWzBdIH1cbiAgICAgIDoge30pLFxuICAgIHNoZWxsX3R5cGU6IFwidW5pZmllZF9leGVjXCIsXG4gICAgdmlzaWJpbGl0eTogXCJsaXN0XCIsXG4gICAgc3VwcG9ydGVkX2luX2FwaTogdHJ1ZSxcbiAgICBwcmlvcml0eSxcbiAgICBhdmFpbGFiaWxpdHlfbnV4OiBudWxsLFxuICAgIHVwZ3JhZGU6IG51bGwsXG4gICAgc3VwcG9ydF92ZXJib3NpdHk6IGZhbHNlLFxuICAgIGRlZmF1bHRfdmVyYm9zaXR5OiBudWxsLFxuICAgIGFwcGx5X3BhdGNoX3Rvb2xfdHlwZTogdGFyZ2V0LmNhcGFiaWxpdGllcy5jdXN0b21Ub29scyA/IFwiZnJlZWZvcm1cIiA6IG51bGwsXG4gICAgdHJ1bmNhdGlvbl9wb2xpY3k6IHsgbW9kZTogXCJ0b2tlbnNcIiwgbGltaXQ6IDEyOF8wMDAgfSxcbiAgICBjb250ZXh0X3dpbmRvdzogbnVsbCxcbiAgICBleHBlcmltZW50YWxfc3VwcG9ydGVkX3Rvb2xzOiBbXSxcbiAgICBpbnB1dF9tb2RhbGl0aWVzOiBbXCJ0ZXh0XCJdLFxuICAgIHdlYl9zZWFyY2hfdG9vbF90eXBlOiBcInRleHRcIixcbiAgICBzdXBwb3J0c19zZWFyY2hfdG9vbDogdGFyZ2V0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gsXG4gICAgc3VwcG9ydHNfaW1hZ2VfZGV0YWlsX29yaWdpbmFsOiBmYWxzZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBPcmRlciBsaXN0ZWQgbW9kZWxzIGluIHRocmVlIGdyb3VwczogbWFqb3ItcHJvdmlkZXIgY2hhdCBmYW1pbGllcywgdGhlXG4gKiByZW1haW5pbmcgY2hhdCBtb2RlbHMsIHRoZW4gZW1iZWRkaW5ncy4gRmFtaWxpZXMga2VlcCBhIGZpeGVkIHByb3ZpZGVyXG4gKiBvcmRlcjsgZWFjaCBmYW1pbHkgYW5kIHRoZSBsYXRlciBncm91cHMgc29ydCBieSB0aGUgcHVibGlzaGVkIGxhYmVsXG4gKiAoYGRpc3BsYXlfbmFtZWAgZm9yIENvZGV4LCBgbmFtZWAgb3RoZXJ3aXNlKS4gTnVtZXJpYyBzZWdtZW50cyBzb3J0XG4gKiBuYXR1cmFsbHkgc28gXCJWZW8gMy4xXCIgcHJlY2VkZXMgXCJWZW8gMy4xMFwiLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQ2F0YWxvZ3VlVGFyZ2V0cyhcbiAgbGVmdDogTW9kZWxUYXJnZXQsXG4gIHJpZ2h0OiBNb2RlbFRhcmdldCxcbiAgbGFiZWw6ICh0YXJnZXQ6IE1vZGVsVGFyZ2V0KSA9PiBzdHJpbmcsXG4pOiBudW1iZXIge1xuICBjb25zdCBncm91cCA9IGNhdGFsb2d1ZUdyb3VwKGxlZnQpIC0gY2F0YWxvZ3VlR3JvdXAocmlnaHQpO1xuICBpZiAoZ3JvdXAgIT09IDApIHJldHVybiBncm91cDtcbiAgY29uc3QgbGVmdEZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseShsZWZ0KTtcbiAgY29uc3QgcmlnaHRGYW1pbHkgPSBjYXRhbG9ndWVGYW1pbHkocmlnaHQpO1xuICBpZiAobGVmdEZhbWlseSAmJiByaWdodEZhbWlseSkge1xuICAgIGNvbnN0IGZhbWlseU9yZGVyID0gbW9kZWxGYW1pbHlSYW5rKGxlZnRGYW1pbHkpIC0gbW9kZWxGYW1pbHlSYW5rKHJpZ2h0RmFtaWx5KTtcbiAgICBpZiAoZmFtaWx5T3JkZXIgIT09IDApIHJldHVybiBmYW1pbHlPcmRlcjtcbiAgfVxuICByZXR1cm4gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxhYmVsKGxlZnQpLCBsYWJlbChyaWdodCkpO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVHcm91cCh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogbnVtYmVyIHtcbiAgaWYgKGlzRW1iZWRkaW5nVGFyZ2V0KHRhcmdldCkpIHJldHVybiAyO1xuICByZXR1cm4gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldCkgPyAwIDogMTtcbn1cblxuY29uc3QgSURFTlRJVFlfUFJFRklYRVMgPSBuZXcgU2V0KFtcbiAgXCJkYXRhYnJpY2tzXCIsXG4gIFwic3lzdGVtXCIsXG4gIFwiYWlcIixcbiAgXCJtZXRhXCIsXG4gIFwiZ29vZ2xlXCIsXG4gIFwib3BlbmFpXCIsXG4gIFwiYW50aHJvcGljXCIsXG5dKTtcblxuZnVuY3Rpb24gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldDogTW9kZWxUYXJnZXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFbWJlZGRpbmdUYXJnZXQodGFyZ2V0KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBbdGFyZ2V0LmRpc3BsYXlOYW1lLCB0YXJnZXQuaWQsIHRhcmdldC5lbmRwb2ludD8ubmFtZV0pIHtcbiAgICBpZiAoIWlkZW50aXR5KSBjb250aW51ZTtcbiAgICBjb25zdCBmYW1pbHkgPSBjYXRhbG9ndWVGYW1pbHlGcm9tSWRlbnRpdHkoaWRlbnRpdHkpO1xuICAgIGlmIChmYW1pbHkpIHJldHVybiBmYW1pbHk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlRmFtaWx5RnJvbUlkZW50aXR5KGlkZW50aXR5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBpZGVudGl0eS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9bYS16MC05XSsvZykgPz8gW107XG4gIGNvbnN0IHN0YXJ0ID0gdG9rZW5zLmZpbmQoKHRva2VuKSA9PiAhSURFTlRJVFlfUFJFRklYRVMuaGFzKHRva2VuKSk7XG4gIGlmICghc3RhcnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChzdGFydCA9PT0gXCJ2ZW9cIikgcmV0dXJuIFwiZ2VtaW5pXCI7XG4gIGNvbnN0IGZhbWlseSA9IG1vZGVsRmFtaWx5KGlkZW50aXR5KTtcbiAgcmV0dXJuIGZhbWlseSAmJiBzdGFydCA9PT0gZmFtaWx5ID8gZmFtaWx5IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0VtYmVkZGluZ1RhcmdldCh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogYm9vbGVhbiB7XG4gIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3MgPT09IHRydWUgfHwgdGFyZ2V0LmVuZHBvaW50Py50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVDYXRhbG9ndWVMYWJlbChsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0LCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6IFwiYmFzZVwiIH0pO1xufVxuXG5mdW5jdGlvbiBoYXNDaGF0Q2xhc3ModGFyZ2V0OiBNb2RlbFRhcmdldCk6IGJvb2xlYW4ge1xuICBjb25zdCBtb2RlbENsYXNzID0gdGFyZ2V0LmVuZHBvaW50Py5jbGFzcztcbiAgcmV0dXJuIG1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCAmJiBpc0NoYXRDbGFzcyhtb2RlbENsYXNzKTtcbn1cbiJdfQ==
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { type WorkspaceClient } from "@databricks/appkit";
6
7
  import { type ResolveModelInput } from "@dbx-tools/shared-model/contracts";
7
8
  import type { ModelCapabilityOverride, ModelTarget } from "@dbx-tools/shared-model-gateway";
8
9
  /** Resolution controls passed through to the model policy owner. */
@@ -18,15 +19,19 @@ export interface ModelRegistry {
18
19
  export interface ModelRegistryOptions {
19
20
  readonly ttlMs?: number;
20
21
  readonly overrides?: readonly ModelCapabilityOverride[];
22
+ /** Discover models with this client instead of the AppKit execution context. */
23
+ readonly client?: WorkspaceClient;
21
24
  }
22
25
  /** Model registry backed by the active AppKit execution context. */
23
26
  export declare class DatabricksModelRegistry implements ModelRegistry {
24
27
  private readonly ttlMs;
25
28
  private readonly overrides;
29
+ private readonly client;
26
30
  constructor(options?: ModelRegistryOptions);
27
31
  list(): Promise<ModelTarget[]>;
28
32
  resolve(model: string, options?: ModelRegistryResolveOptions): Promise<ModelTarget | undefined>;
29
33
  search(query: string): Promise<ModelTarget[]>;
30
34
  refresh(): Promise<void>;
31
35
  private target;
36
+ private context;
32
37
  }
@@ -4,7 +4,7 @@
4
4
  * @module
5
5
  */
6
6
  import { getExecutionContext } from "@databricks/appkit";
7
- import { metadata, modelCatalog, policy, resolve as modelResolve } from "@dbx-tools/model";
7
+ import { metadata, modelCatalog, policy, resolve as modelResolve, } from "@dbx-tools/model";
8
8
  import { log } from "@dbx-tools/shared-core";
9
9
  import { ModelClass, } from "@dbx-tools/shared-model/contracts";
10
10
  const DEFAULT_CACHE_TTL_MS = 60_000;
@@ -13,17 +13,16 @@ const logger = log.logger("appkit/model-gateway/registry");
13
13
  export class DatabricksModelRegistry {
14
14
  ttlMs;
15
15
  overrides;
16
+ client;
16
17
  constructor(options = {}) {
17
18
  this.ttlMs = positiveTtl(options.ttlMs);
18
19
  this.overrides = options.overrides ?? [];
20
+ this.client = options.client;
19
21
  }
20
22
  async list() {
21
- const context = await registryContext();
23
+ const context = await this.context();
22
24
  logger.debug("loading catalogue", { host: context.host, ttlMs: this.ttlMs });
23
- const endpoints = await modelCatalog.listServingEndpoints(context.client, context.host, {
24
- cacheIdentity: context.identity,
25
- ttlMs: this.ttlMs,
26
- });
25
+ const endpoints = await modelCatalog.listServingEndpoints(context.client, context.host, catalogueOptions(context, this.ttlMs));
27
26
  const targets = endpoints.map((endpoint) => this.target(endpoint));
28
27
  logger.debug("loaded catalogue", {
29
28
  endpointCount: endpoints.length,
@@ -74,13 +73,12 @@ export class DatabricksModelRegistry {
74
73
  .filter((target, index, all) => all.findIndex((candidate) => candidate.id === target.id) === index);
75
74
  }
76
75
  async refresh() {
77
- const context = await registryContext();
76
+ const context = await this.context();
78
77
  logger.debug("clearing catalogue", { host: context.host });
79
- await modelCatalog.clearServingEndpointsCache(context.host, context.identity);
80
- await modelCatalog.listServingEndpoints(context.client, context.host, {
81
- cacheIdentity: context.identity,
82
- ttlMs: this.ttlMs,
83
- });
78
+ if (context.identity) {
79
+ await modelCatalog.clearServingEndpointsCache(context.host, context.identity);
80
+ }
81
+ await modelCatalog.listServingEndpoints(context.client, context.host, catalogueOptions(context, this.ttlMs));
84
82
  logger.debug("refreshed catalogue", { host: context.host });
85
83
  }
86
84
  target(endpoint) {
@@ -124,6 +122,19 @@ export class DatabricksModelRegistry {
124
122
  reasoningEfforts: endpoint.reasoningEfforts ?? [],
125
123
  };
126
124
  }
125
+ async context() {
126
+ if (this.client) {
127
+ const host = (await this.client.config.getHost()).toString();
128
+ return { client: this.client, host };
129
+ }
130
+ return registryContext();
131
+ }
132
+ }
133
+ function catalogueOptions(context, ttlMs) {
134
+ return {
135
+ ttlMs,
136
+ ...(context.identity ? { cacheIdentity: context.identity } : {}),
137
+ };
127
138
  }
128
139
  async function registryContext() {
129
140
  const context = getExecutionContext();
@@ -164,4 +175,4 @@ function matchesResolveOptions(target, options) {
164
175
  return target.capabilities.chat;
165
176
  return true;
166
177
  }
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsVUFBVSxHQUdYLE1BQU0sbUNBQW1DLENBQUM7QUFPM0MsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFDcEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0FBeUIzRCxvRUFBb0U7QUFDcEUsTUFBTSxPQUFPLHVCQUF1QjtJQUNqQixLQUFLLENBQVM7SUFDZCxTQUFTLENBQXFDO0lBRS9ELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLE9BQU8sR0FBRyxNQUFNLGVBQWUsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0UsTUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFB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bnQiOlsiLyoqXG4gKiBSZXF1ZXN0LXNjb3BlZCBEYXRhYnJpY2tzIG1vZGVsIGRpc2NvdmVyeSBmb3IgdGhlIEFwcEtpdCBnYXRld2F5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0LCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IG1ldGFkYXRhLCBtb2RlbENhdGFsb2csIHBvbGljeSwgcmVzb2x2ZSBhcyBtb2RlbFJlc29sdmUgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsVGFyZ2V0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5jb25zdCBERUZBVUxUX0NBQ0hFX1RUTF9NUyA9IDYwXzAwMDtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS9yZWdpc3RyeVwiKTtcblxuLyoqIFJlc29sdXRpb24gY29udHJvbHMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsIHBvbGljeSBvd25lci4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyA9IFBpY2s8UmVzb2x2ZU1vZGVsSW5wdXQsIFwibW9kZWxDbGFzc1wiIHwgXCJyZXF1aXJlc1Rvb2xzXCI+O1xuXG4vKiogRHluYW1pYyBtb2RlbCBjYXRhbG9ndWUgdXNlZCBieSByZXF1ZXN0IHJvdXRpbmcgYW5kIG1vZGVsLWxpc3QgcmVzcG9uc2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5IHtcbiAgbGlzdCgpOiBQcm9taXNlPE1vZGVsVGFyZ2V0W10+O1xuICBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHJlc29sdmUobW9kZWw6IHN0cmluZywgb3B0aW9ucz86IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucyk6IFByb21pc2U8TW9kZWxUYXJnZXQgfCB1bmRlZmluZWQ+O1xuICByZWZyZXNoKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciB7QGxpbmsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnl9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHR0bE1zPzogbnVtYmVyO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xufVxuXG5pbnRlcmZhY2UgUmVnaXN0cnlDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgaWRlbnRpdHk6IHN0cmluZztcbn1cblxuLyoqIE1vZGVsIHJlZ2lzdHJ5IGJhY2tlZCBieSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSBpbXBsZW1lbnRzIE1vZGVsUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3ZlcnJpZGVzOiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnR0bE1zID0gcG9zaXRpdmVUdGwob3B0aW9ucy50dGxNcyk7XG4gICAgdGhpcy5vdmVycmlkZXMgPSBvcHRpb25zLm92ZXJyaWRlcyA/PyBbXTtcbiAgfVxuXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHJlZ2lzdHJ5Q29udGV4dCgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxvYWRpbmcgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0LCB0dGxNczogdGhpcy50dGxNcyB9KTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoY29udGV4dC5jbGllbnQsIGNvbnRleHQuaG9zdCwge1xuICAgICAgY2FjaGVJZGVudGl0eTogY29udGV4dC5pZGVudGl0eSxcbiAgICAgIHR0bE1zOiB0aGlzLnR0bE1zLFxuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldHMgPSBlbmRwb2ludHMubWFwKChlbmRwb2ludCkgPT4gdGhpcy50YXJnZXQoZW5kcG9pbnQpKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgY2F0YWxvZ3VlXCIsIHtcbiAgICAgIGVuZHBvaW50Q291bnQ6IGVuZHBvaW50cy5sZW5ndGgsXG4gICAgICBob3N0OiBjb250ZXh0Lmhvc3QsXG4gICAgICB0YXJnZXRDb3VudDogdGFyZ2V0cy5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldHM7XG4gIH1cblxuICBhc3luYyByZXNvbHZlKFxuICAgIG1vZGVsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8TW9kZWxUYXJnZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB1bnF1YWxpZmllZE1vZGVsKG1vZGVsKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgY29uc3QgZXhhY3QgPSB0YXJnZXRzLmZpbmQoKHRhcmdldCkgPT5cbiAgICAgIHRhcmdldC5hbGlhc2VzLnNvbWUoXG4gICAgICAgIChhbGlhcykgPT4gYWxpYXMubG9jYWxlQ29tcGFyZShyZXF1ZXN0ZWQsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogXCJhY2NlbnRcIiB9KSA9PT0gMCxcbiAgICAgICksXG4gICAgKTtcbiAgICBpZiAoZXhhY3QgJiYgbWF0Y2hlc1Jlc29sdmVPcHRpb25zKGV4YWN0LCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2ZWQgZXhhY3QgbW9kZWxcIiwgeyByZXF1ZXN0ZWQsIHJlc29sdmVkOiBleGFjdC5pZCB9KTtcbiAgICAgIHJldHVybiBleGFjdDtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludHMgPSB0YXJnZXRzXG4gICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXNvbHZlZCA9IG1vZGVsUmVzb2x2ZS5yZXNvbHZlTW9kZWwoZW5kcG9pbnRzLCB7XG4gICAgICBleHBsaWNpdDogcmVxdWVzdGVkLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSByZXNvbHZlZC5tb2RlbElkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBmdXp6eSBtb2RlbFwiLCB7XG4gICAgICByZXF1ZXN0ZWQsXG4gICAgICByZXNvbHZlZDogdGFyZ2V0Py5pZCxcbiAgICAgIHNvdXJjZTogcmVzb2x2ZWQuc291cmNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZyk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBieUlkID0gbmV3IE1hcCh0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBbdGFyZ2V0LmlkLCB0YXJnZXRdKSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gdGFyZ2V0c1xuICAgICAgLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQpXG4gICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcmFua2VkID0gW1xuICAgICAgLi4ubW9kZWxSZXNvbHZlLmxvb2t1cE1vZGVscyhlbmRwb2ludHMsIHsgc2VhcmNoOiBxdWVyeSB9KSxcbiAgICAgIC4uLm1vZGVsUmVzb2x2ZS5sb29rdXBNb2RlbHMoZW5kcG9pbnRzLCB7XG4gICAgICAgIHNlYXJjaDogcXVlcnksXG4gICAgICAgIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nLFxuICAgICAgfSksXG4gICAgXS5zb3J0KChsZWZ0LCByaWdodCkgPT4gKGxlZnQuc2NvcmUgPz8gMCkgLSAocmlnaHQuc2NvcmUgPz8gMCkpO1xuICAgIHJldHVybiByYW5rZWRcbiAgICAgIC5tYXAoKHsgZW5kcG9pbnQgfSkgPT4gYnlJZC5nZXQoZW5kcG9pbnQubmFtZSkpXG4gICAgICAuZmlsdGVyKCh0YXJnZXQpOiB0YXJnZXQgaXMgTW9kZWxUYXJnZXQgPT4gdGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAodGFyZ2V0LCBpbmRleCwgYWxsKSA9PiBhbGwuZmluZEluZGV4KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gdGFyZ2V0LmlkKSA9PT0gaW5kZXgsXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgcmVnaXN0cnlDb250ZXh0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2xlYXJpbmcgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0IH0pO1xuICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5jbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShjb250ZXh0Lmhvc3QsIGNvbnRleHQuaWRlbnRpdHkpO1xuICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhjb250ZXh0LmNsaWVudCwgY29udGV4dC5ob3N0LCB7XG4gICAgICBjYWNoZUlkZW50aXR5OiBjb250ZXh0LmlkZW50aXR5LFxuICAgICAgdHRsTXM6IHRoaXMudHRsTXMsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVmcmVzaGVkIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdGFyZ2V0KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxUYXJnZXQge1xuICAgIGNvbnN0IHB1Ymxpc2hlZCA9IG1ldGFkYXRhLm1vZGVsQ2FwYWJpbGl0aWVzRm9yKGVuZHBvaW50KTtcbiAgICBjb25zdCBmYW1pbHkgPSBlbmRwb2ludC5mYW1pbHk/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgb3BlbkFpRmFtaWx5ID0gZmFtaWx5ID09PSBcImdwdFwiIHx8IGZhbWlseSA9PT0gXCJvcGVuYWlcIiB8fCBlbmRwb2ludC5uYW1lLmluY2x1ZGVzKFwiY29kZXhcIik7XG4gICAgY29uc3QgbW9kZWxTZXJ2aWNlTmFtZSA9IG5vcm1hbGl6ZWRNb2RlbFNlcnZpY2VOYW1lKGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPVxuICAgICAgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIHx8IGVuZHBvaW50LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcbiAgICBjb25zdCBjYXBhYmlsaXRpZXM6IE1vZGVsQ2FwYWJpbGl0aWVzID0ge1xuICAgICAgcmVzcG9uc2VzOiAhZW1iZWRkaW5ncyAmJiAob3BlbkFpRmFtaWx5IHx8IHB1Ymxpc2hlZC5yZXNwb25zZXMpLFxuICAgICAgb3BlblJlc3BvbnNlczogIWVtYmVkZGluZ3MgJiYgIW9wZW5BaUZhbWlseSxcbiAgICAgIGNoYXQ6ICFlbWJlZGRpbmdzLFxuICAgICAgYW50aHJvcGljOiBmYW1pbHkgPT09IFwiY2xhdWRlXCIsXG4gICAgICBlbWJlZGRpbmdzLFxuICAgICAgYWlHYXRld2F5Q29kZXg6XG4gICAgICAgICFlbWJlZGRpbmdzICYmIEJvb2xlYW4obW9kZWxTZXJ2aWNlTmFtZSkgJiYgZmFtaWx5ICE9PSBcImNsYXVkZVwiICYmIGZhbWlseSAhPT0gXCJnZW1pbmlcIixcbiAgICAgIHRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgcmVhc29uaW5nOiBwb2xpY3kubW9kZWxSZWFzb25pbmdFZmZvcnRzKGVuZHBvaW50Lm5hbWUpLmxlbmd0aCA+IDAsXG4gICAgICBzdHJlYW1pbmc6IHRydWUsXG4gICAgICBwYXJhbGxlbFRvb2xzOiBlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID09PSB0cnVlLFxuICAgICAgY3VzdG9tVG9vbHM6IHB1Ymxpc2hlZC5hcHBseVBhdGNoIHx8IGVuZHBvaW50Lm5hbWUuaW5jbHVkZXMoXCJjb2RleFwiKSxcbiAgICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUsXG4gICAgICB3ZWJTZWFyY2g6IHB1Ymxpc2hlZC53ZWJTZWFyY2gsXG4gICAgfTtcbiAgICBjb25zdCBhbGlhc2VzID0gbmV3IFNldChcbiAgICAgIFtcbiAgICAgICAgZW5kcG9pbnQubmFtZSxcbiAgICAgICAgZW5kcG9pbnQuZGlzcGxheU5hbWUsXG4gICAgICAgIGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUsXG4gICAgICAgIG1vZGVsU2VydmljZU5hbWUsXG4gICAgICAgIC4uLk9iamVjdC52YWx1ZXMoZW5kcG9pbnQuc2VydmljZU5hbWVzID8/IHt9KSxcbiAgICAgIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlPy50cmltKCkpKSxcbiAgICApO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5vdmVycmlkZXMuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+XG4gICAgICAgIGNhbmRpZGF0ZS5tb2RlbCA9PT0gZW5kcG9pbnQubmFtZSB8fFxuICAgICAgICBbLi4uYWxpYXNlc10uc29tZSgoYWxpYXMpID0+IGFsaWFzID09PSBjYW5kaWRhdGUubW9kZWwpLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBlbmRwb2ludC5uYW1lLFxuICAgICAgYWxpYXNlczogWy4uLmFsaWFzZXNdLFxuICAgICAgZGlzcGxheU5hbWU6IGVuZHBvaW50LmRpc3BsYXlOYW1lID8/IGVuZHBvaW50Lm5hbWUsXG4gICAgICAuLi4oZW5kcG9pbnQuZmFtaWx5ID8geyBmYW1pbHk6IGVuZHBvaW50LmZhbWlseSB9IDoge30pLFxuICAgICAgLi4uKG1vZGVsU2VydmljZU5hbWUgPyB7IG1vZGVsU2VydmljZU5hbWUgfSA6IHt9KSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgY2FwYWJpbGl0aWVzOiB7IC4uLmNhcGFiaWxpdGllcywgLi4ub3ZlcnJpZGU/LmNhcGFiaWxpdGllcyB9LFxuICAgICAgcmVhc29uaW5nRWZmb3J0czogZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cyA/PyBbXSxcbiAgICB9O1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdHJ5Q29udGV4dCgpOiBQcm9taXNlPFJlZ2lzdHJ5Q29udGV4dD4ge1xuICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIHJldHVybiB7XG4gICAgY2xpZW50OiBjb250ZXh0LmNsaWVudCxcbiAgICBob3N0LFxuICAgIGlkZW50aXR5OiBcInVzZXJJZFwiIGluIGNvbnRleHQgPyBjb250ZXh0LnVzZXJJZCA6IGNvbnRleHQuc2VydmljZVVzZXJJZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5xdWFsaWZpZWRNb2RlbChtb2RlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG1vZGVsLnRyaW0oKS5yZXBsYWNlKC9eKD86ZGJ4fGRhdGFicmlja3MpXFwvL2ksIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZVR0bCh2YWx1ZSA9IERFRkFVTFRfQ0FDSEVfVFRMX01TKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNb2RlbCByZWdpc3RyeSB0dGxNcyBtdXN0IGJlIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRNb2RlbFNlcnZpY2VOYW1lKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBub3JtYWxpemVkID0gdmFsdWU/LnRyaW0oKS5yZXBsYWNlKC9eZGF0YWJyaWNrc1xcLy8sIFwiXCIpO1xuICBpZiAoIW5vcm1hbGl6ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJzeXN0ZW0uYWkuZGF0YWJyaWNrcy1cIikpIHtcbiAgICByZXR1cm4gYHN5c3RlbS5haS4ke25vcm1hbGl6ZWQuc2xpY2UoXCJzeXN0ZW0uYWkuZGF0YWJyaWNrcy1cIi5sZW5ndGgpfWA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcImRhdGFicmlja3MtXCIpKSB7XG4gICAgcmV0dXJuIGBzeXN0ZW0uYWkuJHtub3JtYWxpemVkLnNsaWNlKFwiZGF0YWJyaWNrcy1cIi5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNSZXNvbHZlT3B0aW9ucyh0YXJnZXQ6IE1vZGVsVGFyZ2V0LCBvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKG9wdGlvbnMucmVxdWlyZXNUb29scyAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scykgcmV0dXJuIGZhbHNlO1xuICBpZiAob3B0aW9ucy5tb2RlbENsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZykgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncztcbiAgaWYgKG9wdGlvbnMubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGFyZ2V0LmNhcGFiaWxpdGllcy5jaGF0O1xuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sT0FBTyxJQUFJLFlBQVksR0FFeEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsR0FHWCxNQUFNLG1DQUFtQyxDQUFDO0FBTzNDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQTJCM0Qsb0VBQW9FO0FBQ3BFLE1BQU0sT0FBTyx1QkFBdUI7SUFDakIsS0FBSyxDQUFTO0lBQ2QsU0FBUyxDQUFxQztJQUM5QyxNQUFNLENBQThCO0lBRXJELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RSxN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QkFBdUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxPQUFPLGFBQWEsVUFBVSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBbUIsRUFBRSxPQUFvQztJQUN0RixJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO0lBQ3ZGLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUN0RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcXVlc3Qtc2NvcGVkIERhdGFicmlja3MgbW9kZWwgZGlzY292ZXJ5IGZvciB0aGUgQXBwS2l0IGdhdGV3YXkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQsIHR5cGUgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgbWV0YWRhdGEsXG4gIG1vZGVsQ2F0YWxvZyxcbiAgcG9saWN5LFxuICByZXNvbHZlIGFzIG1vZGVsUmVzb2x2ZSxcbiAgdHlwZSBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyxcbiAgdHlwZSBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSxcbiAgTW9kZWxUYXJnZXQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IERFRkFVTFRfQ0FDSEVfVFRMX01TID0gNjBfMDAwO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L3JlZ2lzdHJ5XCIpO1xuXG4vKiogUmVzb2x1dGlvbiBjb250cm9scyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWwgcG9saWN5IG93bmVyLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zID0gUGljazxSZXNvbHZlTW9kZWxJbnB1dCwgXCJtb2RlbENsYXNzXCIgfCBcInJlcXVpcmVzVG9vbHNcIj47XG5cbi8qKiBEeW5hbWljIG1vZGVsIGNhdGFsb2d1ZSB1c2VkIGJ5IHJlcXVlc3Qgcm91dGluZyBhbmQgbW9kZWwtbGlzdCByZXNwb25zZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnkge1xuICBsaXN0KCk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT47XG4gIHNlYXJjaChxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPjtcbiAgcmVzb2x2ZShtb2RlbDogc3RyaW5nLCBvcHRpb25zPzogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zKTogUHJvbWlzZTxNb2RlbFRhcmdldCB8IHVuZGVmaW5lZD47XG4gIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIHtAbGluayBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeX0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgdHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIC8qKiBEaXNjb3ZlciBtb2RlbHMgd2l0aCB0aGlzIGNsaWVudCBpbnN0ZWFkIG9mIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG4gIHJlYWRvbmx5IGNsaWVudD86IFdvcmtzcGFjZUNsaWVudDtcbn1cblxuaW50ZXJmYWNlIFJlZ2lzdHJ5Q29udGV4dCB7XG4gIHJlYWRvbmx5IGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlkZW50aXR5Pzogc3RyaW5nO1xufVxuXG4vKiogTW9kZWwgcmVnaXN0cnkgYmFja2VkIGJ5IHRoZSBhY3RpdmUgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xuZXhwb3J0IGNsYXNzIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5IGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHRsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBvdmVycmlkZXM6IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxSZWdpc3RyeU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudHRsTXMgPSBwb3NpdGl2ZVR0bChvcHRpb25zLnR0bE1zKTtcbiAgICB0aGlzLm92ZXJyaWRlcyA9IG9wdGlvbnMub3ZlcnJpZGVzID8/IFtdO1xuICAgIHRoaXMuY2xpZW50ID0gb3B0aW9ucy5jbGllbnQ7XG4gIH1cblxuICBhc3luYyBsaXN0KCk6IFByb21pc2U8TW9kZWxUYXJnZXRbXT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmNvbnRleHQoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsb2FkaW5nIGNhdGFsb2d1ZVwiLCB7IGhvc3Q6IGNvbnRleHQuaG9zdCwgdHRsTXM6IHRoaXMudHRsTXMgfSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKFxuICAgICAgY29udGV4dC5jbGllbnQsXG4gICAgICBjb250ZXh0Lmhvc3QsXG4gICAgICBjYXRhbG9ndWVPcHRpb25zKGNvbnRleHQsIHRoaXMudHRsTXMpLFxuICAgICk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGVuZHBvaW50cy5tYXAoKGVuZHBvaW50KSA9PiB0aGlzLnRhcmdldChlbmRwb2ludCkpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBjYXRhbG9ndWVcIiwge1xuICAgICAgZW5kcG9pbnRDb3VudDogZW5kcG9pbnRzLmxlbmd0aCxcbiAgICAgIGhvc3Q6IGNvbnRleHQuaG9zdCxcbiAgICAgIHRhcmdldENvdW50OiB0YXJnZXRzLmxlbmd0aCxcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0cztcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmUoXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxNb2RlbFRhcmdldCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHVucXVhbGlmaWVkTW9kZWwobW9kZWwpO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBleGFjdCA9IHRhcmdldHMuZmluZCgodGFyZ2V0KSA9PlxuICAgICAgdGFyZ2V0LmFsaWFzZXMuc29tZShcbiAgICAgICAgKGFsaWFzKSA9PiBhbGlhcy5sb2NhbGVDb21wYXJlKHJlcXVlc3RlZCwgdW5kZWZpbmVkLCB7IHNlbnNpdGl2aXR5OiBcImFjY2VudFwiIH0pID09PSAwLFxuICAgICAgKSxcbiAgICApO1xuICAgIGlmIChleGFjdCAmJiBtYXRjaGVzUmVzb2x2ZU9wdGlvbnMoZXhhY3QsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBleGFjdCBtb2RlbFwiLCB7IHJlcXVlc3RlZCwgcmVzb2x2ZWQ6IGV4YWN0LmlkIH0pO1xuICAgICAgcmV0dXJuIGV4YWN0O1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50cyA9IHRhcmdldHNcbiAgICAgIC5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50KVxuICAgICAgLmZpbHRlcigoZW5kcG9pbnQpOiBlbmRwb2ludCBpcyBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0+IGVuZHBvaW50ICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlc29sdmVkID0gbW9kZWxSZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIGV4cGxpY2l0OiByZXF1ZXN0ZWQsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHJlc29sdmVkLm1vZGVsSWQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmVkIGZ1enp5IG1vZGVsXCIsIHtcbiAgICAgIHJlcXVlc3RlZCxcbiAgICAgIHJlc29sdmVkOiB0YXJnZXQ/LmlkLFxuICAgICAgc291cmNlOiByZXNvbHZlZC5zb3VyY2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGFzeW5jIHNlYXJjaChxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbFRhcmdldFtdPiB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGJ5SWQgPSBuZXcgTWFwKHRhcmdldHMubWFwKCh0YXJnZXQpID0+IFt0YXJnZXQuaWQsIHRhcmdldF0pKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSB0YXJnZXRzXG4gICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByYW5rZWQgPSBbXG4gICAgICAuLi5tb2RlbFJlc29sdmUubG9va3VwTW9kZWxzKGVuZHBvaW50cywgeyBzZWFyY2g6IHF1ZXJ5IH0pLFxuICAgICAgLi4ubW9kZWxSZXNvbHZlLmxvb2t1cE1vZGVscyhlbmRwb2ludHMsIHtcbiAgICAgICAgc2VhcmNoOiBxdWVyeSxcbiAgICAgICAgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcsXG4gICAgICB9KSxcbiAgICBdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiAobGVmdC5zY29yZSA/PyAwKSAtIChyaWdodC5zY29yZSA/PyAwKSk7XG4gICAgcmV0dXJuIHJhbmtlZFxuICAgICAgLm1hcCgoeyBlbmRwb2ludCB9KSA9PiBieUlkLmdldChlbmRwb2ludC5uYW1lKSlcbiAgICAgIC5maWx0ZXIoKHRhcmdldCk6IHRhcmdldCBpcyBNb2RlbFRhcmdldCA9PiB0YXJnZXQgIT09IHVuZGVmaW5lZClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh0YXJnZXQsIGluZGV4LCBhbGwpID0+IGFsbC5maW5kSW5kZXgoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSB0YXJnZXQuaWQpID09PSBpbmRleCxcbiAgICAgICk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmNvbnRleHQoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJjbGVhcmluZyBjYXRhbG9ndWVcIiwgeyBob3N0OiBjb250ZXh0Lmhvc3QgfSk7XG4gICAgaWYgKGNvbnRleHQuaWRlbnRpdHkpIHtcbiAgICAgIGF3YWl0IG1vZGVsQ2F0YWxvZy5jbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShjb250ZXh0Lmhvc3QsIGNvbnRleHQuaWRlbnRpdHkpO1xuICAgIH1cbiAgICBhd2FpdCBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBjb250ZXh0LmNsaWVudCxcbiAgICAgIGNvbnRleHQuaG9zdCxcbiAgICAgIGNhdGFsb2d1ZU9wdGlvbnMoY29udGV4dCwgdGhpcy50dGxNcyksXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoZWQgY2F0YWxvZ3VlXCIsIHsgaG9zdDogY29udGV4dC5ob3N0IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0YXJnZXQoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbFRhcmdldCB7XG4gICAgY29uc3QgcHVibGlzaGVkID0gbWV0YWRhdGEubW9kZWxDYXBhYmlsaXRpZXNGb3IoZW5kcG9pbnQpO1xuICAgIGNvbnN0IGZhbWlseSA9IGVuZHBvaW50LmZhbWlseT8udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBvcGVuQWlGYW1pbHkgPSBmYW1pbHkgPT09IFwiZ3B0XCIgfHwgZmFtaWx5ID09PSBcIm9wZW5haVwiIHx8IGVuZHBvaW50Lm5hbWUuaW5jbHVkZXMoXCJjb2RleFwiKTtcbiAgICBjb25zdCBtb2RlbFNlcnZpY2VOYW1lID0gbm9ybWFsaXplZE1vZGVsU2VydmljZU5hbWUoZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSk7XG4gICAgY29uc3QgZW1iZWRkaW5ncyA9XG4gICAgICBlbmRwb2ludC5jbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcgfHwgZW5kcG9pbnQudGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiO1xuICAgIGNvbnN0IGNhcGFiaWxpdGllczogTW9kZWxDYXBhYmlsaXRpZXMgPSB7XG4gICAgICByZXNwb25zZXM6ICFlbWJlZGRpbmdzICYmIChvcGVuQWlGYW1pbHkgfHwgcHVibGlzaGVkLnJlc3BvbnNlcyksXG4gICAgICBvcGVuUmVzcG9uc2VzOiAhZW1iZWRkaW5ncyAmJiAhb3BlbkFpRmFtaWx5LFxuICAgICAgY2hhdDogIWVtYmVkZGluZ3MsXG4gICAgICBhbnRocm9waWM6IGZhbWlseSA9PT0gXCJjbGF1ZGVcIixcbiAgICAgIGVtYmVkZGluZ3MsXG4gICAgICBhaUdhdGV3YXlDb2RleDpcbiAgICAgICAgIWVtYmVkZGluZ3MgJiYgQm9vbGVhbihtb2RlbFNlcnZpY2VOYW1lKSAmJiBmYW1pbHkgIT09IFwiY2xhdWRlXCIgJiYgZmFtaWx5ICE9PSBcImdlbWluaVwiLFxuICAgICAgdG9vbHM6IGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgPT09IHRydWUsXG4gICAgICByZWFzb25pbmc6IHBvbGljeS5tb2RlbFJlYXNvbmluZ0VmZm9ydHMoZW5kcG9pbnQubmFtZSkubGVuZ3RoID4gMCxcbiAgICAgIHN0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsVG9vbHM6IGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgPT09IHRydWUsXG4gICAgICBjdXN0b21Ub29sczogcHVibGlzaGVkLmFwcGx5UGF0Y2ggfHwgZW5kcG9pbnQubmFtZS5pbmNsdWRlcyhcImNvZGV4XCIpLFxuICAgICAgc3RydWN0dXJlZE91dHB1dDogdHJ1ZSxcbiAgICAgIHdlYlNlYXJjaDogcHVibGlzaGVkLndlYlNlYXJjaCxcbiAgICB9O1xuICAgIGNvbnN0IGFsaWFzZXMgPSBuZXcgU2V0KFxuICAgICAgW1xuICAgICAgICBlbmRwb2ludC5uYW1lLFxuICAgICAgICBlbmRwb2ludC5kaXNwbGF5TmFtZSxcbiAgICAgICAgZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAgICAgbW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICAgICAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWU/LnRyaW0oKSkpLFxuICAgICk7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLm92ZXJyaWRlcy5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgY2FuZGlkYXRlLm1vZGVsID09PSBlbmRwb2ludC5uYW1lIHx8XG4gICAgICAgIFsuLi5hbGlhc2VzXS5zb21lKChhbGlhcykgPT4gYWxpYXMgPT09IGNhbmRpZGF0ZS5tb2RlbCksXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGVuZHBvaW50Lm5hbWUsXG4gICAgICBhbGlhc2VzOiBbLi4uYWxpYXNlc10sXG4gICAgICBkaXNwbGF5TmFtZTogZW5kcG9pbnQuZGlzcGxheU5hbWUgPz8gZW5kcG9pbnQubmFtZSxcbiAgICAgIC4uLihlbmRwb2ludC5mYW1pbHkgPyB7IGZhbWlseTogZW5kcG9pbnQuZmFtaWx5IH0gOiB7fSksXG4gICAgICAuLi4obW9kZWxTZXJ2aWNlTmFtZSA/IHsgbW9kZWxTZXJ2aWNlTmFtZSB9IDoge30pLFxuICAgICAgZW5kcG9pbnQsXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgLi4uY2FwYWJpbGl0aWVzLCAuLi5vdmVycmlkZT8uY2FwYWJpbGl0aWVzIH0sXG4gICAgICByZWFzb25pbmdFZmZvcnRzOiBlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzID8/IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnRleHQoKTogUHJvbWlzZTxSZWdpc3RyeUNvbnRleHQ+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgdGhpcy5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiB7IGNsaWVudDogdGhpcy5jbGllbnQsIGhvc3QgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5Q29udGV4dCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZU9wdGlvbnMoY29udGV4dDogUmVnaXN0cnlDb250ZXh0LCB0dGxNczogbnVtYmVyKTogTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICB0dGxNcyxcbiAgICAuLi4oY29udGV4dC5pZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY29udGV4dC5pZGVudGl0eSB9IDoge30pLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWdpc3RyeUNvbnRleHQoKTogUHJvbWlzZTxSZWdpc3RyeUNvbnRleHQ+IHtcbiAgY29uc3QgY29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICByZXR1cm4ge1xuICAgIGNsaWVudDogY29udGV4dC5jbGllbnQsXG4gICAgaG9zdCxcbiAgICBpZGVudGl0eTogXCJ1c2VySWRcIiBpbiBjb250ZXh0ID8gY29udGV4dC51c2VySWQgOiBjb250ZXh0LnNlcnZpY2VVc2VySWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVucXVhbGlmaWVkTW9kZWwobW9kZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbC50cmltKCkucmVwbGFjZSgvXig/OmRieHxkYXRhYnJpY2tzKVxcLy9pLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpdmVUdGwodmFsdWUgPSBERUZBVUxUX0NBQ0hFX1RUTF9NUyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTW9kZWwgcmVnaXN0cnkgdHRsTXMgbXVzdCBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkTW9kZWxTZXJ2aWNlTmFtZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHZhbHVlPy50cmltKCkucmVwbGFjZSgvXmRhdGFicmlja3NcXC8vLCBcIlwiKTtcbiAgaWYgKCFub3JtYWxpemVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwic3lzdGVtLmFpLmRhdGFicmlja3MtXCIpKSB7XG4gICAgcmV0dXJuIGBzeXN0ZW0uYWkuJHtub3JtYWxpemVkLnNsaWNlKFwic3lzdGVtLmFpLmRhdGFicmlja3MtXCIubGVuZ3RoKX1gO1xuICB9XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJkYXRhYnJpY2tzLVwiKSkge1xuICAgIHJldHVybiBgc3lzdGVtLmFpLiR7bm9ybWFsaXplZC5zbGljZShcImRhdGFicmlja3MtXCIubGVuZ3RoKX1gO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzUmVzb2x2ZU9wdGlvbnModGFyZ2V0OiBNb2RlbFRhcmdldCwgb3B0aW9uczogTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChvcHRpb25zLnJlcXVpcmVzVG9vbHMgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMpIHJldHVybiBmYWxzZTtcbiAgaWYgKG9wdGlvbnMubW9kZWxDbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcpIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3M7XG4gIGlmIChvcHRpb25zLm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdDtcbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
package/lib/src/router.js CHANGED
@@ -26,17 +26,14 @@ export function resolveRoute(input) {
26
26
  if (clientProtocol === "openai-responses") {
27
27
  rejectStatefulResponses(features);
28
28
  if (isCodexOriginator(input.originator) &&
29
- targetsModelService(requestedModel, target) &&
30
- target.capabilities.aiGatewayCodex &&
31
- supportsDirectResponses(target, features)) {
29
+ canUseAiGatewayCodex(target, features) &&
30
+ !requestedServingEndpoint(requestedModel, target)) {
32
31
  return directRoute(input, "databricks-ai-gateway-codex", target.modelServiceName);
33
32
  }
34
33
  if (target.capabilities.responses && supportsDirectResponses(target, features)) {
35
34
  return directRoute(input, "databricks-responses", target.id);
36
35
  }
37
- if (target.capabilities.aiGatewayCodex &&
38
- target.modelServiceName &&
39
- supportsDirectResponses(target, features)) {
36
+ if (canUseAiGatewayCodex(target, features)) {
40
37
  return directRoute(input, "databricks-ai-gateway-codex", target.modelServiceName);
41
38
  }
42
39
  if (target.capabilities.openResponses && supportsOpenResponses(target, features)) {
@@ -128,10 +125,12 @@ function rejectStatefulResponses(features) {
128
125
  if (unsupported.length > 0)
129
126
  throw new UnsupportedGatewayFeatureError(unsupported);
130
127
  }
131
- function targetsModelService(requestedModel, target) {
132
- if (!target.modelServiceName)
133
- return false;
134
- const unqualified = requestedModel.trim().replace(/^(?:dbx|databricks)\//i, "");
135
- return unqualified === target.modelServiceName;
128
+ function canUseAiGatewayCodex(target, features) {
129
+ return (Boolean(target.capabilities.aiGatewayCodex && target.modelServiceName) &&
130
+ supportsDirectResponses(target, features));
136
131
  }
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBU2hELGlGQUFpRjtBQUNqRixNQUFNLE9BQU8sOEJBQStCLFNBQVEsS0FBSztJQUdsQztJQUZaLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFFdEIsWUFBcUIsUUFBMkI7UUFDOUMsS0FBSyxDQUFDLDBEQUEwRCxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQURwRSxhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQUU5QyxJQUFJLENBQUMsSUFBSSxHQUFHLGdDQUFnQyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQUVELDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQXdCO0lBQ25ELE1BQU0sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDbkUsSUFBSSxjQUFjLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksOEJBQThCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLGNBQWMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQ0UsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNuQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFD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QztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdXJlIGNhcGFiaWxpdHktZHJpdmVuIHJvdXRlIHNlbGVjdGlvbiBmb3IgbW9kZWwtZ2F0ZXdheSByZXF1ZXN0cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHtcbiAgR2F0ZXdheVJvdXRlLFxuICBNb2RlbFRhcmdldCxcbiAgUmVxdWVzdGVkRmVhdHVyZXMsXG4gIFJlc29sdmVSb3V0ZUlucHV0LFxuICBVcHN0cmVhbVByb3RvY29sLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG4vKiogRXJyb3IgcmV0dXJuZWQgd2hlbiBwcmVzZXJ2aW5nIGEgcmVxdWVzdGVkIHByb3RvY29sIGZlYXR1cmUgaXMgaW1wb3NzaWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1cyA9IDQwMDtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW10pIHtcbiAgICBzdXBlcihgVGhlIHNlbGVjdGVkIG1vZGVsIGNhbm5vdCBwcmVzZXJ2ZSByZXF1ZXN0ZWQgZmVhdHVyZXM6ICR7ZmVhdHVyZXMuam9pbihcIiwgXCIpfWApO1xuICAgIHRoaXMubmFtZSA9IFwiVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIFNlbGVjdCB0aGUgbG93ZXN0LW92ZXJoZWFkIHVwc3RyZWFtIHRoYXQgcHJlc2VydmVzIHRoZSBjbGllbnQgY29udHJhY3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJvdXRlKGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCk6IEdhdGV3YXlSb3V0ZSB7XG4gIGNvbnN0IHsgY2xpZW50UHJvdG9jb2wsIHJlcXVlc3RlZE1vZGVsLCBmZWF0dXJlcywgdGFyZ2V0IH0gPSBpbnB1dDtcbiAgaWYgKGNsaWVudFByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIpIHtcbiAgICBpZiAoIXRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncykge1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvcihbXCJlbWJlZGRpbmdzXCJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtZW1iZWRkaW5nc1wiLCB0YXJnZXQuaWQpO1xuICB9XG4gIGlmIChjbGllbnRQcm90b2NvbCA9PT0gXCJvcGVuYWktcmVzcG9uc2VzXCIpIHtcbiAgICByZWplY3RTdGF0ZWZ1bFJlc3BvbnNlcyhmZWF0dXJlcyk7XG4gICAgaWYgKFxuICAgICAgaXNDb2RleE9yaWdpbmF0b3IoaW5wdXQub3JpZ2luYXRvcikgJiZcbiAgICAgIHRhcmdldHNNb2RlbFNlcnZpY2UocmVxdWVzdGVkTW9kZWwsIHRhcmdldCkgJiZcbiAgICAgIHRhcmdldC5jYXBhYmlsaXRpZXMuYWlHYXRld2F5Q29kZXggJiZcbiAgICAgIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1haS1nYXRld2F5LWNvZGV4XCIsIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lISk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyAmJiBzdXBwb3J0c0RpcmVjdFJlc3BvbnNlcyh0YXJnZXQsIGZlYXR1cmVzKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtcmVzcG9uc2VzXCIsIHRhcmdldC5pZCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRhcmdldC5jYXBhYmlsaXRpZXMuYWlHYXRld2F5Q29kZXggJiZcbiAgICAgIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lICYmXG4gICAgICBzdXBwb3J0c0RpcmVjdFJlc3BvbnNlcyh0YXJnZXQsIGZlYXR1cmVzKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRpcmVjdFJvdXRlKGlucHV0LCBcImRhdGFicmlja3MtYWktZ2F0ZXdheS1jb2RleFwiLCB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZSk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMgJiYgc3VwcG9ydHNPcGVuUmVzcG9uc2VzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1vcGVuLXJlc3BvbnNlc1wiLCB0YXJnZXQuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbiAgfVxuXG4gIGlmIChjbGllbnRQcm90b2NvbCA9PT0gXCJvcGVuYWktY2hhdFwiKSB7XG4gICAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdCAmJiBzdXBwb3J0c1Rvb2xzKHRhcmdldCwgZmVhdHVyZXMpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1jaGF0XCIsIHRhcmdldC5pZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkUm91dGUoaW5wdXQpO1xuICB9XG5cbiAgaWYgKHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljICYmIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykpIHtcbiAgICByZXR1cm4gZGlyZWN0Um91dGUoaW5wdXQsIFwiZGF0YWJyaWNrcy1hbnRocm9waWNcIiwgdGFyZ2V0LmlkKTtcbiAgfVxuICByZXR1cm4gdHJhbnNsYXRlZFJvdXRlKGlucHV0KTtcbn1cblxuLyoqIERldGVjdCByb3V0ZS1hZmZlY3RpbmcgZmVhdHVyZXMgZnJvbSBhbiBPcGVuQUkgb3IgQW50aHJvcGljIHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ZWRGZWF0dXJlcyhib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBSZXF1ZXN0ZWRGZWF0dXJlcyB7XG4gIGNvbnN0IHRvb2xzID0gQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSA/IGJvZHkudG9vbHMgOiBbXTtcbiAgY29uc3QgdG9vbFR5cGVzID0gdG9vbHNcbiAgICAuZmlsdGVyKCh0b29sKTogdG9vbCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiBvYmplY3QuaXNSZWNvcmQodG9vbCkpXG4gICAgLm1hcCgodG9vbCkgPT4gdG9vbC50eXBlKTtcbiAgY29uc3QgdGV4dCA9IG9iamVjdC5pc1JlY29yZChib2R5LnRleHQpID8gYm9keS50ZXh0IDoge307XG4gIGNvbnN0IGZvcm1hdCA9IG9iamVjdC5pc1JlY29yZCh0ZXh0LmZvcm1hdCkgPyB0ZXh0LmZvcm1hdC50eXBlIDogdGV4dC5mb3JtYXQ7XG4gIHJldHVybiB7XG4gICAgYmFja2dyb3VuZDogYm9keS5iYWNrZ3JvdW5kID09PSB0cnVlLFxuICAgIGN1c3RvbVRvb2xzOiB0b29sVHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJjdXN0b21cIiksXG4gICAgcGFyYWxsZWxUb29sczogYm9keS5wYXJhbGxlbF90b29sX2NhbGxzID09PSB0cnVlLFxuICAgIHByZXZpb3VzUmVzcG9uc2U6XG4gICAgICB0eXBlb2YgYm9keS5wcmV2aW91c19yZXNwb25zZV9pZCA9PT0gXCJzdHJpbmdcIiAmJiBib2R5LnByZXZpb3VzX3Jlc3BvbnNlX2lkLmxlbmd0aCA+IDAsXG4gICAgcmVhc29uaW5nOiBvYmplY3QuaXNSZWNvcmQoYm9keS5yZWFzb25pbmcpIHx8IGJvZHkucmVhc29uaW5nX2VmZm9ydCAhPT0gdW5kZWZpbmVkLFxuICAgIHN0b3JhZ2U6IGJvZHkuc3RvcmUgPT09IHRydWUsXG4gICAgc3RydWN0dXJlZE91dHB1dDogZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgZm9ybWF0ICE9PSBcInRleHRcIixcbiAgICB0b29sczogdG9vbHMubGVuZ3RoID4gMCxcbiAgICB1bnN1cHBvcnRlZE9wZW5SZXNwb25zZXNUb29sczogdG9vbFR5cGVzLnNvbWUoXG4gICAgICAodHlwZSkgPT4gdHlwZSAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGUgIT09IFwid2ViX3NlYXJjaFwiICYmIHR5cGUgIT09IFwid2ViX3NlYXJjaF9wcmV2aWV3XCIsXG4gICAgKSxcbiAgICB3ZWJTZWFyY2g6IHRvb2xUeXBlcy5zb21lKCh0eXBlKSA9PiB0eXBlID09PSBcIndlYl9zZWFyY2hcIiB8fCB0eXBlID09PSBcIndlYl9zZWFyY2hfcHJldmlld1wiKSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGFuIE9yaWdpbmF0b3IgaGVhZGVyIHNlbGVjdHMgQ29kZXggY29tcGF0aWJpbGl0eSBiZWhhdmlvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9yaWdpbmF0b3I/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJjb2RleFwiKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGlyZWN0Um91dGUoXG4gIGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCxcbiAgdXBzdHJlYW1Qcm90b2NvbDogRXhjbHVkZTxVcHN0cmVhbVByb3RvY29sLCBcImFpLXNka1wiPixcbiAgdXBzdHJlYW1Nb2RlbDogc3RyaW5nLFxuKTogR2F0ZXdheVJvdXRlIHtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnRQcm90b2NvbDogaW5wdXQuY2xpZW50UHJvdG9jb2wsXG4gICAgdXBzdHJlYW1Qcm90b2NvbCxcbiAgICB0YXJnZXQ6IGlucHV0LnRhcmdldCxcbiAgICB1cHN0cmVhbU1vZGVsLFxuICAgIHRyYW5zbGF0ZVJlcXVlc3Q6IGZhbHNlLFxuICAgIHRyYW5zbGF0ZVJlc3BvbnNlOiBmYWxzZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlZFJvdXRlKGlucHV0OiBSZXNvbHZlUm91dGVJbnB1dCk6IEdhdGV3YXlSb3V0ZSB7XG4gIHJldHVybiB7XG4gICAgY2xpZW50UHJvdG9jb2w6IGlucHV0LmNsaWVudFByb3RvY29sLFxuICAgIHVwc3RyZWFtUHJvdG9jb2w6IFwiYWktc2RrXCIsXG4gICAgdGFyZ2V0OiBpbnB1dC50YXJnZXQsXG4gICAgdXBzdHJlYW1Nb2RlbDogaW5wdXQudGFyZ2V0LmlkLFxuICAgIHRyYW5zbGF0ZVJlcXVlc3Q6IHRydWUsXG4gICAgdHJhbnNsYXRlUmVzcG9uc2U6IHRydWUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzRGlyZWN0UmVzcG9uc2VzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAoIWZlYXR1cmVzLmN1c3RvbVRvb2xzIHx8IHRhcmdldC5jYXBhYmlsaXRpZXMuY3VzdG9tVG9vbHMpICYmXG4gICAgKCFmZWF0dXJlcy5zdHJ1Y3R1cmVkT3V0cHV0IHx8IHRhcmdldC5jYXBhYmlsaXRpZXMuc3RydWN0dXJlZE91dHB1dClcbiAgKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNPcGVuUmVzcG9uc2VzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN1cHBvcnRzVG9vbHModGFyZ2V0LCBmZWF0dXJlcykgJiZcbiAgICAhZmVhdHVyZXMuY3VzdG9tVG9vbHMgJiZcbiAgICAhZmVhdHVyZXMucHJldmlvdXNSZXNwb25zZSAmJlxuICAgICFmZWF0dXJlcy5zdG9yYWdlICYmXG4gICAgIWZlYXR1cmVzLmJhY2tncm91bmQgJiZcbiAgICAhZmVhdHVyZXMudW5zdXBwb3J0ZWRPcGVuUmVzcG9uc2VzVG9vbHMgJiZcbiAgICAoIWZlYXR1cmVzLndlYlNlYXJjaCB8fCB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCkgJiZcbiAgICAoIWZlYXR1cmVzLnN0cnVjdHVyZWRPdXRwdXQgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJ1Y3R1cmVkT3V0cHV0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c1Rvb2xzKHRhcmdldDogTW9kZWxUYXJnZXQsIGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgICghZmVhdHVyZXMudG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy50b29scykgJiZcbiAgICAoIWZlYXR1cmVzLnBhcmFsbGVsVG9vbHMgfHwgdGFyZ2V0LmNhcGFiaWxpdGllcy5wYXJhbGxlbFRvb2xzKVxuICApO1xufVxuXG5mdW5jdGlvbiByZWplY3RTdGF0ZWZ1bFJlc3BvbnNlcyhmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXMpOiB2b2lkIHtcbiAgY29uc3QgdW5zdXBwb3J0ZWQgPSBbXG4gICAgLi4uKGZlYXR1cmVzLnByZXZpb3VzUmVzcG9uc2UgPyBbXCJwcmV2aW91c19yZXNwb25zZV9pZFwiXSA6IFtdKSxcbiAgICAuLi4oZmVhdHVyZXMuc3RvcmFnZSA/IFtcInN0b3JlXCJdIDogW10pLFxuICAgIC4uLihmZWF0dXJlcy5iYWNrZ3JvdW5kID8gW1wiYmFja2dyb3VuZFwiXSA6IFtdKSxcbiAgXTtcbiAgaWYgKHVuc3VwcG9ydGVkLmxlbmd0aCA+IDApIHRocm93IG5ldyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IodW5zdXBwb3J0ZWQpO1xufVxuXG5mdW5jdGlvbiB0YXJnZXRzTW9kZWxTZXJ2aWNlKHJlcXVlc3RlZE1vZGVsOiBzdHJpbmcsIHRhcmdldDogTW9kZWxUYXJnZXQpOiBib29sZWFuIHtcbiAgaWYgKCF0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB1bnF1YWxpZmllZCA9IHJlcXVlc3RlZE1vZGVsLnRyaW0oKS5yZXBsYWNlKC9eKD86ZGJ4fGRhdGFicmlja3MpXFwvL2ksIFwiXCIpO1xuICByZXR1cm4gdW5xdWFsaWZpZWQgPT09IHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lO1xufVxuIl19
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=
@@ -13,5 +13,7 @@ export interface DatabricksTransportRequest {
13
13
  }
14
14
  /** Execute a direct route with SDK-owned authentication and an unbuffered response body. */
15
15
  export declare function fetchDatabricks(request: DatabricksTransportRequest): Promise<Response>;
16
+ /** Remove client compatibility fields rejected by direct Databricks protocols. */
17
+ export declare function directDatabricksRequestBody(route: Pick<GatewayRoute, "upstreamProtocol" | "upstreamModel">, body: Readonly<Record<string, unknown>>): Record<string, unknown>;
16
18
  /** Copy only response headers that belong to the public model protocol. */
17
19
  export declare function gatewayResponseHeaders(upstream: Headers): Headers;
@@ -6,6 +6,7 @@
6
6
  import { getExecutionContext } from "@databricks/appkit";
7
7
  import { workspaceClient } from "@dbx-tools/databricks";
8
8
  import { log } from "@dbx-tools/shared-core";
9
+ import { openaiChat } from "@dbx-tools/shared-model";
9
10
  import { upstreamUrl } from "@dbx-tools/shared-model-gateway";
10
11
  const logger = log.logger("appkit/model-gateway/transport");
11
12
  const ERROR_PREVIEW_BYTES = 8 * 1024;
@@ -47,7 +48,7 @@ export async function fetchDatabricks(request) {
47
48
  await client.config.authenticate(headers);
48
49
  const url = upstreamUrl(host, request.route);
49
50
  const startedAt = Date.now();
50
- const body = JSON.stringify({ ...request.body, model: request.route.upstreamModel });
51
+ const body = JSON.stringify(directDatabricksRequestBody(request.route, request.body));
51
52
  logger.debug("sending upstream request", {
52
53
  model: request.route.upstreamModel,
53
54
  path: new URL(url).pathname,
@@ -104,6 +105,17 @@ export async function fetchDatabricks(request) {
104
105
  throw error;
105
106
  }
106
107
  }
108
+ /** Remove client compatibility fields rejected by direct Databricks protocols. */
109
+ export function directDatabricksRequestBody(route, body) {
110
+ const sanitized = { ...body, model: route.upstreamModel };
111
+ if (route.upstreamProtocol === "databricks-chat") {
112
+ openaiChat.stripUnsupportedChatFields(sanitized);
113
+ }
114
+ else {
115
+ delete sanitized.parallel_tool_calls;
116
+ }
117
+ return sanitized;
118
+ }
107
119
  /** Copy only response headers that belong to the public model protocol. */
108
120
  export function gatewayResponseHeaders(upstream) {
109
121
  const headers = new Headers();
@@ -146,4 +158,4 @@ async function logUpstreamFailureBody(response, details) {
146
158
  await reader.cancel().catch(() => undefined);
147
159
  }
148
160
  }
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFxQixNQUFNLGlDQUFpQyxDQUFDO0FBRWpGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQUM1RCxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFFckMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN0QyxpQkFBaUI7SUFDakIsZUFBZTtJQUNmLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsUUFBUTtJQUNSLE1BQU07SUFDTixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLFdBQVc7Q0FDWixDQUFDLENBQUM7QUFFSCxNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3ZDLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLFlBQVk7SUFDWixJQUFJO0lBQ0osU0FBUztJQUNULG1CQUFtQjtJQUNuQixTQUFTO0NBQ1YsQ0FBQyxDQUFDO0FBVUgsNEZBQTRGO0FBQzVGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQW1DO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixFQUFFLENBQUMsTUFBTSxDQUFDO0lBQzVDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFD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QztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dGhlbnRpY2F0ZWQgc3RyZWFtaW5nIHRyYW5zcG9ydCBmb3IgZGlyZWN0IERhdGFicmlja3MgZ2F0ZXdheSByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyB3b3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgdXBzdHJlYW1VcmwsIHR5cGUgR2F0ZXdheVJvdXRlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L3RyYW5zcG9ydFwiKTtcbmNvbnN0IEVSUk9SX1BSRVZJRVdfQllURVMgPSA4ICogMTAyNDtcblxuY29uc3QgQkxPQ0tFRF9SRVFVRVNUX0hFQURFUlMgPSBuZXcgU2V0KFtcbiAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwiY29ubmVjdGlvblwiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwiY29va2llXCIsXG4gIFwiaG9zdFwiLFxuICBcInByb3h5LWF1dGhvcml6YXRpb25cIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuICBcIngtYXBpLWtleVwiLFxuXSk7XG5cbmNvbnN0IEJMT0NLRURfUkVTUE9OU0VfSEVBREVSUyA9IG5ldyBTZXQoW1xuICBcImNvbm5lY3Rpb25cIixcbiAgXCJjb250ZW50LWVuY29kaW5nXCIsXG4gIFwiY29udGVudC1sZW5ndGhcIixcbiAgXCJrZWVwLWFsaXZlXCIsXG4gIFwicHJveHktYXV0aGVudGljYXRlXCIsXG4gIFwicHJveHktYXV0aG9yaXphdGlvblwiLFxuICBcInNldC1jb29raWVcIixcbiAgXCJ0ZVwiLFxuICBcInRyYWlsZXJcIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuICBcInVwZ3JhZGVcIixcbl0pO1xuXG4vKiogSW5wdXRzIGZvciBvbmUgZGlyZWN0IERhdGFicmlja3MgcHJvdG9jb2wgcmVxdWVzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1RyYW5zcG9ydFJlcXVlc3Qge1xuICByZWFkb25seSByb3V0ZTogR2F0ZXdheVJvdXRlO1xuICByZWFkb25seSBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNpZ25hbDogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBFeGVjdXRlIGEgZGlyZWN0IHJvdXRlIHdpdGggU0RLLW93bmVkIGF1dGhlbnRpY2F0aW9uIGFuZCBhbiB1bmJ1ZmZlcmVkIHJlc3BvbnNlIGJvZHkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhYnJpY2tzKHJlcXVlc3Q6IERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KTtcbiAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIUJMT0NLRURfUkVRVUVTVF9IRUFERVJTLmhhcyhub3JtYWxpemVkKSAmJiAhbm9ybWFsaXplZC5zdGFydHNXaXRoKFwieC1mb3J3YXJkZWQtXCIpKSB7XG4gICAgICBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgYXdhaXQgY2xpZW50LmNvbmZpZy5hdXRoZW50aWNhdGUoaGVhZGVycyk7XG4gIGNvbnN0IHVybCA9IHVwc3RyZWFtVXJsKGhvc3QsIHJlcXVlc3Qucm91dGUpO1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyAuLi5yZXF1ZXN0LmJvZHksIG1vZGVsOiByZXF1ZXN0LnJvdXRlLnVwc3RyZWFtTW9kZWwgfSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInNlbmRpbmcgdXBzdHJlYW0gcmVxdWVzdFwiLCB7XG4gICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICBwYXRoOiBuZXcgVVJMKHVybCkucGF0aG5hbWUsXG4gICAgc3RyZWFtOiByZXF1ZXN0LmJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgfSk7XG4gIHRyeSB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICAoYXdhaXQgd29ya3NwYWNlQ2xpZW50LnJlZnJlc2hXb3Jrc3BhY2VDbGllbnRBdXRoZW50aWNhdGlvbihjbGllbnQpKVxuICAgICkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmV0cnlpbmcgcmVqZWN0ZWQgdXBzdHJlYW0gY3JlZGVudGlhbFwiLCB7XG4gICAgICAgIG1vZGVsOiByZXF1ZXN0LnJvdXRlLnVwc3RyZWFtTW9kZWwsXG4gICAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICBoZWFkZXJzLmRlbGV0ZShcImF1dGhvcml6YXRpb25cIik7XG4gICAgICBoZWFkZXJzLmRlbGV0ZShcIngtZGF0YWJyaWNrcy13b3Jrc3BhY2UtaWRcIik7XG4gICAgICBhd2FpdCBjbGllbnQuY29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHksXG4gICAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIG1vZGVsOiByZXF1ZXN0LnJvdXRlLnVwc3RyZWFtTW9kZWwsXG4gICAgICByZXF1ZXN0SWQ6XG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwieC1yZXF1ZXN0LWlkXCIpID8/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwieC1kYXRhYnJpY2tzLXJlcXVlc3QtaWRcIiksXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9O1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVjZWl2ZWQgdXBzdHJlYW0gcmVzcG9uc2VcIiwgZGV0YWlscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gcmVzcG9uc2UgZmFpbGVkXCIsIGRldGFpbHMpO1xuICAgICAgdm9pZCBsb2dVcHN0cmVhbUZhaWx1cmVCb2R5KHJlc3BvbnNlLmNsb25lKCksIGRldGFpbHMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKFwidXBzdHJlYW0gZmV0Y2ggZmFpbGVkXCIsIHtcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIGVycm9yLFxuICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiogQ29weSBvbmx5IHJlc3BvbnNlIGhlYWRlcnMgdGhhdCBiZWxvbmcgdG8gdGhlIHB1YmxpYyBtb2RlbCBwcm90b2NvbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnYXRld2F5UmVzcG9uc2VIZWFkZXJzKHVwc3RyZWFtOiBIZWFkZXJzKTogSGVhZGVycyB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICB1cHN0cmVhbS5mb3JFYWNoKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgIGlmICghQkxPQ0tFRF9SRVNQT05TRV9IRUFERVJTLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gaGVhZGVycztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nVXBzdHJlYW1GYWlsdXJlQm9keShcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICBkZXRhaWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5Py5nZXRSZWFkZXIoKTtcbiAgaWYgKCFyZWFkZXIpIHJldHVybjtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBsZXQgcHJldmlldyA9IFwiXCI7XG4gIGxldCBieXRlcyA9IDA7XG4gIHRyeSB7XG4gICAgd2hpbGUgKGJ5dGVzIDwgRVJST1JfUFJFVklFV19CWVRFUykge1xuICAgICAgY29uc3QgY2h1bmsgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGNodW5rLmRvbmUpIGJyZWFrO1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gRVJST1JfUFJFVklFV19CWVRFUyAtIGJ5dGVzO1xuICAgICAgY29uc3QgdmFsdWUgPSBjaHVuay52YWx1ZS5zdWJhcnJheSgwLCByZW1haW5pbmcpO1xuICAgICAgYnl0ZXMgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICAgIHByZXZpZXcgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pO1xuICAgICAgaWYgKHZhbHVlLmJ5dGVMZW5ndGggPCBjaHVuay52YWx1ZS5ieXRlTGVuZ3RoKSBicmVhaztcbiAgICB9XG4gICAgcHJldmlldyArPSBkZWNvZGVyLmRlY29kZSgpO1xuICAgIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gZXJyb3IgYm9keVwiLCB7XG4gICAgICAuLi5kZXRhaWxzLFxuICAgICAgcHJldmlldyxcbiAgICAgIHRydW5jYXRlZDogYnl0ZXMgPj0gRVJST1JfUFJFVklFV19CWVRFUyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjb3VsZCBub3QgcmVhZCB1cHN0cmVhbSBlcnJvciBib2R5XCIsIHsgLi4uZGV0YWlscywgZXJyb3IgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIH1cbn1cbiJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBcUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFDNUQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBRXJDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDdEMsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixNQUFNO0lBQ04scUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQixXQUFXO0NBQ1osQ0FBQyxDQUFDO0FBRUgsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN2QyxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixZQUFZO0lBQ1osSUFBSTtJQUNKLFNBQVM7SUFDVCxtQkFBbUI7SUFDbkIsU0FBUztDQUNWLENBQUMsQ0FBQztBQVVILDRGQUE0RjtBQUM1RixNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxPQUFtQztJQUN2RSxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxD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QUFDO1lBQ2pELEtBQUssSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELElBQUksS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVU7Z0JBQUUsTUFBTTtRQUN2RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ2pDLEdBQUcsT0FBTztZQUNWLE9BQU87WUFDUCxTQUFTLEVBQUUsS0FBSyxJQUFJLG1CQUFtQjtTQUN4QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdXRoZW50aWNhdGVkIHN0cmVhbWluZyB0cmFuc3BvcnQgZm9yIGRpcmVjdCBEYXRhYnJpY2tzIGdhdGV3YXkgcm91dGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG9wZW5haUNoYXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IHVwc3RyZWFtVXJsLCB0eXBlIEdhdGV3YXlSb3V0ZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS90cmFuc3BvcnRcIik7XG5jb25zdCBFUlJPUl9QUkVWSUVXX0JZVEVTID0gOCAqIDEwMjQ7XG5cbmNvbnN0IEJMT0NLRURfUkVRVUVTVF9IRUFERVJTID0gbmV3IFNldChbXG4gIFwiYWNjZXB0LWVuY29kaW5nXCIsXG4gIFwiYXV0aG9yaXphdGlvblwiLFxuICBcImNvbm5lY3Rpb25cIixcbiAgXCJjb250ZW50LWxlbmd0aFwiLFxuICBcImNvb2tpZVwiLFxuICBcImhvc3RcIixcbiAgXCJwcm94eS1hdXRob3JpemF0aW9uXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJ4LWFwaS1rZXlcIixcbl0pO1xuXG5jb25zdCBCTE9DS0VEX1JFU1BPTlNFX0hFQURFUlMgPSBuZXcgU2V0KFtcbiAgXCJjb25uZWN0aW9uXCIsXG4gIFwiY29udGVudC1lbmNvZGluZ1wiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwia2VlcC1hbGl2ZVwiLFxuICBcInByb3h5LWF1dGhlbnRpY2F0ZVwiLFxuICBcInByb3h5LWF1dGhvcml6YXRpb25cIixcbiAgXCJzZXQtY29va2llXCIsXG4gIFwidGVcIixcbiAgXCJ0cmFpbGVyXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJ1cGdyYWRlXCIsXG5dKTtcblxuLyoqIElucHV0cyBmb3Igb25lIGRpcmVjdCBEYXRhYnJpY2tzIHByb3RvY29sIHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgcm91dGU6IEdhdGV3YXlSb3V0ZTtcbiAgcmVhZG9ubHkgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsO1xufVxuXG4vKiogRXhlY3V0ZSBhIGRpcmVjdCByb3V0ZSB3aXRoIFNESy1vd25lZCBhdXRoZW50aWNhdGlvbiBhbmQgYW4gdW5idWZmZXJlZCByZXNwb25zZSBib2R5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YWJyaWNrcyhyZXF1ZXN0OiBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSk7XG4gIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFCTE9DS0VEX1JFUVVFU1RfSEVBREVSUy5oYXMobm9ybWFsaXplZCkgJiYgIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcIngtZm9yd2FyZGVkLVwiKSkge1xuICAgICAgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICBjb25zdCB1cmwgPSB1cHN0cmVhbVVybChob3N0LCByZXF1ZXN0LnJvdXRlKTtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGRpcmVjdERhdGFicmlja3NSZXF1ZXN0Qm9keShyZXF1ZXN0LnJvdXRlLCByZXF1ZXN0LmJvZHkpKTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VuZGluZyB1cHN0cmVhbSByZXF1ZXN0XCIsIHtcbiAgICBtb2RlbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbU1vZGVsLFxuICAgIHBhdGg6IG5ldyBVUkwodXJsKS5wYXRobmFtZSxcbiAgICBzdHJlYW06IHJlcXVlc3QuYm9keS5zdHJlYW0gPT09IHRydWUsXG4gICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keSxcbiAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiZcbiAgICAgIChhd2FpdCB3b3Jrc3BhY2VDbGllbnQucmVmcmVzaFdvcmtzcGFjZUNsaWVudEF1dGhlbnRpY2F0aW9uKGNsaWVudCkpXG4gICAgKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXRyeWluZyByZWplY3RlZCB1cHN0cmVhbSBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKFwiYXV0aG9yaXphdGlvblwiKTtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKFwieC1kYXRhYnJpY2tzLXdvcmtzcGFjZS1pZFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgIHJlcXVlc3RJZDpcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LXJlcXVlc3QtaWRcIikgPz8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LWRhdGFicmlja3MtcmVxdWVzdC1pZFwiKSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH07XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZWNlaXZlZCB1cHN0cmVhbSByZXNwb25zZVwiLCBkZXRhaWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSByZXNwb25zZSBmYWlsZWRcIiwgZGV0YWlscyk7XG4gICAgICB2b2lkIGxvZ1Vwc3RyZWFtRmFpbHVyZUJvZHkocmVzcG9uc2UuY2xvbmUoKSwgZGV0YWlscyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoXCJ1cHN0cmVhbSBmZXRjaCBmYWlsZWRcIiwge1xuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgZXJyb3IsXG4gICAgICBtb2RlbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbU1vZGVsLFxuICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKiBSZW1vdmUgY2xpZW50IGNvbXBhdGliaWxpdHkgZmllbGRzIHJlamVjdGVkIGJ5IGRpcmVjdCBEYXRhYnJpY2tzIHByb3RvY29scy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3REYXRhYnJpY2tzUmVxdWVzdEJvZHkoXG4gIHJvdXRlOiBQaWNrPEdhdGV3YXlSb3V0ZSwgXCJ1cHN0cmVhbVByb3RvY29sXCIgfCBcInVwc3RyZWFtTW9kZWxcIj4sXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3Qgc2FuaXRpemVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYm9keSwgbW9kZWw6IHJvdXRlLnVwc3RyZWFtTW9kZWwgfTtcbiAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiZGF0YWJyaWNrcy1jaGF0XCIpIHtcbiAgICBvcGVuYWlDaGF0LnN0cmlwVW5zdXBwb3J0ZWRDaGF0RmllbGRzKHNhbml0aXplZCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIHNhbml0aXplZC5wYXJhbGxlbF90b29sX2NhbGxzO1xuICB9XG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbi8qKiBDb3B5IG9ubHkgcmVzcG9uc2UgaGVhZGVycyB0aGF0IGJlbG9uZyB0byB0aGUgcHVibGljIG1vZGVsIHByb3RvY29sLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGV3YXlSZXNwb25zZUhlYWRlcnModXBzdHJlYW06IEhlYWRlcnMpOiBIZWFkZXJzIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIHVwc3RyZWFtLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgaWYgKCFCTE9DS0VEX1JFU1BPTlNFX0hFQURFUlMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSkpIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2dVcHN0cmVhbUZhaWx1cmVCb2R5KFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIGRldGFpbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpO1xuICBpZiAoIXJlYWRlcikgcmV0dXJuO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBwcmV2aWV3ID0gXCJcIjtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoYnl0ZXMgPCBFUlJPUl9QUkVWSUVXX0JZVEVTKSB7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoY2h1bmsuZG9uZSkgYnJlYWs7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBFUlJPUl9QUkVWSUVXX0JZVEVTIC0gYnl0ZXM7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNodW5rLnZhbHVlLnN1YmFycmF5KDAsIHJlbWFpbmluZyk7XG4gICAgICBieXRlcyArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgcHJldmlldyArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICBpZiAodmFsdWUuYnl0ZUxlbmd0aCA8IGNodW5rLnZhbHVlLmJ5dGVMZW5ndGgpIGJyZWFrO1xuICAgIH1cbiAgICBwcmV2aWV3ICs9IGRlY29kZXIuZGVjb2RlKCk7XG4gICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSBlcnJvciBib2R5XCIsIHtcbiAgICAgIC4uLmRldGFpbHMsXG4gICAgICBwcmV2aWV3LFxuICAgICAgdHJ1bmNhdGVkOiBieXRlcyA+PSBFUlJPUl9QUkVWSUVXX0JZVEVTLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNvdWxkIG5vdCByZWFkIHVwc3RyZWFtIGVycm9yIGJvZHlcIiwgeyAuLi5kZXRhaWxzLCBlcnJvciB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -31,11 +31,11 @@
31
31
  "@ai-sdk/open-responses": "^2.0.58",
32
32
  "@ai-sdk/openai-compatible": "^3.0.62",
33
33
  "@databricks/appkit": "0.81.0",
34
- "@dbx-tools/databricks": "^0.9.60",
35
- "@dbx-tools/model": "^0.9.60",
36
- "@dbx-tools/shared-core": "^0.9.60",
37
- "@dbx-tools/shared-model": "^0.9.60",
38
- "@dbx-tools/shared-model-gateway": "^0.9.60",
34
+ "@dbx-tools/databricks": "^0.9.61",
35
+ "@dbx-tools/model": "^0.9.61",
36
+ "@dbx-tools/shared-core": "^0.9.61",
37
+ "@dbx-tools/shared-model": "^0.9.61",
38
+ "@dbx-tools/shared-model-gateway": "^0.9.61",
39
39
  "ai": "^7.0.0",
40
40
  "zod": "4.3.6"
41
41
  },
@@ -89,7 +89,7 @@
89
89
  "./package.json": "./package.json"
90
90
  }
91
91
  },
92
- "version": "0.9.60",
92
+ "version": "0.9.61",
93
93
  "types": "./lib/index.d.ts",
94
94
  "dbxToolsConfig": {
95
95
  "tags": [
package/src/models.ts CHANGED
@@ -91,14 +91,19 @@ function openAiModel(target: ModelTarget): OpenAIModel {
91
91
  };
92
92
  }
93
93
 
94
- function codexModel(target: ModelTarget, priority: number): CodexModel {
94
+ /** Codex `/v1/models` slug for a resolved gateway target. */
95
+ export function codexModelSlug(target: ModelTarget): string {
95
96
  const model =
96
97
  target.capabilities.aiGatewayCodex && target.modelServiceName
97
98
  ? target.modelServiceName
98
99
  : target.id;
100
+ return `databricks/${model}`;
101
+ }
102
+
103
+ function codexModel(target: ModelTarget, priority: number): CodexModel {
99
104
  const efforts = target.reasoningEfforts;
100
105
  return {
101
- slug: `databricks/${model}`,
106
+ slug: codexModelSlug(target),
102
107
  display_name: target.displayName,
103
108
  description: target.endpoint?.description ?? "Databricks model service",
104
109
  base_instructions: CODEX_BASE_INSTRUCTIONS,
package/src/registry.ts CHANGED
@@ -5,7 +5,13 @@
5
5
  */
6
6
 
7
7
  import { getExecutionContext, type WorkspaceClient } from "@databricks/appkit";
8
- import { metadata, modelCatalog, policy, resolve as modelResolve } from "@dbx-tools/model";
8
+ import {
9
+ metadata,
10
+ modelCatalog,
11
+ policy,
12
+ resolve as modelResolve,
13
+ type ListServingEndpointsOptions,
14
+ } from "@dbx-tools/model";
9
15
  import { log } from "@dbx-tools/shared-core";
10
16
  import {
11
17
  ModelClass,
@@ -36,31 +42,36 @@ export interface ModelRegistry {
36
42
  export interface ModelRegistryOptions {
37
43
  readonly ttlMs?: number;
38
44
  readonly overrides?: readonly ModelCapabilityOverride[];
45
+ /** Discover models with this client instead of the AppKit execution context. */
46
+ readonly client?: WorkspaceClient;
39
47
  }
40
48
 
41
49
  interface RegistryContext {
42
50
  readonly client: WorkspaceClient;
43
51
  readonly host: string;
44
- readonly identity: string;
52
+ readonly identity?: string;
45
53
  }
46
54
 
47
55
  /** Model registry backed by the active AppKit execution context. */
48
56
  export class DatabricksModelRegistry implements ModelRegistry {
49
57
  private readonly ttlMs: number;
50
58
  private readonly overrides: readonly ModelCapabilityOverride[];
59
+ private readonly client: WorkspaceClient | undefined;
51
60
 
52
61
  constructor(options: ModelRegistryOptions = {}) {
53
62
  this.ttlMs = positiveTtl(options.ttlMs);
54
63
  this.overrides = options.overrides ?? [];
64
+ this.client = options.client;
55
65
  }
56
66
 
57
67
  async list(): Promise<ModelTarget[]> {
58
- const context = await registryContext();
68
+ const context = await this.context();
59
69
  logger.debug("loading catalogue", { host: context.host, ttlMs: this.ttlMs });
60
- const endpoints = await modelCatalog.listServingEndpoints(context.client, context.host, {
61
- cacheIdentity: context.identity,
62
- ttlMs: this.ttlMs,
63
- });
70
+ const endpoints = await modelCatalog.listServingEndpoints(
71
+ context.client,
72
+ context.host,
73
+ catalogueOptions(context, this.ttlMs),
74
+ );
64
75
  const targets = endpoints.map((endpoint) => this.target(endpoint));
65
76
  logger.debug("loaded catalogue", {
66
77
  endpointCount: endpoints.length,
@@ -124,13 +135,16 @@ export class DatabricksModelRegistry implements ModelRegistry {
124
135
  }
125
136
 
126
137
  async refresh(): Promise<void> {
127
- const context = await registryContext();
138
+ const context = await this.context();
128
139
  logger.debug("clearing catalogue", { host: context.host });
129
- await modelCatalog.clearServingEndpointsCache(context.host, context.identity);
130
- await modelCatalog.listServingEndpoints(context.client, context.host, {
131
- cacheIdentity: context.identity,
132
- ttlMs: this.ttlMs,
133
- });
140
+ if (context.identity) {
141
+ await modelCatalog.clearServingEndpointsCache(context.host, context.identity);
142
+ }
143
+ await modelCatalog.listServingEndpoints(
144
+ context.client,
145
+ context.host,
146
+ catalogueOptions(context, this.ttlMs),
147
+ );
134
148
  logger.debug("refreshed catalogue", { host: context.host });
135
149
  }
136
150
 
@@ -182,6 +196,21 @@ export class DatabricksModelRegistry implements ModelRegistry {
182
196
  reasoningEfforts: endpoint.reasoningEfforts ?? [],
183
197
  };
184
198
  }
199
+
200
+ private async context(): Promise<RegistryContext> {
201
+ if (this.client) {
202
+ const host = (await this.client.config.getHost()).toString();
203
+ return { client: this.client, host };
204
+ }
205
+ return registryContext();
206
+ }
207
+ }
208
+
209
+ function catalogueOptions(context: RegistryContext, ttlMs: number): ListServingEndpointsOptions {
210
+ return {
211
+ ttlMs,
212
+ ...(context.identity ? { cacheIdentity: context.identity } : {}),
213
+ };
185
214
  }
186
215
 
187
216
  async function registryContext(): Promise<RegistryContext> {
package/src/router.ts CHANGED
@@ -36,21 +36,16 @@ export function resolveRoute(input: ResolveRouteInput): GatewayRoute {
36
36
  rejectStatefulResponses(features);
37
37
  if (
38
38
  isCodexOriginator(input.originator) &&
39
- targetsModelService(requestedModel, target) &&
40
- target.capabilities.aiGatewayCodex &&
41
- supportsDirectResponses(target, features)
39
+ canUseAiGatewayCodex(target, features) &&
40
+ !requestedServingEndpoint(requestedModel, target)
42
41
  ) {
43
42
  return directRoute(input, "databricks-ai-gateway-codex", target.modelServiceName!);
44
43
  }
45
44
  if (target.capabilities.responses && supportsDirectResponses(target, features)) {
46
45
  return directRoute(input, "databricks-responses", target.id);
47
46
  }
48
- if (
49
- target.capabilities.aiGatewayCodex &&
50
- target.modelServiceName &&
51
- supportsDirectResponses(target, features)
52
- ) {
53
- return directRoute(input, "databricks-ai-gateway-codex", target.modelServiceName);
47
+ if (canUseAiGatewayCodex(target, features)) {
48
+ return directRoute(input, "databricks-ai-gateway-codex", target.modelServiceName!);
54
49
  }
55
50
  if (target.capabilities.openResponses && supportsOpenResponses(target, features)) {
56
51
  return directRoute(input, "databricks-open-responses", target.id);
@@ -164,8 +159,14 @@ function rejectStatefulResponses(features: RequestedFeatures): void {
164
159
  if (unsupported.length > 0) throw new UnsupportedGatewayFeatureError(unsupported);
165
160
  }
166
161
 
167
- function targetsModelService(requestedModel: string, target: ModelTarget): boolean {
168
- if (!target.modelServiceName) return false;
169
- const unqualified = requestedModel.trim().replace(/^(?:dbx|databricks)\//i, "");
170
- return unqualified === target.modelServiceName;
162
+ function canUseAiGatewayCodex(target: ModelTarget, features: RequestedFeatures): boolean {
163
+ return (
164
+ Boolean(target.capabilities.aiGatewayCodex && target.modelServiceName) &&
165
+ supportsDirectResponses(target, features)
166
+ );
167
+ }
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;
171
172
  }
package/src/transport.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  import { getExecutionContext } from "@databricks/appkit";
8
8
  import { workspaceClient } from "@dbx-tools/databricks";
9
9
  import { log } from "@dbx-tools/shared-core";
10
+ import { openaiChat } from "@dbx-tools/shared-model";
10
11
  import { upstreamUrl, type GatewayRoute } from "@dbx-tools/shared-model-gateway";
11
12
 
12
13
  const logger = log.logger("appkit/model-gateway/transport");
@@ -60,7 +61,7 @@ export async function fetchDatabricks(request: DatabricksTransportRequest): Prom
60
61
  await client.config.authenticate(headers);
61
62
  const url = upstreamUrl(host, request.route);
62
63
  const startedAt = Date.now();
63
- const body = JSON.stringify({ ...request.body, model: request.route.upstreamModel });
64
+ const body = JSON.stringify(directDatabricksRequestBody(request.route, request.body));
64
65
  logger.debug("sending upstream request", {
65
66
  model: request.route.upstreamModel,
66
67
  path: new URL(url).pathname,
@@ -119,6 +120,20 @@ export async function fetchDatabricks(request: DatabricksTransportRequest): Prom
119
120
  }
120
121
  }
121
122
 
123
+ /** Remove client compatibility fields rejected by direct Databricks protocols. */
124
+ export function directDatabricksRequestBody(
125
+ route: Pick<GatewayRoute, "upstreamProtocol" | "upstreamModel">,
126
+ body: Readonly<Record<string, unknown>>,
127
+ ): Record<string, unknown> {
128
+ const sanitized: Record<string, unknown> = { ...body, model: route.upstreamModel };
129
+ if (route.upstreamProtocol === "databricks-chat") {
130
+ openaiChat.stripUnsupportedChatFields(sanitized);
131
+ } else {
132
+ delete sanitized.parallel_tool_calls;
133
+ }
134
+ return sanitized;
135
+ }
136
+
122
137
  /** Copy only response headers that belong to the public model protocol. */
123
138
  export function gatewayResponseHeaders(upstream: Headers): Headers {
124
139
  const headers = new Headers();