@dbx-tools/model 0.9.118 → 0.9.120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -8
- package/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +2 -2
- package/lib/src/_cache.d.ts +4 -0
- package/lib/src/_cache.js +12 -0
- package/lib/src/metadata-cache.d.ts +10 -52
- package/lib/src/metadata-cache.js +34 -187
- package/lib/src/metadata.d.ts +3 -5
- package/lib/src/metadata.js +7 -10
- package/lib/src/model-catalog.d.ts +9 -19
- package/lib/src/model-catalog.js +25 -27
- package/lib/src/model-client.js +3 -2
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -9
- package/src/_cache.ts +13 -0
- package/src/metadata-cache.ts +52 -245
- package/src/metadata.ts +6 -10
- package/src/model-catalog.ts +30 -32
- package/src/model-client.ts +2 -1
- package/lib/package.json +0 -137
package/README.md
CHANGED
|
@@ -193,10 +193,12 @@ const raw = await modelCatalog.listServingEndpointsUncached(client);
|
|
|
193
193
|
await modelCatalog.clearServingEndpointsCache(host);
|
|
194
194
|
```
|
|
195
195
|
|
|
196
|
-
`listServingEndpoints()` uses
|
|
197
|
-
classification and embedding dimensions, and
|
|
198
|
-
|
|
199
|
-
|
|
196
|
+
`listServingEndpoints()` uses the shared memory-first model project cache, enriches
|
|
197
|
+
endpoints with classification and embedding dimensions, and isolates entries by
|
|
198
|
+
workspace host and trusted credential identity. If a refresh fails, it can return
|
|
199
|
+
the last known-good value retained on disk. `listServingEndpointsUncached()` is
|
|
200
|
+
useful for simple scripts that only need the SDK response and do not want a cache
|
|
201
|
+
dependency.
|
|
200
202
|
|
|
201
203
|
## Fuzzy Resolve Endpoint Names
|
|
202
204
|
|
|
@@ -221,10 +223,10 @@ const resolved = await resolve.rankModelIdLive((force) => loadCatalogue(force),
|
|
|
221
223
|
`rankModelIdLive()` matches the catalogue you already hold and, on a miss,
|
|
222
224
|
reloads once with `force` before giving up, so a model deployed after your cache
|
|
223
225
|
warmed still resolves without a restart. You supply the loader, so the caching
|
|
224
|
-
policy stays yours: `listServingEndpoints` and its
|
|
225
|
-
in a long-lived CLI, or a test double. `rankModelId()` is the pure form over
|
|
226
|
-
single snapshot; unlike `serving.resolveModelId` it breaks equal match scores
|
|
227
|
-
class and then version, so `"opus"` prefers `opus-5` over `opus-4-7`.
|
|
226
|
+
policy stays yours: `listServingEndpoints` and its shared project cache, a plain
|
|
227
|
+
field in a long-lived CLI, or a test double. `rankModelId()` is the pure form over
|
|
228
|
+
a single snapshot; unlike `serving.resolveModelId` it breaks equal match scores
|
|
229
|
+
by class and then version, so `"opus"` prefers `opus-5` over `opus-4-7`.
|
|
228
230
|
|
|
229
231
|
## Call An Endpoint Directly
|
|
230
232
|
|
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/model";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.120";
|
|
7
7
|
export * as bindings from "./src/bindings.ts";
|
|
8
8
|
export * as classes from "./src/classes.ts";
|
|
9
9
|
export * as classify from "./src/classify.ts";
|
|
@@ -21,7 +21,7 @@ export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
|
|
|
21
21
|
export { INVOCATIONS_SUFFIX, SERVING_ENDPOINTS_PATH, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH, AI_GATEWAY_CODEX_RESPONSES_PATH, ANTHROPIC_BASE_PATH, ANTHROPIC_MESSAGES_PATH } from "./src/invoke.ts";
|
|
22
22
|
export type { AuthenticatingClientLike } from "./src/invoke.ts";
|
|
23
23
|
export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.ts";
|
|
24
|
-
export type {
|
|
24
|
+
export type { MetadataCacheOptions, MetadataCacheMergeInput, MetadataCache } from "./src/metadata-cache.ts";
|
|
25
25
|
export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.ts";
|
|
26
26
|
export type { WorkspaceClientLike, ListServingEndpointsOptions } from "./src/model-catalog.ts";
|
|
27
27
|
export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/model";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.120";
|
|
3
3
|
export * as bindings from "./src/bindings.ts";
|
|
4
4
|
export * as classes from "./src/classes.ts";
|
|
5
5
|
export * as classify from "./src/classify.ts";
|
|
@@ -17,7 +17,7 @@ export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
|
|
|
17
17
|
export { INVOCATIONS_SUFFIX, SERVING_ENDPOINTS_PATH, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH, AI_GATEWAY_CODEX_RESPONSES_PATH, ANTHROPIC_BASE_PATH, ANTHROPIC_MESSAGES_PATH } from "./src/invoke.ts";
|
|
18
18
|
export type { AuthenticatingClientLike } from "./src/invoke.ts";
|
|
19
19
|
export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.ts";
|
|
20
|
-
export type {
|
|
20
|
+
export type { MetadataCacheOptions, MetadataCacheMergeInput, MetadataCache } from "./src/metadata-cache.ts";
|
|
21
21
|
export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.ts";
|
|
22
22
|
export type { WorkspaceClientLike, ListServingEndpointsOptions } from "./src/model-catalog.ts";
|
|
23
23
|
export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.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/model";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.120";
|
|
6
6
|
export * as bindings from "./src/bindings.js";
|
|
7
7
|
export * as classes from "./src/classes.js";
|
|
8
8
|
export * as classify from "./src/classify.js";
|
|
@@ -24,4 +24,4 @@ export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.js";
|
|
|
24
24
|
export { ModelFamily } from "./src/policy.js";
|
|
25
25
|
export { REASONING_LEVELS } from "./src/reasoning-translation.js";
|
|
26
26
|
export * from "./exports.js";
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhOLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdsRSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMjBcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgU0VSVklOR19FTkRQT0lOVFNfUEFUSCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX0JBU0VfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBNb2RlbEZhbWlseSB9IGZyb20gXCIuL3NyYy9wb2xpY3kudHNcIjtcbmV4cG9ydCB7IFJFQVNPTklOR19MRVZFTFMgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlYXNvbmluZ0xldmVsLCBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSwgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlbGVjdE1vZGVsSW5wdXQsIFNlYXJjaE1vZGVsc0lucHV0IH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4cG9ydHMudHNcIjtcbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Memory-first cache for endpoint catalogues, isolated for full invalidation. */
|
|
2
|
+
export declare const modelCatalogueCache: import("cacheable").Cacheable;
|
|
3
|
+
/** One memory-first project cache shared by every model metadata key. */
|
|
4
|
+
export declare const modelMetadataCache: import("cacheable").Cacheable;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { projectCache } from "@dbx-tools/cache/cache";
|
|
2
|
+
/** Memory-first cache for endpoint catalogues, isolated for full invalidation. */
|
|
3
|
+
export const modelCatalogueCache = projectCache("model-catalog", {
|
|
4
|
+
maxEntries: 256,
|
|
5
|
+
useClone: false,
|
|
6
|
+
});
|
|
7
|
+
/** One memory-first project cache shared by every model metadata key. */
|
|
8
|
+
export const modelMetadataCache = projectCache("model-metadata", {
|
|
9
|
+
maxEntries: 256,
|
|
10
|
+
useClone: false,
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFlBQVksQ0FBQyxlQUFlLEVBQUU7SUFDL0QsVUFBVSxFQUFFLEdBQUc7SUFDZixRQUFRLEVBQUUsS0FBSztDQUNoQixDQUFDLENBQUM7QUFFSCx5RUFBeUU7QUFDekUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFO0lBQy9ELFVBQVUsRUFBRSxHQUFHO0lBQ2YsUUFBUSxFQUFFLEtBQUs7Q0FDaEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvamVjdENhY2hlIH0gZnJvbSBcIkBkYngtdG9vbHMvY2FjaGUvY2FjaGVcIjtcblxuLyoqIE1lbW9yeS1maXJzdCBjYWNoZSBmb3IgZW5kcG9pbnQgY2F0YWxvZ3VlcywgaXNvbGF0ZWQgZm9yIGZ1bGwgaW52YWxpZGF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsQ2F0YWxvZ3VlQ2FjaGUgPSBwcm9qZWN0Q2FjaGUoXCJtb2RlbC1jYXRhbG9nXCIsIHtcbiAgbWF4RW50cmllczogMjU2LFxuICB1c2VDbG9uZTogZmFsc2UsXG59KTtcblxuLyoqIE9uZSBtZW1vcnktZmlyc3QgcHJvamVjdCBjYWNoZSBzaGFyZWQgYnkgZXZlcnkgbW9kZWwgbWV0YWRhdGEga2V5LiAqL1xuZXhwb3J0IGNvbnN0IG1vZGVsTWV0YWRhdGFDYWNoZSA9IHByb2plY3RDYWNoZShcIm1vZGVsLW1ldGFkYXRhXCIsIHtcbiAgbWF4RW50cmllczogMjU2LFxuICB1c2VDbG9uZTogZmFsc2UsXG59KTtcbiJdfQ==
|
|
@@ -1,48 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Uses cacache's built-in memory memoization (`memoize: true` on put; gets read
|
|
5
|
-
* the in-memory layer by default) with content-addressed disk under
|
|
6
|
-
* `env-paths("dbx-tools").cache/model-gateway/<version>/`. Disk persistence is
|
|
7
|
-
* disabled inside a Databricks App ({@link environmentUtils.isDatabricksAppEnv});
|
|
8
|
-
* those processes keep a process-local Map only.
|
|
9
|
-
*
|
|
10
|
-
* Each cache owns a key, hard-coded fallback, optional network loader, and a
|
|
11
|
-
* merger that combines fresh / previous / fallback values. Freshness is the
|
|
12
|
-
* envelope `refreshedAt` window (default one day), not cacache's short LRU TTL.
|
|
2
|
+
* Daily model metadata cache built on the shared memory-first cache package.
|
|
13
3
|
*
|
|
14
4
|
* @module
|
|
15
5
|
*/
|
|
16
|
-
|
|
17
|
-
export interface MetadataCacheRecord<T> {
|
|
18
|
-
readonly refreshedAt: number;
|
|
19
|
-
readonly value: T;
|
|
20
|
-
}
|
|
6
|
+
import { createCache } from "@dbx-tools/cache/cache";
|
|
21
7
|
/** Factory inputs for one named metadata cache. */
|
|
22
8
|
export interface MetadataCacheOptions<T> {
|
|
23
|
-
/** Stable
|
|
9
|
+
/** Stable cache key. */
|
|
24
10
|
readonly key: string;
|
|
25
11
|
/** Hard-coded / committed baseline used when store and load both miss. */
|
|
26
12
|
readonly fallback: T;
|
|
27
|
-
/**
|
|
28
|
-
* Refresh source. When omitted the cache only serves store + fallback and
|
|
29
|
-
* {@link MetadataCache.update} mutations (for example error-learned values).
|
|
30
|
-
*/
|
|
13
|
+
/** Optional refresh source. */
|
|
31
14
|
readonly load?: () => Promise<T>;
|
|
32
15
|
/** Combine a fresh load, prior store value, and the hard-coded fallback. */
|
|
33
16
|
readonly merge: (input: MetadataCacheMergeInput<T>) => T;
|
|
34
|
-
/** Freshness window; defaults to
|
|
17
|
+
/** Freshness window; defaults to one day. */
|
|
35
18
|
readonly ttlMs?: number;
|
|
36
|
-
/** Package version segment in the cache path. Defaults to this package. */
|
|
37
|
-
readonly version?: string;
|
|
38
|
-
/** Override the cacache root directory (tests). */
|
|
39
|
-
readonly cacheDir?: string;
|
|
40
|
-
/**
|
|
41
|
-
* Force disk on/off. Defaults to off inside Databricks Apps, on otherwise.
|
|
42
|
-
*/
|
|
43
|
-
readonly disk?: boolean;
|
|
44
|
-
/** Clock override for tests. */
|
|
45
|
-
readonly now?: () => number;
|
|
46
19
|
}
|
|
47
20
|
/** Arguments passed to a cache merger. */
|
|
48
21
|
export interface MetadataCacheMergeInput<T> {
|
|
@@ -50,35 +23,20 @@ export interface MetadataCacheMergeInput<T> {
|
|
|
50
23
|
readonly previous: T | undefined;
|
|
51
24
|
readonly fallback: T;
|
|
52
25
|
}
|
|
53
|
-
/** One
|
|
26
|
+
/** One namespaced view over the shared metadata cache. */
|
|
54
27
|
export interface MetadataCache<T> {
|
|
55
|
-
/** Absolute cacache root for this package version (unused when disk is off). */
|
|
56
|
-
readonly path: string;
|
|
57
|
-
/** Whether cacache disk persistence is enabled for this instance. */
|
|
58
|
-
readonly diskEnabled: boolean;
|
|
59
28
|
/** Return a fresh-or-fallback value, refreshing when stale. */
|
|
60
29
|
get(): Promise<T>;
|
|
61
|
-
/** Read memory
|
|
30
|
+
/** Read process memory without refreshing. */
|
|
62
31
|
peek(): Promise<T | undefined>;
|
|
63
32
|
/** Mutate the cached value and persist it. */
|
|
64
33
|
update(mutator: (current: T) => T): Promise<T>;
|
|
65
34
|
/** Force a refresh attempt even when the entry is still fresh. */
|
|
66
35
|
refresh(): Promise<T>;
|
|
67
36
|
}
|
|
68
|
-
/**
|
|
69
|
-
export declare function
|
|
70
|
-
/** Whether metadata caches should persist to disk in this process. */
|
|
71
|
-
export declare function metadataCacheDiskEnabled(environment?: NodeJS.ProcessEnv): boolean;
|
|
72
|
-
/**
|
|
73
|
-
* Create one daily cache backed by cacache memoization, with optional disk.
|
|
74
|
-
*/
|
|
75
|
-
export declare function createMetadataCache<T>(options: MetadataCacheOptions<T>): MetadataCache<T>;
|
|
37
|
+
/** Create one namespaced view over the shared model metadata cache. */
|
|
38
|
+
export declare function createMetadataCache<T>(options: MetadataCacheOptions<T>, cache?: ReturnType<typeof createCache>): MetadataCache<T>;
|
|
76
39
|
/** Prefer a non-empty fresh array, else previous, else fallback. */
|
|
77
40
|
export declare function mergePreferFreshList<T>(input: MetadataCacheMergeInput<readonly T[]>): T[];
|
|
78
|
-
/**
|
|
79
|
-
* Shallow-merge record catalogues: fallback, then previous, then fresh keys.
|
|
80
|
-
* Fresh values win per key.
|
|
81
|
-
*/
|
|
41
|
+
/** Shallow-merge record catalogues: fallback, then previous, then fresh keys. */
|
|
82
42
|
export declare function mergePreferFreshRecord<T>(input: MetadataCacheMergeInput<Readonly<Record<string, T>>>): Record<string, T>;
|
|
83
|
-
/** Test helper: wipe a cacache root and clear cacache memoization. */
|
|
84
|
-
export declare function resetMetadataCacheDir(cacheDir: string): Promise<void>;
|
|
@@ -1,169 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Uses cacache's built-in memory memoization (`memoize: true` on put; gets read
|
|
5
|
-
* the in-memory layer by default) with content-addressed disk under
|
|
6
|
-
* `env-paths("dbx-tools").cache/model-gateway/<version>/`. Disk persistence is
|
|
7
|
-
* disabled inside a Databricks App ({@link environmentUtils.isDatabricksAppEnv});
|
|
8
|
-
* those processes keep a process-local Map only.
|
|
9
|
-
*
|
|
10
|
-
* Each cache owns a key, hard-coded fallback, optional network loader, and a
|
|
11
|
-
* merger that combines fresh / previous / fallback values. Freshness is the
|
|
12
|
-
* envelope `refreshedAt` window (default one day), not cacache's short LRU TTL.
|
|
2
|
+
* Daily model metadata cache built on the shared memory-first cache package.
|
|
13
3
|
*
|
|
14
4
|
* @module
|
|
15
5
|
*/
|
|
16
|
-
import {
|
|
17
|
-
import * as
|
|
6
|
+
import { getOrSet } from "@dbx-tools/cache/cache";
|
|
7
|
+
import * as errorUtils from "@dbx-tools/shared-core/error-utils";
|
|
18
8
|
import * as log from "@dbx-tools/shared-core/log";
|
|
19
|
-
import
|
|
20
|
-
import envPaths from "env-paths";
|
|
21
|
-
import packageManifest from "../package.json" with { type: "json" };
|
|
9
|
+
import { modelMetadataCache } from "./_cache.js";
|
|
22
10
|
import { MODEL_METADATA_TTL_MS } from "./_metadata-contract.js";
|
|
23
11
|
const logger = log.logger("model/metadata-cache");
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
version: packageManifest.version,
|
|
27
|
-
};
|
|
28
|
-
const inflight = new Map();
|
|
29
|
-
/** Default cacache root for a package version under the dbx-tools cache dir. */
|
|
30
|
-
export function defaultMetadataCacheDir(version) {
|
|
31
|
-
const cacheDirectory = envPaths("dbx-tools", { suffix: "" }).cache;
|
|
32
|
-
return resolve(cacheDirectory, "model-gateway", version);
|
|
33
|
-
}
|
|
34
|
-
/** Whether metadata caches should persist to disk in this process. */
|
|
35
|
-
export function metadataCacheDiskEnabled(environment = process.env) {
|
|
36
|
-
return !environmentUtils.isDatabricksAppEnv(environment);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Create one daily cache backed by cacache memoization, with optional disk.
|
|
40
|
-
*/
|
|
41
|
-
export function createMetadataCache(options) {
|
|
12
|
+
/** Create one namespaced view over the shared model metadata cache. */
|
|
13
|
+
export function createMetadataCache(options, cache = modelMetadataCache) {
|
|
42
14
|
const ttlMs = options.ttlMs ?? MODEL_METADATA_TTL_MS;
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
/** Process-local store used when disk is off (Databricks Apps). */
|
|
49
|
-
const memoryOnly = new Map();
|
|
50
|
-
const resolveValue = (input) => options.merge(input);
|
|
51
|
-
const isFresh = (record) => Boolean(record && now() - record.refreshedAt < ttlMs);
|
|
52
|
-
const cachePath = async () => {
|
|
53
|
-
path ??= await pathPromise;
|
|
54
|
-
return path;
|
|
55
|
-
};
|
|
56
|
-
const readRecord = async () => {
|
|
57
|
-
if (!diskEnabled)
|
|
58
|
-
return memoryOnly.get(options.key);
|
|
59
|
-
const resolvedPath = await cachePath();
|
|
60
|
-
try {
|
|
61
|
-
// cacache reads its in-memory memo first unless memoize is false
|
|
62
|
-
const entry = await cacache.get(resolvedPath, options.key);
|
|
63
|
-
return decodeRecord(entry.data);
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
if (isCacheMiss(error))
|
|
67
|
-
return undefined;
|
|
68
|
-
logger.warn("metadata cache cacache read failed", {
|
|
69
|
-
key: options.key,
|
|
70
|
-
path: resolvedPath,
|
|
71
|
-
error,
|
|
72
|
-
});
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
const writeRecord = async (record) => {
|
|
77
|
-
if (!diskEnabled) {
|
|
78
|
-
memoryOnly.set(options.key, record);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
const resolvedPath = await cachePath();
|
|
82
|
-
try {
|
|
83
|
-
await cacache.put(resolvedPath, options.key, `${JSON.stringify(record)}\n`, {
|
|
84
|
-
memoize: true,
|
|
85
|
-
metadata: { refreshedAt: record.refreshedAt },
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
catch (error) {
|
|
89
|
-
logger.warn("metadata cache cacache write failed", {
|
|
90
|
-
key: options.key,
|
|
91
|
-
path: resolvedPath,
|
|
92
|
-
error,
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
const persist = async (value, refreshedAt = now()) => {
|
|
97
|
-
await writeRecord({ refreshedAt, value });
|
|
15
|
+
const valueKey = `model-metadata:value:${options.key}`;
|
|
16
|
+
const refreshKey = `model-metadata:refresh:${options.key}`;
|
|
17
|
+
const read = () => cache.get(valueKey);
|
|
18
|
+
const persist = async (value) => {
|
|
19
|
+
await cache.set(valueKey, value);
|
|
98
20
|
return value;
|
|
99
21
|
};
|
|
22
|
+
const resolveValue = (fresh, previous) => options.merge({ fresh, previous, fallback: options.fallback });
|
|
100
23
|
const refresh = async (force) => {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
fresh: undefined,
|
|
107
|
-
previous: previous?.value,
|
|
108
|
-
fallback: options.fallback,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
24
|
+
if (force)
|
|
25
|
+
await cache.delete(refreshKey);
|
|
26
|
+
let staleRefreshFailed = false;
|
|
27
|
+
await getOrSet(cache, refreshKey, async () => {
|
|
28
|
+
const previous = await read();
|
|
111
29
|
let fresh;
|
|
112
30
|
if (options.load) {
|
|
113
31
|
try {
|
|
114
32
|
fresh = await options.load();
|
|
115
33
|
}
|
|
116
34
|
catch (error) {
|
|
117
|
-
logger.warn("metadata cache refresh failed;
|
|
35
|
+
logger.warn("metadata cache refresh failed; using cached or committed value", {
|
|
118
36
|
key: options.key,
|
|
119
|
-
error,
|
|
120
|
-
path: resolvedPath,
|
|
121
|
-
diskEnabled,
|
|
37
|
+
error: errorUtils.toError(error),
|
|
122
38
|
});
|
|
39
|
+
staleRefreshFailed = previous !== undefined;
|
|
123
40
|
}
|
|
124
41
|
}
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return value;
|
|
134
|
-
});
|
|
42
|
+
const resolved = resolveValue(fresh, previous);
|
|
43
|
+
if (fresh !== undefined || previous === undefined)
|
|
44
|
+
await persist(resolved);
|
|
45
|
+
return true;
|
|
46
|
+
}, { ttl: ttlMs, throwErrors: true });
|
|
47
|
+
if (staleRefreshFailed)
|
|
48
|
+
await cache.delete(refreshKey);
|
|
49
|
+
return resolveValue(undefined, await read());
|
|
135
50
|
};
|
|
136
51
|
return {
|
|
137
|
-
get path() {
|
|
138
|
-
if (!path) {
|
|
139
|
-
throw new Error("metadata cache path is not resolved until the first cache read");
|
|
140
|
-
}
|
|
141
|
-
return path;
|
|
142
|
-
},
|
|
143
|
-
diskEnabled,
|
|
144
52
|
get: () => refresh(false),
|
|
145
|
-
peek:
|
|
53
|
+
peek: read,
|
|
146
54
|
refresh: () => refresh(true),
|
|
147
55
|
update: async (mutator) => {
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
const baseline = resolveValue({
|
|
152
|
-
fresh: undefined,
|
|
153
|
-
previous: previous?.value,
|
|
154
|
-
fallback: options.fallback,
|
|
155
|
-
});
|
|
156
|
-
return persist(mutator(baseline));
|
|
157
|
-
});
|
|
56
|
+
const value = await persist(mutator(resolveValue(undefined, await read())));
|
|
57
|
+
await cache.set(refreshKey, true, { ttl: ttlMs });
|
|
58
|
+
return value;
|
|
158
59
|
},
|
|
159
60
|
};
|
|
160
61
|
}
|
|
161
|
-
async function resolveCacheDir(options) {
|
|
162
|
-
if (options.cacheDir)
|
|
163
|
-
return options.cacheDir;
|
|
164
|
-
const version = options.version ?? PACKAGE_IDENTITY.version;
|
|
165
|
-
return defaultMetadataCacheDir(version);
|
|
166
|
-
}
|
|
167
62
|
/** Prefer a non-empty fresh array, else previous, else fallback. */
|
|
168
63
|
export function mergePreferFreshList(input) {
|
|
169
64
|
if (input.fresh && input.fresh.length > 0)
|
|
@@ -172,10 +67,7 @@ export function mergePreferFreshList(input) {
|
|
|
172
67
|
return [...input.previous];
|
|
173
68
|
return [...input.fallback];
|
|
174
69
|
}
|
|
175
|
-
/**
|
|
176
|
-
* Shallow-merge record catalogues: fallback, then previous, then fresh keys.
|
|
177
|
-
* Fresh values win per key.
|
|
178
|
-
*/
|
|
70
|
+
/** Shallow-merge record catalogues: fallback, then previous, then fresh keys. */
|
|
179
71
|
export function mergePreferFreshRecord(input) {
|
|
180
72
|
return {
|
|
181
73
|
...input.fallback,
|
|
@@ -183,49 +75,4 @@ export function mergePreferFreshRecord(input) {
|
|
|
183
75
|
...(input.fresh ?? {}),
|
|
184
76
|
};
|
|
185
77
|
}
|
|
186
|
-
|
|
187
|
-
export async function resetMetadataCacheDir(cacheDir) {
|
|
188
|
-
try {
|
|
189
|
-
await cacache.rm.all(cacheDir);
|
|
190
|
-
}
|
|
191
|
-
catch {
|
|
192
|
-
// empty / missing cache is fine
|
|
193
|
-
}
|
|
194
|
-
cacache.clearMemoized();
|
|
195
|
-
for (const key of [...inflight.keys()]) {
|
|
196
|
-
if (key.startsWith(`${cacheDir}::`))
|
|
197
|
-
inflight.delete(key);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
function coalesce(key, work) {
|
|
201
|
-
const existing = inflight.get(key);
|
|
202
|
-
if (existing)
|
|
203
|
-
return existing;
|
|
204
|
-
const pending = work().finally(() => {
|
|
205
|
-
if (inflight.get(key) === pending)
|
|
206
|
-
inflight.delete(key);
|
|
207
|
-
});
|
|
208
|
-
inflight.set(key, pending);
|
|
209
|
-
return pending;
|
|
210
|
-
}
|
|
211
|
-
function decodeRecord(data) {
|
|
212
|
-
try {
|
|
213
|
-
const parsed = JSON.parse(data.toString("utf8"));
|
|
214
|
-
if (!parsed ||
|
|
215
|
-
typeof parsed !== "object" ||
|
|
216
|
-
typeof parsed.refreshedAt !== "number") {
|
|
217
|
-
return undefined;
|
|
218
|
-
}
|
|
219
|
-
return parsed;
|
|
220
|
-
}
|
|
221
|
-
catch {
|
|
222
|
-
return undefined;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
function isCacheMiss(error) {
|
|
226
|
-
return Boolean(error &&
|
|
227
|
-
typeof error === "object" &&
|
|
228
|
-
"code" in error &&
|
|
229
|
-
error.code === "ENOENT");
|
|
230
|
-
}
|
|
231
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSwwQ0FBMEMsQ0FBQztBQUM3RSxPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xELE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxlQUFlLE1BQU0saUJBQWlCLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBT2xELE1BQU0sZ0JBQWdCLEdBQW9CO0lBQ3hDLFVBQVUsRUFBRSxlQUFlLENBQUMsSUFBSTtJQUNoQyxPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU87Q0FDakMsQ0FBQztBQTBERixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztBQUVyRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQWU7SUFDckQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNuRSxPQUFPLE9BQU8sQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLHdCQUF3QixDQUFDLGNBQWlDLE9BQU8sQ0FBQyxHQUFHO0lBQ25GLE9BQU8s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QU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQVksQ0FBQztRQUM1RCxJQUNFLENBQUMsTUFBTTtZQUNQLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFDMUIsT0FBUSxNQUFpQyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQ2xFLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxNQUFnQyxDQUFDO0lBQzFDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsT0FBTyxPQUFPLENBQ1osS0FBSztRQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsTUFBTSxJQUFJLEtBQUs7UUFDZCxLQUEyQixDQUFDLElBQUksS0FBSyxRQUFRLENBQy9DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZ25vc3RpYyBkYWlseSBtZXRhZGF0YSBjYWNoZSBvbiB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY2FjYWNoZSB8IGNhY2FjaGV9LlxuICpcbiAqIFVzZXMgY2FjYWNoZSdzIGJ1aWx0LWluIG1lbW9yeSBtZW1vaXphdGlvbiAoYG1lbW9pemU6IHRydWVgIG9uIHB1dDsgZ2V0cyByZWFkXG4gKiB0aGUgaW4tbWVtb3J5IGxheWVyIGJ5IGRlZmF1bHQpIHdpdGggY29udGVudC1hZGRyZXNzZWQgZGlzayB1bmRlclxuICogYGVudi1wYXRocyhcImRieC10b29sc1wiKS5jYWNoZS9tb2RlbC1nYXRld2F5Lzx2ZXJzaW9uPi9gLiBEaXNrIHBlcnNpc3RlbmNlIGlzXG4gKiBkaXNhYmxlZCBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCAoe0BsaW5rIGVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52fSk7XG4gKiB0aG9zZSBwcm9jZXNzZXMga2VlcCBhIHByb2Nlc3MtbG9jYWwgTWFwIG9ubHkuXG4gKlxuICogRWFjaCBjYWNoZSBvd25zIGEga2V5LCBoYXJkLWNvZGVkIGZhbGxiYWNrLCBvcHRpb25hbCBuZXR3b3JrIGxvYWRlciwgYW5kIGFcbiAqIG1lcmdlciB0aGF0IGNvbWJpbmVzIGZyZXNoIC8gcHJldmlvdXMgLyBmYWxsYmFjayB2YWx1ZXMuIEZyZXNobmVzcyBpcyB0aGVcbiAqIGVudmVsb3BlIGByZWZyZXNoZWRBdGAgd2luZG93IChkZWZhdWx0IG9uZSBkYXkpLCBub3QgY2FjYWNoZSdzIHNob3J0IExSVSBUVEwuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCAqIGFzIGVudmlyb25tZW50VXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZW52aXJvbm1lbnQtdXRpbHNcIjtcbmltcG9ydCAqIGFzIGxvZyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9sb2dcIjtcbmltcG9ydCBjYWNhY2hlIGZyb20gXCJjYWNhY2hlXCI7XG5pbXBvcnQgZW52UGF0aHMgZnJvbSBcImVudi1wYXRoc1wiO1xuXG5pbXBvcnQgcGFja2FnZU1hbmlmZXN0IGZyb20gXCIuLi9wYWNrYWdlLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUyB9IGZyb20gXCIuL19tZXRhZGF0YS1jb250cmFjdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvbWV0YWRhdGEtY2FjaGVcIik7XG5cbmludGVyZmFjZSBQYWNrYWdlSWRlbnRpdHkge1xuICByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuY29uc3QgUEFDS0FHRV9JREVOVElUWTogUGFja2FnZUlkZW50aXR5ID0ge1xuICBpZGVudGlmaWVyOiBwYWNrYWdlTWFuaWZlc3QubmFtZSxcbiAgdmVyc2lvbjogcGFja2FnZU1hbmlmZXN0LnZlcnNpb24sXG59O1xuXG4vKiogRW52ZWxvcGUgc3RvcmVkIGFzIEpTT04gYnl0ZXMgaW4gY2FjYWNoZSBmb3IgZXZlcnkga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHtcbiAgcmVhZG9ubHkgcmVmcmVzaGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgdmFsdWU6IFQ7XG59XG5cbi8qKiBGYWN0b3J5IGlucHV0cyBmb3Igb25lIG5hbWVkIG1ldGFkYXRhIGNhY2hlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlT3B0aW9uczxUPiB7XG4gIC8qKiBTdGFibGUgY2FjYWNoZSBrZXkuICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKiogSGFyZC1jb2RlZCAvIGNvbW1pdHRlZCBiYXNlbGluZSB1c2VkIHdoZW4gc3RvcmUgYW5kIGxvYWQgYm90aCBtaXNzLiAqL1xuICByZWFkb25seSBmYWxsYmFjazogVDtcbiAgLyoqXG4gICAqIFJlZnJlc2ggc291cmNlLiBXaGVuIG9taXR0ZWQgdGhlIGNhY2hlIG9ubHkgc2VydmVzIHN0b3JlICsgZmFsbGJhY2sgYW5kXG4gICAqIHtAbGluayBNZXRhZGF0YUNhY2hlLnVwZGF0ZX0gbXV0YXRpb25zIChmb3IgZXhhbXBsZSBlcnJvci1sZWFybmVkIHZhbHVlcykuXG4gICAqL1xuICByZWFkb25seSBsb2FkPzogKCkgPT4gUHJvbWlzZTxUPjtcbiAgLyoqIENvbWJpbmUgYSBmcmVzaCBsb2FkLCBwcmlvciBzdG9yZSB2YWx1ZSwgYW5kIHRoZSBoYXJkLWNvZGVkIGZhbGxiYWNrLiAqL1xuICByZWFkb25seSBtZXJnZTogKGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPikgPT4gVDtcbiAgLyoqIEZyZXNobmVzcyB3aW5kb3c7IGRlZmF1bHRzIHRvIHtAbGluayBNT0RFTF9NRVRBREFUQV9UVExfTVN9IChvbmUgZGF5KS4gKi9cbiAgcmVhZG9ubHkgdHRsTXM/OiBudW1iZXI7XG4gIC8qKiBQYWNrYWdlIHZlcnNpb24gc2VnbWVudCBpbiB0aGUgY2FjaGUgcGF0aC4gRGVmYXVsdHMgdG8gdGhpcyBwYWNrYWdlLiAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgdGhlIGNhY2FjaGUgcm9vdCBkaXJlY3RvcnkgKHRlc3RzKS4gKi9cbiAgcmVhZG9ubHkgY2FjaGVEaXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGb3JjZSBkaXNrIG9uL29mZi4gRGVmYXVsdHMgdG8gb2ZmIGluc2lkZSBEYXRhYnJpY2tzIEFwcHMsIG9uIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2s/OiBib29sZWFuO1xuICAvKiogQ2xvY2sgb3ZlcnJpZGUgZm9yIHRlc3RzLiAqL1xuICByZWFkb25seSBub3c/OiAoKSA9PiBudW1iZXI7XG59XG5cbi8qKiBBcmd1bWVudHMgcGFzc2VkIHRvIGEgY2FjaGUgbWVyZ2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPiB7XG4gIHJlYWRvbmx5IGZyZXNoOiBUIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBwcmV2aW91czogVCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZmFsbGJhY2s6IFQ7XG59XG5cbi8qKiBPbmUgdmVyc2lvbmVkIG1ldGFkYXRhIGNhY2hlIChjYWNhY2hlIG1lbW9yeSArIG9wdGlvbmFsIGRpc2spLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlPFQ+IHtcbiAgLyoqIEFic29sdXRlIGNhY2FjaGUgcm9vdCBmb3IgdGhpcyBwYWNrYWdlIHZlcnNpb24gKHVudXNlZCB3aGVuIGRpc2sgaXMgb2ZmKS4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKiogV2hldGhlciBjYWNhY2hlIGRpc2sgcGVyc2lzdGVuY2UgaXMgZW5hYmxlZCBmb3IgdGhpcyBpbnN0YW5jZS4gKi9cbiAgcmVhZG9ubHkgZGlza0VuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKiBSZXR1cm4gYSBmcmVzaC1vci1mYWxsYmFjayB2YWx1ZSwgcmVmcmVzaGluZyB3aGVuIHN0YWxlLiAqL1xuICBnZXQoKTogUHJvbWlzZTxUPjtcbiAgLyoqIFJlYWQgbWVtb3J5IC8gZGlzayB3aXRob3V0IHJlZnJlc2hpbmcuICovXG4gIHBlZWsoKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgLyoqIE11dGF0ZSB0aGUgY2FjaGVkIHZhbHVlIGFuZCBwZXJzaXN0IGl0LiAqL1xuICB1cGRhdGUobXV0YXRvcjogKGN1cnJlbnQ6IFQpID0+IFQpOiBQcm9taXNlPFQ+O1xuICAvKiogRm9yY2UgYSByZWZyZXNoIGF0dGVtcHQgZXZlbiB3aGVuIHRoZSBlbnRyeSBpcyBzdGlsbCBmcmVzaC4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPFQ+O1xufVxuXG5jb25zdCBpbmZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG4vKiogRGVmYXVsdCBjYWNhY2hlIHJvb3QgZm9yIGEgcGFja2FnZSB2ZXJzaW9uIHVuZGVyIHRoZSBkYngtdG9vbHMgY2FjaGUgZGlyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNZXRhZGF0YUNhY2hlRGlyKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5ID0gZW52UGF0aHMoXCJkYngtdG9vbHNcIiwgeyBzdWZmaXg6IFwiXCIgfSkuY2FjaGU7XG4gIHJldHVybiByZXNvbHZlKGNhY2hlRGlyZWN0b3J5LCBcIm1vZGVsLWdhdGV3YXlcIiwgdmVyc2lvbik7XG59XG5cbi8qKiBXaGV0aGVyIG1ldGFkYXRhIGNhY2hlcyBzaG91bGQgcGVyc2lzdCB0byBkaXNrIGluIHRoaXMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRhZGF0YUNhY2hlRGlza0VuYWJsZWQoZW52aXJvbm1lbnQ6IE5vZGVKUy5Qcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnYpOiBib29sZWFuIHtcbiAgcmV0dXJuICFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudihlbnZpcm9ubWVudCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIG9uZSBkYWlseSBjYWNoZSBiYWNrZWQgYnkgY2FjYWNoZSBtZW1vaXphdGlvbiwgd2l0aCBvcHRpb25hbCBkaXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0YWRhdGFDYWNoZTxUPihvcHRpb25zOiBNZXRhZGF0YUNhY2hlT3B0aW9uczxUPik6IE1ldGFkYXRhQ2FjaGU8VD4ge1xuICBjb25zdCB0dGxNcyA9IG9wdGlvbnMudHRsTXMgPz8gTU9ERUxfTUVUQURBVEFfVFRMX01TO1xuICBjb25zdCBkaXNrRW5hYmxlZCA9IG9wdGlvbnMuZGlzayA/PyBtZXRhZGF0YUNhY2hlRGlza0VuYWJsZWQoKTtcbiAgY29uc3Qgbm93ID0gb3B0aW9ucy5ub3cgPz8gRGF0ZS5ub3c7XG4gIGNvbnN0IHBhdGhQcm9taXNlID0gcmVzb2x2ZUNhY2hlRGlyKG9wdGlvbnMpO1xuICBsZXQgcGF0aCA9IG9wdGlvbnMuY2FjaGVEaXI7XG5cbiAgY29uc3QgZmxpZ2h0S2V5ID0gKGNhY2hlUGF0aDogc3RyaW5nLCBzdWZmaXggPSBcIlwiKTogc3RyaW5nID0+XG4gICAgYCR7Y2FjaGVQYXRofTo6JHtvcHRpb25zLmtleX0ke3N1ZmZpeH1gO1xuXG4gIC8qKiBQcm9jZXNzLWxvY2FsIHN0b3JlIHVzZWQgd2hlbiBkaXNrIGlzIG9mZiAoRGF0YWJyaWNrcyBBcHBzKS4gKi9cbiAgY29uc3QgbWVtb3J5T25seSA9IG5ldyBNYXA8c3RyaW5nLCBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+PigpO1xuXG4gIGNvbnN0IHJlc29sdmVWYWx1ZSA9IChpbnB1dDogTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQ8VD4pOiBUID0+IG9wdGlvbnMubWVyZ2UoaW5wdXQpO1xuXG4gIGNvbnN0IGlzRnJlc2ggPSAocmVjb3JkOiBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICAgIEJvb2xlYW4ocmVjb3JkICYmIG5vdygpIC0gcmVjb3JkLnJlZnJlc2hlZEF0IDwgdHRsTXMpO1xuXG4gIGNvbnN0IGNhY2hlUGF0aCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIHBhdGggPz89IGF3YWl0IHBhdGhQcm9taXNlO1xuICAgIHJldHVybiBwYXRoO1xuICB9O1xuXG4gIGNvbnN0IHJlYWRSZWNvcmQgPSBhc3luYyAoKTogUHJvbWlzZTxNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgaWYgKCFkaXNrRW5hYmxlZCkgcmV0dXJuIG1lbW9yeU9ubHkuZ2V0KG9wdGlvbnMua2V5KTtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCBjYWNoZVBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgLy8gY2FjYWNoZSByZWFkcyBpdHMgaW4tbWVtb3J5IG1lbW8gZmlyc3QgdW5sZXNzIG1lbW9pemUgaXMgZmFsc2VcbiAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY2FjYWNoZS5nZXQocmVzb2x2ZWRQYXRoLCBvcHRpb25zLmtleSk7XG4gICAgICByZXR1cm4gZGVjb2RlUmVjb3JkPFQ+KGVudHJ5LmRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNDYWNoZU1pc3MoZXJyb3IpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgbG9nZ2VyLndhcm4oXCJtZXRhZGF0YSBjYWNoZSBjYWNhY2hlIHJlYWQgZmFpbGVkXCIsIHtcbiAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgd3JpdGVSZWNvcmQgPSBhc3luYyAocmVjb3JkOiBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFkaXNrRW5hYmxlZCkge1xuICAgICAgbWVtb3J5T25seS5zZXQob3B0aW9ucy5rZXksIHJlY29yZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWNhY2hlLnB1dChyZXNvbHZlZFBhdGgsIG9wdGlvbnMua2V5LCBgJHtKU09OLnN0cmluZ2lmeShyZWNvcmQpfVxcbmAsIHtcbiAgICAgICAgbWVtb2l6ZTogdHJ1ZSxcbiAgICAgICAgbWV0YWRhdGE6IHsgcmVmcmVzaGVkQXQ6IHJlY29yZC5yZWZyZXNoZWRBdCB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwibWV0YWRhdGEgY2FjaGUgY2FjYWNoZSB3cml0ZSBmYWlsZWRcIiwge1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICBwYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHBlcnNpc3QgPSBhc3luYyAodmFsdWU6IFQsIHJlZnJlc2hlZEF0ID0gbm93KCkpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBhd2FpdCB3cml0ZVJlY29yZCh7IHJlZnJlc2hlZEF0LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgY29uc3QgcmVmcmVzaCA9IGFzeW5jIChmb3JjZTogYm9vbGVhbik6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IGNhY2hlUGF0aCgpO1xuICAgIHJldHVybiBjb2FsZXNjZShmbGlnaHRLZXkocmVzb2x2ZWRQYXRoKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCByZWFkUmVjb3JkKCk7XG4gICAgICBpZiAoIWZvcmNlICYmIGlzRnJlc2gocHJldmlvdXMpKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVmFsdWUoe1xuICAgICAgICAgIGZyZXNoOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzPy52YWx1ZSxcbiAgICAgICAgICBmYWxsYmFjazogb3B0aW9ucy5mYWxsYmFjayxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBmcmVzaDogVCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRpb25zLmxvYWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmcmVzaCA9IGF3YWl0IG9wdGlvbnMubG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwibWV0YWRhdGEgY2FjaGUgcmVmcmVzaCBmYWlsZWQ7IGtlZXBpbmcgbGFzdCBrbm93biBnb29kXCIsIHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgIGRpc2tFbmFibGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZVZhbHVlKHtcbiAgICAgICAgZnJlc2gsXG4gICAgICAgIHByZXZpb3VzOiBwcmV2aW91cz8udmFsdWUsXG4gICAgICAgIGZhbGxiYWNrOiBvcHRpb25zLmZhbGxiYWNrLFxuICAgICAgfSk7XG4gICAgICBpZiAoZnJlc2ggIT09IHVuZGVmaW5lZCB8fCAhcHJldmlvdXMpIHtcbiAgICAgICAgYXdhaXQgcGVyc2lzdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQgcGF0aCgpIHtcbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtZXRhZGF0YSBjYWNoZSBwYXRoIGlzIG5vdCByZXNvbHZlZCB1bnRpbCB0aGUgZmlyc3QgY2FjaGUgcmVhZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH0sXG4gICAgZGlza0VuYWJsZWQsXG4gICAgZ2V0OiAoKSA9PiByZWZyZXNoKGZhbHNlKSxcbiAgICBwZWVrOiBhc3luYyAoKSA9PiAoYXdhaXQgcmVhZFJlY29yZCgpKT8udmFsdWUsXG4gICAgcmVmcmVzaDogKCkgPT4gcmVmcmVzaCh0cnVlKSxcbiAgICB1cGRhdGU6IGFzeW5jIChtdXRhdG9yKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCBjYWNoZVBhdGgoKTtcbiAgICAgIHJldHVybiBjb2FsZXNjZShmbGlnaHRLZXkocmVzb2x2ZWRQYXRoLCBcIjp1cGRhdGVcIiksIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCByZWFkUmVjb3JkKCk7XG4gICAgICAgIGNvbnN0IGJhc2VsaW5lID0gcmVzb2x2ZVZhbHVlKHtcbiAgICAgICAgICBmcmVzaDogdW5kZWZpbmVkLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cz8udmFsdWUsXG4gICAgICAgICAgZmFsbGJhY2s6IG9wdGlvbnMuZmFsbGJhY2ssXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGVyc2lzdChtdXRhdG9yKGJhc2VsaW5lKSk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2FjaGVEaXIob3B0aW9uczoge1xuICByZWFkb25seSBjYWNoZURpcj86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAob3B0aW9ucy5jYWNoZURpcikgcmV0dXJuIG9wdGlvbnMuY2FjaGVEaXI7XG4gIGNvbnN0IHZlcnNpb24gPSBvcHRpb25zLnZlcnNpb24gPz8gUEFDS0FHRV9JREVOVElUWS52ZXJzaW9uO1xuICByZXR1cm4gZGVmYXVsdE1ldGFkYXRhQ2FjaGVEaXIodmVyc2lvbik7XG59XG5cbi8qKiBQcmVmZXIgYSBub24tZW1wdHkgZnJlc2ggYXJyYXksIGVsc2UgcHJldmlvdXMsIGVsc2UgZmFsbGJhY2suICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmVmZXJGcmVzaExpc3Q8VD4oaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PHJlYWRvbmx5IFRbXT4pOiBUW10ge1xuICBpZiAoaW5wdXQuZnJlc2ggJiYgaW5wdXQuZnJlc2gubGVuZ3RoID4gMCkgcmV0dXJuIFsuLi5pbnB1dC5mcmVzaF07XG4gIGlmIChpbnB1dC5wcmV2aW91cyAmJiBpbnB1dC5wcmV2aW91cy5sZW5ndGggPiAwKSByZXR1cm4gWy4uLmlucHV0LnByZXZpb3VzXTtcbiAgcmV0dXJuIFsuLi5pbnB1dC5mYWxsYmFja107XG59XG5cbi8qKlxuICogU2hhbGxvdy1tZXJnZSByZWNvcmQgY2F0YWxvZ3VlczogZmFsbGJhY2ssIHRoZW4gcHJldmlvdXMsIHRoZW4gZnJlc2gga2V5cy5cbiAqIEZyZXNoIHZhbHVlcyB3aW4gcGVyIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQ8VD4oXG4gIGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBUPj4+LFxuKTogUmVjb3JkPHN0cmluZywgVD4ge1xuICByZXR1cm4ge1xuICAgIC4uLmlucHV0LmZhbGxiYWNrLFxuICAgIC4uLihpbnB1dC5wcmV2aW91cyA/PyB7fSksXG4gICAgLi4uKGlucHV0LmZyZXNoID8/IHt9KSxcbiAgfTtcbn1cblxuLyoqIFRlc3QgaGVscGVyOiB3aXBlIGEgY2FjYWNoZSByb290IGFuZCBjbGVhciBjYWNhY2hlIG1lbW9pemF0aW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc2V0TWV0YWRhdGFDYWNoZURpcihjYWNoZURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2FjYWNoZS5ybS5hbGwoY2FjaGVEaXIpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBlbXB0eSAvIG1pc3NpbmcgY2FjaGUgaXMgZmluZVxuICB9XG4gIGNhY2FjaGUuY2xlYXJNZW1vaXplZCgpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbLi4uaW5mbGlnaHQua2V5cygpXSkge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHtjYWNoZURpcn06OmApKSBpbmZsaWdodC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2FsZXNjZTxUPihrZXk6IHN0cmluZywgd29yazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCBleGlzdGluZyA9IGluZmxpZ2h0LmdldChrZXkpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZyBhcyBQcm9taXNlPFQ+O1xuICBjb25zdCBwZW5kaW5nID0gd29yaygpLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChpbmZsaWdodC5nZXQoa2V5KSA9PT0gcGVuZGluZykgaW5mbGlnaHQuZGVsZXRlKGtleSk7XG4gIH0pO1xuICBpbmZsaWdodC5zZXQoa2V5LCBwZW5kaW5nKTtcbiAgcmV0dXJuIHBlbmRpbmc7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVJlY29yZDxUPihkYXRhOiBCdWZmZXIpOiBNZXRhZGF0YUNhY2hlUmVjb3JkPFQ+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoXCJ1dGY4XCIpKSBhcyB1bmtub3duO1xuICAgIGlmIChcbiAgICAgICFwYXJzZWQgfHxcbiAgICAgIHR5cGVvZiBwYXJzZWQgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgIHR5cGVvZiAocGFyc2VkIGFzIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD4pLnJlZnJlc2hlZEF0ICE9PSBcIm51bWJlclwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkIGFzIE1ldGFkYXRhQ2FjaGVSZWNvcmQ8VD47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDYWNoZU1pc3MoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgZXJyb3IgJiZcbiAgICB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcImNvZGVcIiBpbiBlcnJvciAmJlxuICAgIChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFTk9FTlRcIixcbiAgKTtcbn1cbiJdfQ==
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBZSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQW1DbEQsdUVBQXVFO0FBQ3ZFLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsT0FBZ0MsRUFDaEMsUUFBd0Msa0JBQWtCO0lBRTFELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUkscUJBQXFCLENBQUM7SUFDckQsTUFBTSxRQUFRLEdBQUcsd0JBQXdCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2RCxNQUFNLFVBQVUsR0FBRywwQkFBMEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNELE1BQU0sSUFBSSxHQUFHLEdBQTJCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFJLFFBQVEsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxLQUFRLEVBQWMsRUFBRTtRQUM3QyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFvQixFQUFFLFFBQXVCLEVBQUssRUFBRSxDQUN4RSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFFakUsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLEtBQWMsRUFBYyxFQUFFO1FBQ25ELElBQUksS0FBSztZQUFFLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMvQixNQUFNLFFBQVEsQ0FDWixLQUFLLEVBQ0wsVUFBVSxFQUNWLEtBQUssSUFBSSxFQUFFO1lBQ1QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFJLEtBQW9CLENBQUM7WUFDekIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQztvQkFDSCxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQy9CLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxFQUFFO3dCQUM1RSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7d0JBQ2hCLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztxQkFDakMsQ0FBQyxDQUFDO29CQUNILGtCQUFrQixHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFNBQVM7Z0JBQUUsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0UsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLEVBQ0QsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FDbEMsQ0FBQztRQUNGLElBQUksa0JBQWtCO1lBQUUsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sWUFBWSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDO0lBRUYsT0FBTztRQUNMLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksRUFBRSxJQUFJO1FBQ1YsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDNUIsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN4QixNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVFLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsTUFBTSxVQUFVLG9CQUFvQixDQUFJLEtBQTRDO0lBQ2xGLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25FLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsS0FBMkQ7SUFFM0QsT0FBTztRQUNMLEdBQUcsS0FBSyxDQUFDLFFBQVE7UUFDakIsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztLQUN2QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGFpbHkgbW9kZWwgbWV0YWRhdGEgY2FjaGUgYnVpbHQgb24gdGhlIHNoYXJlZCBtZW1vcnktZmlyc3QgY2FjaGUgcGFja2FnZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlQ2FjaGUsIGdldE9yU2V0IH0gZnJvbSBcIkBkYngtdG9vbHMvY2FjaGUvY2FjaGVcIjtcbmltcG9ydCAqIGFzIGVycm9yVXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvZXJyb3ItdXRpbHNcIjtcbmltcG9ydCAqIGFzIGxvZyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9sb2dcIjtcblxuaW1wb3J0IHsgbW9kZWxNZXRhZGF0YUNhY2hlIH0gZnJvbSBcIi4vX2NhY2hlLnRzXCI7XG5pbXBvcnQgeyBNT0RFTF9NRVRBREFUQV9UVExfTVMgfSBmcm9tIFwiLi9fbWV0YWRhdGEtY29udHJhY3QudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL21ldGFkYXRhLWNhY2hlXCIpO1xuXG4vKiogRmFjdG9yeSBpbnB1dHMgZm9yIG9uZSBuYW1lZCBtZXRhZGF0YSBjYWNoZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFDYWNoZU9wdGlvbnM8VD4ge1xuICAvKiogU3RhYmxlIGNhY2hlIGtleS4gKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIC8qKiBIYXJkLWNvZGVkIC8gY29tbWl0dGVkIGJhc2VsaW5lIHVzZWQgd2hlbiBzdG9yZSBhbmQgbG9hZCBib3RoIG1pc3MuICovXG4gIHJlYWRvbmx5IGZhbGxiYWNrOiBUO1xuICAvKiogT3B0aW9uYWwgcmVmcmVzaCBzb3VyY2UuICovXG4gIHJlYWRvbmx5IGxvYWQ/OiAoKSA9PiBQcm9taXNlPFQ+O1xuICAvKiogQ29tYmluZSBhIGZyZXNoIGxvYWQsIHByaW9yIHN0b3JlIHZhbHVlLCBhbmQgdGhlIGhhcmQtY29kZWQgZmFsbGJhY2suICovXG4gIHJlYWRvbmx5IG1lcmdlOiAoaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PFQ+KSA9PiBUO1xuICAvKiogRnJlc2huZXNzIHdpbmRvdzsgZGVmYXVsdHMgdG8gb25lIGRheS4gKi9cbiAgcmVhZG9ubHkgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBBcmd1bWVudHMgcGFzc2VkIHRvIGEgY2FjaGUgbWVyZ2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxUPiB7XG4gIHJlYWRvbmx5IGZyZXNoOiBUIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBwcmV2aW91czogVCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZmFsbGJhY2s6IFQ7XG59XG5cbi8qKiBPbmUgbmFtZXNwYWNlZCB2aWV3IG92ZXIgdGhlIHNoYXJlZCBtZXRhZGF0YSBjYWNoZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFDYWNoZTxUPiB7XG4gIC8qKiBSZXR1cm4gYSBmcmVzaC1vci1mYWxsYmFjayB2YWx1ZSwgcmVmcmVzaGluZyB3aGVuIHN0YWxlLiAqL1xuICBnZXQoKTogUHJvbWlzZTxUPjtcbiAgLyoqIFJlYWQgcHJvY2VzcyBtZW1vcnkgd2l0aG91dCByZWZyZXNoaW5nLiAqL1xuICBwZWVrKCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gIC8qKiBNdXRhdGUgdGhlIGNhY2hlZCB2YWx1ZSBhbmQgcGVyc2lzdCBpdC4gKi9cbiAgdXBkYXRlKG11dGF0b3I6IChjdXJyZW50OiBUKSA9PiBUKTogUHJvbWlzZTxUPjtcbiAgLyoqIEZvcmNlIGEgcmVmcmVzaCBhdHRlbXB0IGV2ZW4gd2hlbiB0aGUgZW50cnkgaXMgc3RpbGwgZnJlc2guICovXG4gIHJlZnJlc2goKTogUHJvbWlzZTxUPjtcbn1cblxuLyoqIENyZWF0ZSBvbmUgbmFtZXNwYWNlZCB2aWV3IG92ZXIgdGhlIHNoYXJlZCBtb2RlbCBtZXRhZGF0YSBjYWNoZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRhZGF0YUNhY2hlPFQ+KFxuICBvcHRpb25zOiBNZXRhZGF0YUNhY2hlT3B0aW9uczxUPixcbiAgY2FjaGU6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNhY2hlPiA9IG1vZGVsTWV0YWRhdGFDYWNoZSxcbik6IE1ldGFkYXRhQ2FjaGU8VD4ge1xuICBjb25zdCB0dGxNcyA9IG9wdGlvbnMudHRsTXMgPz8gTU9ERUxfTUVUQURBVEFfVFRMX01TO1xuICBjb25zdCB2YWx1ZUtleSA9IGBtb2RlbC1tZXRhZGF0YTp2YWx1ZToke29wdGlvbnMua2V5fWA7XG4gIGNvbnN0IHJlZnJlc2hLZXkgPSBgbW9kZWwtbWV0YWRhdGE6cmVmcmVzaDoke29wdGlvbnMua2V5fWA7XG5cbiAgY29uc3QgcmVhZCA9ICgpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+ID0+IGNhY2hlLmdldDxUPih2YWx1ZUtleSk7XG4gIGNvbnN0IHBlcnNpc3QgPSBhc3luYyAodmFsdWU6IFQpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBhd2FpdCBjYWNoZS5zZXQodmFsdWVLZXksIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIGNvbnN0IHJlc29sdmVWYWx1ZSA9IChmcmVzaDogVCB8IHVuZGVmaW5lZCwgcHJldmlvdXM6IFQgfCB1bmRlZmluZWQpOiBUID0+XG4gICAgb3B0aW9ucy5tZXJnZSh7IGZyZXNoLCBwcmV2aW91cywgZmFsbGJhY2s6IG9wdGlvbnMuZmFsbGJhY2sgfSk7XG5cbiAgY29uc3QgcmVmcmVzaCA9IGFzeW5jIChmb3JjZTogYm9vbGVhbik6IFByb21pc2U8VD4gPT4ge1xuICAgIGlmIChmb3JjZSkgYXdhaXQgY2FjaGUuZGVsZXRlKHJlZnJlc2hLZXkpO1xuICAgIGxldCBzdGFsZVJlZnJlc2hGYWlsZWQgPSBmYWxzZTtcbiAgICBhd2FpdCBnZXRPclNldChcbiAgICAgIGNhY2hlLFxuICAgICAgcmVmcmVzaEtleSxcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCByZWFkKCk7XG4gICAgICAgIGxldCBmcmVzaDogVCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG9wdGlvbnMubG9hZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmcmVzaCA9IGF3YWl0IG9wdGlvbnMubG9hZCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIm1ldGFkYXRhIGNhY2hlIHJlZnJlc2ggZmFpbGVkOyB1c2luZyBjYWNoZWQgb3IgY29tbWl0dGVkIHZhbHVlXCIsIHtcbiAgICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0YWxlUmVmcmVzaEZhaWxlZCA9IHByZXZpb3VzICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVZhbHVlKGZyZXNoLCBwcmV2aW91cyk7XG4gICAgICAgIGlmIChmcmVzaCAhPT0gdW5kZWZpbmVkIHx8IHByZXZpb3VzID09PSB1bmRlZmluZWQpIGF3YWl0IHBlcnNpc3QocmVzb2x2ZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICB7IHR0bDogdHRsTXMsIHRocm93RXJyb3JzOiB0cnVlIH0sXG4gICAgKTtcbiAgICBpZiAoc3RhbGVSZWZyZXNoRmFpbGVkKSBhd2FpdCBjYWNoZS5kZWxldGUocmVmcmVzaEtleSk7XG4gICAgcmV0dXJuIHJlc29sdmVWYWx1ZSh1bmRlZmluZWQsIGF3YWl0IHJlYWQoKSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHJlZnJlc2goZmFsc2UpLFxuICAgIHBlZWs6IHJlYWQsXG4gICAgcmVmcmVzaDogKCkgPT4gcmVmcmVzaCh0cnVlKSxcbiAgICB1cGRhdGU6IGFzeW5jIChtdXRhdG9yKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBlcnNpc3QobXV0YXRvcihyZXNvbHZlVmFsdWUodW5kZWZpbmVkLCBhd2FpdCByZWFkKCkpKSk7XG4gICAgICBhd2FpdCBjYWNoZS5zZXQocmVmcmVzaEtleSwgdHJ1ZSwgeyB0dGw6IHR0bE1zIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKiBQcmVmZXIgYSBub24tZW1wdHkgZnJlc2ggYXJyYXksIGVsc2UgcHJldmlvdXMsIGVsc2UgZmFsbGJhY2suICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmVmZXJGcmVzaExpc3Q8VD4oaW5wdXQ6IE1ldGFkYXRhQ2FjaGVNZXJnZUlucHV0PHJlYWRvbmx5IFRbXT4pOiBUW10ge1xuICBpZiAoaW5wdXQuZnJlc2ggJiYgaW5wdXQuZnJlc2gubGVuZ3RoID4gMCkgcmV0dXJuIFsuLi5pbnB1dC5mcmVzaF07XG4gIGlmIChpbnB1dC5wcmV2aW91cyAmJiBpbnB1dC5wcmV2aW91cy5sZW5ndGggPiAwKSByZXR1cm4gWy4uLmlucHV0LnByZXZpb3VzXTtcbiAgcmV0dXJuIFsuLi5pbnB1dC5mYWxsYmFja107XG59XG5cbi8qKiBTaGFsbG93LW1lcmdlIHJlY29yZCBjYXRhbG9ndWVzOiBmYWxsYmFjaywgdGhlbiBwcmV2aW91cywgdGhlbiBmcmVzaCBrZXlzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQ8VD4oXG4gIGlucHV0OiBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBUPj4+LFxuKTogUmVjb3JkPHN0cmluZywgVD4ge1xuICByZXR1cm4ge1xuICAgIC4uLmlucHV0LmZhbGxiYWNrLFxuICAgIC4uLihpbnB1dC5wcmV2aW91cyA/PyB7fSksXG4gICAgLi4uKGlucHV0LmZyZXNoID8/IHt9KSxcbiAgfTtcbn1cbiJdfQ==
|
package/lib/src/metadata.d.ts
CHANGED
|
@@ -16,14 +16,12 @@ interface MetadataIndex {
|
|
|
16
16
|
* Safe to call on gateway startup. Concurrent callers share one refresh.
|
|
17
17
|
*/
|
|
18
18
|
export declare function refreshModelMetadata(): Promise<MetadataIndex>;
|
|
19
|
-
/** Load
|
|
19
|
+
/** Load shared cache entries without forcing a network refresh. */
|
|
20
20
|
export declare function hydrateModelMetadata(): Promise<MetadataIndex>;
|
|
21
|
-
/** Absolute cacache root used by the documentation / learned caches. */
|
|
22
|
-
export declare function modelMetadataCachePath(): string;
|
|
23
21
|
export { modelStatusFor, retiredModelNames } from "./_retirement.ts";
|
|
24
22
|
/** Return the committed reasoning-effort catalogue. Cached per process. */
|
|
25
23
|
export declare function reasoningModelCatalogue(): ReasoningModelCatalogue;
|
|
26
|
-
/** Return error-learned reasoning ladders
|
|
24
|
+
/** Return error-learned reasoning ladders from the shared model cache. */
|
|
27
25
|
export declare function learnedReasoningCatalogue(): ReasoningModelCatalogue;
|
|
28
26
|
/**
|
|
29
27
|
* Store levels learned from an upstream error and persist them write-through.
|
|
@@ -37,7 +35,7 @@ export declare function rememberReasoningLevels(model: string, levels: readonly
|
|
|
37
35
|
*
|
|
38
36
|
* Accepts the same nested Databricks envelopes as {@link parseReasoningLevels}.
|
|
39
37
|
* Returns the levels that were stored (or the current lookup when parse yields
|
|
40
|
-
* nothing). The raw error body is never
|
|
38
|
+
* nothing). The raw error body is never cached.
|
|
41
39
|
*/
|
|
42
40
|
export declare function learnReasoningLevelsFromError(model: string, body: unknown): Promise<ReasoningLevel[]>;
|
|
43
41
|
/** Resolve documented model capabilities from a name or endpoint summary. */
|