@dbx-tools/appkit-mastra 0.6.5 → 0.6.7

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.
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Startup provisioning of remote Agent-Skill sources for a Mastra workspace.
3
+ *
4
+ * A {@link RemoteSkillSource} names WHERE a `SKILL.md` tree comes from - a
5
+ * GitHub `owner/repo`, any git / GitLab URL, or a direct download URL - and
6
+ * optional per-source policy. {@link provisionRemoteSkills} materializes every
7
+ * source into a local `SKILL.md` tree at app boot and returns the directories
8
+ * to hand Mastra as extra skill scan paths.
9
+ *
10
+ * Resolution per source, in order:
11
+ *
12
+ * 1. the OPTIONAL `skills` npm CLI (peer dep): if installed, each source is
13
+ * copied into a staging dir with `skills add <source> --agent <dir> --copy`,
14
+ * which understands every source format the ecosystem does (GitHub
15
+ * shorthand, git URLs, archive/download URLs);
16
+ * 2. otherwise a plain {@link fetch} of the source URL (built with
17
+ * {@link net.urlBuilder}), writing the downloaded `SKILL.md` to a staging
18
+ * dir.
19
+ *
20
+ * A source that resolves through neither path fails app startup, unless the
21
+ * source (or the top-level call) sets `failOnError: false`, in which case it is
22
+ * logged and skipped so one bad source never takes the app down.
23
+ *
24
+ * The default destination is the Databricks workspace Assistant skills tree
25
+ * (`/Workspace/.assistant/skills`, the same tree a "save this as a skill"
26
+ * action writes to), so provisioned skills persist across restarts and are
27
+ * discovered by the built-in Assistant-skills mount. Pass `userEmail` (or an
28
+ * explicit `databricksBasePath`) to target `/Users/<email>/.assistant/skills`
29
+ * instead. When no Databricks client is resolvable at startup, the tree is
30
+ * written to a local temp dir and returned as an extra local skill path for
31
+ * the current process.
32
+ *
33
+ * @module
34
+ */
35
+ import { mkdtemp, cp, mkdir, readdir, readFile, rm, stat, writeFile } from "node:fs/promises";
36
+ import { createRequire } from "node:module";
37
+ import { tmpdir } from "node:os";
38
+ import { join, posix } from "node:path";
39
+ import { appkit } from "@dbx-tools/appkit";
40
+ import { spawn } from "@dbx-tools/core";
41
+ import { findFiles } from "@dbx-tools/path";
42
+ import { error, log, net, string } from "@dbx-tools/shared-core";
43
+ import { DatabricksWorkspaceFilesystem } from "./filesystems.js";
44
+ const logger = log.logger("mastra/remote-skills");
45
+ /** Shared Assistant skills tree in the Databricks workspace (default target). */
46
+ const ASSISTANT_SHARED_SKILLS_PATH = "/Workspace/.assistant/skills";
47
+ /** Assistant skills directory for a specific Databricks user. */
48
+ function userAssistantSkillsPath(userEmail) {
49
+ return `/Users/${userEmail.trim()}/.assistant/skills`;
50
+ }
51
+ /** npm agent id the `skills` CLI installs a bare `SKILL.md` tree under. */
52
+ const SKILLS_CLI_AGENT = "agents";
53
+ /** Where the `skills` CLI drops a plain `SKILL.md` tree under a target dir. */
54
+ const SKILLS_CLI_LAYOUT = [".agents", "skills"];
55
+ /** Cap on a direct-fetch download body, matching the `skills` CLI default. */
56
+ const DEFAULT_MAX_DOWNLOAD_BYTES = 10 * 1024 * 1024;
57
+ /* ------------------------------- helpers ------------------------------- */
58
+ /** Normalize the `remoteSkills` option into a flat options bag. */
59
+ export function normalizeRemoteSkillsOption(option) {
60
+ if (option === undefined)
61
+ return undefined;
62
+ if (typeof option === "string")
63
+ return { sources: [option] };
64
+ if (Array.isArray(option))
65
+ return option.length > 0 ? { sources: option } : undefined;
66
+ if (isProvisionOptions(option)) {
67
+ const sources = Array.isArray(option.sources) ? option.sources : [option.sources];
68
+ return sources.length > 0 ? { ...option, sources } : undefined;
69
+ }
70
+ // A lone RemoteSkillSourceOptions object.
71
+ return { sources: [option] };
72
+ }
73
+ /** A `sources`-bearing bag is the top-level options shape, not a single source. */
74
+ function isProvisionOptions(value) {
75
+ return "sources" in value;
76
+ }
77
+ /** Coerce a source entry to its normalized {@link RemoteSkillSourceOptions}. */
78
+ function toSourceOptions(source) {
79
+ return typeof source === "string" ? { source } : source;
80
+ }
81
+ /**
82
+ * Materialize every configured remote skill source at app startup.
83
+ *
84
+ * Writes each resolved `SKILL.md` tree to the Databricks user Assistant skills
85
+ * folder when a writable workspace is available, else to a local temp dir
86
+ * returned in {@link ProvisionedRemoteSkills.localSkillPaths}.
87
+ */
88
+ export async function provisionRemoteSkills(option) {
89
+ const options = normalizeRemoteSkillsOption(option);
90
+ const empty = { localSkillPaths: [], skillNames: [] };
91
+ if (!options)
92
+ return empty;
93
+ const failDefault = options.failOnError !== false;
94
+ const client = options.client ?? appkit.tryGetExecutionContext()?.client;
95
+ const databricksBasePath = resolveDatabricksBasePath(options, client);
96
+ const destination = databricksBasePath
97
+ ? new DatabricksWorkspaceFilesystem({ client, basePath: databricksBasePath, readOnly: false })
98
+ : undefined;
99
+ const localSkillPaths = [];
100
+ const skillNames = [];
101
+ let staging;
102
+ try {
103
+ const sources = Array.isArray(options.sources) ? options.sources : [options.sources];
104
+ for (const entry of sources) {
105
+ const sourceOptions = toSourceOptions(entry);
106
+ const failOnError = sourceOptions.failOnError ?? failDefault;
107
+ try {
108
+ staging ??= await mkdtemp(join(tmpdir(), "mastra-remote-skills-"));
109
+ const stagedDir = await stageSource(sourceOptions, staging, options);
110
+ const staged = await collectSkillDirs(stagedDir);
111
+ if (staged.length === 0) {
112
+ throw new Error(`no SKILL.md found for source "${sourceOptions.source}"`);
113
+ }
114
+ if (destination && databricksBasePath) {
115
+ await uploadSkillDirs(destination, staged);
116
+ skillNames.push(...staged.map((dir) => dir.name));
117
+ }
118
+ else {
119
+ const localDir = await persistLocally(staged);
120
+ localSkillPaths.push(localDir);
121
+ skillNames.push(...staged.map((dir) => dir.name));
122
+ }
123
+ logger.debug("source:provisioned", {
124
+ source: sourceOptions.source,
125
+ destination: databricksBasePath ?? "local-temp",
126
+ skills: staged.map((dir) => dir.name),
127
+ });
128
+ }
129
+ catch (err) {
130
+ if (failOnError) {
131
+ throw new Error(`failed to provision remote skill source "${sourceOptions.source}": ${error.errorMessage(err)}`, { cause: error.toError(err) });
132
+ }
133
+ logger.warn("source:skipped", {
134
+ source: sourceOptions.source,
135
+ error: error.errorMessage(err),
136
+ });
137
+ }
138
+ }
139
+ }
140
+ finally {
141
+ if (staging)
142
+ await rm(staging, { recursive: true, force: true }).catch(() => undefined);
143
+ }
144
+ return { localSkillPaths, databricksBasePath, skillNames };
145
+ }
146
+ /** Resolve the Databricks Assistant skills destination, or `undefined` for local temp. */
147
+ function resolveDatabricksBasePath(options, client) {
148
+ if (!client)
149
+ return undefined;
150
+ if (options.databricksBasePath)
151
+ return options.databricksBasePath.trim() || undefined;
152
+ const email = string.trimToNull(options.userEmail);
153
+ // A named user targets their personal Assistant tree (the "save a skill"
154
+ // target); otherwise the shared workspace Assistant tree, which the built-in
155
+ // Assistant-skills mount already scans.
156
+ return email ? userAssistantSkillsPath(email) : ASSISTANT_SHARED_SKILLS_PATH;
157
+ }
158
+ /**
159
+ * Stage one source into a fresh dir under `staging`, preferring the optional
160
+ * `skills` CLI and falling back to a direct fetch.
161
+ */
162
+ async function stageSource(sourceOptions, staging, options) {
163
+ const target = await mkdtemp(join(staging, "src-"));
164
+ const viaCli = await stageViaSkillsCli(sourceOptions, target);
165
+ if (viaCli)
166
+ return viaCli;
167
+ return stageViaFetch(sourceOptions, target, options);
168
+ }
169
+ /**
170
+ * Copy a source into `target` with the `skills` CLI when it is installed.
171
+ * Returns the dir holding the copied `SKILL.md` trees, or `undefined` when the
172
+ * CLI is absent (so the caller can fall back to a fetch).
173
+ */
174
+ async function stageViaSkillsCli(sourceOptions, target) {
175
+ const cli = await resolveSkillsCli();
176
+ if (!cli)
177
+ return undefined;
178
+ const args = [
179
+ ...cli.args,
180
+ "add",
181
+ sourceOptions.source,
182
+ "--agent",
183
+ SKILLS_CLI_AGENT,
184
+ "--copy",
185
+ "-y",
186
+ ];
187
+ for (const skill of string.parseList(sourceOptions.skills)) {
188
+ args.push("--skill", skill);
189
+ }
190
+ if (string.parseList(sourceOptions.skills).length === 0)
191
+ args.push("--skill", "*");
192
+ const result = await spawn(cli.command, args, {
193
+ cwd: target,
194
+ stdout: "capture",
195
+ stderr: "capture",
196
+ check: false,
197
+ });
198
+ if (result.exitCode !== 0) {
199
+ throw new Error(`skills CLI failed (exit ${result.exitCode}): ${result.stderr || result.stdout}`);
200
+ }
201
+ return join(target, ...SKILLS_CLI_LAYOUT);
202
+ }
203
+ /**
204
+ * Locate the optional `skills` CLI bin, resolved from THIS package's module
205
+ * graph. Returns `undefined` when the peer dep isn't installed, so the caller
206
+ * falls back to a direct fetch.
207
+ */
208
+ async function resolveSkillsCli() {
209
+ try {
210
+ const require = createRequire(import.meta.url);
211
+ const pkgPath = require.resolve("skills/package.json");
212
+ const bin = join(pkgPath, "..", "bin", "cli.mjs");
213
+ if (await pathExists(bin))
214
+ return { command: process.execPath, args: [bin] };
215
+ }
216
+ catch {
217
+ // peer dep absent or unresolvable - fetch fallback handles it
218
+ }
219
+ return undefined;
220
+ }
221
+ /**
222
+ * Fetch a source URL and write the downloaded `SKILL.md` under `target`.
223
+ * Used when the `skills` CLI isn't installed; supports a direct `SKILL.md` URL.
224
+ */
225
+ async function stageViaFetch(sourceOptions, target, options) {
226
+ const url = net.urlBuilder(sourceOptions.source);
227
+ if (!url) {
228
+ throw new Error(`source "${sourceOptions.source}" is not a URL and the optional "skills" package is not installed`);
229
+ }
230
+ const maxBytes = sourceOptions.maxDownloadBytes ?? options.maxDownloadBytes ?? DEFAULT_MAX_DOWNLOAD_BYTES;
231
+ const response = await fetch(url.toString());
232
+ if (!response.ok) {
233
+ throw new Error(`download failed: ${response.status} ${response.statusText} (${url.toString()})`);
234
+ }
235
+ const buffer = Buffer.from(await response.arrayBuffer());
236
+ if (buffer.byteLength > maxBytes) {
237
+ throw new Error(`download exceeds ${maxBytes} bytes (${url.toString()})`);
238
+ }
239
+ const name = string.toSlug(deriveSkillName(url.toString())) || "remote-skill";
240
+ const skillDir = join(target, name);
241
+ await mkdir(skillDir, { recursive: true });
242
+ await writeFile(join(skillDir, "SKILL.md"), buffer);
243
+ return target;
244
+ }
245
+ /** Derive a skill directory name from a download URL's last path segment. */
246
+ function deriveSkillName(urlString) {
247
+ const url = net.urlBuilder(urlString);
248
+ const last = url?.pathname.split("/").filter(Boolean).pop() ?? "";
249
+ return last.replace(/\.(md|zip|tar|tgz|gz)$/i, "");
250
+ }
251
+ /**
252
+ * Collect every skill directory under `root`: a `root/SKILL.md` (root IS the
253
+ * skill) or each immediate child dir that contains a `SKILL.md`.
254
+ */
255
+ async function collectSkillDirs(root) {
256
+ if (!(await pathExists(root)))
257
+ return [];
258
+ if (await pathExists(join(root, "SKILL.md"))) {
259
+ const name = posix.basename(root.split(/[\\/]/).join("/"));
260
+ return [{ name, absolutePath: root }];
261
+ }
262
+ const dirs = [];
263
+ for (const entry of await readdir(root, { withFileTypes: true })) {
264
+ if (!entry.isDirectory())
265
+ continue;
266
+ const dir = join(root, entry.name);
267
+ if (await pathExists(join(dir, "SKILL.md"))) {
268
+ dirs.push({ name: entry.name, absolutePath: dir });
269
+ }
270
+ }
271
+ return dirs;
272
+ }
273
+ /** Upload each staged skill directory into the Databricks destination tree. */
274
+ async function uploadSkillDirs(destination, dirs) {
275
+ await destination.init?.();
276
+ for (const dir of dirs) {
277
+ for (const relative of findFiles("**/*", { cwd: dir.absolutePath, nodir: true })) {
278
+ const buffer = await readFile(join(dir.absolutePath, relative));
279
+ const remotePath = posix.join("/", dir.name, relative.split(/[\\/]/).join("/"));
280
+ await destination.writeFile(remotePath, buffer, { overwrite: true });
281
+ }
282
+ }
283
+ }
284
+ /** Copy staged skill dirs into a persistent local temp dir; return its path. */
285
+ async function persistLocally(dirs) {
286
+ const base = await mkdtemp(join(tmpdir(), "mastra-local-skills-"));
287
+ for (const dir of dirs) {
288
+ await cp(dir.absolutePath, join(base, dir.name), { recursive: true });
289
+ }
290
+ return base;
291
+ }
292
+ /** Best-effort existence check. */
293
+ async function pathExists(path) {
294
+ try {
295
+ await stat(path);
296
+ return true;
297
+ }
298
+ catch {
299
+ return false;
300
+ }
301
+ }
302
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFakUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRWxELGlGQUFpRjtBQUNqRixNQUFNLDRCQUE0QixHQUFHLDhCQUE4QixDQUFDO0FBRXBFLGlFQUFpRTtBQUNqRSxTQUFTLHVCQUF1QixDQUFDLFNBQWlCO0lBQ2hELE9BQU8sVUFBVSxTQUFTLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDO0FBQ3hELENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxnQkFBZ0IsR0FBRyxRQUFR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LFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDaEUsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLEtBQUssVUFBVSxjQUFjLENBQUMsSUFBc0I7SUFDbEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQztJQUNuRSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsbUNBQW1DO0FBQ25DLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNwQyxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFydHVwIHByb3Zpc2lvbmluZyBvZiByZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBmb3IgYSBNYXN0cmEgd29ya3NwYWNlLlxuICpcbiAqIEEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlfSBuYW1lcyBXSEVSRSBhIGBTS0lMTC5tZGAgdHJlZSBjb21lcyBmcm9tIC0gYVxuICogR2l0SHViIGBvd25lci9yZXBvYCwgYW55IGdpdCAvIEdpdExhYiBVUkwsIG9yIGEgZGlyZWN0IGRvd25sb2FkIFVSTCAtIGFuZFxuICogb3B0aW9uYWwgcGVyLXNvdXJjZSBwb2xpY3kuIHtAbGluayBwcm92aXNpb25SZW1vdGVTa2lsbHN9IG1hdGVyaWFsaXplcyBldmVyeVxuICogc291cmNlIGludG8gYSBsb2NhbCBgU0tJTEwubWRgIHRyZWUgYXQgYXBwIGJvb3QgYW5kIHJldHVybnMgdGhlIGRpcmVjdG9yaWVzXG4gKiB0byBoYW5kIE1hc3RyYSBhcyBleHRyYSBza2lsbCBzY2FuIHBhdGhzLlxuICpcbiAqIFJlc29sdXRpb24gcGVyIHNvdXJjZSwgaW4gb3JkZXI6XG4gKlxuICogMS4gdGhlIE9QVElPTkFMIGBza2lsbHNgIG5wbSBDTEkgKHBlZXIgZGVwKTogaWYgaW5zdGFsbGVkLCBlYWNoIHNvdXJjZSBpc1xuICogICAgY29waWVkIGludG8gYSBzdGFnaW5nIGRpciB3aXRoIGBza2lsbHMgYWRkIDxzb3VyY2U+IC0tYWdlbnQgPGRpcj4gLS1jb3B5YCxcbiAqICAgIHdoaWNoIHVuZGVyc3RhbmRzIGV2ZXJ5IHNvdXJjZSBmb3JtYXQgdGhlIGVjb3N5c3RlbSBkb2VzIChHaXRIdWJcbiAqICAgIHNob3J0aGFuZCwgZ2l0IFVSTHMsIGFyY2hpdmUvZG93bmxvYWQgVVJMcyk7XG4gKiAyLiBvdGhlcndpc2UgYSBwbGFpbiB7QGxpbmsgZmV0Y2h9IG9mIHRoZSBzb3VyY2UgVVJMIChidWlsdCB3aXRoXG4gKiAgICB7QGxpbmsgbmV0LnVybEJ1aWxkZXJ9KSwgd3JpdGluZyB0aGUgZG93bmxvYWRlZCBgU0tJTEwubWRgIHRvIGEgc3RhZ2luZ1xuICogICAgZGlyLlxuICpcbiAqIEEgc291cmNlIHRoYXQgcmVzb2x2ZXMgdGhyb3VnaCBuZWl0aGVyIHBhdGggZmFpbHMgYXBwIHN0YXJ0dXAsIHVubGVzcyB0aGVcbiAqIHNvdXJjZSAob3IgdGhlIHRvcC1sZXZlbCBjYWxsKSBzZXRzIGBmYWlsT25FcnJvcjogZmFsc2VgLCBpbiB3aGljaCBjYXNlIGl0IGlzXG4gKiBsb2dnZWQgYW5kIHNraXBwZWQgc28gb25lIGJhZCBzb3VyY2UgbmV2ZXIgdGFrZXMgdGhlIGFwcCBkb3duLlxuICpcbiAqIFRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIGlzIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBBc3Npc3RhbnQgc2tpbGxzIHRyZWVcbiAqIChgL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc2AsIHRoZSBzYW1lIHRyZWUgYSBcInNhdmUgdGhpcyBhcyBhIHNraWxsXCJcbiAqIGFjdGlvbiB3cml0ZXMgdG8pLCBzbyBwcm92aXNpb25lZCBza2lsbHMgcGVyc2lzdCBhY3Jvc3MgcmVzdGFydHMgYW5kIGFyZVxuICogZGlzY292ZXJlZCBieSB0aGUgYnVpbHQtaW4gQXNzaXN0YW50LXNraWxscyBtb3VudC4gUGFzcyBgdXNlckVtYWlsYCAob3IgYW5cbiAqIGV4cGxpY2l0IGBkYXRhYnJpY2tzQmFzZVBhdGhgKSB0byB0YXJnZXQgYC9Vc2Vycy88ZW1haWw+Ly5hc3Npc3RhbnQvc2tpbGxzYFxuICogaW5zdGVhZC4gV2hlbiBubyBEYXRhYnJpY2tzIGNsaWVudCBpcyByZXNvbHZhYmxlIGF0IHN0YXJ0dXAsIHRoZSB0cmVlIGlzXG4gKiB3cml0dGVuIHRvIGEgbG9jYWwgdGVtcCBkaXIgYW5kIHJldHVybmVkIGFzIGFuIGV4dHJhIGxvY2FsIHNraWxsIHBhdGggZm9yXG4gKiB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2R0ZW1wLCBjcCwgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlLCBybSwgc3RhdCwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luLCBwb3NpeCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGZpbmRGaWxlcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3BhdGhcIjtcbmltcG9ydCB7IGVycm9yLCBsb2csIG5ldCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuaW1wb3J0IHsgRGF0YWJyaWNrc1dvcmtzcGFjZUZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9maWxlc3lzdGVtcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3JlbW90ZS1za2lsbHNcIik7XG5cbi8qKiBTaGFyZWQgQXNzaXN0YW50IHNraWxscyB0cmVlIGluIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSAoZGVmYXVsdCB0YXJnZXQpLiAqL1xuY29uc3QgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSCA9IFwiL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc1wiO1xuXG4vKiogQXNzaXN0YW50IHNraWxscyBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgRGF0YWJyaWNrcyB1c2VyLiAqL1xuZnVuY3Rpb24gdXNlckFzc2lzdGFudFNraWxsc1BhdGgodXNlckVtYWlsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYC9Vc2Vycy8ke3VzZXJFbWFpbC50cmltKCl9Ly5hc3Npc3RhbnQvc2tpbGxzYDtcbn1cblxuLyoqIG5wbSBhZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0FHRU5UID0gXCJhZ2VudHNcIjtcblxuLyoqIFdoZXJlIHRoZSBgc2tpbGxzYCBDTEkgZHJvcHMgYSBwbGFpbiBgU0tJTEwubWRgIHRyZWUgdW5kZXIgYSB0YXJnZXQgZGlyLiAqL1xuY29uc3QgU0tJTExTX0NMSV9MQVlPVVQgPSBbXCIuYWdlbnRzXCIsIFwic2tpbGxzXCJdIGFzIGNvbnN0O1xuXG4vKiogQ2FwIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkIGJvZHksIG1hdGNoaW5nIHRoZSBgc2tpbGxzYCBDTEkgZGVmYXVsdC4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX0RPV05MT0FEX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNDtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcmVtb3RlIHNraWxsIHNvdXJjZSBhbmQgaXRzIHBlci1zb3VyY2UgcG9saWN5LlxuICpcbiAqIGBzb3VyY2VgIGlzIGFueXRoaW5nIHRoZSBgc2tpbGxzYCBlY29zeXN0ZW0gdW5kZXJzdGFuZHM6IGEgR2l0SHViXG4gKiBgb3duZXIvcmVwb2Agc2hvcnRoYW5kLCBhIGZ1bGwgR2l0SHViIC8gR2l0TGFiIC8gZ2l0IFVSTCwgb3IgYSBkaXJlY3RcbiAqIGRvd25sb2FkIFVSTCB0byBhIGBTS0lMTC5tZGAgb3IgYXJjaGl2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMge1xuICAvKiogR2l0SHViIHNob3J0aGFuZCwgZ2l0IC8gR2l0TGFiIFVSTCwgb3IgYSBkaXJlY3QgZG93bmxvYWQgVVJMLiAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgLyoqIEluc3RhbGwgb25seSB0aGVzZSBza2lsbCBuYW1lcyBmcm9tIHRoZSBzb3VyY2UgKENMSSBwYXRoIG9ubHkpLiAqL1xuICBza2lsbHM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqIE92ZXJyaWRlIHRoZSBieXRlIGNlaWxpbmcgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgZm9yIHRoaXMgc291cmNlLiAqL1xuICBtYXhEb3dubG9hZEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hlbiBgZmFsc2VgLCBhIHNvdXJjZSB0aGF0IGZhaWxzIHRvIHJlc29sdmUgaXMgbG9nZ2VkIGFuZCBza2lwcGVkIGluc3RlYWRcbiAgICogb2YgZmFpbGluZyBhcHAgc3RhcnR1cC4gT3ZlcnJpZGVzIHRoZSB0b3AtbGV2ZWwge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMuZmFpbE9uRXJyb3J9LlxuICAgKi9cbiAgZmFpbE9uRXJyb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgcmVtb3RlIHNraWxsIHNvdXJjZTogYSBiYXJlIHNvdXJjZSBzdHJpbmcgKEdpdEh1YiBzaG9ydGhhbmQgLyBVUkwpIG9yIGFcbiAqIHtAbGluayBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnN9IHdpdGggcGVyLXNvdXJjZSBwb2xpY3kuXG4gKi9cbmV4cG9ydCB0eXBlIFJlbW90ZVNraWxsU291cmNlID0gc3RyaW5nIHwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zO1xuXG4vKipcbiAqIFRoZSB3b3Jrc3BhY2UgYHJlbW90ZVNraWxsc2Agb3B0aW9uLiBBIHNpbmdsZSBzb3VyY2UsIGEgbGlzdCwgb3IgYVxuICoge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnN9IGJhZyB3aGVuIHRvcC1sZXZlbCBwb2xpY3kgaXMgbmVlZGVkLlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbHNPcHRpb24gPVxuICBSZW1vdGVTa2lsbFNvdXJjZSB8IFJlbW90ZVNraWxsU291cmNlW10gfCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zO1xuXG4vKiogVG9wLWxldmVsIHJlbW90ZS1za2lsbHMgcHJvdmlzaW9uaW5nIG9wdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICAvKiogU291cmNlcyB0byBtYXRlcmlhbGl6ZSBhdCBzdGFydHVwLiAqL1xuICBzb3VyY2VzOiBSZW1vdGVTa2lsbFNvdXJjZSB8IFJlbW90ZVNraWxsU291cmNlW107XG4gIC8qKlxuICAgKiBGYWlsIGFwcCBzdGFydHVwIHdoZW4gYSBzb3VyY2UgY2FuJ3QgYmUgcmVzb2x2ZWQuIERlZmF1bHRzIHRvIGB0cnVlYC4gQVxuICAgKiBwZXItc291cmNlIGBmYWlsT25FcnJvcmAgd2lucyBvdmVyIHRoaXMuXG4gICAqL1xuICBmYWlsT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIHBhdGggdGhhdCByb290cyB0aGUgZGVzdGluYXRpb24gQXNzaXN0YW50IHNraWxscyB0cmVlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgT0JPIHVzZXIncyBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgLlxuICAgKi9cbiAgZGF0YWJyaWNrc0Jhc2VQYXRoPzogc3RyaW5nO1xuICAvKiogQXV0aC1zY29wZWQgRGF0YWJyaWNrcyBjbGllbnQuIERlZmF1bHRzIHRvIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIC8qKiBVc2VyIGVtYWlsIHVzZWQgdG8gZGVyaXZlIHRoZSBkZWZhdWx0IERhdGFicmlja3MgZGVzdGluYXRpb24uICovXG4gIHVzZXJFbWFpbD86IHN0cmluZztcbiAgLyoqIEJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZC4gRGVmYXVsdHMgdG8gMTAgTWlCLiAqL1xuICBtYXhEb3dubG9hZEJ5dGVzPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSByZXNvbHZlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMge1xuICAvKipcbiAgICogRXh0cmEgTE9DQUwgc2tpbGwgc2NhbiBwYXRocyB0byBoYW5kIE1hc3RyYSAoYSB0ZW1wIGRpciBwZXIgc291cmNlIHRoYXRcbiAgICogY291bGRuJ3QgYmUgd3JpdHRlbiB0byBEYXRhYnJpY2tzKS4gRW1wdHkgd2hlbiBldmVyeXRoaW5nIGxhbmRlZCBpbiB0aGVcbiAgICogRGF0YWJyaWNrcyBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluIG1vdW50IGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbiBlYWNoIHNvdXJjZSB3YXMgd3JpdHRlbiB0bywgaWYgYW55LiAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiBOYW1lcyBvZiBldmVyeSBza2lsbCBkaXJlY3RvcnkgdGhhdCB3YXMgcHJvdmlzaW9uZWQuICovXG4gIHNraWxsTmFtZXM6IHN0cmluZ1tdO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogTm9ybWFsaXplIHRoZSBgcmVtb3RlU2tpbGxzYCBvcHRpb24gaW50byBhIGZsYXQgb3B0aW9ucyBiYWcuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKFxuICBvcHRpb246IFJlbW90ZVNraWxsc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBzb3VyY2VzOiBbb3B0aW9uXSB9O1xuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb24pKSByZXR1cm4gb3B0aW9uLmxlbmd0aCA+IDAgPyB7IHNvdXJjZXM6IG9wdGlvbiB9IDogdW5kZWZpbmVkO1xuICBpZiAoaXNQcm92aXNpb25PcHRpb25zKG9wdGlvbikpIHtcbiAgICBjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShvcHRpb24uc291cmNlcykgPyBvcHRpb24uc291cmNlcyA6IFtvcHRpb24uc291cmNlc107XG4gICAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID4gMCA/IHsgLi4ub3B0aW9uLCBzb3VyY2VzIH0gOiB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gQSBsb25lIFJlbW90ZVNraWxsU291cmNlT3B0aW9ucyBvYmplY3QuXG4gIHJldHVybiB7IHNvdXJjZXM6IFtvcHRpb25dIH07XG59XG5cbi8qKiBBIGBzb3VyY2VzYC1iZWFyaW5nIGJhZyBpcyB0aGUgdG9wLWxldmVsIG9wdGlvbnMgc2hhcGUsIG5vdCBhIHNpbmdsZSBzb3VyY2UuICovXG5mdW5jdGlvbiBpc1Byb3Zpc2lvbk9wdGlvbnMoXG4gIHZhbHVlOiBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMgfCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogdmFsdWUgaXMgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB7XG4gIHJldHVybiBcInNvdXJjZXNcIiBpbiB2YWx1ZTtcbn1cblxuLyoqIENvZXJjZSBhIHNvdXJjZSBlbnRyeSB0byBpdHMgbm9ybWFsaXplZCB7QGxpbmsgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zfS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlT3B0aW9ucyhzb3VyY2U6IFJlbW90ZVNraWxsU291cmNlKTogUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zIHtcbiAgcmV0dXJuIHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgPyB7IHNvdXJjZSB9IDogc291cmNlO1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplIGV2ZXJ5IGNvbmZpZ3VyZWQgcmVtb3RlIHNraWxsIHNvdXJjZSBhdCBhcHAgc3RhcnR1cC5cbiAqXG4gKiBXcml0ZXMgZWFjaCByZXNvbHZlZCBgU0tJTEwubWRgIHRyZWUgdG8gdGhlIERhdGFicmlja3MgdXNlciBBc3Npc3RhbnQgc2tpbGxzXG4gKiBmb2xkZXIgd2hlbiBhIHdyaXRhYmxlIHdvcmtzcGFjZSBpcyBhdmFpbGFibGUsIGVsc2UgdG8gYSBsb2NhbCB0ZW1wIGRpclxuICogcmV0dXJuZWQgaW4ge0BsaW5rIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzLmxvY2FsU2tpbGxQYXRoc30uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aXNpb25SZW1vdGVTa2lsbHMoXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxQcm92aXNpb25lZFJlbW90ZVNraWxscz4ge1xuICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKG9wdGlvbik7XG4gIGNvbnN0IGVtcHR5OiBQcm92aXNpb25lZFJlbW90ZVNraWxscyA9IHsgbG9jYWxTa2lsbFBhdGhzOiBbXSwgc2tpbGxOYW1lczogW10gfTtcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gZW1wdHk7XG5cbiAgY29uc3QgZmFpbERlZmF1bHQgPSBvcHRpb25zLmZhaWxPbkVycm9yICE9PSBmYWxzZTtcbiAgY29uc3QgY2xpZW50ID0gb3B0aW9ucy5jbGllbnQgPz8gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50O1xuICBjb25zdCBkYXRhYnJpY2tzQmFzZVBhdGggPSByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKG9wdGlvbnMsIGNsaWVudCk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gZGF0YWJyaWNrc0Jhc2VQYXRoXG4gICAgPyBuZXcgRGF0YWJyaWNrc1dvcmtzcGFjZUZpbGVzeXN0ZW0oeyBjbGllbnQsIGJhc2VQYXRoOiBkYXRhYnJpY2tzQmFzZVBhdGgsIHJlYWRPbmx5OiBmYWxzZSB9KVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGxvY2FsU2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2tpbGxOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IHN0YWdpbmc6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuc291cmNlcykgPyBvcHRpb25zLnNvdXJjZXMgOiBbb3B0aW9ucy5zb3VyY2VzXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZU9wdGlvbnMgPSB0b1NvdXJjZU9wdGlvbnMoZW50cnkpO1xuICAgICAgY29uc3QgZmFpbE9uRXJyb3IgPSBzb3VyY2VPcHRpb25zLmZhaWxPbkVycm9yID8/IGZhaWxEZWZhdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RhZ2luZyA/Pz0gYXdhaXQgbWtkdGVtcChqb2luKHRtcGRpcigpLCBcIm1hc3RyYS1yZW1vdGUtc2tpbGxzLVwiKSk7XG4gICAgICAgIGNvbnN0IHN0YWdlZERpciA9IGF3YWl0IHN0YWdlU291cmNlKHNvdXJjZU9wdGlvbnMsIHN0YWdpbmcsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFnZWQgPSBhd2FpdCBjb2xsZWN0U2tpbGxEaXJzKHN0YWdlZERpcik7XG4gICAgICAgIGlmIChzdGFnZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBTS0lMTC5tZCBmb3VuZCBmb3Igc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkYXRhYnJpY2tzQmFzZVBhdGgpIHtcbiAgICAgICAgICBhd2FpdCB1cGxvYWRTa2lsbERpcnMoZGVzdGluYXRpb24sIHN0YWdlZCk7XG4gICAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLnN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsb2NhbERpciA9IGF3YWl0IHBlcnNpc3RMb2NhbGx5KHN0YWdlZCk7XG4gICAgICAgICAgbG9jYWxTa2lsbFBhdGhzLnB1c2gobG9jYWxEaXIpO1xuICAgICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5zdGFnZWQubWFwKChkaXIpID0+IGRpci5uYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwic291cmNlOnByb3Zpc2lvbmVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGRlc3RpbmF0aW9uOiBkYXRhYnJpY2tzQmFzZVBhdGggPz8gXCJsb2NhbC10ZW1wXCIsXG4gICAgICAgICAgc2tpbGxzOiBzdGFnZWQubWFwKChkaXIpID0+IGRpci5uYW1lKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYGZhaWxlZCB0byBwcm92aXNpb24gcmVtb3RlIHNraWxsIHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCI6ICR7ZXJyb3IuZXJyb3JNZXNzYWdlKGVycil9YCxcbiAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yLnRvRXJyb3IoZXJyKSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzb3VyY2U6c2tpcHBlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoc3RhZ2luZykgYXdhaXQgcm0oc3RhZ2luZywgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIH1cblxuICByZXR1cm4geyBsb2NhbFNraWxsUGF0aHMsIGRhdGFicmlja3NCYXNlUGF0aCwgc2tpbGxOYW1lcyB9O1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgRGF0YWJyaWNrcyBBc3Npc3RhbnQgc2tpbGxzIGRlc3RpbmF0aW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgbG9jYWwgdGVtcC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzQmFzZVBhdGgoXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob3B0aW9ucy5kYXRhYnJpY2tzQmFzZVBhdGgpIHJldHVybiBvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aC50cmltKCkgfHwgdW5kZWZpbmVkO1xuICBjb25zdCBlbWFpbCA9IHN0cmluZy50cmltVG9OdWxsKG9wdGlvbnMudXNlckVtYWlsKTtcbiAgLy8gQSBuYW1lZCB1c2VyIHRhcmdldHMgdGhlaXIgcGVyc29uYWwgQXNzaXN0YW50IHRyZWUgKHRoZSBcInNhdmUgYSBza2lsbFwiXG4gIC8vIHRhcmdldCk7IG90aGVyd2lzZSB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluXG4gIC8vIEFzc2lzdGFudC1za2lsbHMgbW91bnQgYWxyZWFkeSBzY2Fucy5cbiAgcmV0dXJuIGVtYWlsID8gdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpIDogQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSDtcbn1cblxuLyoqXG4gKiBTdGFnZSBvbmUgc291cmNlIGludG8gYSBmcmVzaCBkaXIgdW5kZXIgYHN0YWdpbmdgLCBwcmVmZXJyaW5nIHRoZSBvcHRpb25hbFxuICogYHNraWxsc2AgQ0xJIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBkaXJlY3QgZmV0Y2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlU291cmNlKFxuICBzb3VyY2VPcHRpb25zOiBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsXG4gIHN0YWdpbmc6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHRhcmdldCA9IGF3YWl0IG1rZHRlbXAoam9pbihzdGFnaW5nLCBcInNyYy1cIikpO1xuICBjb25zdCB2aWFDbGkgPSBhd2FpdCBzdGFnZVZpYVNraWxsc0NsaShzb3VyY2VPcHRpb25zLCB0YXJnZXQpO1xuICBpZiAodmlhQ2xpKSByZXR1cm4gdmlhQ2xpO1xuICByZXR1cm4gc3RhZ2VWaWFGZXRjaChzb3VyY2VPcHRpb25zLCB0YXJnZXQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIENvcHkgYSBzb3VyY2UgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBgc2tpbGxzYCBDTEkgd2hlbiBpdCBpcyBpbnN0YWxsZWQuXG4gKiBSZXR1cm5zIHRoZSBkaXIgaG9sZGluZyB0aGUgY29waWVkIGBTS0lMTC5tZGAgdHJlZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gKiBDTEkgaXMgYWJzZW50IChzbyB0aGUgY2FsbGVyIGNhbiBmYWxsIGJhY2sgdG8gYSBmZXRjaCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhU2tpbGxzQ2xpKFxuICBzb3VyY2VPcHRpb25zOiBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsXG4gIHRhcmdldDogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2xpID0gYXdhaXQgcmVzb2x2ZVNraWxsc0NsaSgpO1xuICBpZiAoIWNsaSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBhcmdzID0gW1xuICAgIC4uLmNsaS5hcmdzLFxuICAgIFwiYWRkXCIsXG4gICAgc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgXCItLWFnZW50XCIsXG4gICAgU0tJTExTX0NMSV9BR0VOVCxcbiAgICBcIi0tY29weVwiLFxuICAgIFwiLXlcIixcbiAgXTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSkge1xuICAgIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgc2tpbGwpO1xuICB9XG4gIGlmIChzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKS5sZW5ndGggPT09IDApIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgXCIqXCIpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduKGNsaS5jb21tYW5kLCBhcmdzLCB7XG4gICAgY3dkOiB0YXJnZXQsXG4gICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgIGNoZWNrOiBmYWxzZSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgc2tpbGxzIENMSSBmYWlsZWQgKGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9KTogJHtyZXN1bHQuc3RkZXJyIHx8IHJlc3VsdC5zdGRvdXR9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBqb2luKHRhcmdldCwgLi4uU0tJTExTX0NMSV9MQVlPVVQpO1xufVxuXG4vKipcbiAqIExvY2F0ZSB0aGUgb3B0aW9uYWwgYHNraWxsc2AgQ0xJIGJpbiwgcmVzb2x2ZWQgZnJvbSBUSElTIHBhY2thZ2UncyBtb2R1bGVcbiAqIGdyYXBoLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIHBlZXIgZGVwIGlzbid0IGluc3RhbGxlZCwgc28gdGhlIGNhbGxlclxuICogZmFsbHMgYmFjayB0byBhIGRpcmVjdCBmZXRjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsc0NsaSgpOiBQcm9taXNlPHsgY29tbWFuZDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICBjb25zdCBwa2dQYXRoID0gcmVxdWlyZS5yZXNvbHZlKFwic2tpbGxzL3BhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCBiaW4gPSBqb2luKHBrZ1BhdGgsIFwiLi5cIiwgXCJiaW5cIiwgXCJjbGkubWpzXCIpO1xuICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKGJpbikpIHJldHVybiB7IGNvbW1hbmQ6IHByb2Nlc3MuZXhlY1BhdGgsIGFyZ3M6IFtiaW5dIH07XG4gIH0gY2F0Y2gge1xuICAgIC8vIHBlZXIgZGVwIGFic2VudCBvciB1bnJlc29sdmFibGUgLSBmZXRjaCBmYWxsYmFjayBoYW5kbGVzIGl0XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGZXRjaCBhIHNvdXJjZSBVUkwgYW5kIHdyaXRlIHRoZSBkb3dubG9hZGVkIGBTS0lMTC5tZGAgdW5kZXIgYHRhcmdldGAuXG4gKiBVc2VkIHdoZW4gdGhlIGBza2lsbHNgIENMSSBpc24ndCBpbnN0YWxsZWQ7IHN1cHBvcnRzIGEgZGlyZWN0IGBTS0lMTC5tZGAgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVZpYUZldGNoKFxuICBzb3VyY2VPcHRpb25zOiBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoc291cmNlT3B0aW9ucy5zb3VyY2UpO1xuICBpZiAoIXVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiIGlzIG5vdCBhIFVSTCBhbmQgdGhlIG9wdGlvbmFsIFwic2tpbGxzXCIgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IG1heEJ5dGVzID1cbiAgICBzb3VyY2VPcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gb3B0aW9ucy5tYXhEb3dubG9hZEJ5dGVzID8/IERFRkFVTFRfTUFYX0RPV05MT0FEX0JZVEVTO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpKTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBkb3dubG9hZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9ICgke3VybC50b1N0cmluZygpfSlgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChidWZmZXIuYnl0ZUxlbmd0aCA+IG1heEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBleGNlZWRzICR7bWF4Qnl0ZXN9IGJ5dGVzICgke3VybC50b1N0cmluZygpfSlgKTtcbiAgfVxuICBjb25zdCBuYW1lID0gc3RyaW5nLnRvU2x1ZyhkZXJpdmVTa2lsbE5hbWUodXJsLnRvU3RyaW5nKCkpKSB8fCBcInJlbW90ZS1za2lsbFwiO1xuICBjb25zdCBza2lsbERpciA9IGpvaW4odGFyZ2V0LCBuYW1lKTtcbiAgYXdhaXQgbWtkaXIoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihza2lsbERpciwgXCJTS0lMTC5tZFwiKSwgYnVmZmVyKTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqIERlcml2ZSBhIHNraWxsIGRpcmVjdG9yeSBuYW1lIGZyb20gYSBkb3dubG9hZCBVUkwncyBsYXN0IHBhdGggc2VnbWVudC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVNraWxsTmFtZSh1cmxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHVybFN0cmluZyk7XG4gIGNvbnN0IGxhc3QgPSB1cmw/LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgPz8gXCJcIjtcbiAgcmV0dXJuIGxhc3QucmVwbGFjZSgvXFwuKG1kfHppcHx0YXJ8dGd6fGd6KSQvaSwgXCJcIik7XG59XG5cbi8qKiBBIHNraWxsIGRpcmVjdG9yeSAoaG9sZGluZyBhIGBTS0lMTC5tZGApIHN0YWdlZCBvbiBsb2NhbCBkaXNrLiAqL1xuaW50ZXJmYWNlIFN0YWdlZFNraWxsRGlyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhYnNvbHV0ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSB1bmRlciBgcm9vdGA6IGEgYHJvb3QvU0tJTEwubWRgIChyb290IElTIHRoZVxuICogc2tpbGwpIG9yIGVhY2ggaW1tZWRpYXRlIGNoaWxkIGRpciB0aGF0IGNvbnRhaW5zIGEgYFNLSUxMLm1kYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFNraWxsRGlycyhyb290OiBzdHJpbmcpOiBQcm9taXNlPFN0YWdlZFNraWxsRGlyW10+IHtcbiAgaWYgKCEoYXdhaXQgcGF0aEV4aXN0cyhyb290KSkpIHJldHVybiBbXTtcbiAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihyb290LCBcIlNLSUxMLm1kXCIpKSkge1xuICAgIGNvbnN0IG5hbWUgPSBwb3NpeC5iYXNlbmFtZShyb290LnNwbGl0KC9bXFxcXC9dLykuam9pbihcIi9cIikpO1xuICAgIHJldHVybiBbeyBuYW1lLCBhYnNvbHV0ZVBhdGg6IHJvb3QgfV07XG4gIH1cbiAgY29uc3QgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF3YWl0IHJlYWRkaXIocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBkaXIgPSBqb2luKHJvb3QsIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKGpvaW4oZGlyLCBcIlNLSUxMLm1kXCIpKSkge1xuICAgICAgZGlycy5wdXNoKHsgbmFtZTogZW50cnkubmFtZSwgYWJzb2x1dGVQYXRoOiBkaXIgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXJzO1xufVxuXG4vKiogVXBsb2FkIGVhY2ggc3RhZ2VkIHNraWxsIGRpcmVjdG9yeSBpbnRvIHRoZSBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uIHRyZWUuICovXG5hc3luYyBmdW5jdGlvbiB1cGxvYWRTa2lsbERpcnMoXG4gIGRlc3RpbmF0aW9uOiBEYXRhYnJpY2tzV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBkZXN0aW5hdGlvbi5pbml0Py4oKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmUgb2YgZmluZEZpbGVzKFwiKiovKlwiLCB7IGN3ZDogZGlyLmFic29sdXRlUGF0aCwgbm9kaXI6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlyLmFic29sdXRlUGF0aCwgcmVsYXRpdmUpKTtcbiAgICAgIGNvbnN0IHJlbW90ZVBhdGggPSBwb3NpeC5qb2luKFwiL1wiLCBkaXIubmFtZSwgcmVsYXRpdmUuc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgICBhd2FpdCBkZXN0aW5hdGlvbi53cml0ZUZpbGUocmVtb3RlUGF0aCwgYnVmZmVyLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIENvcHkgc3RhZ2VkIHNraWxsIGRpcnMgaW50byBhIHBlcnNpc3RlbnQgbG9jYWwgdGVtcCBkaXI7IHJldHVybiBpdHMgcGF0aC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RMb2NhbGx5KGRpcnM6IFN0YWdlZFNraWxsRGlyW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBiYXNlID0gYXdhaXQgbWtkdGVtcChqb2luKHRtcGRpcigpLCBcIm1hc3RyYS1sb2NhbC1za2lsbHMtXCIpKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGF3YWl0IGNwKGRpci5hYnNvbHV0ZVBhdGgsIGpvaW4oYmFzZSwgZGlyLm5hbWUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gYmFzZTtcbn1cblxuLyoqIEJlc3QtZWZmb3J0IGV4aXN0ZW5jZSBjaGVjay4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgc3RhdChwYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
@@ -42,6 +42,14 @@ export interface CreateWorkspaceOptions {
42
42
  checkSkillFileMtime?: boolean;
43
43
  /** Enable BM25 keyword search over indexed workspace content. */
44
44
  bm25?: boolean;
45
+ /**
46
+ * Extra LOCAL skill scan paths added to every request's skill discovery.
47
+ * Used by the plugin to surface remote skills provisioned to a local temp
48
+ * dir at startup (see `remote-skills.ts`). Databricks-hosted remote skills
49
+ * need no entry here - they land in the Assistant tree the built-in mount
50
+ * already scans.
51
+ */
52
+ extraSkillPaths?: string[];
45
53
  }
