@dbx-tools/search 0.9.154 → 0.9.157
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 +13 -8
- package/lib/index.d.ts +13 -8
- package/lib/index.js +12 -7
- package/lib/src/client.d.ts +1 -2
- package/lib/src/client.js +15 -15
- package/lib/src/config.js +16 -16
- package/lib/src/lakebase-plugin.js +9 -11
- package/lib/src/lakebase.js +9 -11
- package/lib/src/native.js +5 -5
- package/lib/src/plugin.d.ts +5 -5
- package/lib/src/plugin.js +20 -20
- package/lib/src/query.js +4 -4
- package/lib/src/schema.d.ts +0 -66
- package/lib/src/schema.js +7 -20
- package/lib/src/tool.js +14 -16
- package/package.json +9 -105
- package/src/client.ts +14 -17
- package/src/config.ts +16 -44
- package/src/lakebase-plugin.ts +8 -10
- package/src/lakebase.ts +16 -13
- package/src/native.ts +6 -6
- package/src/plugin.ts +31 -24
- package/src/query.ts +3 -3
- package/src/schema.ts +6 -25
- package/src/tool.ts +22 -20
package/lib/src/tool.js
CHANGED
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
*
|
|
15
15
|
* @module
|
|
16
16
|
*/
|
|
17
|
-
import {
|
|
17
|
+
import { createIndexRequestSchema, indexInfoSchema, searchDocumentSchema, searchRequestSchema, searchResultSchema, syncIndexRequestSchema, universalSearchRequestSchema, upsertResultSchema, } from "@dbx-tools/shared-search";
|
|
18
18
|
import { createTool } from "@mastra/core/tools";
|
|
19
19
|
import { z } from "zod";
|
|
20
20
|
import { toSearchOptions, toUniversalSearchOptions } from "./_search-options.js";
|
|
21
21
|
import { toCreateIndexOptions } from "./index-options.js";
|
|
22
22
|
import { toDocumentArray } from "./query.js";
|
|
23
23
|
import { createSearchRuntime } from "./runtime.js";
|
|
24
|
-
import { ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SEARCH_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION,
|
|
24
|
+
import { ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SEARCH_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, } from "./schema.js";
|
|
25
25
|
/** Resolve the isolated runtime captured by one standalone tool factory. */
|
|
26
26
|
function toolRuntime(options) {
|
|
27
27
|
if (options.runtime && (options.config || options.readBackend)) {
|
|
@@ -53,10 +53,10 @@ export function searchTool(options = {}) {
|
|
|
53
53
|
return createTool({
|
|
54
54
|
id: options.id ?? "search",
|
|
55
55
|
description: SEARCH_TOOL_DESCRIPTION,
|
|
56
|
-
inputSchema:
|
|
56
|
+
inputSchema: searchRequestSchema,
|
|
57
57
|
outputSchema: searchResultSchema,
|
|
58
58
|
execute: async (input, context) => {
|
|
59
|
-
const request =
|
|
59
|
+
const request = searchRequestSchema.parse(input);
|
|
60
60
|
return runtime.client.search(request.query, toSearchOptions(request, context?.abortSignal));
|
|
61
61
|
},
|
|
62
62
|
});
|
|
@@ -67,10 +67,10 @@ export function universalSearchTool(options = {}) {
|
|
|
67
67
|
return createTool({
|
|
68
68
|
id: options.id ?? "universal_search",
|
|
69
69
|
description: UNIVERSAL_SEARCH_TOOL_DESCRIPTION,
|
|
70
|
-
inputSchema:
|
|
70
|
+
inputSchema: universalSearchRequestSchema,
|
|
71
71
|
outputSchema: searchResultSchema,
|
|
72
72
|
execute: async (input, context) => {
|
|
73
|
-
const request =
|
|
73
|
+
const request = universalSearchRequestSchema.parse(input);
|
|
74
74
|
return runtime.client.universalSearch(request.query, toUniversalSearchOptions(request, context?.abortSignal));
|
|
75
75
|
},
|
|
76
76
|
});
|
|
@@ -81,16 +81,14 @@ export function universalSearchTool(options = {}) {
|
|
|
81
81
|
*/
|
|
82
82
|
export function addDocumentsTool(options = {}) {
|
|
83
83
|
const runtime = toolRuntime(options);
|
|
84
|
-
const inputSchema =
|
|
84
|
+
const inputSchema = searchDocumentSchema
|
|
85
85
|
.array()
|
|
86
86
|
.describe("Documents to add or update. Each must include the index primary key.");
|
|
87
87
|
return createTool({
|
|
88
88
|
id: options.id ?? "add_documents",
|
|
89
89
|
description: ADD_DOCUMENTS_TOOL_DESCRIPTION,
|
|
90
|
-
inputSchema:
|
|
91
|
-
|
|
92
|
-
.extend({ documents: inputSchema }),
|
|
93
|
-
outputSchema: searchSchemas.upsertResultSchema,
|
|
90
|
+
inputSchema: searchRequestSchema.pick({ index: true }).extend({ documents: inputSchema }),
|
|
91
|
+
outputSchema: upsertResultSchema,
|
|
94
92
|
execute: async (input, context) => {
|
|
95
93
|
const { client, config } = runtime;
|
|
96
94
|
const record = input;
|
|
@@ -111,10 +109,10 @@ export function createIndexTool(options = {}) {
|
|
|
111
109
|
return createTool({
|
|
112
110
|
id: options.id ?? "create_index",
|
|
113
111
|
description: CREATE_INDEX_TOOL_DESCRIPTION,
|
|
114
|
-
inputSchema:
|
|
112
|
+
inputSchema: createIndexRequestSchema,
|
|
115
113
|
outputSchema: indexInfoSchema,
|
|
116
114
|
execute: async (input, context) => {
|
|
117
|
-
const request =
|
|
115
|
+
const request = createIndexRequestSchema.parse(input);
|
|
118
116
|
return runtime.client.createIndex(request.name, toCreateIndexOptions(request, context?.abortSignal));
|
|
119
117
|
},
|
|
120
118
|
});
|
|
@@ -133,10 +131,10 @@ export function syncIndexTool(options = {}) {
|
|
|
133
131
|
return createTool({
|
|
134
132
|
id: options.id ?? "sync_index",
|
|
135
133
|
description: SYNC_INDEX_TOOL_DESCRIPTION,
|
|
136
|
-
inputSchema:
|
|
134
|
+
inputSchema: syncIndexRequestSchema,
|
|
137
135
|
outputSchema: syncIndexResultSchema,
|
|
138
136
|
execute: async (input, context) => {
|
|
139
|
-
const request =
|
|
137
|
+
const request = syncIndexRequestSchema.parse(input);
|
|
140
138
|
const { client, config } = runtime;
|
|
141
139
|
const index = request.index ?? config.defaultIndex ?? "";
|
|
142
140
|
await client.syncIndex(index, context?.abortSignal);
|
|
@@ -144,4 +142,4 @@ export function syncIndexTool(options = {}) {
|
|
|
144
142
|
},
|
|
145
143
|
});
|
|
146
144
|
}
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFzQixNQUFNLGNBQWMsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLDZCQUE2QixFQUM3Qix1QkFBdUIsRUFDdkIsMkJBQTJCLEVBQzNCLGlDQUFpQyxFQUNqQyxxQkFBcUIsRUFDckIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLHlCQUF5QixHQUMxQixNQUFNLGFBQWEsQ0FBQztBQWNyQiw0RUFBNEU7QUFDNUUsU0FBUyxXQUFXLENBQUMsT0FBMEI7SUFDN0MsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMvRCxNQUFNLElBQUksU0FBUyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELE9BQU8sQ0FDTCxPQUFPLENBQUMsT0FBTztRQUNmLG1CQUFtQixDQUFDO1lBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7U0FD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WSxFQUFFLHFCQUFxQjtRQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakQsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUN6RCxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGBzZWFyY2hgLCBgdW5pdmVyc2FsX3NlYXJjaGAsIGFuZCAob3B0LWluKSBgYWRkX2RvY3VtZW50c2AsXG4gKiBgY3JlYXRlX2luZGV4YCwgYW5kIGBzeW5jX2luZGV4YCBNYXN0cmEgdG9vbHMuXG4gKlxuICogQXBwLWludGVncmF0ZWQgYWdlbnRzIHNob3VsZCBjb25zdW1lIHRoZSBwbHVnaW4ncyBuYXRpdmUgdG9vbGtpdCBzbyBjYWxsc1xuICogcmV0YWluIHRoYXQgcGx1Z2luJ3MgY29uZmlnIGFuZCBwcm92aWRlciBiYWNrZW5kLiBUaGVzZSBzdGFuZGFsb25lIGZhY3Rvcmllc1xuICogY2FwdHVyZSBhbiBleHBsaWNpdCBydW50aW1lIG9yIGJ1aWxkIGFuIGlzb2xhdGVkIG9uZSBmcm9tIGNvbmZpZyBwbHVzIGFcbiAqIHByb3ZpZGVyLiBUaGV5IHJ1biB1bmRlciB0aGUgY2FsbGVyJ3MgT0JPIHNjb3BlICh0aGUgY2xpZW50IHJlc29sdmVzIHRoZVxuICogZXhlY3V0aW9uIGNvbnRleHQncyB3b3Jrc3BhY2UgY2xpZW50KSwgc28gc2VhcmNoIHJ1bnMgYXMgdGhlIHJlcXVlc3RpbmcgdXNlclxuICogYW5kIFVuaXR5IENhdGFsb2cgQUNMcyBhcHBseS5cbiAqXG4gKiBUaGUgc2FtZSB0b29scyBhcmUgZXhwb3NlZCB0byBBcHBLaXQncyBvd24gYWdlbnRzIHRocm91Z2ggdGhlIHBsdWdpbidzXG4gKiBgVG9vbFByb3ZpZGVyYCAoc2VlIGBwbHVnaW4udHNgKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgc2VhcmNoU2NoZW1hcywgdHlwZSBVcHNlcnRSZXN1bHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHRvU2VhcmNoT3B0aW9ucywgdG9Vbml2ZXJzYWxTZWFyY2hPcHRpb25zIH0gZnJvbSBcIi4vX3NlYXJjaC1vcHRpb25zLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaFJlYWRCYWNrZW5kIH0gZnJvbSBcIi4vY2xpZW50LnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgdG9DcmVhdGVJbmRleE9wdGlvbnMgfSBmcm9tIFwiLi9pbmRleC1vcHRpb25zLnRzXCI7XG5pbXBvcnQgeyB0b0RvY3VtZW50QXJyYXkgfSBmcm9tIFwiLi9xdWVyeS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlU2VhcmNoUnVudGltZSwgdHlwZSBTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBjcmVhdGVJbmRleFRvb2xTY2hlbWEsXG4gIGluZGV4SW5mb1NjaGVtYSxcbiAgc2VhcmNoUmVzdWx0U2NoZW1hLFxuICBzZWFyY2hUb29sU2NoZW1hLFxuICBzeW5jSW5kZXhUb29sU2NoZW1hLFxuICB1bml2ZXJzYWxTZWFyY2hUb29sU2NoZW1hLFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgZXZlcnkgc3RhbmRhbG9uZSB0b29sIGZhY3RvcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFRvb2xPcHRpb25zIHtcbiAgLyoqIE92ZXJyaWRlIHRoZSB0b29sIGlkIChkZWZhdWx0cyBwZXIgdG9vbCkuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogSXNvbGF0ZWQgcnVudGltZSB1c2VkIGJ5IHRoaXMgc3RhbmRhbG9uZSB0b29sLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjb25maWcvYmFja2VuZC4gKi9cbiAgcnVudGltZT86IFNlYXJjaFJ1bnRpbWU7XG4gIC8qKiBDb25maWcgdXNlZCB0byBjcmVhdGUgYW4gaXNvbGF0ZWQgcnVudGltZS4gKi9cbiAgY29uZmlnPzogU2VhcmNoUGx1Z2luQ29uZmlnO1xuICAvKiogUHJvdmlkZXIgdXNlZCB3aGVuIGNyZWF0aW5nIGEgcnVudGltZSBmcm9tIGNvbmZpZy4gKi9cbiAgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZDtcbn1cblxuLyoqIFJlc29sdmUgdGhlIGlzb2xhdGVkIHJ1bnRpbWUgY2FwdHVyZWQgYnkgb25lIHN0YW5kYWxvbmUgdG9vbCBmYWN0b3J5LiAqL1xuZnVuY3Rpb24gdG9vbFJ1bnRpbWUob3B0aW9uczogU2VhcmNoVG9vbE9wdGlvbnMpOiBTZWFyY2hSdW50aW1lIHtcbiAgaWYgKG9wdGlvbnMucnVudGltZSAmJiAob3B0aW9ucy5jb25maWcgfHwgb3B0aW9ucy5yZWFkQmFja2VuZCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwic2VhcmNoIHRvb2wgb3B0aW9ucyBhY2NlcHQgcnVudGltZSBvciBjb25maWcvcmVhZEJhY2tlbmQsIG5vdCBib3RoXCIpO1xuICB9XG4gIHJldHVybiAoXG4gICAgb3B0aW9ucy5ydW50aW1lID8/XG4gICAgY3JlYXRlU2VhcmNoUnVudGltZSh7XG4gICAgICBjb25maWc6IG9wdGlvbnMuY29uZmlnLFxuICAgICAgcmVhZEJhY2tlbmQ6IG9wdGlvbnMucmVhZEJhY2tlbmQsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHNlYXJjaGAgdG9vbC4gU3ByZWFkIGl0IGludG8gYW55IGFnZW50IHRoYXQgc2hvdWxkIGJlIGFibGUgdG8gbG9va1xuICogdGhpbmdzIHVwIGluIGFuIGluZGV4LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc2VhcmNoVG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NlYXJjaFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIkFuc3dlciBmcm9tIHRoZSBkb2NzLiBVc2UgYHNlYXJjaGAgdG8gZmluZCB0aGVtLlwiLFxuICogICB0b29sczogKCkgPT4gKHsgc2VhcmNoOiBzZWFyY2hUb29sKCkgfSksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhcmNoVG9vbChvcHRpb25zOiBTZWFyY2hUb29sT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHJ1bnRpbWUgPSB0b29sUnVudGltZShvcHRpb25zKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBvcHRpb25zLmlkID8/IFwic2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246IFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgIGlucHV0U2NoZW1hOiBzZWFyY2hUb29sU2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogc2VhcmNoUmVzdWx0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFRvb2xTY2hlbWEucGFyc2UoaW5wdXQpO1xuICAgICAgcmV0dXJuIHJ1bnRpbWUuY2xpZW50LnNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB0b1NlYXJjaE9wdGlvbnMocmVxdWVzdCwgY29udGV4dD8uYWJvcnRTaWduYWwpKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBgdW5pdmVyc2FsX3NlYXJjaGAgdG9vbCAoZmVkZXJhdGVkIHNlYXJjaCBhY3Jvc3MgZXZlcnkgaW5kZXgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXZlcnNhbFNlYXJjaFRvb2wob3B0aW9uczogU2VhcmNoVG9vbE9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBydW50aW1lID0gdG9vbFJ1bnRpbWUob3B0aW9ucyk7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogb3B0aW9ucy5pZCA/PyBcInVuaXZlcnNhbF9zZWFyY2hcIixcbiAgICBkZXNjcmlwdGlvbjogVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgIGlucHV0U2NoZW1hOiB1bml2ZXJzYWxTZWFyY2hUb29sU2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogc2VhcmNoUmVzdWx0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHVuaXZlcnNhbFNlYXJjaFRvb2xTY2hlbWEucGFyc2UoaW5wdXQpO1xuICAgICAgcmV0dXJuIHJ1bnRpbWUuY2xpZW50LnVuaXZlcnNhbFNlYXJjaChcbiAgICAgICAgcmVxdWVzdC5xdWVyeSxcbiAgICAgICAgdG9Vbml2ZXJzYWxTZWFyY2hPcHRpb25zKHJlcXVlc3QsIGNvbnRleHQ/LmFib3J0U2lnbmFsKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9wdC1pbiBgYWRkX2RvY3VtZW50c2AgdG9vbCAod3JpdGUgaW50byBhIGRpcmVjdC1hY2Nlc3MgaW5kZXgpLlxuICogT25seSBpbnN0YWxsIGl0IHdoZW4gdGhlIHBsdWdpbidzIHdyaXRlIHN1cmZhY2UgaXMgZW5hYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERvY3VtZW50c1Rvb2wob3B0aW9uczogU2VhcmNoVG9vbE9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBydW50aW1lID0gdG9vbFJ1bnRpbWUob3B0aW9ucyk7XG4gIGNvbnN0IGlucHV0U2NoZW1hID0gc2VhcmNoU2NoZW1hcy5zZWFyY2hEb2N1bWVudFNjaGVtYVxuICAgIC5hcnJheSgpXG4gICAgLmRlc2NyaWJlKFwiRG9jdW1lbnRzIHRvIGFkZCBvciB1cGRhdGUuIEVhY2ggbXVzdCBpbmNsdWRlIHRoZSBpbmRleCBwcmltYXJ5IGtleS5cIik7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogb3B0aW9ucy5pZCA/PyBcImFkZF9kb2N1bWVudHNcIixcbiAgICBkZXNjcmlwdGlvbjogQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICAgIGlucHV0U2NoZW1hOiBzZWFyY2hTY2hlbWFzLnNlYXJjaFJlcXVlc3RTY2hlbWFcbiAgICAgIC5waWNrKHsgaW5kZXg6IHRydWUgfSlcbiAgICAgIC5leHRlbmQoeyBkb2N1bWVudHM6IGlucHV0U2NoZW1hIH0pLFxuICAgIG91dHB1dFNjaGVtYTogc2VhcmNoU2NoZW1hcy51cHNlcnRSZXN1bHRTY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBjb250ZXh0KTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+ID0+IHtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IHJ1bnRpbWU7XG4gICAgICBjb25zdCByZWNvcmQgPSBpbnB1dCBhcyB7IGluZGV4Pzogc3RyaW5nOyBkb2N1bWVudHM6IHVua25vd24gfTtcbiAgICAgIGNvbnN0IGRvY3VtZW50cyA9IHRvRG9jdW1lbnRBcnJheShyZWNvcmQuZG9jdW1lbnRzKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVjb3JkLmluZGV4ID8/IGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gXCJcIjtcbiAgICAgIHJldHVybiBjbGllbnQuYWRkRG9jdW1lbnRzKGluZGV4LCBkb2N1bWVudHMsIGNvbnRleHQ/LmFib3J0U2lnbmFsKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgb3B0LWluIGBjcmVhdGVfaW5kZXhgIHRvb2wgKHByb3Zpc2lvbiBhIFZlY3RvciBTZWFyY2ggaW5kZXgpLlxuICogT25seSBpbnN0YWxsIGl0IHdoZW4gdGhlIHBsdWdpbidzIHdyaXRlIHN1cmZhY2UgaXMgZW5hYmxlZC4gRGVsZWdhdGVzIHRvXG4gKiB7QGxpbmsgU2VhcmNoQ2xpZW50LmNyZWF0ZUluZGV4fSwgaW5mZXJyaW5nIHRoZSBlbmRwb2ludCwgZW1iZWRkaW5nIG1vZGVsLFxuICoga2V5LCBhbmQgY29sdW1ucyBmcm9tIHRoZSByZXF1ZXN0ICsgcGx1Z2luIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluZGV4VG9vbChvcHRpb25zOiBTZWFyY2hUb29sT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHJ1bnRpbWUgPSB0b29sUnVudGltZShvcHRpb25zKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBvcHRpb25zLmlkID8/IFwiY3JlYXRlX2luZGV4XCIsXG4gICAgZGVzY3JpcHRpb246IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgIGlucHV0U2NoZW1hOiBjcmVhdGVJbmRleFRvb2xTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiBpbmRleEluZm9TY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gY3JlYXRlSW5kZXhUb29sU2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgICAgIHJldHVybiBydW50aW1lLmNsaWVudC5jcmVhdGVJbmRleChcbiAgICAgICAgcmVxdWVzdC5uYW1lLFxuICAgICAgICB0b0NyZWF0ZUluZGV4T3B0aW9ucyhyZXF1ZXN0LCBjb250ZXh0Py5hYm9ydFNpZ25hbCksXG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKiogT3V0cHV0IHNjaGVtYSBmb3IgdGhlIGBzeW5jX2luZGV4YCB0b29sLiAqL1xuY29uc3Qgc3luY0luZGV4UmVzdWx0U2NoZW1hID0gei5vYmplY3Qoe1xuICBpbmRleDogei5zdHJpbmcoKS5kZXNjcmliZShcIlRoZSBpbmRleCB0aGF0IHdhcyBzeW5jZWQuXCIpLFxuICBzeW5jZWQ6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiVHJ1ZSBvbmNlIHRoZSBzeW5jIHdhcyB0cmlnZ2VyZWQuXCIpLFxufSk7XG5cbi8qKlxuICogQnVpbGQgdGhlIG9wdC1pbiBgc3luY19pbmRleGAgdG9vbCAocmVmcmVzaCBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHNcbiAqIHNvdXJjZSB0YWJsZSkuIE9ubHkgaW5zdGFsbCBpdCB3aGVuIHRoZSBwbHVnaW4ncyB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW5jSW5kZXhUb29sKG9wdGlvbnM6IFNlYXJjaFRvb2xPcHRpb25zID0ge30pIHtcbiAgY29uc3QgcnVudGltZSA9IHRvb2xSdW50aW1lKG9wdGlvbnMpO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IG9wdGlvbnMuaWQgPz8gXCJzeW5jX2luZGV4XCIsXG4gICAgZGVzY3JpcHRpb246IFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgICBpbnB1dFNjaGVtYTogc3luY0luZGV4VG9vbFNjaGVtYSxcbiAgICBvdXRwdXRTY2hlbWE6IHN5bmNJbmRleFJlc3VsdFNjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzeW5jSW5kZXhUb29sU2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IHJ1bnRpbWU7XG4gICAgICBjb25zdCBpbmRleCA9IHJlcXVlc3QuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgICAgYXdhaXQgY2xpZW50LnN5bmNJbmRleChpbmRleCwgY29udGV4dD8uYWJvcnRTaWduYWwpO1xuICAgICAgcmV0dXJuIHsgaW5kZXgsIHN5bmNlZDogdHJ1ZSB9O1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0Qiw0QkFBNEIsRUFDNUIsa0JBQWtCLEdBRW5CLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFzQixNQUFNLGNBQWMsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLDZCQUE2QixFQUM3Qix1QkFBdUIsRUFDdkIsMkJBQTJCLEVBQzNCLGlDQUFpQyxHQUNsQyxNQUFNLGFBQWEsQ0FBQztBQWNyQiw0RUFBNEU7QUFDNUUsU0FBUyxXQUFXLENBQUMsT0FBMEI7SUFDN0MsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMvRCxNQUFNLElBQUksU0FBUyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELE9BQU8sQ0FDTCxPQUFPLENBQUMsT0FBTztRQUNmLG1CQUFtQixDQUFDO1lBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixXQUFXLEVBQUUsT0FB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bkMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BELE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDekQsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDakMsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBgc2VhcmNoYCwgYHVuaXZlcnNhbF9zZWFyY2hgLCBhbmQgKG9wdC1pbikgYGFkZF9kb2N1bWVudHNgLFxuICogYGNyZWF0ZV9pbmRleGAsIGFuZCBgc3luY19pbmRleGAgTWFzdHJhIHRvb2xzLlxuICpcbiAqIEFwcC1pbnRlZ3JhdGVkIGFnZW50cyBzaG91bGQgY29uc3VtZSB0aGUgcGx1Z2luJ3MgbmF0aXZlIHRvb2xraXQgc28gY2FsbHNcbiAqIHJldGFpbiB0aGF0IHBsdWdpbidzIGNvbmZpZyBhbmQgcHJvdmlkZXIgYmFja2VuZC4gVGhlc2Ugc3RhbmRhbG9uZSBmYWN0b3JpZXNcbiAqIGNhcHR1cmUgYW4gZXhwbGljaXQgcnVudGltZSBvciBidWlsZCBhbiBpc29sYXRlZCBvbmUgZnJvbSBjb25maWcgcGx1cyBhXG4gKiBwcm92aWRlci4gVGhleSBydW4gdW5kZXIgdGhlIGNhbGxlcidzIE9CTyBzY29wZSAodGhlIGNsaWVudCByZXNvbHZlcyB0aGVcbiAqIGV4ZWN1dGlvbiBjb250ZXh0J3Mgd29ya3NwYWNlIGNsaWVudCksIHNvIHNlYXJjaCBydW5zIGFzIHRoZSByZXF1ZXN0aW5nIHVzZXJcbiAqIGFuZCBVbml0eSBDYXRhbG9nIEFDTHMgYXBwbHkuXG4gKlxuICogVGhlIHNhbWUgdG9vbHMgYXJlIGV4cG9zZWQgdG8gQXBwS2l0J3Mgb3duIGFnZW50cyB0aHJvdWdoIHRoZSBwbHVnaW4nc1xuICogYFRvb2xQcm92aWRlcmAgKHNlZSBgcGx1Z2luLnRzYCkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYSxcbiAgaW5kZXhJbmZvU2NoZW1hLFxuICBzZWFyY2hEb2N1bWVudFNjaGVtYSxcbiAgc2VhcmNoUmVxdWVzdFNjaGVtYSxcbiAgc2VhcmNoUmVzdWx0U2NoZW1hLFxuICBzeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLFxuICB1bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICB1cHNlcnRSZXN1bHRTY2hlbWEsXG4gIHR5cGUgVXBzZXJ0UmVzdWx0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHRvU2VhcmNoT3B0aW9ucywgdG9Vbml2ZXJzYWxTZWFyY2hPcHRpb25zIH0gZnJvbSBcIi4vX3NlYXJjaC1vcHRpb25zLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaFJlYWRCYWNrZW5kIH0gZnJvbSBcIi4vY2xpZW50LnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgdG9DcmVhdGVJbmRleE9wdGlvbnMgfSBmcm9tIFwiLi9pbmRleC1vcHRpb25zLnRzXCI7XG5pbXBvcnQgeyB0b0RvY3VtZW50QXJyYXkgfSBmcm9tIFwiLi9xdWVyeS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlU2VhcmNoUnVudGltZSwgdHlwZSBTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgZXZlcnkgc3RhbmRhbG9uZSB0b29sIGZhY3RvcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFRvb2xPcHRpb25zIHtcbiAgLyoqIE92ZXJyaWRlIHRoZSB0b29sIGlkIChkZWZhdWx0cyBwZXIgdG9vbCkuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogSXNvbGF0ZWQgcnVudGltZSB1c2VkIGJ5IHRoaXMgc3RhbmRhbG9uZSB0b29sLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjb25maWcvYmFja2VuZC4gKi9cbiAgcnVudGltZT86IFNlYXJjaFJ1bnRpbWU7XG4gIC8qKiBDb25maWcgdXNlZCB0byBjcmVhdGUgYW4gaXNvbGF0ZWQgcnVudGltZS4gKi9cbiAgY29uZmlnPzogU2VhcmNoUGx1Z2luQ29uZmlnO1xuICAvKiogUHJvdmlkZXIgdXNlZCB3aGVuIGNyZWF0aW5nIGEgcnVudGltZSBmcm9tIGNvbmZpZy4gKi9cbiAgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZDtcbn1cblxuLyoqIFJlc29sdmUgdGhlIGlzb2xhdGVkIHJ1bnRpbWUgY2FwdHVyZWQgYnkgb25lIHN0YW5kYWxvbmUgdG9vbCBmYWN0b3J5LiAqL1xuZnVuY3Rpb24gdG9vbFJ1bnRpbWUob3B0aW9uczogU2VhcmNoVG9vbE9wdGlvbnMpOiBTZWFyY2hSdW50aW1lIHtcbiAgaWYgKG9wdGlvbnMucnVudGltZSAmJiAob3B0aW9ucy5jb25maWcgfHwgb3B0aW9ucy5yZWFkQmFja2VuZCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwic2VhcmNoIHRvb2wgb3B0aW9ucyBhY2NlcHQgcnVudGltZSBvciBjb25maWcvcmVhZEJhY2tlbmQsIG5vdCBib3RoXCIpO1xuICB9XG4gIHJldHVybiAoXG4gICAgb3B0aW9ucy5ydW50aW1lID8/XG4gICAgY3JlYXRlU2VhcmNoUnVudGltZSh7XG4gICAgICBjb25maWc6IG9wdGlvbnMuY29uZmlnLFxuICAgICAgcmVhZEJhY2tlbmQ6IG9wdGlvbnMucmVhZEJhY2tlbmQsXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHNlYXJjaGAgdG9vbC4gU3ByZWFkIGl0IGludG8gYW55IGFnZW50IHRoYXQgc2hvdWxkIGJlIGFibGUgdG8gbG9va1xuICogdGhpbmdzIHVwIGluIGFuIGluZGV4LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc2VhcmNoVG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NlYXJjaFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIkFuc3dlciBmcm9tIHRoZSBkb2NzLiBVc2UgYHNlYXJjaGAgdG8gZmluZCB0aGVtLlwiLFxuICogICB0b29sczogKCkgPT4gKHsgc2VhcmNoOiBzZWFyY2hUb29sKCkgfSksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhcmNoVG9vbChvcHRpb25zOiBTZWFyY2hUb29sT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHJ1bnRpbWUgPSB0b29sUnVudGltZShvcHRpb25zKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBvcHRpb25zLmlkID8/IFwic2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246IFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgIGlucHV0U2NoZW1hOiBzZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogc2VhcmNoUmVzdWx0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoaW5wdXQpO1xuICAgICAgcmV0dXJuIHJ1bnRpbWUuY2xpZW50LnNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB0b1NlYXJjaE9wdGlvbnMocmVxdWVzdCwgY29udGV4dD8uYWJvcnRTaWduYWwpKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBgdW5pdmVyc2FsX3NlYXJjaGAgdG9vbCAoZmVkZXJhdGVkIHNlYXJjaCBhY3Jvc3MgZXZlcnkgaW5kZXgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXZlcnNhbFNlYXJjaFRvb2wob3B0aW9uczogU2VhcmNoVG9vbE9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBydW50aW1lID0gdG9vbFJ1bnRpbWUob3B0aW9ucyk7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogb3B0aW9ucy5pZCA/PyBcInVuaXZlcnNhbF9zZWFyY2hcIixcbiAgICBkZXNjcmlwdGlvbjogVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgIGlucHV0U2NoZW1hOiB1bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogc2VhcmNoUmVzdWx0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoaW5wdXQpO1xuICAgICAgcmV0dXJuIHJ1bnRpbWUuY2xpZW50LnVuaXZlcnNhbFNlYXJjaChcbiAgICAgICAgcmVxdWVzdC5xdWVyeSxcbiAgICAgICAgdG9Vbml2ZXJzYWxTZWFyY2hPcHRpb25zKHJlcXVlc3QsIGNvbnRleHQ/LmFib3J0U2lnbmFsKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9wdC1pbiBgYWRkX2RvY3VtZW50c2AgdG9vbCAod3JpdGUgaW50byBhIGRpcmVjdC1hY2Nlc3MgaW5kZXgpLlxuICogT25seSBpbnN0YWxsIGl0IHdoZW4gdGhlIHBsdWdpbidzIHdyaXRlIHN1cmZhY2UgaXMgZW5hYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERvY3VtZW50c1Rvb2wob3B0aW9uczogU2VhcmNoVG9vbE9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBydW50aW1lID0gdG9vbFJ1bnRpbWUob3B0aW9ucyk7XG4gIGNvbnN0IGlucHV0U2NoZW1hID0gc2VhcmNoRG9jdW1lbnRTY2hlbWFcbiAgICAuYXJyYXkoKVxuICAgIC5kZXNjcmliZShcIkRvY3VtZW50cyB0byBhZGQgb3IgdXBkYXRlLiBFYWNoIG11c3QgaW5jbHVkZSB0aGUgaW5kZXggcHJpbWFyeSBrZXkuXCIpO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IG9wdGlvbnMuaWQgPz8gXCJhZGRfZG9jdW1lbnRzXCIsXG4gICAgZGVzY3JpcHRpb246IEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgICBpbnB1dFNjaGVtYTogc2VhcmNoUmVxdWVzdFNjaGVtYS5waWNrKHsgaW5kZXg6IHRydWUgfSkuZXh0ZW5kKHsgZG9jdW1lbnRzOiBpbnB1dFNjaGVtYSB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHVwc2VydFJlc3VsdFNjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIGNvbnRleHQpOiBQcm9taXNlPFVwc2VydFJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gcnVudGltZTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9O1xuICAgICAgY29uc3QgZG9jdW1lbnRzID0gdG9Eb2N1bWVudEFycmF5KHJlY29yZC5kb2N1bWVudHMpO1xuICAgICAgY29uc3QgaW5kZXggPSByZWNvcmQuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgICAgcmV0dXJuIGNsaWVudC5hZGREb2N1bWVudHMoaW5kZXgsIGRvY3VtZW50cywgY29udGV4dD8uYWJvcnRTaWduYWwpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBvcHQtaW4gYGNyZWF0ZV9pbmRleGAgdG9vbCAocHJvdmlzaW9uIGEgVmVjdG9yIFNlYXJjaCBpbmRleCkuXG4gKiBPbmx5IGluc3RhbGwgaXQgd2hlbiB0aGUgcGx1Z2luJ3Mgd3JpdGUgc3VyZmFjZSBpcyBlbmFibGVkLiBEZWxlZ2F0ZXMgdG9cbiAqIHtAbGluayBTZWFyY2hDbGllbnQuY3JlYXRlSW5kZXh9LCBpbmZlcnJpbmcgdGhlIGVuZHBvaW50LCBlbWJlZGRpbmcgbW9kZWwsXG4gKiBrZXksIGFuZCBjb2x1bW5zIGZyb20gdGhlIHJlcXVlc3QgKyBwbHVnaW4gY29uZmlnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5kZXhUb29sKG9wdGlvbnM6IFNlYXJjaFRvb2xPcHRpb25zID0ge30pIHtcbiAgY29uc3QgcnVudGltZSA9IHRvb2xSdW50aW1lKG9wdGlvbnMpO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IG9wdGlvbnMuaWQgPz8gXCJjcmVhdGVfaW5kZXhcIixcbiAgICBkZXNjcmlwdGlvbjogQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgaW5wdXRTY2hlbWE6IGNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYSxcbiAgICBvdXRwdXRTY2hlbWE6IGluZGV4SW5mb1NjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBjcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoaW5wdXQpO1xuICAgICAgcmV0dXJuIHJ1bnRpbWUuY2xpZW50LmNyZWF0ZUluZGV4KFxuICAgICAgICByZXF1ZXN0Lm5hbWUsXG4gICAgICAgIHRvQ3JlYXRlSW5kZXhPcHRpb25zKHJlcXVlc3QsIGNvbnRleHQ/LmFib3J0U2lnbmFsKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKiBPdXRwdXQgc2NoZW1hIGZvciB0aGUgYHN5bmNfaW5kZXhgIHRvb2wuICovXG5jb25zdCBzeW5jSW5kZXhSZXN1bHRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGluZGV4OiB6LnN0cmluZygpLmRlc2NyaWJlKFwiVGhlIGluZGV4IHRoYXQgd2FzIHN5bmNlZC5cIiksXG4gIHN5bmNlZDogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIG9uY2UgdGhlIHN5bmMgd2FzIHRyaWdnZXJlZC5cIiksXG59KTtcblxuLyoqXG4gKiBCdWlsZCB0aGUgb3B0LWluIGBzeW5jX2luZGV4YCB0b29sIChyZWZyZXNoIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0c1xuICogc291cmNlIHRhYmxlKS4gT25seSBpbnN0YWxsIGl0IHdoZW4gdGhlIHBsdWdpbidzIHdyaXRlIHN1cmZhY2UgaXMgZW5hYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5bmNJbmRleFRvb2wob3B0aW9uczogU2VhcmNoVG9vbE9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBydW50aW1lID0gdG9vbFJ1bnRpbWUob3B0aW9ucyk7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogb3B0aW9ucy5pZCA/PyBcInN5bmNfaW5kZXhcIixcbiAgICBkZXNjcmlwdGlvbjogU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgIGlucHV0U2NoZW1hOiBzeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogc3luY0luZGV4UmVzdWx0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHN5bmNJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoaW5wdXQpO1xuICAgICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gcnVudGltZTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVxdWVzdC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgICBhd2FpdCBjbGllbnQuc3luY0luZGV4KGluZGV4LCBjb250ZXh0Py5hYm9ydFNpZ25hbCk7XG4gICAgICByZXR1cm4geyBpbmRleCwgc3luY2VkOiB0cnVlIH07XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "0.81.0",
|
|
30
30
|
"@databricks/sdk-experimental": "^0.17.0",
|
|
31
|
-
"@dbx-tools/appkit": "^0.9.
|
|
32
|
-
"@dbx-tools/core": "^0.9.
|
|
33
|
-
"@dbx-tools/model": "^0.9.
|
|
34
|
-
"@dbx-tools/postgres": "^0.9.
|
|
35
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
36
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
37
|
-
"@dbx-tools/shared-search": "^0.9.
|
|
31
|
+
"@dbx-tools/appkit": "^0.9.157",
|
|
32
|
+
"@dbx-tools/core": "^0.9.157",
|
|
33
|
+
"@dbx-tools/model": "^0.9.157",
|
|
34
|
+
"@dbx-tools/postgres": "^0.9.157",
|
|
35
|
+
"@dbx-tools/shared-core": "^0.9.157",
|
|
36
|
+
"@dbx-tools/shared-model": "^0.9.157",
|
|
37
|
+
"@dbx-tools/shared-search": "^0.9.157",
|
|
38
38
|
"@mastra/core": "1.71.0",
|
|
39
39
|
"pg": "^8.22.0",
|
|
40
40
|
"zod": "4.3.6"
|
|
@@ -50,58 +50,10 @@
|
|
|
50
50
|
"types": "./lib/index.d.ts",
|
|
51
51
|
"default": "./lib/index.js"
|
|
52
52
|
},
|
|
53
|
-
"./client": {
|
|
54
|
-
"types": "./lib/src/client.d.ts",
|
|
55
|
-
"default": "./lib/src/client.js"
|
|
56
|
-
},
|
|
57
|
-
"./config": {
|
|
58
|
-
"types": "./lib/src/config.d.ts",
|
|
59
|
-
"default": "./lib/src/config.js"
|
|
60
|
-
},
|
|
61
|
-
"./index-options": {
|
|
62
|
-
"types": "./lib/src/index-options.d.ts",
|
|
63
|
-
"default": "./lib/src/index-options.js"
|
|
64
|
-
},
|
|
65
|
-
"./lakebase-plugin": {
|
|
66
|
-
"types": "./lib/src/lakebase-plugin.d.ts",
|
|
67
|
-
"default": "./lib/src/lakebase-plugin.js"
|
|
68
|
-
},
|
|
69
|
-
"./lakebase": {
|
|
70
|
-
"types": "./lib/src/lakebase.d.ts",
|
|
71
|
-
"default": "./lib/src/lakebase.js"
|
|
72
|
-
},
|
|
73
|
-
"./native": {
|
|
74
|
-
"types": "./lib/src/native.d.ts",
|
|
75
|
-
"default": "./lib/src/native.js"
|
|
76
|
-
},
|
|
77
|
-
"./plugin": {
|
|
78
|
-
"types": "./lib/src/plugin.d.ts",
|
|
79
|
-
"default": "./lib/src/plugin.js"
|
|
80
|
-
},
|
|
81
|
-
"./query": {
|
|
82
|
-
"types": "./lib/src/query.d.ts",
|
|
83
|
-
"default": "./lib/src/query.js"
|
|
84
|
-
},
|
|
85
|
-
"./runtime": {
|
|
86
|
-
"types": "./lib/src/runtime.d.ts",
|
|
87
|
-
"default": "./lib/src/runtime.js"
|
|
88
|
-
},
|
|
89
|
-
"./schema": {
|
|
90
|
-
"types": "./lib/src/schema.d.ts",
|
|
91
|
-
"default": "./lib/src/schema.js"
|
|
92
|
-
},
|
|
93
|
-
"./tool": {
|
|
94
|
-
"types": "./lib/src/tool.d.ts",
|
|
95
|
-
"default": "./lib/src/tool.js"
|
|
96
|
-
},
|
|
97
|
-
"./*": {
|
|
98
|
-
"types": "./lib/src/*/index.d.ts",
|
|
99
|
-
"default": "./lib/src/*/index.js"
|
|
100
|
-
},
|
|
101
53
|
"./package.json": "./package.json"
|
|
102
54
|
}
|
|
103
55
|
},
|
|
104
|
-
"version": "0.9.
|
|
56
|
+
"version": "0.9.157",
|
|
105
57
|
"types": "./lib/index.d.ts",
|
|
106
58
|
"dbxToolsConfig": {
|
|
107
59
|
"tags": [
|
|
@@ -114,58 +66,10 @@
|
|
|
114
66
|
"types": "./lib/index.d.ts",
|
|
115
67
|
"default": "./lib/index.js"
|
|
116
68
|
},
|
|
117
|
-
"./client": {
|
|
118
|
-
"types": "./lib/src/client.d.ts",
|
|
119
|
-
"default": "./lib/src/client.js"
|
|
120
|
-
},
|
|
121
|
-
"./config": {
|
|
122
|
-
"types": "./lib/src/config.d.ts",
|
|
123
|
-
"default": "./lib/src/config.js"
|
|
124
|
-
},
|
|
125
|
-
"./index-options": {
|
|
126
|
-
"types": "./lib/src/index-options.d.ts",
|
|
127
|
-
"default": "./lib/src/index-options.js"
|
|
128
|
-
},
|
|
129
|
-
"./lakebase-plugin": {
|
|
130
|
-
"types": "./lib/src/lakebase-plugin.d.ts",
|
|
131
|
-
"default": "./lib/src/lakebase-plugin.js"
|
|
132
|
-
},
|
|
133
|
-
"./lakebase": {
|
|
134
|
-
"types": "./lib/src/lakebase.d.ts",
|
|
135
|
-
"default": "./lib/src/lakebase.js"
|
|
136
|
-
},
|
|
137
|
-
"./native": {
|
|
138
|
-
"types": "./lib/src/native.d.ts",
|
|
139
|
-
"default": "./lib/src/native.js"
|
|
140
|
-
},
|
|
141
|
-
"./plugin": {
|
|
142
|
-
"types": "./lib/src/plugin.d.ts",
|
|
143
|
-
"default": "./lib/src/plugin.js"
|
|
144
|
-
},
|
|
145
|
-
"./query": {
|
|
146
|
-
"types": "./lib/src/query.d.ts",
|
|
147
|
-
"default": "./lib/src/query.js"
|
|
148
|
-
},
|
|
149
|
-
"./runtime": {
|
|
150
|
-
"types": "./lib/src/runtime.d.ts",
|
|
151
|
-
"default": "./lib/src/runtime.js"
|
|
152
|
-
},
|
|
153
|
-
"./schema": {
|
|
154
|
-
"types": "./lib/src/schema.d.ts",
|
|
155
|
-
"default": "./lib/src/schema.js"
|
|
156
|
-
},
|
|
157
|
-
"./tool": {
|
|
158
|
-
"types": "./lib/src/tool.d.ts",
|
|
159
|
-
"default": "./lib/src/tool.js"
|
|
160
|
-
},
|
|
161
|
-
"./*": {
|
|
162
|
-
"types": "./lib/src/*/index.d.ts",
|
|
163
|
-
"default": "./lib/src/*/index.js"
|
|
164
|
-
},
|
|
165
69
|
"./package.json": "./package.json"
|
|
166
70
|
},
|
|
167
71
|
"files": [
|
|
168
|
-
"index
|
|
72
|
+
"index*.ts",
|
|
169
73
|
"src",
|
|
170
74
|
"lib"
|
|
171
75
|
],
|
package/src/client.ts
CHANGED
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
|
|
22
22
|
import { ExecutionError, getExecutionContext } from "@databricks/appkit";
|
|
23
23
|
import { Context } from "@databricks/sdk-experimental";
|
|
24
|
-
import { appkit,
|
|
25
|
-
import { invoke,
|
|
26
|
-
import {
|
|
24
|
+
import { appkit, tryGetExecutionContext, toContext } from "@dbx-tools/appkit";
|
|
25
|
+
import { invoke, selection, modelCatalog } from "@dbx-tools/model";
|
|
26
|
+
import { log, sleep, parseRecord, trimToEmpty, trimToNull } from "@dbx-tools/shared-core";
|
|
27
27
|
import { ModelClass } from "@dbx-tools/shared-model";
|
|
28
28
|
import type {
|
|
29
29
|
IndexInfo,
|
|
@@ -141,9 +141,6 @@ export class SearchIndex {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
/** A resolved live index definition. */
|
|
145
|
-
export type { IndexInfo };
|
|
146
|
-
|
|
147
144
|
/**
|
|
148
145
|
* Options for {@link SearchClient.createIndex} / {@link SearchClient.ensureIndex}.
|
|
149
146
|
* The goal is the same as the rest of the client: name a source table and a
|
|
@@ -250,7 +247,7 @@ export class SearchClient {
|
|
|
250
247
|
query: string,
|
|
251
248
|
options: SearchOptions & { index?: string } = {},
|
|
252
249
|
): Promise<SearchResult> {
|
|
253
|
-
const text =
|
|
250
|
+
const text = trimToEmpty(query);
|
|
254
251
|
const name = resolveIndexName(this.config, options.index);
|
|
255
252
|
if (name === null) {
|
|
256
253
|
throw new ExecutionError("search: no index configured; set a default index or pass one", {
|
|
@@ -279,7 +276,7 @@ export class SearchClient {
|
|
|
279
276
|
query: string,
|
|
280
277
|
options: UniversalSearchOptions = {},
|
|
281
278
|
): Promise<SearchResult> {
|
|
282
|
-
const text =
|
|
279
|
+
const text = trimToEmpty(query);
|
|
283
280
|
const names =
|
|
284
281
|
options.indexes && options.indexes.length > 0
|
|
285
282
|
? options.indexes.map((ref) => resolveIndexName(this.config, ref) ?? ref)
|
|
@@ -318,7 +315,7 @@ export class SearchClient {
|
|
|
318
315
|
* `ENDPOINT_NOT_FOUND` instead of naming the real problem.
|
|
319
316
|
*/
|
|
320
317
|
private requireIndexName(reference: string, operation: string): string {
|
|
321
|
-
const name =
|
|
318
|
+
const name = trimToNull(resolveIndexName(this.config, reference) ?? reference);
|
|
322
319
|
if (name === null) {
|
|
323
320
|
throw new ExecutionError(
|
|
324
321
|
`search: no index configured; set a default index or pass one to ${operation}`,
|
|
@@ -351,7 +348,7 @@ export class SearchClient {
|
|
|
351
348
|
let columns = (spec?.embedding_source_columns ?? []).map((c) => c.name ?? "").filter(Boolean);
|
|
352
349
|
const schemaJson = index.direct_access_index_spec?.schema_json;
|
|
353
350
|
if (directAccess && schemaJson) {
|
|
354
|
-
const schema =
|
|
351
|
+
const schema = parseRecord(schemaJson) ?? {};
|
|
355
352
|
const vectorNames = new Set(
|
|
356
353
|
(index.direct_access_index_spec?.embedding_vector_columns ?? [])
|
|
357
354
|
.map((c) => c.name)
|
|
@@ -415,7 +412,7 @@ export class SearchClient {
|
|
|
415
412
|
* live catalogue, otherwise the highest-ranked embedding endpoint is chosen.
|
|
416
413
|
*/
|
|
417
414
|
async resolveEmbeddingModel(requested?: string, signal?: AbortSignal): Promise<string | null> {
|
|
418
|
-
const explicit =
|
|
415
|
+
const explicit = trimToNull(requested ?? this.config.embeddingModel);
|
|
419
416
|
// An explicit name that already looks like an endpoint id (no whitespace)
|
|
420
417
|
// is used verbatim - no need to fetch and fuzzy-match the live catalogue.
|
|
421
418
|
// A genuinely loose name (e.g. "gte large") still resolves against it.
|
|
@@ -425,10 +422,10 @@ export class SearchClient {
|
|
|
425
422
|
const host = (await client.config.getHost()).toString();
|
|
426
423
|
const endpoints = await modelCatalog.listServingEndpoints(client, host);
|
|
427
424
|
signal?.throwIfAborted();
|
|
428
|
-
const { modelId } =
|
|
425
|
+
const { modelId } = selection.resolveModel(endpoints, {
|
|
429
426
|
...(explicit ? { explicit } : { modelClass: ModelClass.Embedding }),
|
|
430
427
|
});
|
|
431
|
-
return
|
|
428
|
+
return trimToNull(modelId);
|
|
432
429
|
}
|
|
433
430
|
|
|
434
431
|
/**
|
|
@@ -621,7 +618,7 @@ export class SearchClient {
|
|
|
621
618
|
const needEmbed = seed.some((doc) => doc[vectorColumn] === undefined);
|
|
622
619
|
let rows = seed;
|
|
623
620
|
if (needEmbed) {
|
|
624
|
-
const texts = seed.map((doc) =>
|
|
621
|
+
const texts = seed.map((doc) => trimToEmpty(String(doc[sourceColumn] ?? "")));
|
|
625
622
|
const vectors = await this.embed(texts, options.embeddingModel, options.signal);
|
|
626
623
|
rows = seed.map((doc, i) =>
|
|
627
624
|
doc[vectorColumn] === undefined ? { ...doc, [vectorColumn]: vectors[i] } : doc,
|
|
@@ -648,7 +645,7 @@ export class SearchClient {
|
|
|
648
645
|
context: { operation: "provision" },
|
|
649
646
|
});
|
|
650
647
|
}
|
|
651
|
-
await
|
|
648
|
+
await sleep(5000, signal);
|
|
652
649
|
info = await this.getIndex(name, signal);
|
|
653
650
|
}
|
|
654
651
|
return info;
|
|
@@ -735,7 +732,7 @@ export class SearchClient {
|
|
|
735
732
|
const client = this.workspaceClientFactory();
|
|
736
733
|
const controller = new AbortController();
|
|
737
734
|
const timer = setTimeout(() => controller.abort(), this.config.timeoutMs);
|
|
738
|
-
const context =
|
|
735
|
+
const context = toContext(controller, signal);
|
|
739
736
|
try {
|
|
740
737
|
return await fn(client, context);
|
|
741
738
|
} catch (err) {
|
|
@@ -755,7 +752,7 @@ function defaultWorkspaceClient(): WorkspaceClientLike {
|
|
|
755
752
|
|
|
756
753
|
/** AppKit workspace-client facade from the active request or service context. */
|
|
757
754
|
function defaultAppKitWorkspaceClient(): appkit.WorkspaceClientLike {
|
|
758
|
-
const ctx =
|
|
755
|
+
const ctx = tryGetExecutionContext();
|
|
759
756
|
if (ctx?.client) return ctx.client;
|
|
760
757
|
// Outside a request scope (a script, a test): a fresh env-auth client.
|
|
761
758
|
return getExecutionContext().client;
|
package/src/config.ts
CHANGED
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import { ConfigurationError, type BasePluginConfig } from "@databricks/appkit";
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
26
|
+
import { text, ENV_ONLY, string, list, positiveInt, boolean } from "@dbx-tools/core";
|
|
27
|
+
import { optional, trimToNull } from "@dbx-tools/shared-core";
|
|
28
28
|
import type { SearchDocument, SearchMode } from "@dbx-tools/shared-search";
|
|
29
29
|
import type { JSONSchema7 } from "json-schema";
|
|
30
30
|
|
|
@@ -222,11 +222,11 @@ export function defaultAlias(name: string): string {
|
|
|
222
222
|
/** Normalize a config index entry (string or object) into a {@link ResolvedIndexConfig}. */
|
|
223
223
|
function toResolvedIndex(entry: string | SearchIndexConfig): ResolvedIndexConfig | null {
|
|
224
224
|
const raw = typeof entry === "string" ? { name: entry } : entry;
|
|
225
|
-
const name =
|
|
225
|
+
const name = trimToNull(raw.name);
|
|
226
226
|
if (name === null) return null;
|
|
227
227
|
return {
|
|
228
228
|
name,
|
|
229
|
-
alias:
|
|
229
|
+
alias: trimToNull(raw.alias) ?? defaultAlias(name),
|
|
230
230
|
...(raw.primaryKey ? { primaryKey: raw.primaryKey } : {}),
|
|
231
231
|
...(raw.columns && raw.columns.length > 0 ? { columns: [...raw.columns] } : {}),
|
|
232
232
|
};
|
|
@@ -234,7 +234,7 @@ function toResolvedIndex(entry: string | SearchIndexConfig): ResolvedIndexConfig
|
|
|
234
234
|
|
|
235
235
|
/** Parse and validate a {@link SearchMode} from config or an env var. */
|
|
236
236
|
function resolveMode(configured: SearchMode | undefined): SearchMode {
|
|
237
|
-
const raw = configured ??
|
|
237
|
+
const raw = configured ?? text("SEARCH_MODE", ENV_ONLY);
|
|
238
238
|
if (raw === undefined) return DEFAULT_MODE;
|
|
239
239
|
if (raw !== "hybrid" && raw !== "vector" && raw !== "keyword") {
|
|
240
240
|
throw new ConfigurationError(
|
|
@@ -252,11 +252,7 @@ function resolveMode(configured: SearchMode | undefined): SearchMode {
|
|
|
252
252
|
* and a bad mode throws a {@link ConfigurationError} naming the field.
|
|
253
253
|
*/
|
|
254
254
|
export function resolveSearchConfig(config: SearchPluginConfig = {}): ResolvedSearchConfig {
|
|
255
|
-
const defaultIndexRaw =
|
|
256
|
-
config.index,
|
|
257
|
-
[INDEX_ENV, DATABRICKS_INDEX_ENV],
|
|
258
|
-
configUtils.ENV_ONLY,
|
|
259
|
-
);
|
|
255
|
+
const defaultIndexRaw = string(config.index, [INDEX_ENV, DATABRICKS_INDEX_ENV], ENV_ONLY);
|
|
260
256
|
|
|
261
257
|
const configured = (config.indexes ?? [])
|
|
262
258
|
.map(toResolvedIndex)
|
|
@@ -264,12 +260,7 @@ export function resolveSearchConfig(config: SearchPluginConfig = {}): ResolvedSe
|
|
|
264
260
|
|
|
265
261
|
// Ensure the default index is represented in the known set.
|
|
266
262
|
if (defaultIndexRaw && !configured.some((i) => i.name === defaultIndexRaw)) {
|
|
267
|
-
const envColumns =
|
|
268
|
-
undefined,
|
|
269
|
-
"SEARCH_COLUMNS",
|
|
270
|
-
undefined,
|
|
271
|
-
configUtils.ENV_ONLY,
|
|
272
|
-
);
|
|
263
|
+
const envColumns = list(undefined, "SEARCH_COLUMNS", undefined, ENV_ONLY);
|
|
273
264
|
configured.unshift({
|
|
274
265
|
name: defaultIndexRaw,
|
|
275
266
|
alias: defaultAlias(defaultIndexRaw),
|
|
@@ -286,40 +277,21 @@ export function resolveSearchConfig(config: SearchPluginConfig = {}): ResolvedSe
|
|
|
286
277
|
});
|
|
287
278
|
|
|
288
279
|
const defaultIndex = defaultIndexRaw ?? indexes[0]?.name;
|
|
289
|
-
const columns =
|
|
290
|
-
config.columns,
|
|
291
|
-
"SEARCH_COLUMNS",
|
|
292
|
-
undefined,
|
|
293
|
-
configUtils.ENV_ONLY,
|
|
294
|
-
);
|
|
280
|
+
const columns = list(config.columns, "SEARCH_COLUMNS", undefined, ENV_ONLY);
|
|
295
281
|
|
|
296
282
|
return {
|
|
297
|
-
...
|
|
283
|
+
...optional("defaultIndex", defaultIndex),
|
|
298
284
|
indexes,
|
|
299
|
-
...
|
|
300
|
-
"endpoint",
|
|
301
|
-
configUtils.string(config.endpoint, ENDPOINT_ENV, configUtils.ENV_ONLY),
|
|
302
|
-
),
|
|
285
|
+
...optional("endpoint", string(config.endpoint, ENDPOINT_ENV, ENV_ONLY)),
|
|
303
286
|
...(columns.length > 0 ? { columns } : {}),
|
|
304
|
-
pageSize:
|
|
305
|
-
config.pageSize,
|
|
306
|
-
"SEARCH_PAGE_SIZE",
|
|
307
|
-
DEFAULT_PAGE_SIZE,
|
|
308
|
-
configUtils.ENV_ONLY,
|
|
309
|
-
),
|
|
287
|
+
pageSize: positiveInt(config.pageSize, "SEARCH_PAGE_SIZE", DEFAULT_PAGE_SIZE, ENV_ONLY),
|
|
310
288
|
mode: resolveMode(config.mode),
|
|
311
|
-
...
|
|
289
|
+
...optional(
|
|
312
290
|
"embeddingModel",
|
|
313
|
-
|
|
314
|
-
),
|
|
315
|
-
timeoutMs: configUtils.positiveInt(
|
|
316
|
-
config.timeoutMs,
|
|
317
|
-
"SEARCH_TIMEOUT_MS",
|
|
318
|
-
DEFAULT_TIMEOUT_MS,
|
|
319
|
-
configUtils.ENV_ONLY,
|
|
291
|
+
string(config.embeddingModel, "SEARCH_EMBEDDING_MODEL", ENV_ONLY),
|
|
320
292
|
),
|
|
321
|
-
|
|
322
|
-
|
|
293
|
+
timeoutMs: positiveInt(config.timeoutMs, "SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS, ENV_ONLY),
|
|
294
|
+
allowWrite: boolean(config.allowWrite, "SEARCH_WRITE", ENV_ONLY) ?? false,
|
|
323
295
|
...(config.ensureOnSetup ? { ensureOnSetup: config.ensureOnSetup } : {}),
|
|
324
296
|
};
|
|
325
297
|
}
|
|
@@ -334,7 +306,7 @@ export function resolveIndexName(
|
|
|
334
306
|
config: ResolvedSearchConfig,
|
|
335
307
|
reference: string | undefined,
|
|
336
308
|
): string | null {
|
|
337
|
-
const ref =
|
|
309
|
+
const ref = trimToNull(reference);
|
|
338
310
|
if (ref === null) return config.defaultIndex ?? null;
|
|
339
311
|
const byAlias = config.indexes.find((i) => i.alias === ref || i.name === ref);
|
|
340
312
|
if (byAlias) return byAlias.name;
|
package/src/lakebase-plugin.ts
CHANGED
|
@@ -14,8 +14,8 @@ import {
|
|
|
14
14
|
type PluginManifest,
|
|
15
15
|
} from "@databricks/appkit";
|
|
16
16
|
import type { IndexConfig, SearchRequest, SearchResponse } from "@databricks/appkit/beta";
|
|
17
|
-
import {
|
|
18
|
-
import { log,
|
|
17
|
+
import { require } from "@dbx-tools/appkit";
|
|
18
|
+
import { log, isRecord, trimToNull } from "@dbx-tools/shared-core";
|
|
19
19
|
import type { SearchDocument } from "@dbx-tools/shared-search";
|
|
20
20
|
import type express from "express";
|
|
21
21
|
import type { JSONSchema7 } from "json-schema";
|
|
@@ -96,8 +96,8 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
|
|
|
96
96
|
const indexes = this.indexes();
|
|
97
97
|
for (const index of indexes) this.validateAuth(index);
|
|
98
98
|
this.context?.onLifecycle("setup:complete", async () => {
|
|
99
|
-
const lake =
|
|
100
|
-
const schema =
|
|
99
|
+
const lake = require(this.context, lakebase, this);
|
|
100
|
+
const schema = trimToNull(this.config.schema) ?? "public";
|
|
101
101
|
this.servicePrincipalBackend = new LakebaseSearchBackend(lake.exports().pool, schema);
|
|
102
102
|
this.userBackend = new LakebaseSearchBackend(
|
|
103
103
|
{ managedPool: () => lake.exports().pool },
|
|
@@ -125,9 +125,7 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
|
|
|
125
125
|
try {
|
|
126
126
|
const alias = routeParam(req.params.alias);
|
|
127
127
|
const index = this.resolveIndex(alias);
|
|
128
|
-
const { columns: _untrustedColumns, ...request } =
|
|
129
|
-
? req.body
|
|
130
|
-
: {};
|
|
128
|
+
const { columns: _untrustedColumns, ...request } = isRecord(req.body) ? req.body : {};
|
|
131
129
|
res.json(await this.routeRuntime(index, req).query(alias, request as SearchRequest));
|
|
132
130
|
} catch (error) {
|
|
133
131
|
res.status(400).json({
|
|
@@ -162,7 +160,7 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
|
|
|
162
160
|
const alias = routeParam(req.params.alias);
|
|
163
161
|
const index = this.resolveIndex(alias);
|
|
164
162
|
const documents = Array.isArray(req.body?.documents)
|
|
165
|
-
? req.body.documents.filter(
|
|
163
|
+
? req.body.documents.filter(isRecord)
|
|
166
164
|
: [];
|
|
167
165
|
res.json(await this.routeRuntime(index, req).addDocuments(alias, documents));
|
|
168
166
|
},
|
|
@@ -211,7 +209,7 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
|
|
|
211
209
|
const index = this.resolveIndex(alias);
|
|
212
210
|
return this.requireBackend(index).addDocuments(
|
|
213
211
|
index.indexName,
|
|
214
|
-
documents.filter(
|
|
212
|
+
documents.filter(isRecord),
|
|
215
213
|
index.config.textColumn ?? "text",
|
|
216
214
|
);
|
|
217
215
|
}
|
|
@@ -243,7 +241,7 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
|
|
|
243
241
|
private indexes(): ResolvedLakebaseIndex[] {
|
|
244
242
|
return Object.entries(this.config.indexes ?? {}).map(([alias, config]) => ({
|
|
245
243
|
alias,
|
|
246
|
-
indexName:
|
|
244
|
+
indexName: trimToNull(config.indexName) ?? alias,
|
|
247
245
|
config,
|
|
248
246
|
}));
|
|
249
247
|
}
|