@dbx-tools/appkit-web-search 0.9.132 → 0.9.138
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 +2 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +2 -2
- package/lib/src/fetch.d.ts +31 -0
- package/lib/src/fetch.js +93 -19
- package/lib/src/plugin.d.ts +5 -0
- package/lib/src/plugin.js +6 -2
- package/lib/src/runtime.d.ts +5 -1
- package/lib/src/runtime.js +17 -5
- package/lib/src/search.js +79 -32
- package/package.json +7 -7
- package/src/fetch.ts +151 -22
- package/src/plugin.ts +18 -1
- package/src/runtime.ts +20 -3
- package/src/search.ts +97 -33
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-web-search";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.138";
|
|
7
7
|
export * as allowlist from "./src/allowlist.ts";
|
|
8
8
|
export * as config from "./src/config.ts";
|
|
9
9
|
export * as defaults from "./src/defaults.ts";
|
|
@@ -21,6 +21,7 @@ export { MODEL_ENV, SERVING_ENDPOINT_ENV, DEFAULT_MODEL_FALLBACKS, DEFAULT_MAX_C
|
|
|
21
21
|
export type { ApprovalGate, ApprovalPolicy, UrlPolicyMode, ModelSource, WebSearchPluginConfig, ResolvedWebSearchConfig } from "./src/config.ts";
|
|
22
22
|
export { SEARCH_CACHE_TTL_SECONDS, FETCH_CACHE_TTL_SECONDS, SERVING_RETRY_ATTEMPTS, WEB_RETRY_ATTEMPTS, webSearchExecuteDefaults, webFetchExecuteDefaults, scrapeSearchExecuteDefaults } from "./src/defaults.ts";
|
|
23
23
|
export type { WebSearchExecuteConfig, WebSearchExecutionSettings } from "./src/defaults.ts";
|
|
24
|
+
export type { WebAssetPageFetchRequest, WebImageFetchRequest, WebImageFetchResult } from "./src/fetch.ts";
|
|
24
25
|
export { WebSearchPlugin, webSearch } from "./src/plugin.ts";
|
|
25
26
|
export { WebSearchProviderSpecSchema, WEB_SEARCH_PROVIDERS } from "./src/provider.ts";
|
|
26
27
|
export type { WebSearchProvider, WebSearchProviderSpec } from "./src/provider.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-web-search";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.138";
|
|
3
3
|
export * as allowlist from "./src/allowlist.ts";
|
|
4
4
|
export * as config from "./src/config.ts";
|
|
5
5
|
export * as defaults from "./src/defaults.ts";
|
|
@@ -17,6 +17,7 @@ export { MODEL_ENV, SERVING_ENDPOINT_ENV, DEFAULT_MODEL_FALLBACKS, DEFAULT_MAX_C
|
|
|
17
17
|
export type { ApprovalGate, ApprovalPolicy, UrlPolicyMode, ModelSource, WebSearchPluginConfig, ResolvedWebSearchConfig } from "./src/config.ts";
|
|
18
18
|
export { SEARCH_CACHE_TTL_SECONDS, FETCH_CACHE_TTL_SECONDS, SERVING_RETRY_ATTEMPTS, WEB_RETRY_ATTEMPTS, webSearchExecuteDefaults, webFetchExecuteDefaults, scrapeSearchExecuteDefaults } from "./src/defaults.ts";
|
|
19
19
|
export type { WebSearchExecuteConfig, WebSearchExecutionSettings } from "./src/defaults.ts";
|
|
20
|
+
export type { WebAssetPageFetchRequest, WebImageFetchRequest, WebImageFetchResult } from "./src/fetch.ts";
|
|
20
21
|
export { WebSearchPlugin, webSearch } from "./src/plugin.ts";
|
|
21
22
|
export { WebSearchProviderSpecSchema, WEB_SEARCH_PROVIDERS } from "./src/provider.ts";
|
|
22
23
|
export type { WebSearchProvider, WebSearchProviderSpec } from "./src/provider.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-web-search";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.138";
|
|
6
6
|
export * as allowlist from "./src/allowlist.js";
|
|
7
7
|
export * as config from "./src/config.js";
|
|
8
8
|
export * as defaults from "./src/defaults.js";
|
|
@@ -20,4 +20,4 @@ export { SEARCH_CACHE_TTL_SECONDS, FETCH_CACHE_TTL_SECONDS, SERVING_RETRY_ATTEMP
|
|
|
20
20
|
export { WebSearchPlugin, webSearch } from "./src/plugin.js";
|
|
21
21
|
export { WebSearchProviderSpecSchema, WEB_SEARCH_PROVIDERS } from "./src/provider.js";
|
|
22
22
|
export { WEB_SEARCH_TOOL_DESCRIPTION, WEB_FETCH_TOOL_DESCRIPTION, webSearchRequestSchema, webSearchToolRequestSchema, webSearchCitationSchema, webSearchResultSchema, webFetchRequestSchema, webFetchResultSchema } from "./src/schema.js";
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyw4QkFBOEIsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUV0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUwsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHbE4sT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd0RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLEVBQUUsMEJBQTBCLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMzhcIjtcbmV4cG9ydCAqIGFzIGFsbG93bGlzdCBmcm9tIFwiLi9zcmMvYWxsb3dsaXN0LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBmZXRjaCBmcm9tIFwiLi9zcmMvZmV0Y2gudHNcIjtcbmV4cG9ydCAqIGFzIGh0bWxUZXh0IGZyb20gXCIuL3NyYy9odG1sLXRleHQudHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwcm92aWRlciBmcm9tIFwiLi9zcmMvcHJvdmlkZXIudHNcIjtcbmV4cG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSBcIi4vc3JjL3J1bnRpbWUudHNcIjtcbmV4cG9ydCAqIGFzIHNjaGVtYSBmcm9tIFwiLi9zcmMvc2NoZW1hLnRzXCI7XG5leHBvcnQgKiBhcyBzY3JhcGUgZnJvbSBcIi4vc3JjL3NjcmFwZS50c1wiO1xuZXhwb3J0ICogYXMgc2VhcmNoIGZyb20gXCIuL3NyYy9zZWFyY2gudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2wgZnJvbSBcIi4vc3JjL3Rvb2wudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXJsQWxsb3dMaXN0IH0gZnJvbSBcIi4vc3JjL2FsbG93bGlzdC50c1wiO1xuZXhwb3J0IHsgTU9ERUxfRU5WLCBTRVJWSU5HX0VORFBPSU5UX0VOViwgREVGQVVMVF9NT0RFTF9GQUxMQkFDS1MsIERFRkFVTFRfTUFYX0NJVEFUSU9OUywgREVGQVVMVF9GRVRDSF9NQVhfTEVOR1RILCBERUZBVUxUX1RJTUVPVVRfTVMsIFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXBwcm92YWxHYXRlLCBBcHByb3ZhbFBvbGljeSwgVXJsUG9saWN5TW9kZSwgTW9kZWxTb3VyY2UsIFdlYlNlYXJjaFBsdWdpbkNvbmZpZywgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBTRUFSQ0hfQ0FDSEVfVFRMX1NFQ09ORFMsIEZFVENIX0NBQ0hFX1RUTF9TRUNPTkRTLCBTRVJWSU5HX1JFVFJZX0FUVEVNUFRTLCBXRUJfUkVUUllfQVRURU1QVFMsIHdlYlNlYXJjaEV4ZWN1dGVEZWZhdWx0cywgd2ViRmV0Y2hFeGVjdXRlRGVmYXVsdHMsIHNjcmFwZVNlYXJjaEV4ZWN1dGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBXZWJTZWFyY2hFeGVjdXRlQ29uZmlnLCBXZWJTZWFyY2hFeGVjdXRpb25TZXR0aW5ncyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBXZWJBc3NldFBhZ2VGZXRjaFJlcXVlc3QsIFdlYkltYWdlRmV0Y2hSZXF1ZXN0LCBXZWJJbWFnZUZldGNoUmVzdWx0IH0gZnJvbSBcIi4vc3JjL2ZldGNoLnRzXCI7XG5leHBvcnQgeyBXZWJTZWFyY2hQbHVnaW4sIHdlYlNlYXJjaCB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB7IFdlYlNlYXJjaFByb3ZpZGVyU3BlY1NjaGVtYSwgV0VCX1NFQVJDSF9QUk9WSURFUlMgfSBmcm9tIFwiLi9zcmMvcHJvdmlkZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgV2ViU2VhcmNoUHJvdmlkZXIsIFdlYlNlYXJjaFByb3ZpZGVyU3BlYyB9IGZyb20gXCIuL3NyYy9wcm92aWRlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBXZWJTZWFyY2hFeGVjdXRvciwgV2ViU2VhcmNoUnVudGltZSwgV2ViU2VhcmNoUnVudGltZUlucHV0IH0gZnJvbSBcIi4vc3JjL3J1bnRpbWUudHNcIjtcbmV4cG9ydCB7IFdFQl9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTiwgV0VCX0ZFVENIX1RPT0xfREVTQ1JJUFRJT04sIHdlYlNlYXJjaFJlcXVlc3RTY2hlbWEsIHdlYlNlYXJjaFRvb2xSZXF1ZXN0U2NoZW1hLCB3ZWJTZWFyY2hDaXRhdGlvblNjaGVtYSwgd2ViU2VhcmNoUmVzdWx0U2NoZW1hLCB3ZWJGZXRjaFJlcXVlc3RTY2hlbWEsIHdlYkZldGNoUmVzdWx0U2NoZW1hIH0gZnJvbSBcIi4vc3JjL3NjaGVtYS50c1wiO1xuZXhwb3J0IHR5cGUgeyBXZWJTZWFyY2hSZXF1ZXN0LCBXZWJTZWFyY2hUb29sUmVxdWVzdCwgV2ViU2VhcmNoQ2l0YXRpb24sIFdlYlNlYXJjaFJlc3VsdCwgV2ViRmV0Y2hSZXF1ZXN0LCBXZWJGZXRjaFJlc3VsdCB9IGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCB0eXBlIHsgV2ViU2VhcmNoQ29udGV4dCwgV2ViU2VhcmNoTW9kZWxTZWxlY3Rpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NlYXJjaC50c1wiO1xuZXhwb3J0IHR5cGUgeyBXZWJTZWFyY2hUb29sT3B0aW9ucyB9IGZyb20gXCIuL3NyYy90b29sLnRzXCI7XG4iXX0=
|
package/lib/src/fetch.d.ts
CHANGED
|
@@ -16,6 +16,29 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { type WebSearchRuntimeInput } from "./runtime.ts";
|
|
18
18
|
import type { WebFetchRequest, WebFetchResult } from "./schema.ts";
|
|
19
|
+
/** Input for a policy-checked HTML fetch used by in-process asset discovery. */
|
|
20
|
+
export interface WebAssetPageFetchRequest {
|
|
21
|
+
/** Public HTTPS page URL. */
|
|
22
|
+
url: string;
|
|
23
|
+
/** Maximum returned markup length. Defaults to 1.5 million characters. */
|
|
24
|
+
maxLength?: number;
|
|
25
|
+
}
|
|
26
|
+
/** Input for a policy-checked binary image fetch. */
|
|
27
|
+
export interface WebImageFetchRequest {
|
|
28
|
+
/** Public HTTPS image URL. */
|
|
29
|
+
url: string;
|
|
30
|
+
/** Maximum accepted response size. Defaults to 5 MiB. */
|
|
31
|
+
maxBytes?: number;
|
|
32
|
+
}
|
|
33
|
+
/** Binary image fetched through the web-search runtime's URL policy. */
|
|
34
|
+
export interface WebImageFetchResult {
|
|
35
|
+
/** Final URL after redirects. */
|
|
36
|
+
url: string;
|
|
37
|
+
/** Image media type returned by the server. */
|
|
38
|
+
contentType: string;
|
|
39
|
+
/** Fetched image bytes. */
|
|
40
|
+
data: Uint8Array;
|
|
41
|
+
}
|
|
19
42
|
/**
|
|
20
43
|
* Fetch a single URL and return its content in the requested format.
|
|
21
44
|
*
|
|
@@ -25,3 +48,11 @@ import type { WebFetchRequest, WebFetchResult } from "./schema.ts";
|
|
|
25
48
|
* `signal` cancels the in-flight fetch.
|
|
26
49
|
*/
|
|
27
50
|
export declare function runWebFetch(request: WebFetchRequest, runtimeOrConfig: WebSearchRuntimeInput, signal?: AbortSignal): Promise<WebFetchResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Fetch bounded raw markup for deterministic in-process asset discovery.
|
|
53
|
+
*
|
|
54
|
+
* This does not widen the model-facing `web_fetch` cap.
|
|
55
|
+
*/
|
|
56
|
+
export declare function runWebAssetPageFetch(request: WebAssetPageFetchRequest, runtimeOrConfig: WebSearchRuntimeInput, signal?: AbortSignal): Promise<WebFetchResult>;
|
|
57
|
+
/** Fetch one public image while preserving URL policy, timeout, and redirect checks. */
|
|
58
|
+
export declare function runWebImageFetch(request: WebImageFetchRequest, runtimeOrConfig: WebSearchRuntimeInput, signal?: AbortSignal): Promise<WebImageFetchResult>;
|
package/lib/src/fetch.js
CHANGED
|
@@ -19,8 +19,10 @@ import { gotScraping } from "got-scraping";
|
|
|
19
19
|
import { assertFetchUrlAllowed } from "./_fetch-url.js";
|
|
20
20
|
import { toCallSettings, webFetchExecuteDefaults } from "./defaults.js";
|
|
21
21
|
import { decodeHtmlEntities, htmlToText } from "./html-text.js";
|
|
22
|
-
import { executeRead, toWebSearchRuntime } from "./runtime.js";
|
|
22
|
+
import { executeRead, toWebSearchRuntime, } from "./runtime.js";
|
|
23
23
|
const logger = log.logger("web-search/fetch");
|
|
24
|
+
const DEFAULT_IMAGE_MAX_BYTES = 5 * 1024 * 1024;
|
|
25
|
+
const DEFAULT_ASSET_PAGE_MAX_LENGTH = 1_500_000;
|
|
24
26
|
/** Pull the <title> text out of an HTML document, when present. */
|
|
25
27
|
function extractTitle(html) {
|
|
26
28
|
const match = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(html);
|
|
@@ -33,29 +35,18 @@ function truncate(text, max) {
|
|
|
33
35
|
return { content: text, truncated: false };
|
|
34
36
|
return { content: text.slice(0, max), truncated: true };
|
|
35
37
|
}
|
|
36
|
-
/**
|
|
37
|
-
|
|
38
|
-
*
|
|
39
|
-
* Throws when the URL is not permitted by the allow-list (the visible,
|
|
40
|
-
* correctable failure the design calls for on the fetch path). The request's
|
|
41
|
-
* `maxLength` narrows (never widens) the plugin's `fetchMaxLength` cap.
|
|
42
|
-
* `signal` cancels the in-flight fetch.
|
|
43
|
-
*/
|
|
44
|
-
export async function runWebFetch(request, runtimeOrConfig, signal) {
|
|
45
|
-
const runtime = toWebSearchRuntime(runtimeOrConfig);
|
|
38
|
+
/** Fetch and cache one raw page before caller-specific output reduction. */
|
|
39
|
+
async function fetchPage(requestUrl, runtime, signal) {
|
|
46
40
|
const { config } = runtime;
|
|
47
|
-
await assertFetchUrlAllowed(
|
|
48
|
-
const cap = Math.min(request.maxLength ?? config.fetchMaxLength, config.fetchMaxLength);
|
|
49
|
-
// The response is cached before the format reduction, so the same page read
|
|
50
|
-
// as text and as html shares one network round trip.
|
|
41
|
+
await assertFetchUrlAllowed(requestUrl, config.allowList);
|
|
51
42
|
const page = await executeRead(runtime, "page-fetch", toCallSettings(webFetchExecuteDefaults, config.timeoutMs, [
|
|
52
43
|
"web-search",
|
|
53
44
|
"fetch",
|
|
54
|
-
|
|
45
|
+
requestUrl,
|
|
55
46
|
...config.allowList.patterns,
|
|
56
47
|
]), async (executeSignal) => {
|
|
57
48
|
const response = await gotScraping({
|
|
58
|
-
url:
|
|
49
|
+
url: requestUrl,
|
|
59
50
|
// Bun's node:http2 reports default-port origins with :443 while
|
|
60
51
|
// http2-wrapper compares them against URL-normalized origins.
|
|
61
52
|
http2: false,
|
|
@@ -74,13 +65,28 @@ export async function runWebFetch(request, runtimeOrConfig, signal) {
|
|
|
74
65
|
...(executeSignal ? { signal: executeSignal } : {}),
|
|
75
66
|
});
|
|
76
67
|
return {
|
|
77
|
-
url: response.url ??
|
|
68
|
+
url: response.url ?? requestUrl,
|
|
78
69
|
statusCode: response.statusCode,
|
|
79
70
|
contentType: response.headers["content-type"],
|
|
80
71
|
body: typeof response.body === "string" ? response.body : String(response.body ?? ""),
|
|
81
72
|
};
|
|
82
73
|
}, signal);
|
|
83
74
|
await assertFetchUrlAllowed(page.url, config.allowList);
|
|
75
|
+
return page;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Fetch a single URL and return its content in the requested format.
|
|
79
|
+
*
|
|
80
|
+
* Throws when the URL is not permitted by the allow-list (the visible,
|
|
81
|
+
* correctable failure the design calls for on the fetch path). The request's
|
|
82
|
+
* `maxLength` narrows (never widens) the plugin's `fetchMaxLength` cap.
|
|
83
|
+
* `signal` cancels the in-flight fetch.
|
|
84
|
+
*/
|
|
85
|
+
export async function runWebFetch(request, runtimeOrConfig, signal) {
|
|
86
|
+
const runtime = toWebSearchRuntime(runtimeOrConfig);
|
|
87
|
+
const { config } = runtime;
|
|
88
|
+
const cap = Math.min(request.maxLength ?? config.fetchMaxLength, config.fetchMaxLength);
|
|
89
|
+
const page = await fetchPage(request.url, runtime, signal);
|
|
84
90
|
const isHtml = !page.contentType || /html|xml/i.test(page.contentType);
|
|
85
91
|
const rawContent = request.format === "html" || !isHtml ? page.body : htmlToText(page.body);
|
|
86
92
|
const { content, truncated } = truncate(rawContent, cap);
|
|
@@ -101,4 +107,72 @@ export async function runWebFetch(request, runtimeOrConfig, signal) {
|
|
|
101
107
|
truncated,
|
|
102
108
|
};
|
|
103
109
|
}
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmV0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBOEIsTUFBTSxjQUFjLENBQUM7QUFHM0YsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBVTlDLG1FQUFtRTtBQUNuRSxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RCxNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRSxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLFNBQVMsUUFBUSxDQUFDLElBQVksRUFBRSxHQUFXO0lBQ3pDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHO1FBQUUsT0FBTyxFQUFF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SSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVGLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUUzRCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtRQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7UUFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7UUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtRQUN2QixRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDeEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUMxQyxDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1FBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVO1FBQ3ZCLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0IsT0FBTztRQUNQLFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFnZSBmZXRjaGluZyBvdmVyIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9nb3Qtc2NyYXBpbmcgfCBnb3Qtc2NyYXBpbmd9XG4gKiAtIGEgYGdvdGAgd3JhcHBlciB0aGF0IGdlbmVyYXRlcyBicm93c2VyLWxpa2UgVExTICsgaGVhZGVyIGZpbmdlcnByaW50cywgc29cbiAqIGZldGNoZXMgc3Vydml2ZSB0aGUgYm90IHdhbGxzIGEgcGxhaW4gYGZldGNoYCB0cmlwcy4ge0BsaW5rIHJ1bldlYkZldGNofVxuICogZW5mb3JjZXMgdGhlIFVSTCBhbGxvdy1saXN0IChhbiBleHBsaWNpdCBmZXRjaCBvZiBhIGRpc2FsbG93ZWQgVVJMIGlzXG4gKiByZWZ1c2VkLCBub3Qgc2lsZW50bHkgZW1wdGllZCksIGZldGNoZXMgd2l0aCB0aGUgcGx1Z2luJ3MgdGltZW91dCwgYW5kXG4gKiByZXR1cm5zIGVpdGhlciB0aGUgcmF3IEhUTUwgb3IgYSByZWFkYWJsZSBwbGFpbi10ZXh0IHJlZHVjdGlvbiwgY2FwcGVkIGF0XG4gKiB0aGUgY29uZmlndXJlZCBsZW5ndGguXG4gKlxuICogVGhlIEhUTUwtdG8tdGV4dCByZWR1Y3Rpb24gaXMgZGVsaWJlcmF0ZWx5IGRlcGVuZGVuY3ktZnJlZSAoc3RyaXBcbiAqIHNjcmlwdC9zdHlsZSwgdW53cmFwIHRhZ3MsIGRlY29kZSBhIGhhbmRmdWwgb2YgZW50aXRpZXMsIGNvbGxhcHNlXG4gKiB3aGl0ZXNwYWNlKTogZ29vZCBlbm91Z2ggdG8gZmVlZCBhIG1vZGVsLCBhbmQgaXQga2VlcHMgdGhlIGFkZC1vbidzXG4gKiBkZXBlbmRlbmN5IHN1cmZhY2UgdG8gdGhlIHR3byBsaWJyYXJpZXMgdGhlIHRhc2sgY2FsbGVkIGZvci5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGdvdFNjcmFwaW5nIH0gZnJvbSBcImdvdC1zY3JhcGluZ1wiO1xuaW1wb3J0IHsgYXNzZXJ0RmV0Y2hVcmxBbGxvd2VkIH0gZnJvbSBcIi4vX2ZldGNoLXVybC50c1wiO1xuaW1wb3J0IHsgdG9DYWxsU2V0dGluZ3MsIHdlYkZldGNoRXhlY3V0ZURlZmF1bHRzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IGRlY29kZUh0bWxFbnRpdGllcywgaHRtbFRvVGV4dCB9IGZyb20gXCIuL2h0bWwtdGV4dC50c1wiO1xuaW1wb3J0IHsgZXhlY3V0ZVJlYWQsIHRvV2ViU2VhcmNoUnVudGltZSwgdHlwZSBXZWJTZWFyY2hSdW50aW1lSW5wdXQgfSBmcm9tIFwiLi9ydW50aW1lLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdlYkZldGNoUmVxdWVzdCwgV2ViRmV0Y2hSZXN1bHQgfSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIndlYi1zZWFyY2gvZmV0Y2hcIik7XG5cbi8qKiBUaGUgc2xpY2Ugb2YgYSBnb3Qtc2NyYXBpbmcgcmVzcG9uc2UgdGhpcyBtb2R1bGUgcmVhZHMuICovXG5pbnRlcmZhY2UgRmV0Y2hlZFBhZ2Uge1xuICB1cmw6IHN0cmluZztcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBjb250ZW50VHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBib2R5OiBzdHJpbmc7XG59XG5cbi8qKiBQdWxsIHRoZSA8dGl0bGU+IHRleHQgb3V0IG9mIGFuIEhUTUwgZG9jdW1lbnQsIHdoZW4gcHJlc2VudC4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUaXRsZShodG1sOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IC88dGl0bGVbXj5dKj4oW1xcc1xcU10qPyk8XFwvdGl0bGU+L2kuZXhlYyhodG1sKTtcbiAgY29uc3QgdGl0bGUgPSBtYXRjaD8uWzFdID8gZGVjb2RlSHRtbEVudGl0aWVzKG1hdGNoWzFdKS50cmltKCkgOiBcIlwiO1xuICByZXR1cm4gdGl0bGUubGVuZ3RoID4gMCA/IHRpdGxlIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVHJ1bmNhdGUgYHRleHRgIHRvIGBtYXhgIGNoYXJzLCByZXBvcnRpbmcgd2hldGhlciBpdCB3YXMgY3V0LiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGUodGV4dDogc3RyaW5nLCBtYXg6IG51bWJlcik6IHsgY29udGVudDogc3RyaW5nOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfSB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXgpIHJldHVybiB7IGNvbnRlbnQ6IHRleHQsIHRydW5jYXRlZDogZmFsc2UgfTtcbiAgcmV0dXJuIHsgY29udGVudDogdGV4dC5zbGljZSgwLCBtYXgpLCB0cnVuY2F0ZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBGZXRjaCBhIHNpbmdsZSBVUkwgYW5kIHJldHVybiBpdHMgY29udGVudCBpbiB0aGUgcmVxdWVzdGVkIGZvcm1hdC5cbiAqXG4gKiBUaHJvd3Mgd2hlbiB0aGUgVVJMIGlzIG5vdCBwZXJtaXR0ZWQgYnkgdGhlIGFsbG93LWxpc3QgKHRoZSB2aXNpYmxlLFxuICogY29ycmVjdGFibGUgZmFpbHVyZSB0aGUgZGVzaWduIGNhbGxzIGZvciBvbiB0aGUgZmV0Y2ggcGF0aCkuIFRoZSByZXF1ZXN0J3NcbiAqIGBtYXhMZW5ndGhgIG5hcnJvd3MgKG5ldmVyIHdpZGVucykgdGhlIHBsdWdpbidzIGBmZXRjaE1heExlbmd0aGAgY2FwLlxuICogYHNpZ25hbGAgY2FuY2VscyB0aGUgaW4tZmxpZ2h0IGZldGNoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2ViRmV0Y2goXG4gIHJlcXVlc3Q6IFdlYkZldGNoUmVxdWVzdCxcbiAgcnVudGltZU9yQ29uZmlnOiBXZWJTZWFyY2hSdW50aW1lSW5wdXQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxXZWJGZXRjaFJlc3VsdD4ge1xuICBjb25zdCBydW50aW1lID0gdG9XZWJTZWFyY2hSdW50aW1lKHJ1bnRpbWVPckNvbmZpZyk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBhd2FpdCBhc3NlcnRGZXRjaFVybEFsbG93ZWQocmVxdWVzdC51cmwsIGNvbmZpZy5hbGxvd0xpc3QpO1xuICBjb25zdCBjYXAgPSBNYXRoLm1pbihyZXF1ZXN0Lm1heExlbmd0aCA/PyBjb25maWcuZmV0Y2hNYXhMZW5ndGgsIGNvbmZpZy5mZXRjaE1heExlbmd0aCk7XG5cbiAgLy8gVGhlIHJlc3BvbnNlIGlzIGNhY2hlZCBiZWZvcmUgdGhlIGZvcm1hdCByZWR1Y3Rpb24sIHNvIHRoZSBzYW1lIHBhZ2UgcmVhZFxuICAvLyBhcyB0ZXh0IGFuZCBhcyBodG1sIHNoYXJlcyBvbmUgbmV0d29yayByb3VuZCB0cmlwLlxuICBjb25zdCBwYWdlID0gYXdhaXQgZXhlY3V0ZVJlYWQoXG4gICAgcnVudGltZSxcbiAgICBcInBhZ2UtZmV0Y2hcIixcbiAgICB0b0NhbGxTZXR0aW5ncyh3ZWJGZXRjaEV4ZWN1dGVEZWZhdWx0cywgY29uZmlnLnRpbWVvdXRNcywgW1xuICAgICAgXCJ3ZWItc2VhcmNoXCIsXG4gICAgICBcImZldGNoXCIsXG4gICAgICByZXF1ZXN0LnVybCxcbiAgICAgIC4uLmNvbmZpZy5hbGxvd0xpc3QucGF0dGVybnMsXG4gICAgXSksXG4gICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpOiBQcm9taXNlPEZldGNoZWRQYWdlPiA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdvdFNjcmFwaW5nKHtcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgLy8gQnVuJ3Mgbm9kZTpodHRwMiByZXBvcnRzIGRlZmF1bHQtcG9ydCBvcmlnaW5zIHdpdGggOjQ0MyB3aGlsZVxuICAgICAgICAvLyBodHRwMi13cmFwcGVyIGNvbXBhcmVzIHRoZW0gYWdhaW5zdCBVUkwtbm9ybWFsaXplZCBvcmlnaW5zLlxuICAgICAgICBodHRwMjogZmFsc2UsXG4gICAgICAgIC8vIGdvdCdzIG93biB0aW1lb3V0IGFib3J0cyB0aGUgc29ja2V0IGFuZCByZXBvcnRzIHdoaWNoIHBoYXNlIHRpbWVkXG4gICAgICAgIC8vIG91dDsgdGhlIGludGVyY2VwdG9yIHRpbWVvdXQgYm91bmRzIHRoZSB3aG9sZSBhdHRlbXB0IGFyb3VuZCBpdC5cbiAgICAgICAgdGltZW91dDogeyByZXF1ZXN0OiBjb25maWcudGltZW91dE1zIH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICAgIGZvbGxvd1JlZGlyZWN0OiB0cnVlLFxuICAgICAgICBob29rczoge1xuICAgICAgICAgIGJlZm9yZVJlcXVlc3Q6IFtcbiAgICAgICAgICAgIGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgIGF3YWl0IGFzc2VydEZldGNoVXJsQWxsb3dlZChTdHJpbmcob3B0aW9ucy51cmwpLCBjb25maWcuYWxsb3dMaXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCA/PyByZXF1ZXN0LnVybCxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSxcbiAgICAgICAgY29udGVudFR5cGU6IHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0sXG4gICAgICAgIGJvZHk6IHR5cGVvZiByZXNwb25zZS5ib2R5ID09PSBcInN0cmluZ1wiID8gcmVzcG9uc2UuYm9keSA6IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/IFwiXCIpLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHNpZ25hbCxcbiAgKTtcbiAgYXdhaXQgYXNzZXJ0RmV0Y2hVcmxBbGxvd2VkKHBhZ2UudXJsLCBjb25maWcuYWxsb3dMaXN0KTtcblxuICBjb25zdCBpc0h0bWwgPSAhcGFnZS5jb250ZW50VHlwZSB8fCAvaHRtbHx4bWwvaS50ZXN0KHBhZ2UuY29udGVudFR5cGUpO1xuICBjb25zdCByYXdDb250ZW50ID0gcmVxdWVzdC5mb3JtYXQgPT09IFwiaHRtbFwiIHx8ICFpc0h0bWwgPyBwYWdlLmJvZHkgOiBodG1sVG9UZXh0KHBhZ2UuYm9keSk7XG4gIGNvbnN0IHsgY29udGVudCwgdHJ1bmNhdGVkIH0gPSB0cnVuY2F0ZShyYXdDb250ZW50LCBjYXApO1xuICBjb25zdCB0aXRsZSA9IGlzSHRtbCA/IGV4dHJhY3RUaXRsZShwYWdlLmJvZHkpIDogdW5kZWZpbmVkO1xuXG4gIGxvZ2dlci5kZWJ1ZyhcImZldGNoZWRcIiwge1xuICAgIHVybDogcGFnZS51cmwsXG4gICAgc3RhdHVzOiBwYWdlLnN0YXR1c0NvZGUsXG4gICAgYnl0ZXM6IHBhZ2UuYm9keS5sZW5ndGgsXG4gICAgcmV0dXJuZWQ6IGNvbnRlbnQubGVuZ3RoLFxuICAgIC4uLih0cnVuY2F0ZWQgPyB7IHRydW5jYXRlZDogdHJ1ZSB9IDoge30pLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHVybDogcGFnZS51cmwsXG4gICAgc3RhdHVzOiBwYWdlLnN0YXR1c0NvZGUsXG4gICAgLi4uKHBhZ2UuY29udGVudFR5cGUgPyB7IGNvbnRlbnRUeXBlOiBwYWdlLmNvbnRlbnRUeXBlIH0gOiB7fSksXG4gICAgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pLFxuICAgIGNvbnRlbnQsXG4gICAgdHJ1bmNhdGVkLFxuICB9O1xufVxuIl19
|
|
110
|
+
/**
|
|
111
|
+
* Fetch bounded raw markup for deterministic in-process asset discovery.
|
|
112
|
+
*
|
|
113
|
+
* This does not widen the model-facing `web_fetch` cap.
|
|
114
|
+
*/
|
|
115
|
+
export async function runWebAssetPageFetch(request, runtimeOrConfig, signal) {
|
|
116
|
+
const runtime = toWebSearchRuntime(runtimeOrConfig);
|
|
117
|
+
const cap = Math.min(Math.max(1, request.maxLength ?? DEFAULT_ASSET_PAGE_MAX_LENGTH), DEFAULT_ASSET_PAGE_MAX_LENGTH);
|
|
118
|
+
const page = await fetchPage(request.url, runtime, signal);
|
|
119
|
+
const { content, truncated } = truncate(page.body, cap);
|
|
120
|
+
const title = extractTitle(page.body);
|
|
121
|
+
return {
|
|
122
|
+
url: page.url,
|
|
123
|
+
status: page.statusCode,
|
|
124
|
+
...(page.contentType ? { contentType: page.contentType } : {}),
|
|
125
|
+
...(title ? { title } : {}),
|
|
126
|
+
content,
|
|
127
|
+
truncated,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** Fetch one public image while preserving URL policy, timeout, and redirect checks. */
|
|
131
|
+
export async function runWebImageFetch(request, runtimeOrConfig, signal) {
|
|
132
|
+
const runtime = toWebSearchRuntime(runtimeOrConfig);
|
|
133
|
+
const { config } = runtime;
|
|
134
|
+
const maxBytes = Math.max(1, request.maxBytes ?? DEFAULT_IMAGE_MAX_BYTES);
|
|
135
|
+
await assertFetchUrlAllowed(request.url, config.allowList);
|
|
136
|
+
const page = await executeRead(runtime, "image-fetch", {
|
|
137
|
+
default: {
|
|
138
|
+
cache: { enabled: false },
|
|
139
|
+
retry: { enabled: true, attempts: 2 },
|
|
140
|
+
timeout: config.timeoutMs,
|
|
141
|
+
},
|
|
142
|
+
}, async (executeSignal) => {
|
|
143
|
+
const response = await gotScraping({
|
|
144
|
+
url: request.url,
|
|
145
|
+
responseType: "buffer",
|
|
146
|
+
http2: false,
|
|
147
|
+
timeout: { request: config.timeoutMs },
|
|
148
|
+
throwHttpErrors: true,
|
|
149
|
+
followRedirect: true,
|
|
150
|
+
hooks: {
|
|
151
|
+
beforeRequest: [
|
|
152
|
+
async (options) => {
|
|
153
|
+
await assertFetchUrlAllowed(String(options.url), config.allowList);
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
},
|
|
157
|
+
...(executeSignal ? { signal: executeSignal } : {}),
|
|
158
|
+
});
|
|
159
|
+
const contentType = String(response.headers["content-type"] ?? "")
|
|
160
|
+
.split(";")[0]
|
|
161
|
+
.trim()
|
|
162
|
+
.toLowerCase();
|
|
163
|
+
if (!contentType.startsWith("image/")) {
|
|
164
|
+
throw new TypeError(`Expected an image response, received ${contentType || "unknown"}`);
|
|
165
|
+
}
|
|
166
|
+
if (response.body.byteLength > maxBytes) {
|
|
167
|
+
throw new RangeError(`Image response exceeds ${maxBytes} bytes`);
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
url: response.url ?? request.url,
|
|
171
|
+
contentType,
|
|
172
|
+
data: new Uint8Array(response.body),
|
|
173
|
+
};
|
|
174
|
+
}, signal, false);
|
|
175
|
+
await assertFetchUrlAllowed(page.url, config.allowList);
|
|
176
|
+
return page;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmV0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUNMLFdBQVcsRUFDWCxrQkFBa0IsR0FHbkIsTUFBTSxjQUFjLENBQUM7QUFHdEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQzlDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSw2QkFBNkIsR0FBRyxTQUFTLENBQUM7QUFvQ2hELG1FQUFtRTtBQUNuRSxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RCxNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRSxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsb0VBQW9F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TSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNyRSxDQUFDO2lCQUNGO2FBQ0Y7WUFDRCxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3BELENBQUMsQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUMvRCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFFO2FBQ2QsSUFBSSxFQUFFO2FBQ04sV0FBVyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksU0FBUyxDQUFDLHdDQUF3QyxXQUFXLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksVUFBVSxDQUFDLDBCQUEwQixRQUFRLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFDRCxPQUFPO1lBQ0wsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUc7WUFDaEMsV0FBVztZQUNYLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3BDLENBQUM7SUFDSixDQUFDLEVBQ0QsTUFBTSxFQUNOLEtBQUssQ0FDTixDQUFDO0lBQ0YsTUFBTSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4RCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhZ2UgZmV0Y2hpbmcgb3ZlciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZ290LXNjcmFwaW5nIHwgZ290LXNjcmFwaW5nfVxuICogLSBhIGBnb3RgIHdyYXBwZXIgdGhhdCBnZW5lcmF0ZXMgYnJvd3Nlci1saWtlIFRMUyArIGhlYWRlciBmaW5nZXJwcmludHMsIHNvXG4gKiBmZXRjaGVzIHN1cnZpdmUgdGhlIGJvdCB3YWxscyBhIHBsYWluIGBmZXRjaGAgdHJpcHMuIHtAbGluayBydW5XZWJGZXRjaH1cbiAqIGVuZm9yY2VzIHRoZSBVUkwgYWxsb3ctbGlzdCAoYW4gZXhwbGljaXQgZmV0Y2ggb2YgYSBkaXNhbGxvd2VkIFVSTCBpc1xuICogcmVmdXNlZCwgbm90IHNpbGVudGx5IGVtcHRpZWQpLCBmZXRjaGVzIHdpdGggdGhlIHBsdWdpbidzIHRpbWVvdXQsIGFuZFxuICogcmV0dXJucyBlaXRoZXIgdGhlIHJhdyBIVE1MIG9yIGEgcmVhZGFibGUgcGxhaW4tdGV4dCByZWR1Y3Rpb24sIGNhcHBlZCBhdFxuICogdGhlIGNvbmZpZ3VyZWQgbGVuZ3RoLlxuICpcbiAqIFRoZSBIVE1MLXRvLXRleHQgcmVkdWN0aW9uIGlzIGRlbGliZXJhdGVseSBkZXBlbmRlbmN5LWZyZWUgKHN0cmlwXG4gKiBzY3JpcHQvc3R5bGUsIHVud3JhcCB0YWdzLCBkZWNvZGUgYSBoYW5kZnVsIG9mIGVudGl0aWVzLCBjb2xsYXBzZVxuICogd2hpdGVzcGFjZSk6IGdvb2QgZW5vdWdoIHRvIGZlZWQgYSBtb2RlbCwgYW5kIGl0IGtlZXBzIHRoZSBhZGQtb24nc1xuICogZGVwZW5kZW5jeSBzdXJmYWNlIHRvIHRoZSB0d28gbGlicmFyaWVzIHRoZSB0YXNrIGNhbGxlZCBmb3IuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBnb3RTY3JhcGluZyB9IGZyb20gXCJnb3Qtc2NyYXBpbmdcIjtcbmltcG9ydCB7IGFzc2VydEZldGNoVXJsQWxsb3dlZCB9IGZyb20gXCIuL19mZXRjaC11cmwudHNcIjtcbmltcG9ydCB7IHRvQ2FsbFNldHRpbmdzLCB3ZWJGZXRjaEV4ZWN1dGVEZWZhdWx0cyB9IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5pbXBvcnQgeyBkZWNvZGVIdG1sRW50aXRpZXMsIGh0bWxUb1RleHQgfSBmcm9tIFwiLi9odG1sLXRleHQudHNcIjtcbmltcG9ydCB7XG4gIGV4ZWN1dGVSZWFkLFxuICB0b1dlYlNlYXJjaFJ1bnRpbWUsXG4gIHR5cGUgV2ViU2VhcmNoUnVudGltZSxcbiAgdHlwZSBXZWJTZWFyY2hSdW50aW1lSW5wdXQsXG59IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB0eXBlIHsgV2ViRmV0Y2hSZXF1ZXN0LCBXZWJGZXRjaFJlc3VsdCB9IGZyb20gXCIuL3NjaGVtYS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwid2ViLXNlYXJjaC9mZXRjaFwiKTtcbmNvbnN0IERFRkFVTFRfSU1BR0VfTUFYX0JZVEVTID0gNSAqIDEwMjQgKiAxMDI0O1xuY29uc3QgREVGQVVMVF9BU1NFVF9QQUdFX01BWF9MRU5HVEggPSAxXzUwMF8wMDA7XG5cbi8qKiBJbnB1dCBmb3IgYSBwb2xpY3ktY2hlY2tlZCBIVE1MIGZldGNoIHVzZWQgYnkgaW4tcHJvY2VzcyBhc3NldCBkaXNjb3ZlcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkFzc2V0UGFnZUZldGNoUmVxdWVzdCB7XG4gIC8qKiBQdWJsaWMgSFRUUFMgcGFnZSBVUkwuICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogTWF4aW11bSByZXR1cm5lZCBtYXJrdXAgbGVuZ3RoLiBEZWZhdWx0cyB0byAxLjUgbWlsbGlvbiBjaGFyYWN0ZXJzLiAqL1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG59XG5cbi8qKiBJbnB1dCBmb3IgYSBwb2xpY3ktY2hlY2tlZCBiaW5hcnkgaW1hZ2UgZmV0Y2guICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkltYWdlRmV0Y2hSZXF1ZXN0IHtcbiAgLyoqIFB1YmxpYyBIVFRQUyBpbWFnZSBVUkwuICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogTWF4aW11bSBhY2NlcHRlZCByZXNwb25zZSBzaXplLiBEZWZhdWx0cyB0byA1IE1pQi4gKi9cbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG59XG5cbi8qKiBCaW5hcnkgaW1hZ2UgZmV0Y2hlZCB0aHJvdWdoIHRoZSB3ZWItc2VhcmNoIHJ1bnRpbWUncyBVUkwgcG9saWN5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJJbWFnZUZldGNoUmVzdWx0IHtcbiAgLyoqIEZpbmFsIFVSTCBhZnRlciByZWRpcmVjdHMuICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogSW1hZ2UgbWVkaWEgdHlwZSByZXR1cm5lZCBieSB0aGUgc2VydmVyLiAqL1xuICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAvKiogRmV0Y2hlZCBpbWFnZSBieXRlcy4gKi9cbiAgZGF0YTogVWludDhBcnJheTtcbn1cblxuLyoqIFRoZSBzbGljZSBvZiBhIGdvdC1zY3JhcGluZyByZXNwb25zZSB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBGZXRjaGVkUGFnZSB7XG4gIHVybDogc3RyaW5nO1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIGNvbnRlbnRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGJvZHk6IHN0cmluZztcbn1cblxuLyoqIFB1bGwgdGhlIDx0aXRsZT4gdGV4dCBvdXQgb2YgYW4gSFRNTCBkb2N1bWVudCwgd2hlbiBwcmVzZW50LiAqL1xuZnVuY3Rpb24gZXh0cmFjdFRpdGxlKGh0bWw6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gLzx0aXRsZVtePl0qPihbXFxzXFxTXSo/KTxcXC90aXRsZT4vaS5leGVjKGh0bWwpO1xuICBjb25zdCB0aXRsZSA9IG1hdGNoPy5bMV0gPyBkZWNvZGVIdG1sRW50aXRpZXMobWF0Y2hbMV0pLnRyaW0oKSA6IFwiXCI7XG4gIHJldHVybiB0aXRsZS5sZW5ndGggPiAwID8gdGl0bGUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBUcnVuY2F0ZSBgdGV4dGAgdG8gYG1heGAgY2hhcnMsIHJlcG9ydGluZyB3aGV0aGVyIGl0IHdhcyBjdXQuICovXG5mdW5jdGlvbiB0cnVuY2F0ZSh0ZXh0OiBzdHJpbmcsIG1heDogbnVtYmVyKTogeyBjb250ZW50OiBzdHJpbmc7IHRydW5jYXRlZDogYm9vbGVhbiB9IHtcbiAgaWYgKHRleHQubGVuZ3RoIDw9IG1heCkgcmV0dXJuIHsgY29udGVudDogdGV4dCwgdHJ1bmNhdGVkOiBmYWxzZSB9O1xuICByZXR1cm4geyBjb250ZW50OiB0ZXh0LnNsaWNlKDAsIG1heCksIHRydW5jYXRlZDogdHJ1ZSB9O1xufVxuXG4vKiogRmV0Y2ggYW5kIGNhY2hlIG9uZSByYXcgcGFnZSBiZWZvcmUgY2FsbGVyLXNwZWNpZmljIG91dHB1dCByZWR1Y3Rpb24uICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaFBhZ2UoXG4gIHJlcXVlc3RVcmw6IHN0cmluZyxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEZldGNoZWRQYWdlPiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBhd2FpdCBhc3NlcnRGZXRjaFVybEFsbG93ZWQocmVxdWVzdFVybCwgY29uZmlnLmFsbG93TGlzdCk7XG4gIGNvbnN0IHBhZ2UgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwicGFnZS1mZXRjaFwiLFxuICAgIHRvQ2FsbFNldHRpbmdzKHdlYkZldGNoRXhlY3V0ZURlZmF1bHRzLCBjb25maWcudGltZW91dE1zLCBbXG4gICAgICBcIndlYi1zZWFyY2hcIixcbiAgICAgIFwiZmV0Y2hcIixcbiAgICAgIHJlcXVlc3RVcmwsXG4gICAgICAuLi5jb25maWcuYWxsb3dMaXN0LnBhdHRlcm5zLFxuICAgIF0pLFxuICAgIGFzeW5jIChleGVjdXRlU2lnbmFsKTogUHJvbWlzZTxGZXRjaGVkUGFnZT4gPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnb3RTY3JhcGluZyh7XG4gICAgICAgIHVybDogcmVxdWVzdFVybCxcbiAgICAgICAgLy8gQnVuJ3Mgbm9kZTpodHRwMiByZXBvcnRzIGRlZmF1bHQtcG9ydCBvcmlnaW5zIHdpdGggOjQ0MyB3aGlsZVxuICAgICAgICAvLyBodHRwMi13cmFwcGVyIGNvbXBhcmVzIHRoZW0gYWdhaW5zdCBVUkwtbm9ybWFsaXplZCBvcmlnaW5zLlxuICAgICAgICBodHRwMjogZmFsc2UsXG4gICAgICAgIC8vIGdvdCdzIG93biB0aW1lb3V0IGFib3J0cyB0aGUgc29ja2V0IGFuZCByZXBvcnRzIHdoaWNoIHBoYXNlIHRpbWVkXG4gICAgICAgIC8vIG91dDsgdGhlIGludGVyY2VwdG9yIHRpbWVvdXQgYm91bmRzIHRoZSB3aG9sZSBhdHRlbXB0IGFyb3VuZCBpdC5cbiAgICAgICAgdGltZW91dDogeyByZXF1ZXN0OiBjb25maWcudGltZW91dE1zIH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICAgIGZvbGxvd1JlZGlyZWN0OiB0cnVlLFxuICAgICAgICBob29rczoge1xuICAgICAgICAgIGJlZm9yZVJlcXVlc3Q6IFtcbiAgICAgICAgICAgIGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgIGF3YWl0IGFzc2VydEZldGNoVXJsQWxsb3dlZChTdHJpbmcob3B0aW9ucy51cmwpLCBjb25maWcuYWxsb3dMaXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCA/PyByZXF1ZXN0VXJsLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLFxuICAgICAgICBjb250ZW50VHlwZTogcmVzcG9uc2UuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSxcbiAgICAgICAgYm9keTogdHlwZW9mIHJlc3BvbnNlLmJvZHkgPT09IFwic3RyaW5nXCIgPyByZXNwb25zZS5ib2R5IDogU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gXCJcIiksXG4gICAgICB9O1xuICAgIH0sXG4gICAgc2lnbmFsLFxuICApO1xuICBhd2FpdCBhc3NlcnRGZXRjaFVybEFsbG93ZWQocGFnZS51cmwsIGNvbmZpZy5hbGxvd0xpc3QpO1xuICByZXR1cm4gcGFnZTtcbn1cblxuLyoqXG4gKiBGZXRjaCBhIHNpbmdsZSBVUkwgYW5kIHJldHVybiBpdHMgY29udGVudCBpbiB0aGUgcmVxdWVzdGVkIGZvcm1hdC5cbiAqXG4gKiBUaHJvd3Mgd2hlbiB0aGUgVVJMIGlzIG5vdCBwZXJtaXR0ZWQgYnkgdGhlIGFsbG93LWxpc3QgKHRoZSB2aXNpYmxlLFxuICogY29ycmVjdGFibGUgZmFpbHVyZSB0aGUgZGVzaWduIGNhbGxzIGZvciBvbiB0aGUgZmV0Y2ggcGF0aCkuIFRoZSByZXF1ZXN0J3NcbiAqIGBtYXhMZW5ndGhgIG5hcnJvd3MgKG5ldmVyIHdpZGVucykgdGhlIHBsdWdpbidzIGBmZXRjaE1heExlbmd0aGAgY2FwLlxuICogYHNpZ25hbGAgY2FuY2VscyB0aGUgaW4tZmxpZ2h0IGZldGNoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2ViRmV0Y2goXG4gIHJlcXVlc3Q6IFdlYkZldGNoUmVxdWVzdCxcbiAgcnVudGltZU9yQ29uZmlnOiBXZWJTZWFyY2hSdW50aW1lSW5wdXQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxXZWJGZXRjaFJlc3VsdD4ge1xuICBjb25zdCBydW50aW1lID0gdG9XZWJTZWFyY2hSdW50aW1lKHJ1bnRpbWVPckNvbmZpZyk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBjYXAgPSBNYXRoLm1pbihyZXF1ZXN0Lm1heExlbmd0aCA/PyBjb25maWcuZmV0Y2hNYXhMZW5ndGgsIGNvbmZpZy5mZXRjaE1heExlbmd0aCk7XG4gIGNvbnN0IHBhZ2UgPSBhd2FpdCBmZXRjaFBhZ2UocmVxdWVzdC51cmwsIHJ1bnRpbWUsIHNpZ25hbCk7XG5cbiAgY29uc3QgaXNIdG1sID0gIXBhZ2UuY29udGVudFR5cGUgfHwgL2h0bWx8eG1sL2kudGVzdChwYWdlLmNvbnRlbnRUeXBlKTtcbiAgY29uc3QgcmF3Q29udGVudCA9IHJlcXVlc3QuZm9ybWF0ID09PSBcImh0bWxcIiB8fCAhaXNIdG1sID8gcGFnZS5ib2R5IDogaHRtbFRvVGV4dChwYWdlLmJvZHkpO1xuICBjb25zdCB7IGNvbnRlbnQsIHRydW5jYXRlZCB9ID0gdHJ1bmNhdGUocmF3Q29udGVudCwgY2FwKTtcbiAgY29uc3QgdGl0bGUgPSBpc0h0bWwgPyBleHRyYWN0VGl0bGUocGFnZS5ib2R5KSA6IHVuZGVmaW5lZDtcblxuICBsb2dnZXIuZGVidWcoXCJmZXRjaGVkXCIsIHtcbiAgICB1cmw6IHBhZ2UudXJsLFxuICAgIHN0YXR1czogcGFnZS5zdGF0dXNDb2RlLFxuICAgIGJ5dGVzOiBwYWdlLmJvZHkubGVuZ3RoLFxuICAgIHJldHVybmVkOiBjb250ZW50Lmxlbmd0aCxcbiAgICAuLi4odHJ1bmNhdGVkID8geyB0cnVuY2F0ZWQ6IHRydWUgfSA6IHt9KSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICB1cmw6IHBhZ2UudXJsLFxuICAgIHN0YXR1czogcGFnZS5zdGF0dXNDb2RlLFxuICAgIC4uLihwYWdlLmNvbnRlbnRUeXBlID8geyBjb250ZW50VHlwZTogcGFnZS5jb250ZW50VHlwZSB9IDoge30pLFxuICAgIC4uLih0aXRsZSA/IHsgdGl0bGUgfSA6IHt9KSxcbiAgICBjb250ZW50LFxuICAgIHRydW5jYXRlZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBGZXRjaCBib3VuZGVkIHJhdyBtYXJrdXAgZm9yIGRldGVybWluaXN0aWMgaW4tcHJvY2VzcyBhc3NldCBkaXNjb3ZlcnkuXG4gKlxuICogVGhpcyBkb2VzIG5vdCB3aWRlbiB0aGUgbW9kZWwtZmFjaW5nIGB3ZWJfZmV0Y2hgIGNhcC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldlYkFzc2V0UGFnZUZldGNoKFxuICByZXF1ZXN0OiBXZWJBc3NldFBhZ2VGZXRjaFJlcXVlc3QsXG4gIHJ1bnRpbWVPckNvbmZpZzogV2ViU2VhcmNoUnVudGltZUlucHV0LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8V2ViRmV0Y2hSZXN1bHQ+IHtcbiAgY29uc3QgcnVudGltZSA9IHRvV2ViU2VhcmNoUnVudGltZShydW50aW1lT3JDb25maWcpO1xuICBjb25zdCBjYXAgPSBNYXRoLm1pbihcbiAgICBNYXRoLm1heCgxLCByZXF1ZXN0Lm1heExlbmd0aCA/PyBERUZBVUxUX0FTU0VUX1BBR0VfTUFYX0xFTkdUSCksXG4gICAgREVGQVVMVF9BU1NFVF9QQUdFX01BWF9MRU5HVEgsXG4gICk7XG4gIGNvbnN0IHBhZ2UgPSBhd2FpdCBmZXRjaFBhZ2UocmVxdWVzdC51cmwsIHJ1bnRpbWUsIHNpZ25hbCk7XG4gIGNvbnN0IHsgY29udGVudCwgdHJ1bmNhdGVkIH0gPSB0cnVuY2F0ZShwYWdlLmJvZHksIGNhcCk7XG4gIGNvbnN0IHRpdGxlID0gZXh0cmFjdFRpdGxlKHBhZ2UuYm9keSk7XG4gIHJldHVybiB7XG4gICAgdXJsOiBwYWdlLnVybCxcbiAgICBzdGF0dXM6IHBhZ2Uuc3RhdHVzQ29kZSxcbiAgICAuLi4ocGFnZS5jb250ZW50VHlwZSA/IHsgY29udGVudFR5cGU6IHBhZ2UuY29udGVudFR5cGUgfSA6IHt9KSxcbiAgICAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSksXG4gICAgY29udGVudCxcbiAgICB0cnVuY2F0ZWQsXG4gIH07XG59XG5cbi8qKiBGZXRjaCBvbmUgcHVibGljIGltYWdlIHdoaWxlIHByZXNlcnZpbmcgVVJMIHBvbGljeSwgdGltZW91dCwgYW5kIHJlZGlyZWN0IGNoZWNrcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XZWJJbWFnZUZldGNoKFxuICByZXF1ZXN0OiBXZWJJbWFnZUZldGNoUmVxdWVzdCxcbiAgcnVudGltZU9yQ29uZmlnOiBXZWJTZWFyY2hSdW50aW1lSW5wdXQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxXZWJJbWFnZUZldGNoUmVzdWx0PiB7XG4gIGNvbnN0IHJ1bnRpbWUgPSB0b1dlYlNlYXJjaFJ1bnRpbWUocnVudGltZU9yQ29uZmlnKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IG1heEJ5dGVzID0gTWF0aC5tYXgoMSwgcmVxdWVzdC5tYXhCeXRlcyA/PyBERUZBVUxUX0lNQUdFX01BWF9CWVRFUyk7XG4gIGF3YWl0IGFzc2VydEZldGNoVXJsQWxsb3dlZChyZXF1ZXN0LnVybCwgY29uZmlnLmFsbG93TGlzdCk7XG4gIGNvbnN0IHBhZ2UgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwiaW1hZ2UtZmV0Y2hcIixcbiAgICB7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNhY2hlOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgIHJldHJ5OiB7IGVuYWJsZWQ6IHRydWUsIGF0dGVtcHRzOiAyIH0sXG4gICAgICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0TXMsXG4gICAgICB9LFxuICAgIH0sXG4gICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ290U2NyYXBpbmcoe1xuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICByZXNwb25zZVR5cGU6IFwiYnVmZmVyXCIsXG4gICAgICAgIGh0dHAyOiBmYWxzZSxcbiAgICAgICAgdGltZW91dDogeyByZXF1ZXN0OiBjb25maWcudGltZW91dE1zIH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogdHJ1ZSxcbiAgICAgICAgZm9sbG93UmVkaXJlY3Q6IHRydWUsXG4gICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgYmVmb3JlUmVxdWVzdDogW1xuICAgICAgICAgICAgYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgYXNzZXJ0RmV0Y2hVcmxBbGxvd2VkKFN0cmluZyhvcHRpb25zLnVybCksIGNvbmZpZy5hbGxvd0xpc3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICAuLi4oZXhlY3V0ZVNpZ25hbCA/IHsgc2lnbmFsOiBleGVjdXRlU2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gU3RyaW5nKHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPz8gXCJcIilcbiAgICAgICAgLnNwbGl0KFwiO1wiKVswXSFcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICghY29udGVudFR5cGUuc3RhcnRzV2l0aChcImltYWdlL1wiKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhbiBpbWFnZSByZXNwb25zZSwgcmVjZWl2ZWQgJHtjb250ZW50VHlwZSB8fCBcInVua25vd25cIn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwb25zZS5ib2R5LmJ5dGVMZW5ndGggPiBtYXhCeXRlcykge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW1hZ2UgcmVzcG9uc2UgZXhjZWVkcyAke21heEJ5dGVzfSBieXRlc2ApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiByZXNwb25zZS51cmwgPz8gcmVxdWVzdC51cmwsXG4gICAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgICBkYXRhOiBuZXcgVWludDhBcnJheShyZXNwb25zZS5ib2R5KSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBzaWduYWwsXG4gICAgZmFsc2UsXG4gICk7XG4gIGF3YWl0IGFzc2VydEZldGNoVXJsQWxsb3dlZChwYWdlLnVybCwgY29uZmlnLmFsbG93TGlzdCk7XG4gIHJldHVybiBwYWdlO1xufVxuIl19
|
package/lib/src/plugin.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ import { type ToolRegistry } from "@databricks/appkit/beta";
|
|
|
19
19
|
import { ToolRegistryPlugin } from "@dbx-tools/appkit";
|
|
20
20
|
import type { AgentToolExecutionContext } from "@dbx-tools/appkit/tool-provider";
|
|
21
21
|
import { type WebSearchPluginConfig } from "./config.ts";
|
|
22
|
+
import { type WebAssetPageFetchRequest, type WebImageFetchRequest, type WebImageFetchResult } from "./fetch.ts";
|
|
22
23
|
import type { WebFetchRequest, WebFetchResult, WebSearchRequest, WebSearchResult } from "./schema.ts";
|
|
23
24
|
/**
|
|
24
25
|
* AppKit plugin that resolves and holds the web-search runtime config used
|
|
@@ -123,6 +124,10 @@ export declare class WebSearchPlugin extends ToolRegistryPlugin<WebSearchPluginC
|
|
|
123
124
|
* configured URL policy.
|
|
124
125
|
*/
|
|
125
126
|
fetch: (request: WebFetchRequest, signal?: AbortSignal) => Promise<WebFetchResult>;
|
|
127
|
+
/** Fetch expanded HTML for in-process asset discovery. */
|
|
128
|
+
fetchAssetPage: (request: WebAssetPageFetchRequest, signal?: AbortSignal) => Promise<WebFetchResult>;
|
|
129
|
+
/** Fetch one image for in-process visual research. */
|
|
130
|
+
fetchImage: (request: WebImageFetchRequest, signal?: AbortSignal) => Promise<WebImageFetchResult>;
|
|
126
131
|
};
|
|
127
132
|
private search;
|
|
128
133
|
private fetch;
|
package/lib/src/plugin.js
CHANGED
|
@@ -19,7 +19,7 @@ import { defineTool } from "@databricks/appkit/beta";
|
|
|
19
19
|
import { ToolRegistryPlugin } from "@dbx-tools/appkit";
|
|
20
20
|
import { log, stringUtils } from "@dbx-tools/shared-core";
|
|
21
21
|
import { MODEL_ENV, SERVING_ENDPOINT_ENV, WEB_SEARCH_CONFIG_SCHEMA, } from "./config.js";
|
|
22
|
-
import { runWebFetch } from "./fetch.js";
|
|
22
|
+
import { runWebAssetPageFetch, runWebFetch, runWebImageFetch, } from "./fetch.js";
|
|
23
23
|
import { createWebSearchRuntime } from "./runtime.js";
|
|
24
24
|
import { webFetchRequestSchema, webSearchToolRequestSchema, WEB_FETCH_TOOL_DESCRIPTION, WEB_SEARCH_TOOL_DESCRIPTION, } from "./schema.js";
|
|
25
25
|
import { resolveWebSearchContext, runWebSearch } from "./search.js";
|
|
@@ -181,6 +181,10 @@ export class WebSearchPlugin extends ToolRegistryPlugin {
|
|
|
181
181
|
* configured URL policy.
|
|
182
182
|
*/
|
|
183
183
|
fetch: (request, signal) => this.fetch(request, signal),
|
|
184
|
+
/** Fetch expanded HTML for in-process asset discovery. */
|
|
185
|
+
fetchAssetPage: (request, signal) => runWebAssetPageFetch(request, this.runtime, signal),
|
|
186
|
+
/** Fetch one image for in-process visual research. */
|
|
187
|
+
fetchImage: (request, signal) => runWebImageFetch(request, this.runtime, signal),
|
|
184
188
|
};
|
|
185
189
|
}
|
|
186
190
|
async search(request, signal, writeProgress) {
|
|
@@ -216,4 +220,4 @@ export class WebSearchPlugin extends ToolRegistryPlugin {
|
|
|
216
220
|
* ```
|
|
217
221
|
*/
|
|
218
222
|
export const webSearch = toPlugin(WebSearchPlugin);
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFFBQVEsR0FHVCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixFQUNwQix3QkFBd0IsR0FFekIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsc0JBQXNCLEVBQXlCLE1BQU0sY0FBYyxDQUFDO0FBQzdFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQiwyQkFBMkIsR0FDNUIsTUFBTSxhQUFhLENBQUM7QUFPckIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVwRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsSUFBSSxFQUFFLFlBQVksQ0FBQyxnQkFBZ0I7SUFDbkMsS0FBSyxFQUFFLHFCQUFxQjtJQUM1QixXQUFXLEVBQUUscUJBQXFCO0lBQ2xDLFdBQVcsRUFDVCx5RkFBeUY7UUFDekYsb0VBQW9FO0lBQ3RFLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRTtZQUNKLEdBQUcsRUFBRSxvQkFBb0I7WUFDekIs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QztJQUNoQyxDQUFDO0lBRVEsT0FBTztRQUNkLE9BQU87WUFDTDs7OztlQUlHO1lBQ0gsTUFBTSxFQUFFLENBQUMsT0FBeUIsRUFBRSxNQUFvQixFQUE0QixFQUFFLENBQ3BGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztZQUM5Qjs7O2VBR0c7WUFDSCxLQUFLLEVBQUUsQ0FBQyxPQUF3QixFQUFFLE1BQW9CLEVBQTJCLEVBQUUsQ0FDakYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO1NBQzlCLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLE1BQU0sQ0FDbEIsT0FBeUIsRUFDekIsTUFBb0IsRUFDcEIsYUFBMEQ7UUFFMUQsT0FBTyxZQUFZLENBQ2pCLE9BQU8sRUFDUCxJQUFJLENBQUMsT0FBTyxFQUNaLE1BQU0sdUJBQXVCLEVBQUUsRUFDL0IsTUFBTSxFQUNOLGFBQWEsQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBd0IsRUFBRSxNQUFvQjtRQUNoRSxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDOztBQUdIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIChyZWdpc3RlcmVkIG5hbWU6IGB3ZWItc2VhcmNoYCkgdGhhdCBvd25zIHRoZSByZXNvbHZlZFxuICogd2ViLXNlYXJjaCBydW50aW1lIC0gdGhlIFVSTCBwb2xpY3ksIHJlc3VsdCAvIGxlbmd0aCBjYXBzLCB0aW1lb3V0LCBhbmRcbiAqIGRlZmF1bHQgYXBwcm92YWwgZ2F0ZSBpdHMgdG9vbHMgcmVhZC4gUmVnaXN0ZXJpbmcgaXQgcmVzb2x2ZXMgYW5kIGxvZ3MgdGhlXG4gKiBlZmZlY3RpdmUgY29uZmlnICh3aGljaCBVUkwgcG9saWN5IGlzIGluIGZvcmNlLCB0aGUgY2Fwcykgc28gYVxuICogbWlzY29uZmlndXJhdGlvbiBpcyB2aXNpYmxlIGluIHRoZSBib290IGxvZ3MgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0XG4gKiBzZWFyY2guIFRoZSBwbHVnaW4ncyBgZXhlY3V0ZSgpYCBpcyBjYXB0dXJlZCBieSBpdHMgb3duIHJ1bnRpbWUgc28gZXZlcnlcbiAqIG91dGJvdW5kIGNhbGwgcGlja3MgdXAgQXBwS2l0J3MgY2FjaGUgLyByZXRyeSAvIHRpbWVvdXQgLyB0ZWxlbWV0cnkgY2hhaW4uXG4gKlxuICogVGhlIHBsdWdpbiBhbHNvIGltcGxlbWVudHMgQXBwS2l0J3MgYFRvb2xQcm92aWRlcmAsIHNvIGFuIEFwcEtpdCBhZ2VudCBnZXRzXG4gKiBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB3aXRob3V0IGdvaW5nIHRocm91Z2ggTWFzdHJhLiBBcHAtaW50ZWdyYXRlZFxuICogTWFzdHJhIGFnZW50cyBjb25zdW1lIHRoaXMgcHJvdmlkZXIgdGhyb3VnaCBgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpYDtcbiAqIHN0YW5kYWxvbmUgZmFjdG9yaWVzIGluIGB0b29sLnRzYCB1c2UgdGhlaXIgb3duIGV4cGxpY2l0IHJ1bnRpbWUgb3IgY29uZmlnLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBSZXNvdXJjZVR5cGUsXG4gIHRvUGx1Z2luLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGRlZmluZVRvb2wsIHR5cGUgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBUb29sUmVnaXN0cnlQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC90b29sLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBsb2csIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1PREVMX0VOVixcbiAgU0VSVklOR19FTkRQT0lOVF9FTlYsXG4gIFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSxcbiAgdHlwZSBXZWJTZWFyY2hQbHVnaW5Db25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcnVuV2ViRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC50c1wiO1xuaW1wb3J0IHsgY3JlYXRlV2ViU2VhcmNoUnVudGltZSwgdHlwZSBXZWJTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgd2ViRmV0Y2hSZXF1ZXN0U2NoZW1hLFxuICB3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYSxcbiAgV0VCX0ZFVENIX1RPT0xfREVTQ1JJUFRJT04sXG4gIFdFQl9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFdlYkZldGNoUmVxdWVzdCxcbiAgV2ViRmV0Y2hSZXN1bHQsXG4gIFdlYlNlYXJjaFJlcXVlc3QsXG4gIFdlYlNlYXJjaFJlc3VsdCxcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCwgcnVuV2ViU2VhcmNoIH0gZnJvbSBcIi4vc2VhcmNoLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoXCIpO1xuXG4vKipcbiAqIFRoZSBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50IHRoZSBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIHJ1bnMgb24uIERlY2xhcmVkXG4gKiBvcHRpb25hbCBiZWNhdXNlIHRoZSBwbHVnaW4gcmVzb2x2ZXMgYSB3ZWItc2VhcmNoLWNhcGFibGUgZW5kcG9pbnQgZnJvbSB0aGVcbiAqIGxpdmUgY2F0YWxvZ3VlIHdoZW4gbm90aGluZyBpcyBwaW5uZWQ7IHtAbGluayBXZWJTZWFyY2hQbHVnaW4uZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHN9XG4gKiBwcm9tb3RlcyBpdCB0byByZXF1aXJlZCBvbmNlIGEgZGVwbG95bWVudCBuYW1lcyBvbmUuIGBDQU5fUVVFUllgIGlzIHRoZVxuICogd2Vha2VzdCBwZXJtaXNzaW9uIHRoYXQgY2FuIGludm9rZSBhbiBlbmRwb2ludC5cbiAqL1xuY29uc3QgU0VSVklOR19FTkRQT0lOVF9SRVNPVVJDRSA9IHtcbiAgdHlwZTogUmVzb3VyY2VUeXBlLlNFUlZJTkdfRU5EUE9JTlQsXG4gIGFsaWFzOiBcIldlYiBTZWFyY2ggRW5kcG9pbnRcIixcbiAgcmVzb3VyY2VLZXk6IFwid2ViLXNlYXJjaC1lbmRwb2ludFwiLFxuICBkZXNjcmlwdGlvbjpcbiAgICBcIk1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgcnVubmluZyB0aGUgbmF0aXZlIHdlYi1zZWFyY2ggdG9vbC4gT3B0aW9uYWw6IHJlc29sdmVkIGZyb20gdGhlIFwiICtcbiAgICBcIndvcmtzcGFjZSBjYXRhbG9ndWUgKEdlbWluaSwgdGhlbiBHUFQpIHdoZW4gbm8gZW5kcG9pbnQgaXMgcGlubmVkLlwiLFxuICBwZXJtaXNzaW9uOiBcIkNBTl9RVUVSWVwiLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICBlbnY6IFNFUlZJTkdfRU5EUE9JTlRfRU5WLFxuICAgICAgZGVzY3JpcHRpb246IGBTZXJ2aW5nIGVuZHBvaW50IG5hbWUgZm9yIHdlYiBzZWFyY2guICR7TU9ERUxfRU5WfSBvdmVycmlkZXMgaXQuYCxcbiAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICB0eXBlOiBcImNsaVwiLFxuICAgICAgICBjbGlDb21tYW5kOiBcImRhdGFicmlja3Mgc2VydmluZy1lbmRwb2ludHMgbGlzdCAtLXByb2ZpbGUgPFBST0ZJTEU+IC0tb3V0cHV0IGpzb25cIixcbiAgICAgICAgc2VsZWN0RmllbGQ6IFwiLm5hbWVcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gc2F0aXNmaWVzIE9taXQ8UmVzb3VyY2VSZXF1aXJlbWVudCwgXCJyZXF1aXJlZFwiPjtcblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgcmVzb2x2ZXMgYW5kIGhvbGRzIHRoZSB3ZWItc2VhcmNoIHJ1bnRpbWUgY29uZmlnIHVzZWRcbiAqIGJ5IHRoZSBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB0b29scy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgd2ViU2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgd2ViU2VhcmNoKHtcbiAqICAgICAgIG1vZGVsOiBcImdlbWluaVwiLFxuICogICAgICAgdXJsUG9saWN5OiBcImFsbG93bGlzdFwiLFxuICogICAgICAgYWxsb3dlZFVybHM6IFtcIiouZGF0YWJyaWNrcy5jb21cIl0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV2ViU2VhcmNoUGx1Z2luIGV4dGVuZHMgVG9vbFJlZ2lzdHJ5UGx1Z2luPFdlYlNlYXJjaFBsdWdpbkNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJ3ZWItc2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiV2ViIFNlYXJjaFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJTZWFyY2hlcyB0aGUgd2ViIHRocm91Z2ggdGhlIERhdGFicmlja3MgbmF0aXZlIHdlYi1zZWFyY2ggdG9vbCBvbiBpdHMgb3duIFwiICtcbiAgICAgIFwid2ViLWNhcGFibGUgc2VydmluZyBlbmRwb2ludCwgYW5kIGZldGNoZXMgcGFnZXMgdmlhIGdvdC1zY3JhcGluZywgYmVoaW5kIGFuIFwiICtcbiAgICAgIFwib3B0aW9uYWwgVVJMIGFsbG93LWxpc3QgYW5kIHBlci10b29sIGFwcHJvdmFsIGdhdGluZy5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczoge1xuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgICAgb3B0aW9uYWw6IFtTRVJWSU5HX0VORFBPSU5UX1JFU09VUkNFXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcIndlYi1zZWFyY2hcIj47XG5cbiAgLyoqIFJ1bnRpbWUgb3duZWQgZXhjbHVzaXZlbHkgYnkgdGhpcyBwbHVnaW4gaW5zdGFuY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSA9IGNyZWF0ZVdlYlNlYXJjaFJ1bnRpbWUodGhpcy5jb25maWcsIChmbiwgc2V0dGluZ3MpID0+XG4gICAgdGhpcy5leGVjdXRlKGZuLCBzZXR0aW5ncyksXG4gICk7XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdGhlIHNlcnZpbmcgZW5kcG9pbnQgdG8gYSByZXF1aXJlZCByZXNvdXJjZSBvbmNlIGEgZGVwbG95bWVudFxuICAgKiBwaW5zIG9uZSwgdGhyb3VnaCBwbHVnaW4gY29uZmlnIG9yIGVpdGhlciBlbnZpcm9ubWVudCBuYW1lLiBMZWZ0IG9wdGlvbmFsXG4gICAqIG90aGVyd2lzZSwgYmVjYXVzZSB0aGUgcGx1Z2luIHBpY2tzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IG91dCBvZlxuICAgKiB0aGUgbGl2ZSBjYXRhbG9ndWUgb24gaXRzIG93bi5cbiAgICovXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IFdlYlNlYXJjaFBsdWdpbkNvbmZpZyk6IFJlc291cmNlUmVxdWlyZW1lbnRbXSB7XG4gICAgY29uc3QgcGlubmVkID1cbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoY29uZmlnLm1vZGVsKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudltNT0RFTF9FTlZdKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudltTRVJWSU5HX0VORFBPSU5UX0VOVl0pO1xuICAgIHJldHVybiBwaW5uZWQgPT09IG51bGwgPyBbXSA6IFt7IC4uLlNFUlZJTkdfRU5EUE9JTlRfUkVTT1VSQ0UsIHJlcXVpcmVkOiB0cnVlIH1dO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b29scyB0aGlzIHBsdWdpbiBvZmZlcnMgdG8gYW4gQXBwS2l0IGFnZW50LiBCb3RoIGFyZSByZWFkcyBhbmQgYm90aFxuICAgKiBydW4gdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LlxuICAgKlxuICAgKiBOZWl0aGVyIGlzIGBhdXRvSW5oZXJpdGFibGVgLiBgd2ViX2ZldGNoYCByZWFjaGVzIGEgVVJMIHRoZSBtb2RlbCBjaG9zZSxcbiAgICogd2hpY2ggaXMgcmVhY2hhYmxlIGZyb20gaW5zaWRlIHRoZSB3b3Jrc3BhY2UgbmV0d29yaywgc28gaXQgbXVzdCBvbmx5XG4gICAqIGFwcGVhciBpbiBhbiBhZ2VudCB0aGF0IGFza2VkIGZvciBpdCBhbmQgYWNjZXB0ZWQgdGhlIFVSTCBwb2xpY3kgdGhhdFxuICAgKiBjb21lcyB3aXRoIGl0LiBgd2ViX3NlYXJjaGAgaXMgc2FmZXIgYnV0IHN0aWxsIHNwZW5kcyBzZXJ2aW5nIHRva2VucyBvblxuICAgKiBldmVyeSBjYWxsLCBzbyBpdCBpcyBvcHQtaW4gZm9yIGNvc3QgcmF0aGVyIHRoYW4gZm9yIHNhZmV0eS5cbiAgICpcbiAgICogYGV4ZWN1dGVgIHJlLXBhcnNlcyBpdHMgYXJndW1lbnRzIHdpdGggdGhlIGxvY2FsIHNjaGVtYTogQXBwS2l0IHZhbGlkYXRlc1xuICAgKiBhZ2FpbnN0IHRoZSBzYW1lIHNjaGVtYSBmaXJzdCwgYnV0IHJlLXBhcnNpbmcgaXMgd2hhdCBnaXZlcyB0aGUgYm9keSB0eXBlZFxuICAgKiBhcmd1bWVudHMgaW5zdGVhZCBvZiBgdW5rbm93bmAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9vbFJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgd2ViX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICBkZXNjcmlwdGlvbjogV0VCX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgc2NoZW1hOiB3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYSxcbiAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnNlYXJjaCh3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKSwgc2lnbmFsKSxcbiAgICB9KSxcbiAgICB3ZWJfZmV0Y2g6IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFdFQl9GRVRDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgc2NoZW1hOiB3ZWJGZXRjaFJlcXVlc3RTY2hlbWEsXG4gICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5mZXRjaCh3ZWJGZXRjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyksIHNpZ25hbCksXG4gICAgfSksXG4gIH07XG5cbiAgLyoqIERpc3BhdGNoIHdpdGggdGhlIGFjdHVhbCBjYWxsaW5nIG1vZGVsIGFuZCBvcHRpb25hbCBob3N0IHByb2dyZXNzIHNpbmsuICovXG4gIG92ZXJyaWRlIGV4ZWN1dGVBZ2VudFRvb2woXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgY29udGV4dD86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmIChuYW1lICE9PSBcIndlYl9zZWFyY2hcIikgcmV0dXJuIHN1cGVyLmV4ZWN1dGVBZ2VudFRvb2wobmFtZSwgYXJncywgc2lnbmFsLCBjb250ZXh0KTtcbiAgICBjb25zdCByZXF1ZXN0ID0gd2ViU2VhcmNoVG9vbFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoKFxuICAgICAge1xuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgICAuLi4oY29udGV4dD8ubW9kZWwgPyB7IG1vZGVsOiBjb250ZXh0Lm1vZGVsIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgc2lnbmFsLFxuICAgICAgY29udGV4dD8ud3JpdGVQcm9ncmVzcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBzbyBhbiBhY3RpdmUgYWxsb3ctbGlzdCBhbmQgY2FwcyBhcmUgb2J2aW91cyBhdFxuICAgKiBib290LiBSdW50aW1lIGNvbnN0cnVjdGlvbiBhbHJlYWR5IHJlc29sdmVkIGNvbmZpZyBhbmQgY2FwdHVyZWQgdGhpc1xuICAgKiBwbHVnaW4ncyBpbnRlcmNlcHRvciBjaGFpbi5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBtb2RlbDogY29uZmlnLm1vZGVsID8/IGBmYWxsYmFja3M6WyR7Y29uZmlnLm1vZGVsRmFsbGJhY2tzLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIG1vZGVsU291cmNlOiBjb25maWcubW9kZWxTb3VyY2UsXG4gICAgICB1cmxQb2xpY3k6IGNvbmZpZy51cmxQb2xpY3ksXG4gICAgICAuLi4oY29uZmlnLmFsbG93TGlzdC5yZXN0cmljdGVkID8geyBhbGxvd2VkVXJsczogY29uZmlnLmFsbG93TGlzdC5wYXR0ZXJucyB9IDoge30pLFxuICAgICAgbWF4Q2l0YXRpb25zOiBjb25maWcubWF4Q2l0YXRpb25zLFxuICAgICAgZmV0Y2hNYXhMZW5ndGg6IGNvbmZpZy5mZXRjaE1heExlbmd0aCxcbiAgICAgIGFwcHJvdmFsOiBjb25maWcuYXBwcm92YWwubW9kZSxcbiAgICAgIHNjcmFwZUZhbGxiYWNrOiBjb25maWcuc2NyYXBlRmFsbGJhY2ssXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTm8gcnVudGltZSByZXNvdXJjZXMgcmVxdWlyZSBkcmFpbmluZy4gVGhlIGluc3RhbmNlLW93bmVkIGNvbmZpZyBhbmRcbiAgICogZXhlY3V0b3IgYmVjb21lIHVucmVhY2hhYmxlIHdpdGggdGhpcyBwbHVnaW4uXG4gICAqL1xuICBzaHV0ZG93bigpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiogQWJvcnQgaW4tZmxpZ2h0IHdvcmsgb3duZWQgYnkgdGhpcyBwbHVnaW4gaW5zdGFuY2UuICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogUnVuIGEgd2ViIHNlYXJjaCBkaXJlY3RseSAoYnlwYXNzaW5nIHRoZSBhZ2VudCB0b29sKS4gUmVzb2x2ZXMgdGhlXG4gICAgICAgKiBPQk8gY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBleGVjdXRpb24gY29udGV4dCBhbmQgcmVhZHMgdGhpcyBwbHVnaW4nc1xuICAgICAgICogcnVudGltZSBjb25maWcuXG4gICAgICAgKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+ID0+XG4gICAgICAgIHRoaXMuc2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKipcbiAgICAgICAqIEZldGNoIG9uZSBVUkwgZGlyZWN0bHkgKGJ5cGFzc2luZyB0aGUgYWdlbnQgdG9vbCkuIEVuZm9yY2VzIHRoZVxuICAgICAgICogY29uZmlndXJlZCBVUkwgcG9saWN5LlxuICAgICAgICovXG4gICAgICBmZXRjaDogKHJlcXVlc3Q6IFdlYkZldGNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFdlYkZldGNoUmVzdWx0PiA9PlxuICAgICAgICB0aGlzLmZldGNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoKFxuICAgIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgd3JpdGVQcm9ncmVzcz86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdLFxuICApOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiBydW5XZWJTZWFyY2goXG4gICAgICByZXF1ZXN0LFxuICAgICAgdGhpcy5ydW50aW1lLFxuICAgICAgYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaENvbnRleHQoKSxcbiAgICAgIHNpZ25hbCxcbiAgICAgIHdyaXRlUHJvZ3Jlc3MsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2gocmVxdWVzdDogV2ViRmV0Y2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8V2ViRmV0Y2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gcnVuV2ViRmV0Y2gocmVxdWVzdCwgdGhpcy5ydW50aW1lLCBzaWduYWwpO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIHdlYi1zZWFyY2ggcnVudGltZSB3aXRoIEFwcEtpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgd2ViU2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqIGltcG9ydCB7IGFnZW50cywgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IHJlc2VhcmNoZXIgPSBhZ2VudHMuY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiUmVzZWFyY2ggcXVlc3Rpb25zIHdpdGggd2ViX3NlYXJjaCwgdGhlbiByZWFkIHNvdXJjZXMgd2l0aCB3ZWJfZmV0Y2guXCIsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpKSB9O1xuICogICB9LFxuICogfSk7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIHdlYlNlYXJjaCh7IG1vZGVsOiBcImdlbWluaVwiIH0pLFxuICogICAgIG1hc3RyYSh7IGFnZW50czogcmVzZWFyY2hlciB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3ZWJTZWFyY2ggPSB0b1BsdWdpbihXZWJTZWFyY2hQbHVnaW4pO1xuIl19
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFFBQVEsR0FHVCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixFQUNwQix3QkFBd0IsR0FFekIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsZ0JBQWdCLEdBSWpCLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxzQkFBc0IsRUFBeUIsTUFBTSxjQUFjLENBQUM7QUFDN0UsT0FBTyxFQUNMLHFCQUFxQixFQUNyQiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDJCQUEyQixHQUM1QixNQUFNLGFBQWEsQ0FBQztBQU9yQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFeEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRztJQUNoQyxJQUFJLEVBQUUsWUFBWSxDQUFDLGdCQUFnQjtJQUNuQyxLQUFLLEVBQUUscUJBQXFCO0lBQzVCLFdBQVcsRUFBRSxxQkFBcUI7SUFDbEMsV0FBVyxFQUNULHlGQUF5RjtRQUN6RixvRUFBb0U7SUFDdEUsVUFBVSxFQUFFLFdBQVc7SUFDdkIsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFO1lB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QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIChyZWdpc3RlcmVkIG5hbWU6IGB3ZWItc2VhcmNoYCkgdGhhdCBvd25zIHRoZSByZXNvbHZlZFxuICogd2ViLXNlYXJjaCBydW50aW1lIC0gdGhlIFVSTCBwb2xpY3ksIHJlc3VsdCAvIGxlbmd0aCBjYXBzLCB0aW1lb3V0LCBhbmRcbiAqIGRlZmF1bHQgYXBwcm92YWwgZ2F0ZSBpdHMgdG9vbHMgcmVhZC4gUmVnaXN0ZXJpbmcgaXQgcmVzb2x2ZXMgYW5kIGxvZ3MgdGhlXG4gKiBlZmZlY3RpdmUgY29uZmlnICh3aGljaCBVUkwgcG9saWN5IGlzIGluIGZvcmNlLCB0aGUgY2Fwcykgc28gYVxuICogbWlzY29uZmlndXJhdGlvbiBpcyB2aXNpYmxlIGluIHRoZSBib290IGxvZ3MgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0XG4gKiBzZWFyY2guIFRoZSBwbHVnaW4ncyBgZXhlY3V0ZSgpYCBpcyBjYXB0dXJlZCBieSBpdHMgb3duIHJ1bnRpbWUgc28gZXZlcnlcbiAqIG91dGJvdW5kIGNhbGwgcGlja3MgdXAgQXBwS2l0J3MgY2FjaGUgLyByZXRyeSAvIHRpbWVvdXQgLyB0ZWxlbWV0cnkgY2hhaW4uXG4gKlxuICogVGhlIHBsdWdpbiBhbHNvIGltcGxlbWVudHMgQXBwS2l0J3MgYFRvb2xQcm92aWRlcmAsIHNvIGFuIEFwcEtpdCBhZ2VudCBnZXRzXG4gKiBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB3aXRob3V0IGdvaW5nIHRocm91Z2ggTWFzdHJhLiBBcHAtaW50ZWdyYXRlZFxuICogTWFzdHJhIGFnZW50cyBjb25zdW1lIHRoaXMgcHJvdmlkZXIgdGhyb3VnaCBgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpYDtcbiAqIHN0YW5kYWxvbmUgZmFjdG9yaWVzIGluIGB0b29sLnRzYCB1c2UgdGhlaXIgb3duIGV4cGxpY2l0IHJ1bnRpbWUgb3IgY29uZmlnLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBSZXNvdXJjZVR5cGUsXG4gIHRvUGx1Z2luLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGRlZmluZVRvb2wsIHR5cGUgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBUb29sUmVnaXN0cnlQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC90b29sLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBsb2csIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1PREVMX0VOVixcbiAgU0VSVklOR19FTkRQT0lOVF9FTlYsXG4gIFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSxcbiAgdHlwZSBXZWJTZWFyY2hQbHVnaW5Db25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgcnVuV2ViQXNzZXRQYWdlRmV0Y2gsXG4gIHJ1bldlYkZldGNoLFxuICBydW5XZWJJbWFnZUZldGNoLFxuICB0eXBlIFdlYkFzc2V0UGFnZUZldGNoUmVxdWVzdCxcbiAgdHlwZSBXZWJJbWFnZUZldGNoUmVxdWVzdCxcbiAgdHlwZSBXZWJJbWFnZUZldGNoUmVzdWx0LFxufSBmcm9tIFwiLi9mZXRjaC50c1wiO1xuaW1wb3J0IHsgY3JlYXRlV2ViU2VhcmNoUnVudGltZSwgdHlwZSBXZWJTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgd2ViRmV0Y2hSZXF1ZXN0U2NoZW1hLFxuICB3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYSxcbiAgV0VCX0ZFVENIX1RPT0xfREVTQ1JJUFRJT04sXG4gIFdFQl9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFdlYkZldGNoUmVxdWVzdCxcbiAgV2ViRmV0Y2hSZXN1bHQsXG4gIFdlYlNlYXJjaFJlcXVlc3QsXG4gIFdlYlNlYXJjaFJlc3VsdCxcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCwgcnVuV2ViU2VhcmNoIH0gZnJvbSBcIi4vc2VhcmNoLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoXCIpO1xuXG4vKipcbiAqIFRoZSBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50IHRoZSBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIHJ1bnMgb24uIERlY2xhcmVkXG4gKiBvcHRpb25hbCBiZWNhdXNlIHRoZSBwbHVnaW4gcmVzb2x2ZXMgYSB3ZWItc2VhcmNoLWNhcGFibGUgZW5kcG9pbnQgZnJvbSB0aGVcbiAqIGxpdmUgY2F0YWxvZ3VlIHdoZW4gbm90aGluZyBpcyBwaW5uZWQ7IHtAbGluayBXZWJTZWFyY2hQbHVnaW4uZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHN9XG4gKiBwcm9tb3RlcyBpdCB0byByZXF1aXJlZCBvbmNlIGEgZGVwbG95bWVudCBuYW1lcyBvbmUuIGBDQU5fUVVFUllgIGlzIHRoZVxuICogd2Vha2VzdCBwZXJtaXNzaW9uIHRoYXQgY2FuIGludm9rZSBhbiBlbmRwb2ludC5cbiAqL1xuY29uc3QgU0VSVklOR19FTkRQT0lOVF9SRVNPVVJDRSA9IHtcbiAgdHlwZTogUmVzb3VyY2VUeXBlLlNFUlZJTkdfRU5EUE9JTlQsXG4gIGFsaWFzOiBcIldlYiBTZWFyY2ggRW5kcG9pbnRcIixcbiAgcmVzb3VyY2VLZXk6IFwid2ViLXNlYXJjaC1lbmRwb2ludFwiLFxuICBkZXNjcmlwdGlvbjpcbiAgICBcIk1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgcnVubmluZyB0aGUgbmF0aXZlIHdlYi1zZWFyY2ggdG9vbC4gT3B0aW9uYWw6IHJlc29sdmVkIGZyb20gdGhlIFwiICtcbiAgICBcIndvcmtzcGFjZSBjYXRhbG9ndWUgKEdlbWluaSwgdGhlbiBHUFQpIHdoZW4gbm8gZW5kcG9pbnQgaXMgcGlubmVkLlwiLFxuICBwZXJtaXNzaW9uOiBcIkNBTl9RVUVSWVwiLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICBlbnY6IFNFUlZJTkdfRU5EUE9JTlRfRU5WLFxuICAgICAgZGVzY3JpcHRpb246IGBTZXJ2aW5nIGVuZHBvaW50IG5hbWUgZm9yIHdlYiBzZWFyY2guICR7TU9ERUxfRU5WfSBvdmVycmlkZXMgaXQuYCxcbiAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICB0eXBlOiBcImNsaVwiLFxuICAgICAgICBjbGlDb21tYW5kOiBcImRhdGFicmlja3Mgc2VydmluZy1lbmRwb2ludHMgbGlzdCAtLXByb2ZpbGUgPFBST0ZJTEU+IC0tb3V0cHV0IGpzb25cIixcbiAgICAgICAgc2VsZWN0RmllbGQ6IFwiLm5hbWVcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gc2F0aXNmaWVzIE9taXQ8UmVzb3VyY2VSZXF1aXJlbWVudCwgXCJyZXF1aXJlZFwiPjtcblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgcmVzb2x2ZXMgYW5kIGhvbGRzIHRoZSB3ZWItc2VhcmNoIHJ1bnRpbWUgY29uZmlnIHVzZWRcbiAqIGJ5IHRoZSBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB0b29scy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgd2ViU2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgd2ViU2VhcmNoKHtcbiAqICAgICAgIG1vZGVsOiBcImdlbWluaVwiLFxuICogICAgICAgdXJsUG9saWN5OiBcImFsbG93bGlzdFwiLFxuICogICAgICAgYWxsb3dlZFVybHM6IFtcIiouZGF0YWJyaWNrcy5jb21cIl0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV2ViU2VhcmNoUGx1Z2luIGV4dGVuZHMgVG9vbFJlZ2lzdHJ5UGx1Z2luPFdlYlNlYXJjaFBsdWdpbkNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJ3ZWItc2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiV2ViIFNlYXJjaFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJTZWFyY2hlcyB0aGUgd2ViIHRocm91Z2ggdGhlIERhdGFicmlja3MgbmF0aXZlIHdlYi1zZWFyY2ggdG9vbCBvbiBpdHMgb3duIFwiICtcbiAgICAgIFwid2ViLWNhcGFibGUgc2VydmluZyBlbmRwb2ludCwgYW5kIGZldGNoZXMgcGFnZXMgdmlhIGdvdC1zY3JhcGluZywgYmVoaW5kIGFuIFwiICtcbiAgICAgIFwib3B0aW9uYWwgVVJMIGFsbG93LWxpc3QgYW5kIHBlci10b29sIGFwcHJvdmFsIGdhdGluZy5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczoge1xuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgICAgb3B0aW9uYWw6IFtTRVJWSU5HX0VORFBPSU5UX1JFU09VUkNFXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcIndlYi1zZWFyY2hcIj47XG5cbiAgLyoqIFJ1bnRpbWUgb3duZWQgZXhjbHVzaXZlbHkgYnkgdGhpcyBwbHVnaW4gaW5zdGFuY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSA9IGNyZWF0ZVdlYlNlYXJjaFJ1bnRpbWUodGhpcy5jb25maWcsIChmbiwgc2V0dGluZ3MpID0+XG4gICAgdGhpcy5leGVjdXRlKGZuLCBzZXR0aW5ncyksXG4gICk7XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdGhlIHNlcnZpbmcgZW5kcG9pbnQgdG8gYSByZXF1aXJlZCByZXNvdXJjZSBvbmNlIGEgZGVwbG95bWVudFxuICAgKiBwaW5zIG9uZSwgdGhyb3VnaCBwbHVnaW4gY29uZmlnIG9yIGVpdGhlciBlbnZpcm9ubWVudCBuYW1lLiBMZWZ0IG9wdGlvbmFsXG4gICAqIG90aGVyd2lzZSwgYmVjYXVzZSB0aGUgcGx1Z2luIHBpY2tzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IG91dCBvZlxuICAgKiB0aGUgbGl2ZSBjYXRhbG9ndWUgb24gaXRzIG93bi5cbiAgICovXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IFdlYlNlYXJjaFBsdWdpbkNvbmZpZyk6IFJlc291cmNlUmVxdWlyZW1lbnRbXSB7XG4gICAgY29uc3QgcGlubmVkID1cbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoY29uZmlnLm1vZGVsKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudltNT0RFTF9FTlZdKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudltTRVJWSU5HX0VORFBPSU5UX0VOVl0pO1xuICAgIHJldHVybiBwaW5uZWQgPT09IG51bGwgPyBbXSA6IFt7IC4uLlNFUlZJTkdfRU5EUE9JTlRfUkVTT1VSQ0UsIHJlcXVpcmVkOiB0cnVlIH1dO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b29scyB0aGlzIHBsdWdpbiBvZmZlcnMgdG8gYW4gQXBwS2l0IGFnZW50LiBCb3RoIGFyZSByZWFkcyBhbmQgYm90aFxuICAgKiBydW4gdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LlxuICAgKlxuICAgKiBOZWl0aGVyIGlzIGBhdXRvSW5oZXJpdGFibGVgLiBgd2ViX2ZldGNoYCByZWFjaGVzIGEgVVJMIHRoZSBtb2RlbCBjaG9zZSxcbiAgICogd2hpY2ggaXMgcmVhY2hhYmxlIGZyb20gaW5zaWRlIHRoZSB3b3Jrc3BhY2UgbmV0d29yaywgc28gaXQgbXVzdCBvbmx5XG4gICAqIGFwcGVhciBpbiBhbiBhZ2VudCB0aGF0IGFza2VkIGZvciBpdCBhbmQgYWNjZXB0ZWQgdGhlIFVSTCBwb2xpY3kgdGhhdFxuICAgKiBjb21lcyB3aXRoIGl0LiBgd2ViX3NlYXJjaGAgaXMgc2FmZXIgYnV0IHN0aWxsIHNwZW5kcyBzZXJ2aW5nIHRva2VucyBvblxuICAgKiBldmVyeSBjYWxsLCBzbyBpdCBpcyBvcHQtaW4gZm9yIGNvc3QgcmF0aGVyIHRoYW4gZm9yIHNhZmV0eS5cbiAgICpcbiAgICogYGV4ZWN1dGVgIHJlLXBhcnNlcyBpdHMgYXJndW1lbnRzIHdpdGggdGhlIGxvY2FsIHNjaGVtYTogQXBwS2l0IHZhbGlkYXRlc1xuICAgKiBhZ2FpbnN0IHRoZSBzYW1lIHNjaGVtYSBmaXJzdCwgYnV0IHJlLXBhcnNpbmcgaXMgd2hhdCBnaXZlcyB0aGUgYm9keSB0eXBlZFxuICAgKiBhcmd1bWVudHMgaW5zdGVhZCBvZiBgdW5rbm93bmAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9vbFJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgd2ViX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICBkZXNjcmlwdGlvbjogV0VCX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgc2NoZW1hOiB3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYSxcbiAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnNlYXJjaCh3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKSwgc2lnbmFsKSxcbiAgICB9KSxcbiAgICB3ZWJfZmV0Y2g6IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFdFQl9GRVRDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgc2NoZW1hOiB3ZWJGZXRjaFJlcXVlc3RTY2hlbWEsXG4gICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5mZXRjaCh3ZWJGZXRjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyksIHNpZ25hbCksXG4gICAgfSksXG4gIH07XG5cbiAgLyoqIERpc3BhdGNoIHdpdGggdGhlIGFjdHVhbCBjYWxsaW5nIG1vZGVsIGFuZCBvcHRpb25hbCBob3N0IHByb2dyZXNzIHNpbmsuICovXG4gIG92ZXJyaWRlIGV4ZWN1dGVBZ2VudFRvb2woXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgY29udGV4dD86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmIChuYW1lICE9PSBcIndlYl9zZWFyY2hcIikgcmV0dXJuIHN1cGVyLmV4ZWN1dGVBZ2VudFRvb2wobmFtZSwgYXJncywgc2lnbmFsLCBjb250ZXh0KTtcbiAgICBjb25zdCByZXF1ZXN0ID0gd2ViU2VhcmNoVG9vbFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoKFxuICAgICAge1xuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgICAuLi4oY29udGV4dD8ubW9kZWwgPyB7IG1vZGVsOiBjb250ZXh0Lm1vZGVsIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgc2lnbmFsLFxuICAgICAgY29udGV4dD8ud3JpdGVQcm9ncmVzcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBzbyBhbiBhY3RpdmUgYWxsb3ctbGlzdCBhbmQgY2FwcyBhcmUgb2J2aW91cyBhdFxuICAgKiBib290LiBSdW50aW1lIGNvbnN0cnVjdGlvbiBhbHJlYWR5IHJlc29sdmVkIGNvbmZpZyBhbmQgY2FwdHVyZWQgdGhpc1xuICAgKiBwbHVnaW4ncyBpbnRlcmNlcHRvciBjaGFpbi5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBtb2RlbDogY29uZmlnLm1vZGVsID8/IGBmYWxsYmFja3M6WyR7Y29uZmlnLm1vZGVsRmFsbGJhY2tzLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIG1vZGVsU291cmNlOiBjb25maWcubW9kZWxTb3VyY2UsXG4gICAgICB1cmxQb2xpY3k6IGNvbmZpZy51cmxQb2xpY3ksXG4gICAgICAuLi4oY29uZmlnLmFsbG93TGlzdC5yZXN0cmljdGVkID8geyBhbGxvd2VkVXJsczogY29uZmlnLmFsbG93TGlzdC5wYXR0ZXJucyB9IDoge30pLFxuICAgICAgbWF4Q2l0YXRpb25zOiBjb25maWcubWF4Q2l0YXRpb25zLFxuICAgICAgZmV0Y2hNYXhMZW5ndGg6IGNvbmZpZy5mZXRjaE1heExlbmd0aCxcbiAgICAgIGFwcHJvdmFsOiBjb25maWcuYXBwcm92YWwubW9kZSxcbiAgICAgIHNjcmFwZUZhbGxiYWNrOiBjb25maWcuc2NyYXBlRmFsbGJhY2ssXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTm8gcnVudGltZSByZXNvdXJjZXMgcmVxdWlyZSBkcmFpbmluZy4gVGhlIGluc3RhbmNlLW93bmVkIGNvbmZpZyBhbmRcbiAgICogZXhlY3V0b3IgYmVjb21lIHVucmVhY2hhYmxlIHdpdGggdGhpcyBwbHVnaW4uXG4gICAqL1xuICBzaHV0ZG93bigpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiogQWJvcnQgaW4tZmxpZ2h0IHdvcmsgb3duZWQgYnkgdGhpcyBwbHVnaW4gaW5zdGFuY2UuICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogUnVuIGEgd2ViIHNlYXJjaCBkaXJlY3RseSAoYnlwYXNzaW5nIHRoZSBhZ2VudCB0b29sKS4gUmVzb2x2ZXMgdGhlXG4gICAgICAgKiBPQk8gY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBleGVjdXRpb24gY29udGV4dCBhbmQgcmVhZHMgdGhpcyBwbHVnaW4nc1xuICAgICAgICogcnVudGltZSBjb25maWcuXG4gICAgICAgKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+ID0+XG4gICAgICAgIHRoaXMuc2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKipcbiAgICAgICAqIEZldGNoIG9uZSBVUkwgZGlyZWN0bHkgKGJ5cGFzc2luZyB0aGUgYWdlbnQgdG9vbCkuIEVuZm9yY2VzIHRoZVxuICAgICAgICogY29uZmlndXJlZCBVUkwgcG9saWN5LlxuICAgICAgICovXG4gICAgICBmZXRjaDogKHJlcXVlc3Q6IFdlYkZldGNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFdlYkZldGNoUmVzdWx0PiA9PlxuICAgICAgICB0aGlzLmZldGNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogRmV0Y2ggZXhwYW5kZWQgSFRNTCBmb3IgaW4tcHJvY2VzcyBhc3NldCBkaXNjb3ZlcnkuICovXG4gICAgICBmZXRjaEFzc2V0UGFnZTogKFxuICAgICAgICByZXF1ZXN0OiBXZWJBc3NldFBhZ2VGZXRjaFJlcXVlc3QsXG4gICAgICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgICAgKTogUHJvbWlzZTxXZWJGZXRjaFJlc3VsdD4gPT4gcnVuV2ViQXNzZXRQYWdlRmV0Y2gocmVxdWVzdCwgdGhpcy5ydW50aW1lLCBzaWduYWwpLFxuICAgICAgLyoqIEZldGNoIG9uZSBpbWFnZSBmb3IgaW4tcHJvY2VzcyB2aXN1YWwgcmVzZWFyY2guICovXG4gICAgICBmZXRjaEltYWdlOiAoXG4gICAgICAgIHJlcXVlc3Q6IFdlYkltYWdlRmV0Y2hSZXF1ZXN0LFxuICAgICAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICAgICk6IFByb21pc2U8V2ViSW1hZ2VGZXRjaFJlc3VsdD4gPT4gcnVuV2ViSW1hZ2VGZXRjaChyZXF1ZXN0LCB0aGlzLnJ1bnRpbWUsIHNpZ25hbCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoKFxuICAgIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgd3JpdGVQcm9ncmVzcz86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdLFxuICApOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiBydW5XZWJTZWFyY2goXG4gICAgICByZXF1ZXN0LFxuICAgICAgdGhpcy5ydW50aW1lLFxuICAgICAgYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaENvbnRleHQoKSxcbiAgICAgIHNpZ25hbCxcbiAgICAgIHdyaXRlUHJvZ3Jlc3MsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2gocmVxdWVzdDogV2ViRmV0Y2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8V2ViRmV0Y2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gcnVuV2ViRmV0Y2gocmVxdWVzdCwgdGhpcy5ydW50aW1lLCBzaWduYWwpO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIHdlYi1zZWFyY2ggcnVudGltZSB3aXRoIEFwcEtpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgd2ViU2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqIGltcG9ydCB7IGFnZW50cywgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IHJlc2VhcmNoZXIgPSBhZ2VudHMuY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiUmVzZWFyY2ggcXVlc3Rpb25zIHdpdGggd2ViX3NlYXJjaCwgdGhlbiByZWFkIHNvdXJjZXMgd2l0aCB3ZWJfZmV0Y2guXCIsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpKSB9O1xuICogICB9LFxuICogfSk7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIHdlYlNlYXJjaCh7IG1vZGVsOiBcImdlbWluaVwiIH0pLFxuICogICAgIG1hc3RyYSh7IGFnZW50czogcmVzZWFyY2hlciB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3ZWJTZWFyY2ggPSB0b1BsdWdpbihXZWJTZWFyY2hQbHVnaW4pO1xuIl19
|
package/lib/src/runtime.d.ts
CHANGED
|
@@ -23,6 +23,10 @@ export interface WebSearchRuntime {
|
|
|
23
23
|
execute: WebSearchExecutor;
|
|
24
24
|
/** Provider-family cooldown deadlines learned from workspace failures. */
|
|
25
25
|
familyCooldowns: Map<policy.ModelFamily, number>;
|
|
26
|
+
/** Provider families that completed a native search successfully. */
|
|
27
|
+
availableFamilies: Set<policy.ModelFamily>;
|
|
28
|
+
/** First native request currently establishing one family's availability. */
|
|
29
|
+
familyProbes: Map<policy.ModelFamily, Promise<void>>;
|
|
26
30
|
}
|
|
27
31
|
/** Runtime-aware operation input, retaining resolved-config compatibility. */
|
|
28
32
|
export type WebSearchRuntimeInput = WebSearchRuntime | ResolvedWebSearchConfig;
|
|
@@ -44,4 +48,4 @@ export declare function setWebSearchExecutor(runtime: WebSearchRuntime, execute:
|
|
|
44
48
|
* run, a request teardown); it is merged with the signal the timeout
|
|
45
49
|
* interceptor supplies so either one unwinds the I/O.
|
|
46
50
|
*/
|
|
47
|
-
export declare function executeRead<T>(runtime: WebSearchRuntime, operation: string, settings: WebSearchExecutionSettings, fn: (signal?: AbortSignal) => Promise<T>, signal?: AbortSignal): Promise<T>;
|
|
51
|
+
export declare function executeRead<T>(runtime: WebSearchRuntime, operation: string, settings: WebSearchExecutionSettings, fn: (signal?: AbortSignal) => Promise<T>, signal?: AbortSignal, logFailure?: boolean): Promise<T>;
|
package/lib/src/runtime.js
CHANGED
|
@@ -19,11 +19,23 @@ const logger = log.logger("web-search/runtime");
|
|
|
19
19
|
const directExecute = execution.directExecutor();
|
|
20
20
|
/** Build an isolated runtime for one plugin instance or standalone tool set. */
|
|
21
21
|
export function createWebSearchRuntime(overrides, execute = directExecute) {
|
|
22
|
-
return {
|
|
22
|
+
return {
|
|
23
|
+
config: resolveWebSearchConfig(overrides),
|
|
24
|
+
execute,
|
|
25
|
+
familyCooldowns: new Map(),
|
|
26
|
+
availableFamilies: new Set(),
|
|
27
|
+
familyProbes: new Map(),
|
|
28
|
+
};
|
|
23
29
|
}
|
|
24
30
|
/** Build an isolated runtime from config that has already been resolved. */
|
|
25
31
|
export function createResolvedWebSearchRuntime(config, execute = directExecute) {
|
|
26
|
-
return {
|
|
32
|
+
return {
|
|
33
|
+
config,
|
|
34
|
+
execute,
|
|
35
|
+
familyCooldowns: new Map(),
|
|
36
|
+
availableFamilies: new Set(),
|
|
37
|
+
familyProbes: new Map(),
|
|
38
|
+
};
|
|
27
39
|
}
|
|
28
40
|
/** Normalize an explicit runtime or legacy resolved config for one operation. */
|
|
29
41
|
export function toWebSearchRuntime(input) {
|
|
@@ -43,10 +55,10 @@ export function setWebSearchExecutor(runtime, execute) {
|
|
|
43
55
|
* run, a request teardown); it is merged with the signal the timeout
|
|
44
56
|
* interceptor supplies so either one unwinds the I/O.
|
|
45
57
|
*/
|
|
46
|
-
export async function executeRead(runtime, operation, settings, fn, signal) {
|
|
58
|
+
export async function executeRead(runtime, operation, settings, fn, signal, logFailure = true) {
|
|
47
59
|
return pluginExecution.runPluginExecution({
|
|
48
60
|
plugin: "web-search",
|
|
49
|
-
logger,
|
|
61
|
+
logger: logFailure ? logger : { warn() { } },
|
|
50
62
|
operation,
|
|
51
63
|
settings,
|
|
52
64
|
execute: runtime.execute,
|
|
@@ -54,4 +66,4 @@ export async function executeRead(runtime, operation, settings, fn, signal) {
|
|
|
54
66
|
signal,
|
|
55
67
|
});
|
|
56
68
|
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBR0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUNMLHNCQUFzQixHQUd2QixNQUFNLGFBQWEsQ0FBQztBQUdyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUEyQmhEOzs7O0dBSUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsY0FBYyxFQUE4QixDQUFDO0FBRTdFLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLFNBQWlDLEVBQ2pDLFVBQTZCLGFBQWE7SUFFMUMsT0FBTztRQUNMLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUM7UUFDekMsT0FBTztRQUNQLGVBQWUsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUMxQixpQkFBaUIsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUM1QixZQUFZLEVBQUUsSUFBSSxHQUFHLEVBQUU7S0FDeEIsQ0FBQztBQUNKLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLDhCQUE4QixDQUM1QyxNQUErQixFQUMvQixVQUE2QixhQUFhO0lBRTFDLE9BQU87UUFDTCxNQUFNO1FBQ04sT0FBTztRQUNQLGVBQWUsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUMxQixpQkFBaUIsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUM1QixZQUFZLEVBQUUsSUFBSSxHQUFHLEVBQUU7S0FDeEIsQ0FBQztBQUNKLENBQUM7QUFFRCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQTRCO0lBQzdELE9BQU8sU0FBUyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsa0RBQWtEO0FBQ2xELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxPQUF5QixFQUFFLE9BQTBCO0lBQ3hGLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsT0FBeUIsRUFDekIsU0FBaUIsRUFDakIsUUFBb0MsRUFDcEMsRUFBd0MsRUFDeEMsTUFBb0IsRUFDcEIsVUFBVSxHQUFHLElBQUk7SUFFakIsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUM7UUFDeEMsTUFBTSxFQUFFLFlBQVk7UUFDcEIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSSxDQUFDLEVBQUU7UUFDM0MsU0FBUztRQUNULFFBQVE7UUFDUixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsRUFBRTtRQUNGLE1BQU07S0FDUCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWItc2VhcmNoIHJ1bnRpbWUgY29uc3RydWN0aW9uIGFuZCBleGVjdXRpb24gaGVscGVycy5cbiAqXG4gKiBFYWNoIHBsdWdpbiBpbnN0YW5jZSBvd25zIG9uZSBydW50aW1lLiBTdGFuZGFsb25lIHRvb2wgZmFjdG9yaWVzIGNyZWF0ZSB0aGVpclxuICogb3duIHJ1bnRpbWUsIHNvIHNlcGFyYXRlIGFwcHMgYW5kIGRpcmVjdCBjb25zdW1lcnMgY2Fubm90IG92ZXJ3cml0ZSBlYWNoXG4gKiBvdGhlcidzIHBvbGljeSBvciBleGVjdXRvci5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25SZXN1bHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW5FeGVjdXRpb24gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IHBvbGljeSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBleGVjdXRpb24sIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICByZXNvbHZlV2ViU2VhcmNoQ29uZmlnLFxuICB0eXBlIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnLFxuICB0eXBlIFdlYlNlYXJjaFBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdlYlNlYXJjaEV4ZWN1dGlvblNldHRpbmdzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIndlYi1zZWFyY2gvcnVudGltZVwiKTtcblxuLyoqXG4gKiBSdW5zIG9uZSBvdXRib3VuZCBjYWxsIHRocm91Z2ggQXBwS2l0J3MgaW50ZXJjZXB0b3IgY2hhaW4uIE1hdGNoZXNcbiAqIGBQbHVnaW4uZXhlY3V0ZSgpYCwgd2hpY2ggbmV2ZXIgdGhyb3dzOiBhIGZhaWx1cmUgY29tZXMgYmFjayBhc1xuICogYHsgb2s6IGZhbHNlIH1gLlxuICovXG5leHBvcnQgdHlwZSBXZWJTZWFyY2hFeGVjdXRvciA9IDxUPihcbiAgZm46IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTxUPixcbiAgc2V0dGluZ3M6IFdlYlNlYXJjaEV4ZWN1dGlvblNldHRpbmdzLFxuKSA9PiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxUPj47XG5cbi8qKiBUaGUgcmVzb2x2ZWQgY29uZmlnIHBsdXMgdGhlIGV4ZWN1dG9yIG91dGJvdW5kIGNhbGxzIHJ1biB0aHJvdWdoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZWFyY2hSdW50aW1lIHtcbiAgY29uZmlnOiBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZztcbiAgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3I7XG4gIC8qKiBQcm92aWRlci1mYW1pbHkgY29vbGRvd24gZGVhZGxpbmVzIGxlYXJuZWQgZnJvbSB3b3Jrc3BhY2UgZmFpbHVyZXMuICovXG4gIGZhbWlseUNvb2xkb3duczogTWFwPHBvbGljeS5Nb2RlbEZhbWlseSwgbnVtYmVyPjtcbiAgLyoqIFByb3ZpZGVyIGZhbWlsaWVzIHRoYXQgY29tcGxldGVkIGEgbmF0aXZlIHNlYXJjaCBzdWNjZXNzZnVsbHkuICovXG4gIGF2YWlsYWJsZUZhbWlsaWVzOiBTZXQ8cG9saWN5Lk1vZGVsRmFtaWx5PjtcbiAgLyoqIEZpcnN0IG5hdGl2ZSByZXF1ZXN0IGN1cnJlbnRseSBlc3RhYmxpc2hpbmcgb25lIGZhbWlseSdzIGF2YWlsYWJpbGl0eS4gKi9cbiAgZmFtaWx5UHJvYmVzOiBNYXA8cG9saWN5Lk1vZGVsRmFtaWx5LCBQcm9taXNlPHZvaWQ+Pjtcbn1cblxuLyoqIFJ1bnRpbWUtYXdhcmUgb3BlcmF0aW9uIGlucHV0LCByZXRhaW5pbmcgcmVzb2x2ZWQtY29uZmlnIGNvbXBhdGliaWxpdHkuICovXG5leHBvcnQgdHlwZSBXZWJTZWFyY2hSdW50aW1lSW5wdXQgPSBXZWJTZWFyY2hSdW50aW1lIHwgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWc7XG5cbi8qKlxuICogRXhlY3V0b3IgdXNlZCBieSBzdGFuZGFsb25lIHJ1bnRpbWVzOiBydW4gdGhlIGNhbGwgZGlyZWN0bHksIG1hcHBpbmcgYSB0aHJvd1xuICogb250byB0aGUgc2FtZSB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBzaGFwZSBzbyBjYWxsIHNpdGVzIGJyYW5jaCBvbiBgb2tgXG4gKiBlaXRoZXIgd2F5LlxuICovXG5jb25zdCBkaXJlY3RFeGVjdXRlID0gZXhlY3V0aW9uLmRpcmVjdEV4ZWN1dG9yPFdlYlNlYXJjaEV4ZWN1dGlvblNldHRpbmdzPigpO1xuXG4vKiogQnVpbGQgYW4gaXNvbGF0ZWQgcnVudGltZSBmb3Igb25lIHBsdWdpbiBpbnN0YW5jZSBvciBzdGFuZGFsb25lIHRvb2wgc2V0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNlYXJjaFJ1bnRpbWUoXG4gIG92ZXJyaWRlcz86IFdlYlNlYXJjaFBsdWdpbkNvbmZpZyxcbiAgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3IgPSBkaXJlY3RFeGVjdXRlLFxuKTogV2ViU2VhcmNoUnVudGltZSB7XG4gIHJldHVybiB7XG4gICAgY29uZmlnOiByZXNvbHZlV2ViU2VhcmNoQ29uZmlnKG92ZXJyaWRlcyksXG4gICAgZXhlY3V0ZSxcbiAgICBmYW1pbHlDb29sZG93bnM6IG5ldyBNYXAoKSxcbiAgICBhdmFpbGFibGVGYW1pbGllczogbmV3IFNldCgpLFxuICAgIGZhbWlseVByb2JlczogbmV3IE1hcCgpLFxuICB9O1xufVxuXG4vKiogQnVpbGQgYW4gaXNvbGF0ZWQgcnVudGltZSBmcm9tIGNvbmZpZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzb2x2ZWRXZWJTZWFyY2hSdW50aW1lKFxuICBjb25maWc6IFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnLFxuICBleGVjdXRlOiBXZWJTZWFyY2hFeGVjdXRvciA9IGRpcmVjdEV4ZWN1dGUsXG4pOiBXZWJTZWFyY2hSdW50aW1lIHtcbiAgcmV0dXJuIHtcbiAgICBjb25maWcsXG4gICAgZXhlY3V0ZSxcbiAgICBmYW1pbHlDb29sZG93bnM6IG5ldyBNYXAoKSxcbiAgICBhdmFpbGFibGVGYW1pbGllczogbmV3IFNldCgpLFxuICAgIGZhbWlseVByb2JlczogbmV3IE1hcCgpLFxuICB9O1xufVxuXG4vKiogTm9ybWFsaXplIGFuIGV4cGxpY2l0IHJ1bnRpbWUgb3IgbGVnYWN5IHJlc29sdmVkIGNvbmZpZyBmb3Igb25lIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1dlYlNlYXJjaFJ1bnRpbWUoaW5wdXQ6IFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCk6IFdlYlNlYXJjaFJ1bnRpbWUge1xuICByZXR1cm4gXCJleGVjdXRlXCIgaW4gaW5wdXQgPyBpbnB1dCA6IGNyZWF0ZVJlc29sdmVkV2ViU2VhcmNoUnVudGltZShpbnB1dCk7XG59XG5cbi8qKiBJbnN0YWxsIGFuIGV4ZWN1dG9yIG9uIGFuIGV4cGxpY2l0IHJ1bnRpbWUuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViU2VhcmNoRXhlY3V0b3IocnVudGltZTogV2ViU2VhcmNoUnVudGltZSwgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3IpOiB2b2lkIHtcbiAgcnVudGltZS5leGVjdXRlID0gZXhlY3V0ZTtcbn1cblxuLyoqXG4gKiBSdW4gb25lIGlkZW1wb3RlbnQgcmVhZCB0aHJvdWdoIHRoZSBydW50aW1lIGV4ZWN1dG9yIGFuZCB1bndyYXAgaXQuXG4gKlxuICogYGV4ZWN1dGUoKWAgbmV2ZXIgdGhyb3dzLCBzbyBhIGZhaWxlZCBjYWxsIGFycml2ZXMgYXMgYHsgb2s6IGZhbHNlIH1gIHdpdGhcbiAqIGEgc3RhdHVzIHRoZSBpbnRlcmNlcHRvcnMgYWxyZWFkeSBzYW5pdGl6ZWQ7IGl0IGlzIGxvZ2dlZCBoZXJlIGFuZCByZS1yYWlzZWRcbiAqIGFzIGEgc3RhYmxlIHtAbGluayBFeGVjdXRpb25FcnJvcn0gc28gYW4gdXBzdHJlYW0gbWVzc2FnZSBuZXZlciBiZWNvbWVzIHRoZVxuICogY2FsbGVyJ3MgZXJyb3IgdGV4dC4gYHNpZ25hbGAgaXMgdGhlIGNhbGxlcidzIG93biBjYW5jZWxsYXRpb24gKGFuIGFnZW50XG4gKiBydW4sIGEgcmVxdWVzdCB0ZWFyZG93bik7IGl0IGlzIG1lcmdlZCB3aXRoIHRoZSBzaWduYWwgdGhlIHRpbWVvdXRcbiAqIGludGVyY2VwdG9yIHN1cHBsaWVzIHNvIGVpdGhlciBvbmUgdW53aW5kcyB0aGUgSS9PLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJlYWQ8VD4oXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBzZXR0aW5nczogV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MsXG4gIGZuOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICBsb2dGYWlsdXJlID0gdHJ1ZSxcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gcGx1Z2luRXhlY3V0aW9uLnJ1blBsdWdpbkV4ZWN1dGlvbih7XG4gICAgcGx1Z2luOiBcIndlYi1zZWFyY2hcIixcbiAgICBsb2dnZXI6IGxvZ0ZhaWx1cmUgPyBsb2dnZXIgOiB7IHdhcm4oKSB7fSB9LFxuICAgIG9wZXJhdGlvbixcbiAgICBzZXR0aW5ncyxcbiAgICBleGVjdXRlOiBydW50aW1lLmV4ZWN1dGUsXG4gICAgZm4sXG4gICAgc2lnbmFsLFxuICB9KTtcbn1cbiJdfQ==
|