46
54
  /**
47
55
  * Create a Mastra {@link Workspace} with per-request Databricks mounts.
@@ -47,7 +47,11 @@ const logger = log.logger("mastra/workspaces");
47
47
  export function createWorkspace(options = {}) {
48
48
  const { id, name } = resolveWorkspaceIdentity(options);
49
49
  const resolvers = buildMountResolvers(options);
50
- const skills = options.skills ?? (resolvers.length > 0 ? buildWorkspaceSkillsResolver(resolvers) : undefined);
50
+ const extraSkillPaths = options.extraSkillPaths ?? [];
51
+ const skills = options.skills ??
52
+ (resolvers.length > 0 || extraSkillPaths.length > 0
53
+ ? buildWorkspaceSkillsResolver(resolvers, extraSkillPaths)
54
+ : undefined);
51
55
  const checkSkillFileMtime = options.checkSkillFileMtime ?? options.assistantSkills !== false;
52
56
  const bm25 = options.bm25 !== false;
53
57
  logger.debug("workspace:create", {
@@ -59,6 +63,7 @@ export function createWorkspace(options = {}) {
59
63
  customSkillsResolver: Boolean(options.skills),
60
64
  checkSkillFileMtime,
61
65
  bm25,
66
+ extraSkillPaths: extraSkillPaths.length,
62
67
  });
63
68
  return new Workspace({
64
69
  id,
@@ -236,11 +241,12 @@ async function resolveWorkspaceFilesystem(resolvers, context) {
236
241
  * Build the dynamic {@link SkillsResolver} that collects `skillPaths` from
237
242
  * every mount resolver on each request.
238
243
  */
