@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/lib/src/tool.js CHANGED
@@ -14,14 +14,14 @@
14
14
  *
15
15
  * @module
16
16
  */
17
- import { searchSchemas } from "@dbx-tools/shared-search";
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, createIndexToolSchema, indexInfoSchema, searchResultSchema, searchToolSchema, syncIndexToolSchema, universalSearchToolSchema, } from "./schema.js";
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: searchToolSchema,
56
+ inputSchema: searchRequestSchema,
57
57
  outputSchema: searchResultSchema,
58
58
  execute: async (input, context) => {
59
- const request = searchToolSchema.parse(input);
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: universalSearchToolSchema,
70
+ inputSchema: universalSearchRequestSchema,
71
71
  outputSchema: searchResultSchema,
72
72
  execute: async (input, context) => {
73
- const request = universalSearchToolSchema.parse(input);
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 = searchSchemas.searchDocumentSchema
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: searchSchemas.searchRequestSchema
91
- .pick({ index: true })
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: createIndexToolSchema,
112
+ inputSchema: createIndexRequestSchema,
115
113
  outputSchema: indexInfoSchema,
116
114
  execute: async (input, context) => {
117
- const request = createIndexToolSchema.parse(input);
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: syncIndexToolSchema,
134
+ inputSchema: syncIndexRequestSchema,
137
135
  outputSchema: syncIndexResultSchema,
138
136
  execute: async (input, context) => {
139
- const request = syncIndexToolSchema.parse(input);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFzQixNQUFNLGNBQWMsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLDZCQUE2QixFQUM3Qix1QkFBdUIsRUFDdkIsMkJBQTJCLEVBQzNCLGlDQUFpQyxFQUNqQyxxQkFBcUIsRUFDckIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLHlCQUF5QixHQUMxQixNQUFNLGFBQWEsQ0FBQztBQWNyQiw0RUFBNEU7QUFDNUUsU0FBUyxXQUFXLENBQUMsT0FBMEI7SUFDN0MsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMvRCxNQUFNLElBQUksU0FBUyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELE9BQU8sQ0FDTCxPQUFPLENBQUMsT0FBTztRQUNmLG1CQUFtQixDQUFDO1lBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7U0FDakMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLFVBQTZCLEVBQUU7SUFDeEQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sVUFBVSxDQUFDO1FBQ2hCLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLFFBQVE7UUFDMUIsV0FBVyxFQUFFLHVCQUF1QjtRQUNwQyxXQUFXLEVBQUUsZ0JBQWdCO1FBQzdCLFlBQVksRUFBRSxrQkFBa0I7UUFDaEMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzlGLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxVQUE2QixFQUFFO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxPQUFPLFVBQVUsQ0FBQztRQUNoQixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxrQkFBa0I7UUFDcEMsV0FBVyxFQUFFLGlDQUFpQztRQUM5QyxXQUFXLEVBQUUseUJBQXlCO1FBQ3RDLFlBQVksRUFBRSxrQkFBa0I7UUFDaEMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQ25DLE9BQU8sQ0FBQyxLQUFLLEVBQ2Isd0JBQXdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FDeEQsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFVBQTZCLEVBQUU7SUFDOUQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxvQkFBb0I7U0FDbkQsS0FBSyxFQUFFO1NBQ1AsUUFBUSxDQUFDLHNFQUFzRSxDQUFDLENBQUM7SUFDcEYsT0FBTyxVQUFVLENBQUM7UUFDaEIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksZUFBZTtRQUNqQyxXQUFXLEVBQUUsOEJBQThCO1FBQzNDLFdBQVcsRUFBRSxhQUFhLENBQUMsbUJBQW1CO2FBQzNDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUNyQixNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDckMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxrQkFBa0I7UUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUF5QixFQUFFO1lBQ3ZELE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO1lBQ25DLE1BQU0sTUFBTSxHQUFHLEtBQStDLENBQUM7WUFDL0QsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1lBQ3hELE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNyRSxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxVQUE2QixFQUFFO0lBQzdELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxPQUFPLFVBQVUsQ0FBQztRQUNoQixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxjQUFjO1FBQ2hDLFdBQVcsRUFBRSw2QkFBNkI7UUFDMUMsV0FBVyxFQUFFLHFCQUFxQjtRQUNsQyxZQUFZLEVBQUUsZUFBZTtRQUM3QixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDL0IsT0FBTyxDQUFDLElBQUksRUFDWixvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUNwRCxDQUFDO1FBQ0osQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3JDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDO0lBQ3hELE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLG1DQUFtQyxDQUFDO0NBQ2xFLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsVUFBNkIsRUFBRTtJQUMzRCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsT0FBTyxVQUFVLENBQUM7UUFDaEIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksWUFBWTtRQUM5QixXQUFXLEVBQUUsMkJBQTJCO1FBQ3hDLFdBQVcsRUFBRSxtQkFBbUI7UUFDaEMsWUFBWSxFQUFFLHFCQUFxQjtRQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakQsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUN6RCxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGBzZWFyY2hgLCBgdW5pdmVyc2FsX3NlYXJjaGAsIGFuZCAob3B0LWluKSBgYWRkX2RvY3VtZW50c2AsXG4gKiBgY3JlYXRlX2luZGV4YCwgYW5kIGBzeW5jX2luZGV4YCBNYXN0cmEgdG9vbHMuXG4gKlxuICogQXBwLWludGVncmF0ZWQgYWdlbnRzIHNob3VsZCBjb25zdW1lIHRoZSBwbHVnaW4ncyBuYXRpdmUgdG9vbGtpdCBzbyBjYWxsc1xuICogcmV0YWluIHRoYXQgcGx1Z2luJ3MgY29uZmlnIGFuZCBwcm92aWRlciBiYWNrZW5kLiBUaGVzZSBzdGFuZGFsb25lIGZhY3Rvcmllc1xuICogY2FwdHVyZSBhbiBleHBsaWNpdCBydW50aW1lIG9yIGJ1aWxkIGFuIGlzb2xhdGVkIG9uZSBmcm9tIGNvbmZpZyBwbHVzIGFcbiAqIHByb3ZpZGVyLiBUaGV5IHJ1biB1bmRlciB0aGUgY2FsbGVyJ3MgT0JPIHNjb3BlICh0aGUgY2xpZW50IHJlc29sdmVzIHRoZVxuICogZXhlY3V0aW9uIGNvbnRleHQncyB3b3Jrc3BhY2UgY2xpZW50KSwgc28gc2VhcmNoIHJ1bnMgYXMgdGhlIHJlcXVlc3RpbmcgdXNlclxuICogYW5kIFVuaXR5IENhdGFsb2cgQUNMcyBhcHBseS5cbiAqXG4gKiBUaGUgc2FtZSB0b29scyBhcmUgZXhwb3NlZCB0byBBcHBLaXQncyBvd24gYWdlbnRzIHRocm91Z2ggdGhlIHBsdWdpbidzXG4gKiBgVG9vbFByb3ZpZGVyYCAoc2VlIGBwbHVnaW4udHNgKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgc2VhcmNoU2NoZW1hcywgdHlwZSBVcHNlcnRSZXN1bHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHRvU2VhcmNoT3B0aW9ucywgdG9Vbml2ZXJzYWxTZWFyY2hPcHRpb25zIH0gZnJvbSBcIi4vX3NlYXJjaC1vcHRpb25zLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaFJlYWRCYWNrZW5kIH0gZnJvbSBcIi4vY2xpZW50LnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgdG9DcmVhdGVJbmRleE9wdGlvbnMgfSBmcm9tIFwiLi9pbmRleC1vcHRpb25zLnRzXCI7XG5pbXBvcnQgeyB0b0RvY3VtZW50QXJyYXkgfSBmcm9tIFwiLi9xdWVyeS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlU2VhcmNoUnVudGltZSwgdHlwZSBTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBjcmVhdGVJbmRleFRvb2xTY2hlbWEsXG4gIGluZGV4SW5mb1NjaGVtYSxcbiAgc2VhcmNoUmVzdWx0U2NoZW1hLFxuICBzZWFyY2hUb29sU2NoZW1hLFxuICBzeW5jSW5kZXhUb29sU2NoZW1hLFxuICB1bml2ZXJzYWxTZWFyY2hUb29sU2NoZW1hLFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgZXZlcnkgc3RhbmRhbG9uZSB0b29sIGZhY3RvcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFRvb2xPcHRpb25zIHtcbiAgLyoqIE92ZXJyaWRlIHRoZSB0b29sIGlkIChkZWZhdWx0cyBwZXIgdG9vbCkuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogSXNvbGF0ZWQgcnVudGltZSB1c2VkIGJ5IHRoaXMgc3RhbmRhbG9uZSB0b29sLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjb25maWcvYmFja2VuZC4gKi9cbiAgcnVudGltZT86IFNlYXJjaFJ1bnRpbWU7XG4gIC8qKiBDb25maWcgdXNlZCB0byBjcmVhdGUgYW4gaXNvbGF0ZWQgcnVudGltZS4gKi9cbiAgY29uZmlnPzogU2VhcmNoUGx1Z2luQ29uZmlnO1xuICAvKiogUHJvdmlkZXIgdXNlZCB3aGVuIGNyZWF0aW5nIGEgcnVudGltZSBmcm9tIGNvbmZpZy4gKi9cbiAgcmVhZEJhY2tlbmQ/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.154",
32
- "@dbx-tools/core": "^0.9.154",
33
- "@dbx-tools/model": "^0.9.154",
34
- "@dbx-tools/postgres": "^0.9.154",
35
- "@dbx-tools/shared-core": "^0.9.154",
36
- "@dbx-tools/shared-model": "^0.9.154",
37
- "@dbx-tools/shared-search": "^0.9.154",
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.154",
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.ts",
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, databricks } from "@dbx-tools/appkit";
25
- import { invoke, resolve as modelResolve, modelCatalog } from "@dbx-tools/model";
26
- import { asyncUtils, json, log, stringUtils } from "@dbx-tools/shared-core";
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 = stringUtils.trimToEmpty(query);
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 = stringUtils.trimToEmpty(query);
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 = stringUtils.trimToNull(resolveIndexName(this.config, reference) ?? reference);
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 = json.parseRecord(schemaJson) ?? {};
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 = stringUtils.trimToNull(requested ?? this.config.embeddingModel);
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 } = modelResolve.resolveModel(endpoints, {
425
+ const { modelId } = selection.resolveModel(endpoints, {
429
426
  ...(explicit ? { explicit } : { modelClass: ModelClass.Embedding }),
430
427
  });
431
- return stringUtils.trimToNull(modelId);
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) => stringUtils.trimToEmpty(String(doc[sourceColumn] ?? "")));
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 asyncUtils.sleep(5000, signal);
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 = databricks.toContext(controller, signal);
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 = appkit.tryGetExecutionContext();
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 { configUtils } from "@dbx-tools/core";
27
- import { object, stringUtils } from "@dbx-tools/shared-core";
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 = stringUtils.trimToNull(raw.name);
225
+ const name = trimToNull(raw.name);
226
226
  if (name === null) return null;
227
227
  return {
228
228
  name,
229
- alias: stringUtils.trimToNull(raw.alias) ?? defaultAlias(name),
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 ?? configUtils.text("SEARCH_MODE", configUtils.ENV_ONLY);
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 = configUtils.string(
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 = configUtils.list(
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 = configUtils.list(
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
- ...object.optional("defaultIndex", defaultIndex),
283
+ ...optional("defaultIndex", defaultIndex),
298
284
  indexes,
299
- ...object.optional(
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: configUtils.positiveInt(
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
- ...object.optional(
289
+ ...optional(
312
290
  "embeddingModel",
313
- configUtils.string(config.embeddingModel, "SEARCH_EMBEDDING_MODEL", configUtils.ENV_ONLY),
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
- allowWrite:
322
- configUtils.boolean(config.allowWrite, "SEARCH_WRITE", configUtils.ENV_ONLY) ?? false,
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 = stringUtils.trimToNull(reference);
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;
@@ -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 { pluginRegistry } from "@dbx-tools/appkit";
18
- import { log, object, stringUtils } from "@dbx-tools/shared-core";
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 = pluginRegistry.require(this.context, lakebase, this);
100
- const schema = stringUtils.trimToNull(this.config.schema) ?? "public";
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 } = object.isRecord(req.body)
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(object.isRecord)
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(object.isRecord),
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: stringUtils.trimToNull(config.indexName) ?? alias,
244
+ indexName: trimToNull(config.indexName) ?? alias,
247
245
  config,
248
246
  }));
249
247
  }