239
- function buildWorkspaceSkillsResolver(resolvers) {
244
+ function buildWorkspaceSkillsResolver(resolvers, extraSkillPaths = []) {
240
245
  return async (context) => {
241
246
  const { skillPaths } = await resolveWorkspaceContribution(resolvers, context);
242
- logger.debug("skills:resolved", { skillPaths });
243
- return skillPaths ?? [];
247
+ const merged = [...(skillPaths ?? []), ...extraSkillPaths];
248
+ logger.debug("skills:resolved", { skillPaths, extraSkillPaths });
249
+ return merged;
244
250
  };
245
251
  }
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFHSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFNBQVMsR0FJVixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQWEsTUFBTSxhQUFhLENBQUM7QUFDbkcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWxGLDZFQUE2RTtBQUU3RSwrREFBK0Q7QUFDL0QsTUFBTSw0QkFBNEIsR0FBRyw4QkFBOEIsQ0FBQztBQUVwRSxnRUFBZ0U7QUFDaEUsTUFBTSxnQ0FBZ0MsR0FBRyxtQkFBbUIsQ0FBQztBQUU3RCxrRUFBa0U7QUFDbEUsTUFBTSwyQkFBMkIsR0FBRyx3QkFBd0IsQ0FBQztBQUU3RCwrREFBK0Q7QUFDL0QsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLENBQVUsQ0FBQztBQUV4RixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUEwQy9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0MsRUFBRTtJQUNsRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUNWLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENB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IEFwcHMuXG4gKlxuICogQnVpbGRzIGEgcGVyLXJlcXVlc3Qge0BsaW5rIFdvcmtzcGFjZX0gd2hvc2UgZmlsZXN5c3RlbSBpcyBhXG4gKiB7QGxpbmsgQ29tcG9zaXRlRmlsZXN5c3RlbX0gb3ZlciBEYXRhYnJpY2tzIHBhdGhzIHJlc29sdmVkIGZyb20gdGhlXG4gKiBPQk8gY2xpZW50IG9uIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9LiBPcHRpb25hbCBtb3VudCByZXNvbHZlclxuICogY29udHJpYnV0aW9ucyBtZXJnZSBleHRyYSBmaWxlc3lzdGVtcyBhbmQgc2tpbGwgc2NhbiByb290czsgYnVpbHQtaW5cbiAqIEFzc2lzdGFudCBza2lsbCB0cmVlcyBhcmUgdG9nZ2xlZCB3aXRoIGBhc3Npc3RhbnRTa2lsbHNgIChvbiBieSBkZWZhdWx0KS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbFwiO1xuaW1wb3J0IHsgbG9nLCBzdHJpbmcsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgV29ya3NwYWNlLFxuICB0eXBlIFNraWxsc0NvbnRleHQsXG4gIHR5cGUgU2tpbGxzUmVzb2x2ZXIsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1NDT1BFU19LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IERhdGFicmlja3NXb3Jrc3BhY2VGaWxlc3lzdGVtLCBlbXB0eUZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9maWxlc3lzdGVtcy50c1wiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogU2hhcmVkIEFzc2lzdGFudCBza2lsbHMgdHJlZSBpbiB0aGUgd29ya3NwYWNlIG5hbWVzcGFjZS4gKi9cbmNvbnN0IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEggPSBcIi9Xb3Jrc3BhY2UvLmFzc2lzdGFudC9za2lsbHNcIjtcblxuLyoqIENvbXBvc2l0ZSBtb3VudCBmb3Ige0BsaW5rIEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEh9LiAqL1xuY29uc3QgQVNTSVNUQU5UX1dPUktTUEFDRV9TS0lMTFNfTU9VTlQgPSBcIi93b3Jrc3BhY2Vfc2tpbGxzXCI7XG5cbi8qKiBDb21wb3NpdGUgbW91bnQgZm9yIHRoZSBjYWxsZXIncyBgLy5hc3Npc3RhbnQvc2tpbGxzYCB0cmVlLiAqL1xuY29uc3QgQVNTSVNUQU5UX1VTRVJfU0tJTExTX01PVU5UID0gXCIvd29ya3NwYWNlX3VzZXJfc2tpbGxzXCI7XG5cbi8qKiBPQXV0aCBzY29wZXMgdGhhdCBnYXRlIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGUgbW91bnRzLiAqL1xuY29uc3QgV09SS1NQQUNFX0ZJTEVfU0NPUEVTID0gW1wid29ya3NwYWNlXCIsIFwid29ya3NwYWNlLndvcmtzcGFjZVwiLCBcImFsbC1hcGlzXCJdIGFzIGNvbnN0O1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3dvcmtzcGFjZXNcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItcmVxdWVzdCBjb250ZXh0IGZvciBtb3VudCByZXNvbHZlcnMuICovXG5pbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250ZXh0IHtcbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqIE1vdW50IG1hcCBwbHVzIG9wdGlvbmFsIE1hc3RyYSBza2lsbCBzY2FuIHJvb3RzIGZvciBvbmUgcmVzb2x2ZXIuICovXG5pbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250cmlidXRpb24ge1xuICBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKiogUGF0aHMgd2l0aGluIHRoZSBjb21wb3NpdGUgbmFtZXNwYWNlIHdoZXJlIGBTS0lMTC5tZGAgZmlsZXMgYXJlIHNjYW5uZWQuICovXG4gIHNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIENvbnRyaWJ1dGVzIGZpbGVzeXN0ZW0gbW91bnRzIChhbmQgb3B0aW9uYWwgc2tpbGwgcGF0aHMpIGZvciBvbmUgcmVxdWVzdC4gKi9cbnR5cGUgV29ya3NwYWNlTW91bnRSZXNvbHZlciA9IChcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKSA9PiBXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbiB8IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+O1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZVdvcmtzcGFjZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMge1xuICAvKiogV29ya3NwYWNlIGlkOyBkZXJpdmVkIGZyb20gYG5hbWVgIG9yIGBcIndvcmtzcGFjZVwiYCB3aGVuIG9taXR0ZWQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogRGlzcGxheSBuYW1lOyBkZXJpdmVkIGZyb20gYGlkYCB3aGVuIG9taXR0ZWQuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNb3VudCByZWFkLW9ubHkgQXNzaXN0YW50IHNraWxsIHRyZWVzIGZyb20gYC9Xb3Jrc3BhY2UvLmFzc2lzdGFudC9za2lsbHNgXG4gICAqIGFuZCBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBhc3Npc3RhbnRTa2lsbHM/OiBib29sZWFuO1xuICAvKiogRXh0cmEgcGVyLXJlcXVlc3QgbW91bnQgcmVzb2x2ZXJzIChydW4gYWZ0ZXIgYnVpbHQtaW4gb3B0aW9ucykuICovXG4gIG1vdW50cz86IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXTtcbiAgLyoqIFJlcGxhY2UgdGhlIGF1dG8tYnVpbHQgZHluYW1pYyBza2lsbHMgcmVzb2x2ZXIuICovXG4gIHNraWxscz86IFNraWxsc1Jlc29sdmVyO1xuICAvKiogRm9yd2FyZGVkIHRvIE1hc3RyYSB3aGVuIHNraWxsIGRpc2NvdmVyeSBpcyBlbmFibGVkLiAqL1xuICBjaGVja1NraWxsRmlsZU10aW1lPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBCTTI1IGtleXdvcmQgc2VhcmNoIG92ZXIgaW5kZXhlZCB3b3Jrc3BhY2UgY29udGVudC4gKi9cbiAgYm0yNT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgTWFzdHJhIHtAbGluayBXb3Jrc3BhY2V9IHdpdGggcGVyLXJlcXVlc3QgRGF0YWJyaWNrcyBtb3VudHMuXG4gKlxuICogQGV4YW1wbGUgQXNzaXN0YW50IHNraWxscyBvbmx5IChkZWZhdWx0IGZvciBhZ2VudHMgaW4gdGhpcyBwbHVnaW4pXG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKClcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEFzc2lzdGFudCBza2lsbHMgcGx1cyBhIGN1c3RvbSBtb3VudCByZXNvbHZlclxuICogYGBgdHNcbiAqIGNyZWF0ZVdvcmtzcGFjZSh7XG4gKiAgIGFzc2lzdGFudFNraWxsczogdHJ1ZSxcbiAqICAgbW91bnRzOiBbXG4gKiAgICAgYXN5bmMgKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gKHtcbiAqICAgICAgIG1vdW50czogeyBcIi9kYXRhXCI6IG15RmlsZXN5c3RlbSB9LFxuICogICAgICAgc2tpbGxQYXRoczogW10sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3Jrc3BhY2Uob3B0aW9uczogQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCByZXNvbHZlcnMgPSBidWlsZE1vdW50UmVzb2x2ZXJzKG9wdGlvbnMpO1xuICBjb25zdCBza2lsbHMgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/IChyZXNvbHZlcnMubGVuZ3RoID4gMCA/IGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIocmVzb2x2ZXJzKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gb3B0aW9ucy5hc3Npc3RhbnRTa2lsbHMgIT09IGZhbHNlO1xuICBjb25zdCBibTI1ID0gb3B0aW9ucy5ibTI1ICE9PSBmYWxzZTtcbiAgbG9nZ2VyLmRlYnVnKFwid29ya3NwYWNlOmNyZWF0ZVwiLCB7XG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICByZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICAgIGFzc2lzdGFudFNraWxsczogb3B0aW9ucy5hc3Npc3RhbnRTa2lsbHMgIT09IGZhbHNlLFxuICAgIGN1c3RvbU1vdW50UmVzb2x2ZXJzOiBvcHRpb25zLm1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgY3VzdG9tU2tpbGxzUmVzb2x2ZXI6IEJvb2xlYW4ob3B0aW9ucy5za2lsbHMpLFxuICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgYm0yNSxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBXb3Jrc3BhY2Uoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogKGNvbnRleHQpID0+IHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKHJlc29sdmVycywgY29udGV4dCksXG4gICAgLi4uKHNraWxsc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIGJtMjUsXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByaXZhdGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogTWFwIGFuIE9CTyB1c2VyIGVtYWlsIHRvIHRoZWlyIEFzc2lzdGFudCBza2lsbHMgZGlyZWN0b3J5IGluIHRoZVxuICogd29ya3NwYWNlIG5hbWVzcGFjZS5cbiAqL1xuZnVuY3Rpb24gdXNlckFzc2lzdGFudFNraWxsc1BhdGgodXNlckVtYWlsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYC9Vc2Vycy8ke3VzZXJFbWFpbC50cmltKCl9Ly5hc3Npc3RhbnQvc2tpbGxzYDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciB0aGUgcmVxdWVzdCB0b2tlbiBjYXJyaWVzIGEgc2NvcGUgdGhhdCBhbGxvd3Mgd29ya3NwYWNlXG4gKiBmaWxlIEFQSSBhY2Nlc3MgKGB3b3Jrc3BhY2VgIG9yIGBhbGwtYXBpc2Agb24ge0BsaW5rIE1BU1RSQV9TQ09QRVNfS0VZfSkuXG4gKi9cbmZ1bmN0aW9uIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuLmluY2x1ZGVzQWNjZXNzVG9rZW5TY29wZShcbiAgICByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICBXT1JLU1BBQ0VfRklMRV9TQ09QRVMsXG4gICk7XG59XG5cbi8qKlxuICogQnVpbHQtaW4gbW91bnQgcmVzb2x2ZXIgZm9yIEFzc2lzdGFudCBgU0tJTEwubWRgIHRyZWVzLlxuICpcbiAqIE1vdW50cyB7QGxpbmsgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSH0gd2hlbiBzY29wZSBjaGVja3MgcGFzcyBhbmRcbiAqIGAvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2Agd2hlbiB7QGxpbmsgTUFTVFJBX1VTRVJfRU1BSUxfS0VZfSBpc1xuICogc2V0LiBSZXR1cm5zIGVtcHR5IG1vdW50cyB3aGVuIHRoZSBPQk8gdXNlciBvciBjbGllbnQgaXMgbWlzc2luZy5cbiAqIE1hc3RyYSBvd25zIGZpbGVzeXN0ZW0gaW5pdGlhbGl6YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBc3Npc3RhbnRTa2lsbHNNb3VudHMoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KTogV29ya3NwYWNlTW91bnRDb250cmlidXRpb24ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIERhdGFicmlja3NXb3Jrc3BhY2VGaWxlc3lzdGVtPiA9IHt9O1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQucmVxdWVzdENvbnRleHQ7XG5cbiAgaWYgKCFzaG91bGRNb3VudEFzc2lzdGFudFNraWxscyhyZXF1ZXN0Q29udGV4dCkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJhc3Npc3RhbnQtc2tpbGxzOnNraXBwZWRcIiwge1xuICAgICAgcmVhc29uOiAhcmVxdWVzdENvbnRleHQgPyBcIm5vLXJlcXVlc3QtY29udGV4dFwiIDogXCJtaXNzaW5nLXdvcmtzcGFjZS1zY29wZVwiLFxuICAgICAgbm9kZUVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG4gICAgICBzY29wZXM6IGNvbnRleHQucmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbW91bnRzLCBza2lsbFBhdGhzOiBbXSB9O1xuICB9XG5cbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0IS5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0LmNsaWVudDtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJhc3Npc3RhbnQtc2tpbGxzOnNraXBwZWRcIiwge1xuICAgICAgcmVhc29uOiBcIm1pc3Npbmctb2JvLWNsaWVudFwiLFxuICAgICAgdXNlcklkOiB1c2VyPy5pZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHM6IFtdIH07XG4gIH1cblxuICBtb3VudHNbQVNTSVNUQU5UX1dPUktTUEFDRV9TS0lMTFNfTU9VTlRdID0gZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oXG4gICAgY2xpZW50LFxuICAgIEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEgsXG4gICk7XG5cbiAgY29uc3QgZW1haWwgPSByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQpO1xuICBpZiAoZW1haWwpIHtcbiAgICBtb3VudHNbQVNTSVNUQU5UX1VTRVJfU0tJTExTX01PVU5UXSA9IGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICAgICAgY2xpZW50LFxuICAgICAgdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcImFzc2lzdGFudC1za2lsbHM6bW91bnRlZFwiLCB7XG4gICAgc2hhcmVkUGF0aDogQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSCxcbiAgICBzaGFyZWRNb3VudDogQVNTSVNUQU5UX1dPUktTUEFDRV9TS0lMTFNfTU9VTlQsXG4gICAgdXNlck1vdW50OiBlbWFpbCA/IEFTU0lTVEFOVF9VU0VSX1NLSUxMU19NT1VOVCA6IHVuZGVmaW5lZCxcbiAgICB1c2VyUGF0aDogZW1haWwgPyB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aChlbWFpbCkgOiB1bmRlZmluZWQsXG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICB9KTtcblxuICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHM6IE9iamVjdC5rZXlzKG1vdW50cykgfTtcbn1cblxuLyoqXG4gKiBGaWxsIGluIGBpZGAgYW5kIGBuYW1lYCB3aGVuIGVpdGhlciBpcyBvbWl0dGVkIG9uIHtAbGluayBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zfS5cbiAqIFNsdWdpZmllcyBgbmFtZWAgaW50byBgaWRgOyB0b2tlbml6ZXMgYGlkYCBpbnRvIGEgZGlzcGxheSBgbmFtZWAuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zOiBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgbGV0IGlkID0gb3B0aW9ucy5pZDtcbiAgbGV0IG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIGlmICghaWQpIHtcbiAgICBpZCA9IG5hbWUgPyBzdHJpbmcudG9TbHVnKG5hbWUpIDogXCJ3b3Jrc3BhY2VcIjtcbiAgfVxuICBpZiAoIW5hbWUpIHtcbiAgICBuYW1lID0gQXJyYXkuZnJvbShzdHJpbmcudG9rZW5pemUoaWQpKS5qb2luKFwiIFwiKTtcbiAgfVxuICByZXR1cm4geyBpZCwgbmFtZSB9O1xufVxuXG4vKiogQ29sbGVjdCBidWlsdC1pbiBhbmQgY2FsbGVyLXN1cHBsaWVkIG1vdW50IHJlc29sdmVycyBmb3Igb25lIHdvcmtzcGFjZS4gKi9cbmZ1bmN0aW9uIGJ1aWxkTW91bnRSZXNvbHZlcnMob3B0aW9uczogQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyk6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSB7XG4gIGNvbnN0IHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdID0gW107XG4gIGNvbnN0IHsgYXNzaXN0YW50U2tpbGxzID0gdHJ1ZSwgbW91bnRzIH0gPSBvcHRpb25zO1xuICBpZiAoYXNzaXN0YW50U2tpbGxzKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2gocmVzb2x2ZUFzc2lzdGFudFNraWxsc01vdW50cyk7XG4gIH1cbiAgaWYgKG1vdW50cz8ubGVuZ3RoKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goLi4ubW91bnRzKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJzXCIsIHtcbiAgICBhc3Npc3RhbnRTa2lsbHMsXG4gICAgYnVpbHRJblJlc29sdmVyOiBhc3Npc3RhbnRTa2lsbHMsXG4gICAgY3VzdG9tUmVzb2x2ZXJDb3VudDogbW91bnRzPy5sZW5ndGggPz8gMCxcbiAgICB0b3RhbFJlc29sdmVyQ291bnQ6IHJlc29sdmVycy5sZW5ndGgsXG4gIH0pO1xuICByZXR1cm4gcmVzb2x2ZXJzO1xufVxuXG4vKipcbiAqIEdhdGUgQXNzaXN0YW50IHNraWxsIG1vdW50cyBvbiByZXF1ZXN0IGNvbnRleHQuXG4gKlxuICogQWx3YXlzIGFsbG93cyBtb3VudHMgaW4gZGV2ZWxvcG1lbnQ7IGluIG90aGVyIGVudmlyb25tZW50cyByZXF1aXJlc1xuICoge0BsaW5rIGhhc1dvcmtzcGFjZUZpbGVTY29wZX0uXG4gKi9cbmZ1bmN0aW9uIHNob3VsZE1vdW50QXNzaXN0YW50U2tpbGxzKFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQsXG4pOiByZXF1ZXN0Q29udGV4dCBpcyBSZXF1ZXN0Q29udGV4dCB7XG4gIGlmICghcmVxdWVzdENvbnRleHQpIHJldHVybiBmYWxzZTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0KTtcbn1cblxuLyoqIFJlYWQgdGhlIHRyaW1tZWQgT0JPIHVzZXIgZW1haWwgc3RhbXBlZCBvbiB7QGxpbmsgTUFTVFJBX1VTRVJfRU1BSUxfS0VZfS4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRFbWFpbChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBlbWFpbCA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJldHVybiBlbWFpbD8udHJpbSgpIHx8IHVuZGVmaW5lZDtcbn1cblxuLyoqIENvbnN0cnVjdCBhIHJlYWQtb25seSB7QGxpbmsgRGF0YWJyaWNrc1dvcmtzcGFjZUZpbGVzeXN0ZW19IGZvciBgYmFzZVBhdGhgLiAqL1xuZnVuY3Rpb24gZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuICByZWFkT25seTogYm9vbGVhbiA9IHRydWUsXG4pOiBEYXRhYnJpY2tzV29ya3NwYWNlRmlsZXN5c3RlbSB7XG4gIHJldHVybiBuZXcgRGF0YWJyaWNrc1dvcmtzcGFjZUZpbGVzeXN0ZW0oe1xuICAgIGNsaWVudCxcbiAgICBiYXNlUGF0aCxcbiAgICByZWFkT25seSxcbiAgfSk7XG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IG1vdW50IHJlc29sdmVyIGZvciBvbmUgcmVxdWVzdCBhbmQgbWVyZ2UgbW91bnRzIHBsdXMgc2tpbGwgcGF0aHMuXG4gKiBMYXRlciByZXNvbHZlcnMgb3ZlcndyaXRlIG1vdW50IGtleXMgZnJvbSBlYXJsaWVyIG9uZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24oXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb2x2ZXJdIG9mIHJlc29sdmVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlcihjb250ZXh0KTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJcIiwge1xuICAgICAgaW5kZXgsXG4gICAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKGNvbnRyaWJ1dGlvbi5tb3VudHMpLFxuICAgICAgc2tpbGxQYXRoczogY29udHJpYnV0aW9uLnNraWxsUGF0aHMgPz8gW10sXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihtb3VudHMsIGNvbnRyaWJ1dGlvbi5tb3VudHMpO1xuICAgIGlmIChjb250cmlidXRpb24uc2tpbGxQYXRocz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uY29udHJpYnV0aW9uLnNraWxsUGF0aHMpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czptZXJnZWRcIiwge1xuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgICBza2lsbFBhdGhzLFxuICB9KTtcblxuICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHMgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IHdoZW4gYW55IG1vdW50IHJlc29sdmVkOyBvdGhlcndpc2VcbiAqIHtAbGluayBlbXB0eUZpbGVzeXN0ZW19LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlRmlsZXN5c3RlbShcbiAgcmVzb2x2ZXJzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbik6IFByb21pc2U8V29ya3NwYWNlRmlsZXN5c3RlbT4ge1xuICBjb25zdCB7IG1vdW50cyB9ID0gYXdhaXQgcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICBjb25zdCBtb3VudEtleXMgPSBPYmplY3Qua2V5cyhtb3VudHMpO1xuICBpZiAobW91bnRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06ZW1wdHlcIiwge1xuICAgICAgaGFzUmVxdWVzdENvbnRleHQ6IEJvb2xlYW4oY29udGV4dC5yZXF1ZXN0Q29udGV4dCksXG4gICAgfSk7XG4gICAgcmV0dXJuIGVtcHR5RmlsZXN5c3RlbSgpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICByZXR1cm4gbmV3IENvbXBvc2l0ZUZpbGVzeXN0ZW0oeyBtb3VudHMgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGR5bmFtaWMge0BsaW5rIFNraWxsc1Jlc29sdmVyfSB0aGF0IGNvbGxlY3RzIGBza2lsbFBhdGhzYCBmcm9tXG4gKiBldmVyeSBtb3VudCByZXNvbHZlciBvbiBlYWNoIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIocmVzb2x2ZXJzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10pOiBTa2lsbHNSZXNvbHZlciB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogU2tpbGxzQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgc2tpbGxQYXRocyB9ID0gYXdhaXQgcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsczpyZXNvbHZlZFwiLCB7IHNraWxsUGF0aHMgfSk7XG4gICAgcmV0dXJuIHNraWxsUGF0aHMgPz8gW107XG4gIH07XG59XG4iXX0=
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFHSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFNBQVMsR0FJVixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQWEsTUFBTSxhQUFhLENBQUM7QUFDbkcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWxGLDZFQUE2RTtBQUU3RSwrREFBK0Q7QUFDL0QsTUFBTSw0QkFBNEIsR0FBRyw4QkFBOEIsQ0FBQztBQUVwRSxnRUFBZ0U7QUFDaEUsTUFBTSxnQ0FBZ0MsR0FBRyxtQkFBbUIsQ0FBQztBQUU3RCxrRUFBa0U7QUFDbEUsTUFBTSwyQkFBMkIsR0FBRyx3QkFBd0IsQ0FBQztBQUU3RCwrREFBK0Q7QUFDL0QsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLENBQVUsQ0FBQztBQUV4RixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFrRC9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0MsRUFBRTtJQUNsRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO0lB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SSxFQUFFLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUNqRSxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXN0cmEgd29ya3NwYWNlIGZhY3RvcnkgZm9yIERhdGFicmlja3MgQXBwcy5cbiAqXG4gKiBCdWlsZHMgYSBwZXItcmVxdWVzdCB7QGxpbmsgV29ya3NwYWNlfSB3aG9zZSBmaWxlc3lzdGVtIGlzIGFcbiAqIHtAbGluayBDb21wb3NpdGVGaWxlc3lzdGVtfSBvdmVyIERhdGFicmlja3MgcGF0aHMgcmVzb2x2ZWQgZnJvbSB0aGVcbiAqIE9CTyBjbGllbnQgb24ge0BsaW5rIE1BU1RSQV9VU0VSX0tFWX0uIE9wdGlvbmFsIG1vdW50IHJlc29sdmVyXG4gKiBjb250cmlidXRpb25zIG1lcmdlIGV4dHJhIGZpbGVzeXN0ZW1zIGFuZCBza2lsbCBzY2FuIHJvb3RzOyBidWlsdC1pblxuICogQXNzaXN0YW50IHNraWxsIHRyZWVzIGFyZSB0b2dnbGVkIHdpdGggYGFzc2lzdGFudFNraWxsc2AgKG9uIGJ5IGRlZmF1bHQpLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQgeyBsb2csIHN0cmluZywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQge1xuICBDb21wb3NpdGVGaWxlc3lzdGVtLFxuICBXb3Jrc3BhY2UsXG4gIHR5cGUgU2tpbGxzQ29udGV4dCxcbiAgdHlwZSBTa2lsbHNSZXNvbHZlcixcbiAgdHlwZSBXb3Jrc3BhY2VGaWxlc3lzdGVtLFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuXG5pbXBvcnQgeyBNQVNUUkFfU0NPUEVTX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfVVNFUl9LRVksIHR5cGUgVXNlciB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc1dvcmtzcGFjZUZpbGVzeXN0ZW0sIGVtcHR5RmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBTaGFyZWQgQXNzaXN0YW50IHNraWxscyB0cmVlIGluIHRoZSB3b3Jrc3BhY2UgbmFtZXNwYWNlLiAqL1xuY29uc3QgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSCA9IFwiL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc1wiO1xuXG4vKiogQ29tcG9zaXRlIG1vdW50IGZvciB7QGxpbmsgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSH0uICovXG5jb25zdCBBU1NJU1RBTlRfV09SS1NQQUNFX1NLSUxMU19NT1VOVCA9IFwiL3dvcmtzcGFjZV9za2lsbHNcIjtcblxuLyoqIENvbXBvc2l0ZSBtb3VudCBmb3IgdGhlIGNhbGxlcidzIGAvLmFzc2lzdGFudC9za2lsbHNgIHRyZWUuICovXG5jb25zdCBBU1NJU1RBTlRfVVNFUl9TS0lMTFNfTU9VTlQgPSBcIi93b3Jrc3BhY2VfdXNlcl9za2lsbHNcIjtcblxuLyoqIE9BdXRoIHNjb3BlcyB0aGF0IGdhdGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZSBtb3VudHMuICovXG5jb25zdCBXT1JLU1BBQ0VfRklMRV9TQ09QRVMgPSBbXCJ3b3Jrc3BhY2VcIiwgXCJ3b3Jrc3BhY2Uud29ya3NwYWNlXCIsIFwiYWxsLWFwaXNcIl0gYXMgY29uc3Q7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvd29ya3NwYWNlc1wiKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIFBlci1yZXF1ZXN0IGNvbnRleHQgZm9yIG1vdW50IHJlc29sdmVycy4gKi9cbmludGVyZmFjZSBXb3Jrc3BhY2VNb3VudENvbnRleHQge1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKiogTW91bnQgbWFwIHBsdXMgb3B0aW9uYWwgTWFzdHJhIHNraWxsIHNjYW4gcm9vdHMgZm9yIG9uZSByZXNvbHZlci4gKi9cbmludGVyZmFjZSBXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbiB7XG4gIG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT47XG4gIC8qKiBQYXRocyB3aXRoaW4gdGhlIGNvbXBvc2l0ZSBuYW1lc3BhY2Ugd2hlcmUgYFNLSUxMLm1kYCBmaWxlcyBhcmUgc2Nhbm5lZC4gKi9cbiAgc2tpbGxQYXRocz86IHN0cmluZ1tdO1xufVxuXG4vKiogQ29udHJpYnV0ZXMgZmlsZXN5c3RlbSBtb3VudHMgKGFuZCBvcHRpb25hbCBza2lsbCBwYXRocykgZm9yIG9uZSByZXF1ZXN0LiAqL1xudHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlV29ya3NwYWNlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyB7XG4gIC8qKiBXb3Jrc3BhY2UgaWQ7IGRlcml2ZWQgZnJvbSBgbmFtZWAgb3IgYFwid29ya3NwYWNlXCJgIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWU7IGRlcml2ZWQgZnJvbSBgaWRgIHdoZW4gb21pdHRlZC4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1vdW50IHJlYWQtb25seSBBc3Npc3RhbnQgc2tpbGwgdHJlZXMgZnJvbSBgL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc2BcbiAgICogYW5kIGAvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2AuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGFzc2lzdGFudFNraWxscz86IGJvb2xlYW47XG4gIC8qKiBFeHRyYSBwZXItcmVxdWVzdCBtb3VudCByZXNvbHZlcnMgKHJ1biBhZnRlciBidWlsdC1pbiBvcHRpb25zKS4gKi9cbiAgbW91bnRzPzogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdO1xuICAvKiogUmVwbGFjZSB0aGUgYXV0by1idWlsdCBkeW5hbWljIHNraWxscyByZXNvbHZlci4gKi9cbiAgc2tpbGxzPzogU2tpbGxzUmVzb2x2ZXI7XG4gIC8qKiBGb3J3YXJkZWQgdG8gTWFzdHJhIHdoZW4gc2tpbGwgZGlzY292ZXJ5IGlzIGVuYWJsZWQuICovXG4gIGNoZWNrU2tpbGxGaWxlTXRpbWU/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIEJNMjUga2V5d29yZCBzZWFyY2ggb3ZlciBpbmRleGVkIHdvcmtzcGFjZSBjb250ZW50LiAqL1xuICBibTI1PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHNjYW4gcGF0aHMgYWRkZWQgdG8gZXZlcnkgcmVxdWVzdCdzIHNraWxsIGRpc2NvdmVyeS5cbiAgICogVXNlZCBieSB0aGUgcGx1Z2luIHRvIHN1cmZhY2UgcmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIGxvY2FsIHRlbXBcbiAgICogZGlyIGF0IHN0YXJ0dXAgKHNlZSBgcmVtb3RlLXNraWxscy50c2ApLiBEYXRhYnJpY2tzLWhvc3RlZCByZW1vdGUgc2tpbGxzXG4gICAqIG5lZWQgbm8gZW50cnkgaGVyZSAtIHRoZXkgbGFuZCBpbiB0aGUgQXNzaXN0YW50IHRyZWUgdGhlIGJ1aWx0LWluIG1vdW50XG4gICAqIGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gd2l0aCBwZXItcmVxdWVzdCBEYXRhYnJpY2tzIG1vdW50cy5cbiAqXG4gKiBAZXhhbXBsZSBBc3Npc3RhbnQgc2tpbGxzIG9ubHkgKGRlZmF1bHQgZm9yIGFnZW50cyBpbiB0aGlzIHBsdWdpbilcbiAqIGBgYHRzXG4gKiBjcmVhdGVXb3Jrc3BhY2UoKVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQXNzaXN0YW50IHNraWxscyBwbHVzIGEgY3VzdG9tIG1vdW50IHJlc29sdmVyXG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKHtcbiAqICAgYXNzaXN0YW50U2tpbGxzOiB0cnVlLFxuICogICBtb3VudHM6IFtcbiAqICAgICBhc3luYyAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiAoe1xuICogICAgICAgbW91bnRzOiB7IFwiL2RhdGFcIjogbXlGaWxlc3lzdGVtIH0sXG4gKiAgICAgICBza2lsbFBhdGhzOiBbXSxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdvcmtzcGFjZShvcHRpb25zOiBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zID0ge30pOiBXb3Jrc3BhY2Uge1xuICBjb25zdCB7IGlkLCBuYW1lIH0gPSByZXNvbHZlV29ya3NwYWNlSWRlbnRpdHkob3B0aW9ucyk7XG4gIGNvbnN0IHJlc29sdmVycyA9IGJ1aWxkTW91bnRSZXNvbHZlcnMob3B0aW9ucyk7XG4gIGNvbnN0IGV4dHJhU2tpbGxQYXRocyA9IG9wdGlvbnMuZXh0cmFTa2lsbFBhdGhzID8/IFtdO1xuICBjb25zdCBza2lsbHMgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKHJlc29sdmVycy5sZW5ndGggPiAwIHx8IGV4dHJhU2tpbGxQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIocmVzb2x2ZXJzLCBleHRyYVNraWxsUGF0aHMpXG4gICAgICA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gb3B0aW9ucy5hc3Npc3RhbnRTa2lsbHMgIT09IGZhbHNlO1xuICBjb25zdCBibTI1ID0gb3B0aW9ucy5ibTI1ICE9PSBmYWxzZTtcbiAgbG9nZ2VyLmRlYnVnKFwid29ya3NwYWNlOmNyZWF0ZVwiLCB7XG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICByZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICAgIGFzc2lzdGFudFNraWxsczogb3B0aW9ucy5hc3Npc3RhbnRTa2lsbHMgIT09IGZhbHNlLFxuICAgIGN1c3RvbU1vdW50UmVzb2x2ZXJzOiBvcHRpb25zLm1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgY3VzdG9tU2tpbGxzUmVzb2x2ZXI6IEJvb2xlYW4ob3B0aW9ucy5za2lsbHMpLFxuICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgYm0yNSxcbiAgICBleHRyYVNraWxsUGF0aHM6IGV4dHJhU2tpbGxQYXRocy5sZW5ndGgsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgV29ya3NwYWNlKHtcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZpbGVzeXN0ZW06IChjb250ZXh0KSA9PiByZXNvbHZlV29ya3NwYWNlRmlsZXN5c3RlbShyZXNvbHZlcnMsIGNvbnRleHQpLFxuICAgIC4uLihza2lsbHNcbiAgICAgID8ge1xuICAgICAgICAgIHNraWxscyxcbiAgICAgICAgICBjaGVja1NraWxsRmlsZU10aW1lLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBibTI1LFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcml2YXRlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE1hcCBhbiBPQk8gdXNlciBlbWFpbCB0byB0aGVpciBBc3Npc3RhbnQgc2tpbGxzIGRpcmVjdG9yeSBpbiB0aGVcbiAqIHdvcmtzcGFjZSBuYW1lc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoKHVzZXJFbWFpbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAvVXNlcnMvJHt1c2VyRW1haWwudHJpbSgpfS8uYXNzaXN0YW50L3NraWxsc2A7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlcXVlc3QgdG9rZW4gY2FycmllcyBhIHNjb3BlIHRoYXQgYWxsb3dzIHdvcmtzcGFjZVxuICogZmlsZSBBUEkgYWNjZXNzIChgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIG9uIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0pLlxuICovXG5mdW5jdGlvbiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbi5pbmNsdWRlc0FjY2Vzc1Rva2VuU2NvcGUoXG4gICAgcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgV09SS1NQQUNFX0ZJTEVfU0NPUEVTLFxuICApO1xufVxuXG4vKipcbiAqIEJ1aWx0LWluIG1vdW50IHJlc29sdmVyIGZvciBBc3Npc3RhbnQgYFNLSUxMLm1kYCB0cmVlcy5cbiAqXG4gKiBNb3VudHMge0BsaW5rIEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEh9IHdoZW4gc2NvcGUgY2hlY2tzIHBhc3MgYW5kXG4gKiBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgIHdoZW4ge0BsaW5rIE1BU1RSQV9VU0VSX0VNQUlMX0tFWX0gaXNcbiAqIHNldC4gUmV0dXJucyBlbXB0eSBtb3VudHMgd2hlbiB0aGUgT0JPIHVzZXIgb3IgY2xpZW50IGlzIG1pc3NpbmcuXG4gKiBNYXN0cmEgb3ducyBmaWxlc3lzdGVtIGluaXRpYWxpemF0aW9uLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQXNzaXN0YW50U2tpbGxzTW91bnRzKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCk6IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgY29uc3QgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBEYXRhYnJpY2tzV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjb250ZXh0LnJlcXVlc3RDb250ZXh0O1xuXG4gIGlmICghc2hvdWxkTW91bnRBc3Npc3RhbnRTa2lsbHMocmVxdWVzdENvbnRleHQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXNzaXN0YW50LXNraWxsczpza2lwcGVkXCIsIHtcbiAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIG5vZGVFbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuICAgICAgc2NvcGVzOiBjb250ZXh0LnJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1NDT1BFU19LRVkpLFxuICAgIH0pO1xuICAgIHJldHVybiB7IG1vdW50cywgc2tpbGxQYXRoczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dCEuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xpZW50ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dC5jbGllbnQ7XG4gIGlmICghY2xpZW50KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXNzaXN0YW50LXNraWxsczpza2lwcGVkXCIsIHtcbiAgICAgIHJlYXNvbjogXCJtaXNzaW5nLW9iby1jbGllbnRcIixcbiAgICAgIHVzZXJJZDogdXNlcj8uaWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbW91bnRzLCBza2lsbFBhdGhzOiBbXSB9O1xuICB9XG5cbiAgbW91bnRzW0FTU0lTVEFOVF9XT1JLU1BBQ0VfU0tJTExTX01PVU5UXSA9IGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICAgIGNsaWVudCxcbiAgICBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRILFxuICApO1xuXG4gIGNvbnN0IGVtYWlsID0gcmVzb2x2ZVNjb3BlZEVtYWlsKHJlcXVlc3RDb250ZXh0KTtcbiAgaWYgKGVtYWlsKSB7XG4gICAgbW91bnRzW0FTU0lTVEFOVF9VU0VSX1NLSUxMU19NT1VOVF0gPSBkYXRhYnJpY2tzRmlsZXN5c3RlbShcbiAgICAgIGNsaWVudCxcbiAgICAgIHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoKGVtYWlsKSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJhc3Npc3RhbnQtc2tpbGxzOm1vdW50ZWRcIiwge1xuICAgIHNoYXJlZFBhdGg6IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEgsXG4gICAgc2hhcmVkTW91bnQ6IEFTU0lTVEFOVF9XT1JLU1BBQ0VfU0tJTExTX01PVU5ULFxuICAgIHVzZXJNb3VudDogZW1haWwgPyBBU1NJU1RBTlRfVVNFUl9TS0lMTFNfTU9VTlQgOiB1bmRlZmluZWQsXG4gICAgdXNlclBhdGg6IGVtYWlsID8gdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpIDogdW5kZWZpbmVkLFxuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgfSk7XG5cbiAgcmV0dXJuIHsgbW91bnRzLCBza2lsbFBhdGhzOiBPYmplY3Qua2V5cyhtb3VudHMpIH07XG59XG5cbi8qKlxuICogRmlsbCBpbiBgaWRgIGFuZCBgbmFtZWAgd2hlbiBlaXRoZXIgaXMgb21pdHRlZCBvbiB7QGxpbmsgQ3JlYXRlV29ya3NwYWNlT3B0aW9uc30uXG4gKiBTbHVnaWZpZXMgYG5hbWVgIGludG8gYGlkYDsgdG9rZW5pemVzIGBpZGAgaW50byBhIGRpc3BsYXkgYG5hbWVgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlSWRlbnRpdHkob3B0aW9uczogQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyk6IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufSB7XG4gIGxldCBpZCA9IG9wdGlvbnMuaWQ7XG4gIGxldCBuYW1lID0gb3B0aW9ucy5uYW1lO1xuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBuYW1lID8gc3RyaW5nLnRvU2x1ZyhuYW1lKSA6IFwid29ya3NwYWNlXCI7XG4gIH1cbiAgaWYgKCFuYW1lKSB7XG4gICAgbmFtZSA9IEFycmF5LmZyb20oc3RyaW5nLnRva2VuaXplKGlkKSkuam9pbihcIiBcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbn1cblxuLyoqIENvbGxlY3QgYnVpbHQtaW4gYW5kIGNhbGxlci1zdXBwbGllZCBtb3VudCByZXNvbHZlcnMgZm9yIG9uZSB3b3Jrc3BhY2UuICovXG5mdW5jdGlvbiBidWlsZE1vdW50UmVzb2x2ZXJzKG9wdGlvbnM6IENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMpOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCB7IGFzc2lzdGFudFNraWxscyA9IHRydWUsIG1vdW50cyB9ID0gb3B0aW9ucztcbiAgaWYgKGFzc2lzdGFudFNraWxscykge1xuICAgIHJlc29sdmVycy5wdXNoKHJlc29sdmVBc3Npc3RhbnRTa2lsbHNNb3VudHMpO1xuICB9XG4gIGlmIChtb3VudHM/Lmxlbmd0aCkge1xuICAgIHJlc29sdmVycy5wdXNoKC4uLm1vdW50cyk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyc1wiLCB7XG4gICAgYXNzaXN0YW50U2tpbGxzLFxuICAgIGJ1aWx0SW5SZXNvbHZlcjogYXNzaXN0YW50U2tpbGxzLFxuICAgIGN1c3RvbVJlc29sdmVyQ291bnQ6IG1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgdG90YWxSZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVycztcbn1cblxuLyoqXG4gKiBHYXRlIEFzc2lzdGFudCBza2lsbCBtb3VudHMgb24gcmVxdWVzdCBjb250ZXh0LlxuICpcbiAqIEFsd2F5cyBhbGxvd3MgbW91bnRzIGluIGRldmVsb3BtZW50OyBpbiBvdGhlciBlbnZpcm9ubWVudHMgcmVxdWlyZXNcbiAqIHtAbGluayBoYXNXb3Jrc3BhY2VGaWxlU2NvcGV9LlxuICovXG5mdW5jdGlvbiBzaG91bGRNb3VudEFzc2lzdGFudFNraWxscyhcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkLFxuKTogcmVxdWVzdENvbnRleHQgaXMgUmVxdWVzdENvbnRleHQge1xuICBpZiAoIXJlcXVlc3RDb250ZXh0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dCk7XG59XG5cbi8qKiBSZWFkIHRoZSB0cmltbWVkIE9CTyB1c2VyIGVtYWlsIHN0YW1wZWQgb24ge0BsaW5rIE1BU1RSQV9VU0VSX0VNQUlMX0tFWX0uICovXG5mdW5jdGlvbiByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW1haWwgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gZW1haWw/LnRyaW0oKSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkge0BsaW5rIERhdGFicmlja3NXb3Jrc3BhY2VGaWxlc3lzdGVtfSBmb3IgYGJhc2VQYXRoYC4gKi9cbmZ1bmN0aW9uIGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgYmFzZVBhdGg6IHN0cmluZyxcbiAgcmVhZE9ubHk6IGJvb2xlYW4gPSB0cnVlLFxuKTogRGF0YWJyaWNrc1dvcmtzcGFjZUZpbGVzeXN0ZW0ge1xuICByZXR1cm4gbmV3IERhdGFicmlja3NXb3Jrc3BhY2VGaWxlc3lzdGVtKHtcbiAgICBjbGllbnQsXG4gICAgYmFzZVBhdGgsXG4gICAgcmVhZE9ubHksXG4gIH0pO1xufVxuXG4vKipcbiAqIFJ1biBldmVyeSBtb3VudCByZXNvbHZlciBmb3Igb25lIHJlcXVlc3QgYW5kIG1lcmdlIG1vdW50cyBwbHVzIHNraWxsIHBhdGhzLlxuICogTGF0ZXIgcmVzb2x2ZXJzIG92ZXJ3cml0ZSBtb3VudCBrZXlzIGZyb20gZWFybGllciBvbmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIHJlc29sdmVyXSBvZiByZXNvbHZlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgY29udHJpYnV0aW9uID0gYXdhaXQgcmVzb2x2ZXIoY29udGV4dCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHtcbiAgICAgIGluZGV4LFxuICAgICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhjb250cmlidXRpb24ubW91bnRzKSxcbiAgICAgIHNraWxsUGF0aHM6IGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzID8/IFtdLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24obW91bnRzLCBjb250cmlidXRpb24ubW91bnRzKTtcbiAgICBpZiAoY29udHJpYnV0aW9uLnNraWxsUGF0aHM/Lmxlbmd0aCkge1xuICAgICAgc2tpbGxQYXRocy5wdXNoKC4uLmNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6bWVyZ2VkXCIsIHtcbiAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKG1vdW50cyksXG4gICAgc2tpbGxQYXRocyxcbiAgfSk7XG5cbiAgcmV0dXJuIHsgbW91bnRzLCBza2lsbFBhdGhzIH07XG59XG5cbi8qKlxuICogRHluYW1pYyBmaWxlc3lzdGVtIHJlc29sdmVyIHBhc3NlZCB0byBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0uXG4gKlxuICogUmV0dXJucyBhIHtAbGluayBDb21wb3NpdGVGaWxlc3lzdGVtfSB3aGVuIGFueSBtb3VudCByZXNvbHZlZDsgb3RoZXJ3aXNlXG4gKiB7QGxpbmsgZW1wdHlGaWxlc3lzdGVtfS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+IHtcbiAgY29uc3QgeyBtb3VudHMgfSA9IGF3YWl0IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgY29uc3QgbW91bnRLZXlzID0gT2JqZWN0LmtleXMobW91bnRzKTtcbiAgaWYgKG1vdW50S2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJmaWxlc3lzdGVtOmVtcHR5XCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBlbXB0eUZpbGVzeXN0ZW0oKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJmaWxlc3lzdGVtOmNvbXBvc2l0ZVwiLCB7IG1vdW50S2V5cyB9KTtcbiAgcmV0dXJuIG5ldyBDb21wb3NpdGVGaWxlc3lzdGVtKHsgbW91bnRzIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBkeW5hbWljIHtAbGluayBTa2lsbHNSZXNvbHZlcn0gdGhhdCBjb2xsZWN0cyBgc2tpbGxQYXRoc2AgZnJvbVxuICogZXZlcnkgbW91bnQgcmVzb2x2ZXIgb24gZWFjaCByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiBidWlsZFdvcmtzcGFjZVNraWxsc1Jlc29sdmVyKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgZXh0cmFTa2lsbFBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuKTogU2tpbGxzUmVzb2x2ZXIge1xuICByZXR1cm4gYXN5bmMgKGNvbnRleHQ6IFNraWxsc0NvbnRleHQpID0+IHtcbiAgICBjb25zdCB7IHNraWxsUGF0aHMgfSA9IGF3YWl0IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICBjb25zdCBtZXJnZWQgPSBbLi4uKHNraWxsUGF0aHMgPz8gW10pLCAuLi5leHRyYVNraWxsUGF0aHNdO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsczpyZXNvbHZlZFwiLCB7IHNraWxsUGF0aHMsIGV4dHJhU2tpbGxQYXRocyB9KTtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9O1xufVxuIl19
@@ -1 +1 @@
1
- {"root":["../src/agents.ts","../src/chart.ts","../src/config.ts","../src/defaults.ts","../src/filesystems.ts","../src/genie.ts","../src/history.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/observability.ts","../src/pagination.ts","../src/plugin.ts","../src/processors.ts","../src/rest.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/statement.ts","../src/storage-schema.ts","../src/summarize.ts","../src/threads.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/agents.ts","../src/chart.ts","../src/config.ts","../src/defaults.ts","../src/filesystems.ts","../src/genie.ts","../src/history.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/observability.ts","../src/pagination.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/statement.ts","../src/storage-schema.ts","../src/summarize.ts","../src/threads.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -9,9 +9,13 @@
9
9
  "@types/express": "^5.0.5",
10
10
  "@types/node": "^24.6.0",
11
11
  "@types/pg": "^8",
12
+ "skills": "^1",
12
13
  "tsx": "^4.23.0",
13
14
  "typescript": "^5.9.3"
14
15
  },
16
+ "peerDependencies": {
17
+ "skills": "^1"
18
+ },
15
19
  "dependencies": {
16
20
  "@databricks/appkit": "^0.43.0",
17
21
  "@databricks/sdk-experimental": "^0.17.0",
@@ -28,21 +32,22 @@
28
32
  "express": "^5.1.0",
29
33
  "pg": "^8.22.0",
30
34
  "zod": "4.3.6",
31
- "@dbx-tools/appkit": "0.6.5",
32
- "@dbx-tools/model": "0.6.5",
33
- "@dbx-tools/genie": "0.6.5",
34
- "@dbx-tools/core": "0.6.5",
35
- "@dbx-tools/shared-genie": "0.6.5",
36
- "@dbx-tools/shared-mastra": "0.6.5",
37
- "@dbx-tools/shared-core": "0.6.5",
38
- "@dbx-tools/shared-model": "0.6.5"
35
+ "@dbx-tools/core": "0.6.7",
36
+ "@dbx-tools/appkit": "0.6.7",
37
+ "@dbx-tools/genie": "0.6.7",
38
+ "@dbx-tools/model": "0.6.7",
39
+ "@dbx-tools/path": "0.6.7",
40
+ "@dbx-tools/shared-genie": "0.6.7",
41
+ "@dbx-tools/shared-core": "0.6.7",
42
+ "@dbx-tools/shared-model": "0.6.7",
43
+ "@dbx-tools/shared-mastra": "0.6.7"
39
44
  },
40
45
  "main": "./lib/index.js",
41
46
  "license": "UNLICENSED",
42
47
  "publishConfig": {
43
48
  "access": "public"
44
49
  },
45
- "version": "0.6.5",
50
+ "version": "0.6.7",
46
51
  "types": "./lib/index.d.ts",
47
52
  "type": "module",
48
53
  "exports": {
@@ -57,6 +62,11 @@
57
62
  "src",
58
63
  "lib"
59
64
  ],
65
+ "peerDependenciesMeta": {
66
+ "skills": {
67
+ "optional": true
68
+ }
69
+ },
60
70
  "dbxToolsConfig": {
61
71
  "tags": [
62
72
  "node"