@dbx-tools/search 0.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Translation between the browser-safe search contract and the Databricks
3
+ * Vector Search query API, kept in one place so the client, the tools, and the
4
+ * routes never hand-roll a `filters_json` string or unpack a `data_array` by
5
+ * hand.
6
+ *
7
+ * - {@link toQueryType} maps the friendly {@link SearchMode} onto the API's
8
+ * `query_type` (`HYBRID` / `ANN`). Keyword-only search rides on `ANN` with
9
+ * text but no vector, which Databricks answers with its BM25 path.
10
+ * - {@link compileFilter} turns the `{ column: value }` filter object (with
11
+ * optional operator maps like `{ ">=": 10 }`) into the `filters_json`
12
+ * string the API expects, so a caller never learns Databricks' filter
13
+ * spelling.
14
+ * - {@link toHits} unpacks the columnar `{ manifest, result }` response into
15
+ * `{ id, score, fields }` hits, pulling the score out of the reserved
16
+ * `__db_score` / `score` column and the id out of the primary-key column.
17
+ *
18
+ * @module
19
+ */
20
+ import type { SearchHit, SearchMode } from "@dbx-tools/shared-search";
21
+ /** Map a {@link SearchMode} onto the serving API `query_type`. */
22
+ export declare function toQueryType(mode: SearchMode): string;
23
+ /**
24
+ * Compile a `{ column: value }` filter object into the `filters_json` string
25
+ * the query API expects. A scalar becomes an equality; an array becomes an
26
+ * IN-style match; an operator map (`{ ">=": 10, "<": 20 }`) expands to the
27
+ * `column operator` keys Databricks uses. Returns `undefined` for an empty
28
+ * filter so the field is omitted rather than sent as `{}`.
29
+ */
30
+ export declare function compileFilter(filter: Record<string, unknown> | undefined): string | undefined;
31
+ /** A minimal structural view of the Vector Search query response. */
32
+ export interface QueryResponseLike {
33
+ manifest?: {
34
+ columns?: Array<{
35
+ name?: string;
36
+ }>;
37
+ };
38
+ result?: {
39
+ data_array?: Array<Array<unknown>>;
40
+ };
41
+ next_page_token?: string;
42
+ }
43
+ /**
44
+ * Unpack a columnar query response into {@link SearchHit}s. The manifest names
45
+ * the columns in order; each row is a positional array. The score comes from
46
+ * the reserved score column and the id from `primaryKey` (falling back to the
47
+ * first column when the key is unknown). The score column is stripped from
48
+ * `fields` so a hit's fields are just the document.
49
+ */
50
+ export declare function toHits(response: QueryResponseLike, primaryKey: string | undefined, indexName?: string): SearchHit[];
51
+ /**
52
+ * The columns to request from an index for a search. When neither the request
53
+ * nor the index config names columns, the score column alone is requested and
54
+ * the primary key is appended so a hit always has an id. Callers that want the
55
+ * whole document should pass the index's own column list.
56
+ */
57
+ export declare function toRequestColumns(requested: readonly string[] | undefined, fallback: readonly string[] | undefined, primaryKey: string | undefined): string[];
58
+ /**
59
+ * Parse a JSON document payload the model / a route supplied for a write.
60
+ * Accepts an already-parsed array/object or a JSON string, and always returns
61
+ * an array so a single document and a batch are handled the same way. Throws a
62
+ * {@link ValidationError} on unparseable input so the caller can surface it.
63
+ */
64
+ export declare function toDocumentArray(input: unknown): Array<Record<string, unknown>>;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Translation between the browser-safe search contract and the Databricks
3
+ * Vector Search query API, kept in one place so the client, the tools, and the
4
+ * routes never hand-roll a `filters_json` string or unpack a `data_array` by
5
+ * hand.
6
+ *
7
+ * - {@link toQueryType} maps the friendly {@link SearchMode} onto the API's
8
+ * `query_type` (`HYBRID` / `ANN`). Keyword-only search rides on `ANN` with
9
+ * text but no vector, which Databricks answers with its BM25 path.
10
+ * - {@link compileFilter} turns the `{ column: value }` filter object (with
11
+ * optional operator maps like `{ ">=": 10 }`) into the `filters_json`
12
+ * string the API expects, so a caller never learns Databricks' filter
13
+ * spelling.
14
+ * - {@link toHits} unpacks the columnar `{ manifest, result }` response into
15
+ * `{ id, score, fields }` hits, pulling the score out of the reserved
16
+ * `__db_score` / `score` column and the id out of the primary-key column.
17
+ *
18
+ * @module
19
+ */
20
+ import { ValidationError } from "@databricks/appkit";
21
+ import { json, object } from "@dbx-tools/shared-core";
22
+ /** The column name Databricks Vector Search returns the relevance score under. */
23
+ const SCORE_COLUMN = "__db_score";
24
+ /** Map a {@link SearchMode} onto the serving API `query_type`. */
25
+ export function toQueryType(mode) {
26
+ return mode === "hybrid" ? "HYBRID" : "ANN";
27
+ }
28
+ /**
29
+ * Compile a `{ column: value }` filter object into the `filters_json` string
30
+ * the query API expects. A scalar becomes an equality; an array becomes an
31
+ * IN-style match; an operator map (`{ ">=": 10, "<": 20 }`) expands to the
32
+ * `column operator` keys Databricks uses. Returns `undefined` for an empty
33
+ * filter so the field is omitted rather than sent as `{}`.
34
+ */
35
+ export function compileFilter(filter) {
36
+ if (!filter || Object.keys(filter).length === 0)
37
+ return undefined;
38
+ const compiled = {};
39
+ for (const [column, value] of Object.entries(filter)) {
40
+ if (object.isRecord(value)) {
41
+ for (const [op, operand] of Object.entries(value)) {
42
+ compiled[`${column} ${op}`] = operand;
43
+ }
44
+ }
45
+ else {
46
+ compiled[column] = value;
47
+ }
48
+ }
49
+ return JSON.stringify(compiled);
50
+ }
51
+ /**
52
+ * Unpack a columnar query response into {@link SearchHit}s. The manifest names
53
+ * the columns in order; each row is a positional array. The score comes from
54
+ * the reserved score column and the id from `primaryKey` (falling back to the
55
+ * first column when the key is unknown). The score column is stripped from
56
+ * `fields` so a hit's fields are just the document.
57
+ */
58
+ export function toHits(response, primaryKey, indexName) {
59
+ const columns = (response.manifest?.columns ?? []).map((c) => c.name ?? "");
60
+ const rows = response.result?.data_array ?? [];
61
+ const scoreIdx = columns.indexOf(SCORE_COLUMN);
62
+ const keyIdx = primaryKey ? columns.indexOf(primaryKey) : -1;
63
+ return rows.map((row, rowIndex) => {
64
+ const fields = {};
65
+ columns.forEach((name, i) => {
66
+ if (i === scoreIdx || !name)
67
+ return;
68
+ fields[name] = row[i];
69
+ });
70
+ const scoreRaw = scoreIdx >= 0 ? Number(row[scoreIdx]) : NaN;
71
+ const idRaw = keyIdx >= 0 ? row[keyIdx] : primaryKey ? fields[primaryKey] : (row[0] ?? rowIndex);
72
+ return {
73
+ id: String(idRaw ?? rowIndex),
74
+ score: Number.isFinite(scoreRaw) ? scoreRaw : 0,
75
+ fields,
76
+ ...(indexName ? { index: indexName } : {}),
77
+ };
78
+ });
79
+ }
80
+ /**
81
+ * The columns to request from an index for a search. When neither the request
82
+ * nor the index config names columns, the score column alone is requested and
83
+ * the primary key is appended so a hit always has an id. Callers that want the
84
+ * whole document should pass the index's own column list.
85
+ */
86
+ export function toRequestColumns(requested, fallback, primaryKey) {
87
+ const base = requested && requested.length > 0 ? requested : (fallback ?? []);
88
+ const columns = new Set(base);
89
+ if (primaryKey)
90
+ columns.add(primaryKey);
91
+ if (columns.size === 0 && primaryKey)
92
+ columns.add(primaryKey);
93
+ return [...columns];
94
+ }
95
+ /**
96
+ * Parse a JSON document payload the model / a route supplied for a write.
97
+ * Accepts an already-parsed array/object or a JSON string, and always returns
98
+ * an array so a single document and a batch are handled the same way. Throws a
99
+ * {@link ValidationError} on unparseable input so the caller can surface it.
100
+ */
101
+ export function toDocumentArray(input) {
102
+ const value = typeof input === "string" ? json.parse(input, undefined) : input;
103
+ if (value === undefined) {
104
+ throw new ValidationError("documents must be a JSON object, array, or string");
105
+ }
106
+ const list = Array.isArray(value) ? value : [value];
107
+ return list.filter(object.isRecord);
108
+ }
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRELGtGQUFrRjtBQUNsRixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUM7QUFFbEMsa0VBQWtFO0FBQ2xFLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBZ0I7SUFDMUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM5QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUEyQztJQUN2RSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRSxNQUFNLFFBQVEsR0FBNEIsRUFBRSxDQUFDO0lBQzdDLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsUUFBUSxDQUFDLEdBQUcsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FB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QUFDLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMvRSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksZUFBZSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zbGF0aW9uIGJldHdlZW4gdGhlIGJyb3dzZXItc2FmZSBzZWFyY2ggY29udHJhY3QgYW5kIHRoZSBEYXRhYnJpY2tzXG4gKiBWZWN0b3IgU2VhcmNoIHF1ZXJ5IEFQSSwga2VwdCBpbiBvbmUgcGxhY2Ugc28gdGhlIGNsaWVudCwgdGhlIHRvb2xzLCBhbmQgdGhlXG4gKiByb3V0ZXMgbmV2ZXIgaGFuZC1yb2xsIGEgYGZpbHRlcnNfanNvbmAgc3RyaW5nIG9yIHVucGFjayBhIGBkYXRhX2FycmF5YCBieVxuICogaGFuZC5cbiAqXG4gKiAgIC0ge0BsaW5rIHRvUXVlcnlUeXBlfSBtYXBzIHRoZSBmcmllbmRseSB7QGxpbmsgU2VhcmNoTW9kZX0gb250byB0aGUgQVBJJ3NcbiAqICAgICBgcXVlcnlfdHlwZWAgKGBIWUJSSURgIC8gYEFOTmApLiBLZXl3b3JkLW9ubHkgc2VhcmNoIHJpZGVzIG9uIGBBTk5gIHdpdGhcbiAqICAgICB0ZXh0IGJ1dCBubyB2ZWN0b3IsIHdoaWNoIERhdGFicmlja3MgYW5zd2VycyB3aXRoIGl0cyBCTTI1IHBhdGguXG4gKiAgIC0ge0BsaW5rIGNvbXBpbGVGaWx0ZXJ9IHR1cm5zIHRoZSBgeyBjb2x1bW46IHZhbHVlIH1gIGZpbHRlciBvYmplY3QgKHdpdGhcbiAqICAgICBvcHRpb25hbCBvcGVyYXRvciBtYXBzIGxpa2UgYHsgXCI+PVwiOiAxMCB9YCkgaW50byB0aGUgYGZpbHRlcnNfanNvbmBcbiAqICAgICBzdHJpbmcgdGhlIEFQSSBleHBlY3RzLCBzbyBhIGNhbGxlciBuZXZlciBsZWFybnMgRGF0YWJyaWNrcycgZmlsdGVyXG4gKiAgICAgc3BlbGxpbmcuXG4gKiAgIC0ge0BsaW5rIHRvSGl0c30gdW5wYWNrcyB0aGUgY29sdW1uYXIgYHsgbWFuaWZlc3QsIHJlc3VsdCB9YCByZXNwb25zZSBpbnRvXG4gKiAgICAgYHsgaWQsIHNjb3JlLCBmaWVsZHMgfWAgaGl0cywgcHVsbGluZyB0aGUgc2NvcmUgb3V0IG9mIHRoZSByZXNlcnZlZFxuICogICAgIGBfX2RiX3Njb3JlYCAvIGBzY29yZWAgY29sdW1uIGFuZCB0aGUgaWQgb3V0IG9mIHRoZSBwcmltYXJ5LWtleSBjb2x1bW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgU2VhcmNoSGl0LCBTZWFyY2hNb2RlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHsganNvbiwgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuLyoqIFRoZSBjb2x1bW4gbmFtZSBEYXRhYnJpY2tzIFZlY3RvciBTZWFyY2ggcmV0dXJucyB0aGUgcmVsZXZhbmNlIHNjb3JlIHVuZGVyLiAqL1xuY29uc3QgU0NPUkVfQ09MVU1OID0gXCJfX2RiX3Njb3JlXCI7XG5cbi8qKiBNYXAgYSB7QGxpbmsgU2VhcmNoTW9kZX0gb250byB0aGUgc2VydmluZyBBUEkgYHF1ZXJ5X3R5cGVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUXVlcnlUeXBlKG1vZGU6IFNlYXJjaE1vZGUpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZSA9PT0gXCJoeWJyaWRcIiA/IFwiSFlCUklEXCIgOiBcIkFOTlwiO1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBgeyBjb2x1bW46IHZhbHVlIH1gIGZpbHRlciBvYmplY3QgaW50byB0aGUgYGZpbHRlcnNfanNvbmAgc3RyaW5nXG4gKiB0aGUgcXVlcnkgQVBJIGV4cGVjdHMuIEEgc2NhbGFyIGJlY29tZXMgYW4gZXF1YWxpdHk7IGFuIGFycmF5IGJlY29tZXMgYW5cbiAqIElOLXN0eWxlIG1hdGNoOyBhbiBvcGVyYXRvciBtYXAgKGB7IFwiPj1cIjogMTAsIFwiPFwiOiAyMCB9YCkgZXhwYW5kcyB0byB0aGVcbiAqIGBjb2x1bW4gb3BlcmF0b3JgIGtleXMgRGF0YWJyaWNrcyB1c2VzLiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbiBlbXB0eVxuICogZmlsdGVyIHNvIHRoZSBmaWVsZCBpcyBvbWl0dGVkIHJhdGhlciB0aGFuIHNlbnQgYXMgYHt9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVGaWx0ZXIoZmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZmlsdGVyIHx8IE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb21waWxlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgIGlmIChvYmplY3QuaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtvcCwgb3BlcmFuZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgIGNvbXBpbGVkW2Ake2NvbHVtbn0gJHtvcH1gXSA9IG9wZXJhbmQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVkW2NvbHVtbl0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbXBpbGVkKTtcbn1cblxuLyoqIEEgbWluaW1hbCBzdHJ1Y3R1cmFsIHZpZXcgb2YgdGhlIFZlY3RvciBTZWFyY2ggcXVlcnkgcmVzcG9uc2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5UmVzcG9uc2VMaWtlIHtcbiAgbWFuaWZlc3Q/OiB7IGNvbHVtbnM/OiBBcnJheTx7IG5hbWU/OiBzdHJpbmcgfT4gfTtcbiAgcmVzdWx0PzogeyBkYXRhX2FycmF5PzogQXJyYXk8QXJyYXk8dW5rbm93bj4+IH07XG4gIG5leHRfcGFnZV90b2tlbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBVbnBhY2sgYSBjb2x1bW5hciBxdWVyeSByZXNwb25zZSBpbnRvIHtAbGluayBTZWFyY2hIaXR9cy4gVGhlIG1hbmlmZXN0IG5hbWVzXG4gKiB0aGUgY29sdW1ucyBpbiBvcmRlcjsgZWFjaCByb3cgaXMgYSBwb3NpdGlvbmFsIGFycmF5LiBUaGUgc2NvcmUgY29tZXMgZnJvbVxuICogdGhlIHJlc2VydmVkIHNjb3JlIGNvbHVtbiBhbmQgdGhlIGlkIGZyb20gYHByaW1hcnlLZXlgIChmYWxsaW5nIGJhY2sgdG8gdGhlXG4gKiBmaXJzdCBjb2x1bW4gd2hlbiB0aGUga2V5IGlzIHVua25vd24pLiBUaGUgc2NvcmUgY29sdW1uIGlzIHN0cmlwcGVkIGZyb21cbiAqIGBmaWVsZHNgIHNvIGEgaGl0J3MgZmllbGRzIGFyZSBqdXN0IHRoZSBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSGl0cyhcbiAgcmVzcG9uc2U6IFF1ZXJ5UmVzcG9uc2VMaWtlLFxuICBwcmltYXJ5S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGluZGV4TmFtZT86IHN0cmluZyxcbik6IFNlYXJjaEhpdFtdIHtcbiAgY29uc3QgY29sdW1ucyA9IChyZXNwb25zZS5tYW5pZmVzdD8uY29sdW1ucyA/PyBbXSkubWFwKChjKSA9PiBjLm5hbWUgPz8gXCJcIik7XG4gIGNvbnN0IHJvd3MgPSByZXNwb25zZS5yZXN1bHQ/LmRhdGFfYXJyYXkgPz8gW107XG4gIGNvbnN0IHNjb3JlSWR4ID0gY29sdW1ucy5pbmRleE9mKFNDT1JFX0NPTFVNTik7XG4gIGNvbnN0IGtleUlkeCA9IHByaW1hcnlLZXkgPyBjb2x1bW5zLmluZGV4T2YocHJpbWFyeUtleSkgOiAtMTtcbiAgcmV0dXJuIHJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgaWYgKGkgPT09IHNjb3JlSWR4IHx8ICFuYW1lKSByZXR1cm47XG4gICAgICBmaWVsZHNbbmFtZV0gPSByb3dbaV07XG4gICAgfSk7XG4gICAgY29uc3Qgc2NvcmVSYXcgPSBzY29yZUlkeCA+PSAwID8gTnVtYmVyKHJvd1tzY29yZUlkeF0pIDogTmFOO1xuICAgIGNvbnN0IGlkUmF3ID1cbiAgICAgIGtleUlkeCA+PSAwID8gcm93W2tleUlkeF0gOiBwcmltYXJ5S2V5ID8gZmllbGRzW3ByaW1hcnlLZXldIDogKHJvd1swXSA/PyByb3dJbmRleCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBTdHJpbmcoaWRSYXcgPz8gcm93SW5kZXgpLFxuICAgICAgc2NvcmU6IE51bWJlci5pc0Zpbml0ZShzY29yZVJhdykgPyBzY29yZVJhdyA6IDAsXG4gICAgICBmaWVsZHMsXG4gICAgICAuLi4oaW5kZXhOYW1lID8geyBpbmRleDogaW5kZXhOYW1lIH0gOiB7fSksXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIGNvbHVtbnMgdG8gcmVxdWVzdCBmcm9tIGFuIGluZGV4IGZvciBhIHNlYXJjaC4gV2hlbiBuZWl0aGVyIHRoZSByZXF1ZXN0XG4gKiBub3IgdGhlIGluZGV4IGNvbmZpZyBuYW1lcyBjb2x1bW5zLCB0aGUgc2NvcmUgY29sdW1uIGFsb25lIGlzIHJlcXVlc3RlZCBhbmRcbiAqIHRoZSBwcmltYXJ5IGtleSBpcyBhcHBlbmRlZCBzbyBhIGhpdCBhbHdheXMgaGFzIGFuIGlkLiBDYWxsZXJzIHRoYXQgd2FudCB0aGVcbiAqIHdob2xlIGRvY3VtZW50IHNob3VsZCBwYXNzIHRoZSBpbmRleCdzIG93biBjb2x1bW4gbGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUmVxdWVzdENvbHVtbnMoXG4gIHJlcXVlc3RlZDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgcHJpbWFyeUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBiYXNlID0gcmVxdWVzdGVkICYmIHJlcXVlc3RlZC5sZW5ndGggPiAwID8gcmVxdWVzdGVkIDogKGZhbGxiYWNrID8/IFtdKTtcbiAgY29uc3QgY29sdW1ucyA9IG5ldyBTZXQ8c3RyaW5nPihiYXNlKTtcbiAgaWYgKHByaW1hcnlLZXkpIGNvbHVtbnMuYWRkKHByaW1hcnlLZXkpO1xuICBpZiAoY29sdW1ucy5zaXplID09PSAwICYmIHByaW1hcnlLZXkpIGNvbHVtbnMuYWRkKHByaW1hcnlLZXkpO1xuICByZXR1cm4gWy4uLmNvbHVtbnNdO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgSlNPTiBkb2N1bWVudCBwYXlsb2FkIHRoZSBtb2RlbCAvIGEgcm91dGUgc3VwcGxpZWQgZm9yIGEgd3JpdGUuXG4gKiBBY2NlcHRzIGFuIGFscmVhZHktcGFyc2VkIGFycmF5L29iamVjdCBvciBhIEpTT04gc3RyaW5nLCBhbmQgYWx3YXlzIHJldHVybnNcbiAqIGFuIGFycmF5IHNvIGEgc2luZ2xlIGRvY3VtZW50IGFuZCBhIGJhdGNoIGFyZSBoYW5kbGVkIHRoZSBzYW1lIHdheS4gVGhyb3dzIGFcbiAqIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG9uIHVucGFyc2VhYmxlIGlucHV0IHNvIHRoZSBjYWxsZXIgY2FuIHN1cmZhY2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RvY3VtZW50QXJyYXkoaW5wdXQ6IHVua25vd24pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IGpzb24ucGFyc2UoaW5wdXQsIHVuZGVmaW5lZCkgOiBpbnB1dDtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiZG9jdW1lbnRzIG11c3QgYmUgYSBKU09OIG9iamVjdCwgYXJyYXksIG9yIHN0cmluZ1wiKTtcbiAgfVxuICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIHJldHVybiBsaXN0LmZpbHRlcihvYmplY3QuaXNSZWNvcmQpO1xufVxuIl19
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The shared AI Search runtime: the resolved config plus a single
3
+ * {@link SearchClient} instance the plugin, the Mastra tools, and the routes
4
+ * all read. Mirrors the web-search / email runtime pattern - the plugin primes
5
+ * it from its config at setup, and everything else reads the same instance so
6
+ * a tool invoked outside the agent still sees the deployment's config.
7
+ *
8
+ * @module
9
+ */
10
+ import { SearchClient } from "./client.ts";
11
+ import { type SearchPluginConfig, type ResolvedSearchConfig } from "./config.ts";
12
+ import { LakebaseSearchBackend } from "./lakebase.ts";
13
+ /**
14
+ * How the runtime is built. `lakebase` (when present) is the Postgres full-text
15
+ * FALLBACK backend the plugin wires up when no Vector Search endpoint is
16
+ * configured but the AppKit `lakebase` plugin is registered. Every read/write
17
+ * returns the same shape either way.
18
+ */
19
+ export interface SearchRuntimeOptions {
20
+ config?: SearchPluginConfig;
21
+ lakebase?: LakebaseSearchBackend;
22
+ }
23
+ /** The shared resolved config plus the client reads run through. */
24
+ export interface SearchRuntime {
25
+ config: ResolvedSearchConfig;
26
+ client: SearchClient;
27
+ /** The Lakebase fallback backend, when the runtime is backed by Postgres. */
28
+ lakebase?: LakebaseSearchBackend;
29
+ }
30
+ /**
31
+ * Return the shared runtime, building it on first use from the supplied config
32
+ * layered over environment defaults. Overrides are only read when the runtime
33
+ * is first created, so prime it from the plugin's config at setup; subsequent
34
+ * calls pass nothing and get the same instance.
35
+ */
36
+ export declare function getSearchRuntime(options?: SearchRuntimeOptions): SearchRuntime;
37
+ /** Drop the memoized runtime so the next {@link getSearchRuntime} rebuilds it. */
38
+ export declare function resetSearchRuntime(): void;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The shared AI Search runtime: the resolved config plus a single
3
+ * {@link SearchClient} instance the plugin, the Mastra tools, and the routes
4
+ * all read. Mirrors the web-search / email runtime pattern - the plugin primes
5
+ * it from its config at setup, and everything else reads the same instance so
6
+ * a tool invoked outside the agent still sees the deployment's config.
7
+ *
8
+ * @module
9
+ */
10
+ import { createSearchClient } from "./client.js";
11
+ import { resolveSearchConfig, } from "./config.js";
12
+ let runtime;
13
+ /**
14
+ * Return the shared runtime, building it on first use from the supplied config
15
+ * layered over environment defaults. Overrides are only read when the runtime
16
+ * is first created, so prime it from the plugin's config at setup; subsequent
17
+ * calls pass nothing and get the same instance.
18
+ */
19
+ export function getSearchRuntime(options) {
20
+ if (!runtime) {
21
+ const config = resolveSearchConfig(options?.config);
22
+ const lakebase = options?.lakebase;
23
+ runtime = {
24
+ config,
25
+ client: createSearchClient(config, undefined, lakebase),
26
+ ...(lakebase ? { lakebase } : {}),
27
+ };
28
+ }
29
+ return runtime;
30
+ }
31
+ /** Drop the memoized runtime so the next {@link getSearchRuntime} rebuilds it. */
32
+ export function resetSearchRuntime() {
33
+ const backend = runtime?.lakebase;
34
+ runtime = undefined;
35
+ if (backend)
36
+ void backend.close();
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFnQixNQUFNLGFBQWEsQ0FBQztBQUMvRCxPQUFPLEVBQ0wsbUJBQW1CLEdBR3BCLE1BQU0sYUFBYSxDQUFDO0FBc0JyQixJQUFJLE9BQWtDLENBQUM7QUFFdkM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsT0FBOEI7SUFDN0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxRQUFRLENBQUM7UUFDbkMsT0FBTyxHQUFHO1lBQ1IsTUFBTTtZQUNOLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQztZQUN2RCxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDbEMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQztJQUNsQyxPQUFPLEdBQUcsU0FBUyxDQUFDO0lBQ3BCLElBQUksT0FBTztRQUFFLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBzaGFyZWQgQUkgU2VhcmNoIHJ1bnRpbWU6IHRoZSByZXNvbHZlZCBjb25maWcgcGx1cyBhIHNpbmdsZVxuICoge0BsaW5rIFNlYXJjaENsaWVudH0gaW5zdGFuY2UgdGhlIHBsdWdpbiwgdGhlIE1hc3RyYSB0b29scywgYW5kIHRoZSByb3V0ZXNcbiAqIGFsbCByZWFkLiBNaXJyb3JzIHRoZSB3ZWItc2VhcmNoIC8gZW1haWwgcnVudGltZSBwYXR0ZXJuIC0gdGhlIHBsdWdpbiBwcmltZXNcbiAqIGl0IGZyb20gaXRzIGNvbmZpZyBhdCBzZXR1cCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSByZWFkcyB0aGUgc2FtZSBpbnN0YW5jZSBzb1xuICogYSB0b29sIGludm9rZWQgb3V0c2lkZSB0aGUgYWdlbnQgc3RpbGwgc2VlcyB0aGUgZGVwbG95bWVudCdzIGNvbmZpZy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlU2VhcmNoQ2xpZW50LCBTZWFyY2hDbGllbnQgfSBmcm9tIFwiLi9jbGllbnQudHNcIjtcbmltcG9ydCB7XG4gIHJlc29sdmVTZWFyY2hDb25maWcsXG4gIHR5cGUgU2VhcmNoUGx1Z2luQ29uZmlnLFxuICB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IExha2ViYXNlU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL2xha2ViYXNlLnRzXCI7XG5cbi8qKlxuICogSG93IHRoZSBydW50aW1lIGlzIGJ1aWx0LiBgbGFrZWJhc2VgICh3aGVuIHByZXNlbnQpIGlzIHRoZSBQb3N0Z3JlcyBmdWxsLXRleHRcbiAqIEZBTExCQUNLIGJhY2tlbmQgdGhlIHBsdWdpbiB3aXJlcyB1cCB3aGVuIG5vIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgaXNcbiAqIGNvbmZpZ3VyZWQgYnV0IHRoZSBBcHBLaXQgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC4gRXZlcnkgcmVhZC93cml0ZVxuICogcmV0dXJucyB0aGUgc2FtZSBzaGFwZSBlaXRoZXIgd2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJ1bnRpbWVPcHRpb25zIHtcbiAgY29uZmlnPzogU2VhcmNoUGx1Z2luQ29uZmlnO1xuICBsYWtlYmFzZT86IExha2ViYXNlU2VhcmNoQmFja2VuZDtcbn1cblxuLyoqIFRoZSBzaGFyZWQgcmVzb2x2ZWQgY29uZmlnIHBsdXMgdGhlIGNsaWVudCByZWFkcyBydW4gdGhyb3VnaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUnVudGltZSB7XG4gIGNvbmZpZzogUmVzb2x2ZWRTZWFyY2hDb25maWc7XG4gIGNsaWVudDogU2VhcmNoQ2xpZW50O1xuICAvKiogVGhlIExha2ViYXNlIGZhbGxiYWNrIGJhY2tlbmQsIHdoZW4gdGhlIHJ1bnRpbWUgaXMgYmFja2VkIGJ5IFBvc3RncmVzLiAqL1xuICBsYWtlYmFzZT86IExha2ViYXNlU2VhcmNoQmFja2VuZDtcbn1cblxubGV0IHJ1bnRpbWU6IFNlYXJjaFJ1bnRpbWUgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzaGFyZWQgcnVudGltZSwgYnVpbGRpbmcgaXQgb24gZmlyc3QgdXNlIGZyb20gdGhlIHN1cHBsaWVkIGNvbmZpZ1xuICogbGF5ZXJlZCBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzLiBPdmVycmlkZXMgYXJlIG9ubHkgcmVhZCB3aGVuIHRoZSBydW50aW1lXG4gKiBpcyBmaXJzdCBjcmVhdGVkLCBzbyBwcmltZSBpdCBmcm9tIHRoZSBwbHVnaW4ncyBjb25maWcgYXQgc2V0dXA7IHN1YnNlcXVlbnRcbiAqIGNhbGxzIHBhc3Mgbm90aGluZyBhbmQgZ2V0IHRoZSBzYW1lIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VhcmNoUnVudGltZShvcHRpb25zPzogU2VhcmNoUnVudGltZU9wdGlvbnMpOiBTZWFyY2hSdW50aW1lIHtcbiAgaWYgKCFydW50aW1lKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVzb2x2ZVNlYXJjaENvbmZpZyhvcHRpb25zPy5jb25maWcpO1xuICAgIGNvbnN0IGxha2ViYXNlID0gb3B0aW9ucz8ubGFrZWJhc2U7XG4gICAgcnVudGltZSA9IHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNsaWVudDogY3JlYXRlU2VhcmNoQ2xpZW50KGNvbmZpZywgdW5kZWZpbmVkLCBsYWtlYmFzZSksXG4gICAgICAuLi4obGFrZWJhc2UgPyB7IGxha2ViYXNlIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcnVudGltZTtcbn1cblxuLyoqIERyb3AgdGhlIG1lbW9pemVkIHJ1bnRpbWUgc28gdGhlIG5leHQge0BsaW5rIGdldFNlYXJjaFJ1bnRpbWV9IHJlYnVpbGRzIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0U2VhcmNoUnVudGltZSgpOiB2b2lkIHtcbiAgY29uc3QgYmFja2VuZCA9IHJ1bnRpbWU/Lmxha2ViYXNlO1xuICBydW50aW1lID0gdW5kZWZpbmVkO1xuICBpZiAoYmFja2VuZCkgdm9pZCBiYWNrZW5kLmNsb3NlKCk7XG59XG4iXX0=
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Tool-facing descriptions and the request schemas the Mastra tools + AppKit
3
+ * tool provider validate against. The wire shapes themselves live in
4
+ * `@dbx-tools/shared-search`; this module adds the model-readable
5
+ * descriptions so both hosts describe the tools identically.
6
+ *
7
+ * @module
8
+ */
9
+ /** Description the model reads for the `search` tool. */
10
+ export declare const SEARCH_TOOL_DESCRIPTION: string;
11
+ /** Description the model reads for the `universal_search` tool. */
12
+ export declare const UNIVERSAL_SEARCH_TOOL_DESCRIPTION: string;
13
+ /** Description the model reads for the `add_documents` tool. */
14
+ export declare const ADD_DOCUMENTS_TOOL_DESCRIPTION: string;
15
+ /** Description the model reads for the `create_index` tool. */
16
+ export declare const CREATE_INDEX_TOOL_DESCRIPTION: string;
17
+ /** Description the model reads for the `sync_index` tool. */
18
+ export declare const SYNC_INDEX_TOOL_DESCRIPTION: string;
19
+ /** Schema for the `search` tool input (the shared request schema). */
20
+ export declare const searchToolSchema: import("zod").ZodObject<{
21
+ query: import("zod").ZodString;
22
+ index: import("zod").ZodOptional<import("zod").ZodString>;
23
+ limit: import("zod").ZodOptional<import("zod").ZodNumber>;
24
+ mode: import("zod").ZodOptional<import("zod").ZodEnum<{
25
+ hybrid: "hybrid";
26
+ vector: "vector";
27
+ keyword: "keyword";
28
+ }>>;
29
+ columns: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
30
+ filter: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
31
+ scoreThreshold: import("zod").ZodOptional<import("zod").ZodNumber>;
32
+ }, import("zod/v4/core").$strip>;
33
+ /** Schema for the `universal_search` tool input. */
34
+ export declare const universalSearchToolSchema: import("zod").ZodObject<{
35
+ query: import("zod").ZodString;
36
+ indexes: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
37
+ limit: import("zod").ZodOptional<import("zod").ZodNumber>;
38
+ mode: import("zod").ZodOptional<import("zod").ZodEnum<{
39
+ hybrid: "hybrid";
40
+ vector: "vector";
41
+ keyword: "keyword";
42
+ }>>;
43
+ }, import("zod/v4/core").$strip>;
44
+ /** Schema for the `search` / `universal_search` tool output. */
45
+ export declare const searchResultSchema: import("zod").ZodObject<{
46
+ query: import("zod").ZodString;
47
+ hits: import("zod").ZodArray<import("zod").ZodObject<{
48
+ id: import("zod").ZodString;
49
+ score: import("zod").ZodNumber;
50
+ fields: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
51
+ index: import("zod").ZodOptional<import("zod").ZodString>;
52
+ }, import("zod/v4/core").$strip>>;
53
+ index: import("zod").ZodOptional<import("zod").ZodString>;
54
+ count: import("zod").ZodNumber;
55
+ }, import("zod/v4/core").$strip>;
56
+ /** Schema for the `create_index` tool input. */
57
+ export declare const createIndexToolSchema: import("zod").ZodObject<{
58
+ name: import("zod").ZodString;
59
+ sourceTable: import("zod").ZodOptional<import("zod").ZodString>;
60
+ primaryKey: import("zod").ZodOptional<import("zod").ZodString>;
61
+ embeddingSourceColumn: import("zod").ZodOptional<import("zod").ZodString>;
62
+ embeddingModel: import("zod").ZodOptional<import("zod").ZodString>;
63
+ endpoint: import("zod").ZodOptional<import("zod").ZodString>;
64
+ embeddingDimension: import("zod").ZodOptional<import("zod").ZodNumber>;
65
+ pipelineType: import("zod").ZodOptional<import("zod").ZodEnum<{
66
+ TRIGGERED: "TRIGGERED";
67
+ CONTINUOUS: "CONTINUOUS";
68
+ }>>;
69
+ columnsToSync: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
70
+ }, import("zod/v4/core").$strip>;
71
+ /** Schema for the `create_index` tool output (a resolved index definition). */
72
+ export declare const indexInfoSchema: import("zod").ZodObject<{
73
+ name: import("zod").ZodString;
74
+ endpoint: import("zod").ZodOptional<import("zod").ZodString>;
75
+ primaryKey: import("zod").ZodOptional<import("zod").ZodString>;
76
+ columns: import("zod").ZodArray<import("zod").ZodString>;
77
+ ready: import("zod").ZodBoolean;
78
+ rowCount: import("zod").ZodOptional<import("zod").ZodNumber>;
79
+ }, import("zod/v4/core").$strip>;
80
+ /** Schema for the `sync_index` tool input. */
81
+ export declare const syncIndexToolSchema: import("zod").ZodObject<{
82
+ index: import("zod").ZodOptional<import("zod").ZodString>;
83
+ }, import("zod/v4/core").$strip>;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Tool-facing descriptions and the request schemas the Mastra tools + AppKit
3
+ * tool provider validate against. The wire shapes themselves live in
4
+ * `@dbx-tools/shared-search`; this module adds the model-readable
5
+ * descriptions so both hosts describe the tools identically.
6
+ *
7
+ * @module
8
+ */
9
+ import { search } from "@dbx-tools/shared-search";
10
+ import { string } from "@dbx-tools/shared-core";
11
+ /** Description the model reads for the `search` tool. */
12
+ export const SEARCH_TOOL_DESCRIPTION = string.toDescription(`
13
+ Search a Databricks AI Search (Vector Search) index for the documents most
14
+ relevant to a query. Pass a natural-language question or keywords; hybrid
15
+ matching combines semantic similarity with keyword ranking, so exact terms
16
+ (product names, error codes) and paraphrases both work. Optionally name an
17
+ index (defaults to the app's configured index), a result limit, and attribute
18
+ filters. Use it to look up docs, knowledge-base articles, products, or any
19
+ indexed content before answering.
20
+ `);
21
+ /** Description the model reads for the `universal_search` tool. */
22
+ export const UNIVERSAL_SEARCH_TOOL_DESCRIPTION = string.toDescription(`
23
+ Search across every configured AI Search index at once and return the best
24
+ matches from all of them, merged and ranked. Use it when the right index
25
+ isn't known in advance or when an answer may live in any of several
26
+ collections (docs, tickets, products).
27
+ `);
28
+ /** Description the model reads for the `add_documents` tool. */
29
+ export const ADD_DOCUMENTS_TOOL_DESCRIPTION = string.toDescription(`
30
+ Add or update documents in a direct-access AI Search index. Pass an array of
31
+ documents as JSON objects; each MUST include the index's primary-key column.
32
+ Only available when the app enables the write surface. Use it to index new
33
+ content the user provides.
34
+ `);
35
+ /** Description the model reads for the `create_index` tool. */
36
+ export const CREATE_INDEX_TOOL_DESCRIPTION = string.toDescription(`
37
+ Create a Databricks AI Search (Vector Search) index. For the common case pass
38
+ a Delta source table (catalog.schema.table): Databricks computes embeddings
39
+ from its text column and keeps the index synced. To create a direct-access
40
+ index you write vectors to yourself, pass an embedding dimension instead of a
41
+ source table. The endpoint, embedding model, primary key, and text column are
42
+ inferred when omitted. Only available when the app enables the write surface.
43
+ Creating an index provisions infrastructure - do this only when the user
44
+ explicitly asks to set up a new index.
45
+ `);
46
+ /** Description the model reads for the `sync_index` tool. */
47
+ export const SYNC_INDEX_TOOL_DESCRIPTION = string.toDescription(`
48
+ Refresh a Delta Sync AI Search index from its source table so newly added or
49
+ changed rows become searchable. Optionally name the index (defaults to the
50
+ app's default index). Only available when the app enables the write surface.
51
+ `);
52
+ /** Schema for the `search` tool input (the shared request schema). */
53
+ export const searchToolSchema = search.searchRequestSchema;
54
+ /** Schema for the `universal_search` tool input. */
55
+ export const universalSearchToolSchema = search.universalSearchRequestSchema;
56
+ /** Schema for the `search` / `universal_search` tool output. */
57
+ export const searchResultSchema = search.searchResultSchema;
58
+ /** Schema for the `create_index` tool input. */
59
+ export const createIndexToolSchema = search.createIndexRequestSchema;
60
+ /** Schema for the `create_index` tool output (a resolved index definition). */
61
+ export const indexInfoSchema = search.indexInfoSchema;
62
+ /** Schema for the `sync_index` tool input. */
63
+ export const syncIndexToolSchema = search.syncIndexRequestSchema;
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7Q0FRM0QsQ0FBQyxDQUFDO0FBRUgsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7Ozs7O0NBS3JFLENBQUMsQ0FBQztBQUVILGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOzs7OztDQUtsRSxDQUFDLENBQUM7QUFFSCwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7O0NBU2pFLENBQUMsQ0FBQztBQUVILDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOzs7O0NBSS9ELENBQUMsQ0FBQztBQUVILHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUM7QUFFM0Qsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQztBQUU3RSxnRUFBZ0U7QUFDaEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0FBRTVELGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUM7QUFFckUsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO0FBRXRELDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvb2wtZmFjaW5nIGRlc2NyaXB0aW9ucyBhbmQgdGhlIHJlcXVlc3Qgc2NoZW1hcyB0aGUgTWFzdHJhIHRvb2xzICsgQXBwS2l0XG4gKiB0b29sIHByb3ZpZGVyIHZhbGlkYXRlIGFnYWluc3QuIFRoZSB3aXJlIHNoYXBlcyB0aGVtc2VsdmVzIGxpdmUgaW5cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgOyB0aGlzIG1vZHVsZSBhZGRzIHRoZSBtb2RlbC1yZWFkYWJsZVxuICogZGVzY3JpcHRpb25zIHNvIGJvdGggaG9zdHMgZGVzY3JpYmUgdGhlIHRvb2xzIGlkZW50aWNhbGx5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzZWFyY2ggfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHNlYXJjaGAgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTiA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgU2VhcmNoIGEgRGF0YWJyaWNrcyBBSSBTZWFyY2ggKFZlY3RvciBTZWFyY2gpIGluZGV4IGZvciB0aGUgZG9jdW1lbnRzIG1vc3RcbiAgcmVsZXZhbnQgdG8gYSBxdWVyeS4gUGFzcyBhIG5hdHVyYWwtbGFuZ3VhZ2UgcXVlc3Rpb24gb3Iga2V5d29yZHM7IGh5YnJpZFxuICBtYXRjaGluZyBjb21iaW5lcyBzZW1hbnRpYyBzaW1pbGFyaXR5IHdpdGgga2V5d29yZCByYW5raW5nLCBzbyBleGFjdCB0ZXJtc1xuICAocHJvZHVjdCBuYW1lcywgZXJyb3IgY29kZXMpIGFuZCBwYXJhcGhyYXNlcyBib3RoIHdvcmsuIE9wdGlvbmFsbHkgbmFtZSBhblxuICBpbmRleCAoZGVmYXVsdHMgdG8gdGhlIGFwcCdzIGNvbmZpZ3VyZWQgaW5kZXgpLCBhIHJlc3VsdCBsaW1pdCwgYW5kIGF0dHJpYnV0ZVxuICBmaWx0ZXJzLiBVc2UgaXQgdG8gbG9vayB1cCBkb2NzLCBrbm93bGVkZ2UtYmFzZSBhcnRpY2xlcywgcHJvZHVjdHMsIG9yIGFueVxuICBpbmRleGVkIGNvbnRlbnQgYmVmb3JlIGFuc3dlcmluZy5cbmApO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wuICovXG5leHBvcnQgY29uc3QgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICBTZWFyY2ggYWNyb3NzIGV2ZXJ5IGNvbmZpZ3VyZWQgQUkgU2VhcmNoIGluZGV4IGF0IG9uY2UgYW5kIHJldHVybiB0aGUgYmVzdFxuICBtYXRjaGVzIGZyb20gYWxsIG9mIHRoZW0sIG1lcmdlZCBhbmQgcmFua2VkLiBVc2UgaXQgd2hlbiB0aGUgcmlnaHQgaW5kZXhcbiAgaXNuJ3Qga25vd24gaW4gYWR2YW5jZSBvciB3aGVuIGFuIGFuc3dlciBtYXkgbGl2ZSBpbiBhbnkgb2Ygc2V2ZXJhbFxuICBjb2xsZWN0aW9ucyAoZG9jcywgdGlja2V0cywgcHJvZHVjdHMpLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgYWRkX2RvY3VtZW50c2AgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04gPSBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBBSSBTZWFyY2ggaW5kZXguIFBhc3MgYW4gYXJyYXkgb2ZcbiAgZG9jdW1lbnRzIGFzIEpTT04gb2JqZWN0czsgZWFjaCBNVVNUIGluY2x1ZGUgdGhlIGluZGV4J3MgcHJpbWFyeS1rZXkgY29sdW1uLlxuICBPbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSBhcHAgZW5hYmxlcyB0aGUgd3JpdGUgc3VyZmFjZS4gVXNlIGl0IHRvIGluZGV4IG5ld1xuICBjb250ZW50IHRoZSB1c2VyIHByb3ZpZGVzLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sLiAqL1xuZXhwb3J0IGNvbnN0IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICBDcmVhdGUgYSBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXguIEZvciB0aGUgY29tbW9uIGNhc2UgcGFzc1xuICBhIERlbHRhIHNvdXJjZSB0YWJsZSAoY2F0YWxvZy5zY2hlbWEudGFibGUpOiBEYXRhYnJpY2tzIGNvbXB1dGVzIGVtYmVkZGluZ3NcbiAgZnJvbSBpdHMgdGV4dCBjb2x1bW4gYW5kIGtlZXBzIHRoZSBpbmRleCBzeW5jZWQuIFRvIGNyZWF0ZSBhIGRpcmVjdC1hY2Nlc3NcbiAgaW5kZXggeW91IHdyaXRlIHZlY3RvcnMgdG8geW91cnNlbGYsIHBhc3MgYW4gZW1iZWRkaW5nIGRpbWVuc2lvbiBpbnN0ZWFkIG9mIGFcbiAgc291cmNlIHRhYmxlLiBUaGUgZW5kcG9pbnQsIGVtYmVkZGluZyBtb2RlbCwgcHJpbWFyeSBrZXksIGFuZCB0ZXh0IGNvbHVtbiBhcmVcbiAgaW5mZXJyZWQgd2hlbiBvbWl0dGVkLiBPbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSBhcHAgZW5hYmxlcyB0aGUgd3JpdGUgc3VyZmFjZS5cbiAgQ3JlYXRpbmcgYW4gaW5kZXggcHJvdmlzaW9ucyBpbmZyYXN0cnVjdHVyZSAtIGRvIHRoaXMgb25seSB3aGVuIHRoZSB1c2VyXG4gIGV4cGxpY2l0bHkgYXNrcyB0byBzZXQgdXAgYSBuZXcgaW5kZXguXG5gKTtcblxuLyoqIERlc2NyaXB0aW9uIHRoZSBtb2RlbCByZWFkcyBmb3IgdGhlIGBzeW5jX2luZGV4YCB0b29sLiAqL1xuZXhwb3J0IGNvbnN0IFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTiA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgUmVmcmVzaCBhIERlbHRhIFN5bmMgQUkgU2VhcmNoIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZSBzbyBuZXdseSBhZGRlZCBvclxuICBjaGFuZ2VkIHJvd3MgYmVjb21lIHNlYXJjaGFibGUuIE9wdGlvbmFsbHkgbmFtZSB0aGUgaW5kZXggKGRlZmF1bHRzIHRvIHRoZVxuICBhcHAncyBkZWZhdWx0IGluZGV4KS4gT25seSBhdmFpbGFibGUgd2hlbiB0aGUgYXBwIGVuYWJsZXMgdGhlIHdyaXRlIHN1cmZhY2UuXG5gKTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBzZWFyY2hgIHRvb2wgaW5wdXQgKHRoZSBzaGFyZWQgcmVxdWVzdCBzY2hlbWEpLiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaFRvb2xTY2hlbWEgPSBzZWFyY2guc2VhcmNoUmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGB1bml2ZXJzYWxfc2VhcmNoYCB0b29sIGlucHV0LiAqL1xuZXhwb3J0IGNvbnN0IHVuaXZlcnNhbFNlYXJjaFRvb2xTY2hlbWEgPSBzZWFyY2gudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wgb3V0cHV0LiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaFJlc3VsdFNjaGVtYSA9IHNlYXJjaC5zZWFyY2hSZXN1bHRTY2hlbWE7XG5cbi8qKiBTY2hlbWEgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sIGlucHV0LiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluZGV4VG9vbFNjaGVtYSA9IHNlYXJjaC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWE7XG5cbi8qKiBTY2hlbWEgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sIG91dHB1dCAoYSByZXNvbHZlZCBpbmRleCBkZWZpbml0aW9uKS4gKi9cbmV4cG9ydCBjb25zdCBpbmRleEluZm9TY2hlbWEgPSBzZWFyY2guaW5kZXhJbmZvU2NoZW1hO1xuXG4vKiogU2NoZW1hIGZvciB0aGUgYHN5bmNfaW5kZXhgIHRvb2wgaW5wdXQuICovXG5leHBvcnQgY29uc3Qgc3luY0luZGV4VG9vbFNjaGVtYSA9IHNlYXJjaC5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hO1xuIl19
@@ -0,0 +1,116 @@
1
+ /**
2
+ * The `search`, `universal_search`, and (opt-in) `add_documents`,
3
+ * `create_index`, and `sync_index` Mastra tools.
4
+ *
5
+ * All three read the shared runtime primed by the plugin, so a tool spread
6
+ * into an agent uses the deployment's default index, columns, page size, and
7
+ * mode without any per-tool wiring. They run under the caller's OBO scope (the
8
+ * client resolves the execution context's workspace client), so search runs as
9
+ * the requesting user and Unity Catalog ACLs apply.
10
+ *
11
+ * The same tools are exposed to AppKit's own agents through the plugin's
12
+ * `ToolProvider` (see `plugin.ts`); this module is the Mastra half.
13
+ *
14
+ * @module
15
+ */
16
+ /** Common option accepted by every tool factory: override the tool id. */
17
+ export interface SearchToolOptions {
18
+ /** Override the tool id (defaults per tool). */
19
+ id?: string;
20
+ }
21
+ /**
22
+ * Build the `search` tool. Spread it into any agent that should be able to look
23
+ * things up in an index.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { searchTool } from "@dbx-tools/search";
28
+ * import { createAgent } from "@dbx-tools/appkit-mastra";
29
+ *
30
+ * const support = createAgent({
31
+ * instructions: "Answer from the docs. Use `search` to find them.",
32
+ * tools: () => ({ search: searchTool() }),
33
+ * });
34
+ * ```
35
+ */
36
+ export declare function searchTool(options?: SearchToolOptions): import("@mastra/core/tools").Tool<{
37
+ query: string;
38
+ index?: string | undefined;
39
+ limit?: number | undefined;
40
+ mode?: "hybrid" | "vector" | "keyword" | undefined;
41
+ columns?: string[] | undefined;
42
+ filter?: Record<string, unknown> | undefined;
43
+ scoreThreshold?: number | undefined;
44
+ }, {
45
+ query: string;
46
+ hits: {
47
+ id: string;
48
+ score: number;
49
+ fields: Record<string, unknown>;
50
+ index?: string | undefined;
51
+ }[];
52
+ count: number;
53
+ index?: string | undefined;
54
+ }, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, string, unknown>;
55
+ /** Build the `universal_search` tool (federated search across every index). */
56
+ export declare function universalSearchTool(options?: SearchToolOptions): import("@mastra/core/tools").Tool<{
57
+ query: string;
58
+ indexes?: string[] | undefined;
59
+ limit?: number | undefined;
60
+ mode?: "hybrid" | "vector" | "keyword" | undefined;
61
+ }, {
62
+ query: string;
63
+ hits: {
64
+ id: string;
65
+ score: number;
66
+ fields: Record<string, unknown>;
67
+ index?: string | undefined;
68
+ }[];
69
+ count: number;
70
+ index?: string | undefined;
71
+ }, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, string, unknown>;
72
+ /**
73
+ * Build the opt-in `add_documents` tool (write into a direct-access index).
74
+ * Only install it when the plugin's write surface is enabled.
75
+ */
76
+ export declare function addDocumentsTool(options?: SearchToolOptions): import("@mastra/core/tools").Tool<{
77
+ documents: Record<string, unknown>[];
78
+ index?: string | undefined;
79
+ }, {
80
+ index: string;
81
+ count: number;
82
+ }, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, string, unknown>;
83
+ /**
84
+ * Build the opt-in `create_index` tool (provision a Vector Search index).
85
+ * Only install it when the plugin's write surface is enabled. Delegates to
86
+ * {@link SearchClient.createIndex}, inferring the endpoint, embedding model,
87
+ * key, and columns from the request + plugin config.
88
+ */
89
+ export declare function createIndexTool(options?: SearchToolOptions): import("@mastra/core/tools").Tool<{
90
+ name: string;
91
+ sourceTable?: string | undefined;
92
+ primaryKey?: string | undefined;
93
+ embeddingSourceColumn?: string | undefined;
94
+ embeddingModel?: string | undefined;
95
+ endpoint?: string | undefined;
96
+ embeddingDimension?: number | undefined;
97
+ pipelineType?: "TRIGGERED" | "CONTINUOUS" | undefined;
98
+ columnsToSync?: string[] | undefined;
99
+ }, {
100
+ name: string;
101
+ columns: string[];
102
+ ready: boolean;
103
+ endpoint?: string | undefined;
104
+ primaryKey?: string | undefined;
105
+ rowCount?: number | undefined;
106
+ }, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, string, unknown>;
107
+ /**
108
+ * Build the opt-in `sync_index` tool (refresh a Delta Sync index from its
109
+ * source table). Only install it when the plugin's write surface is enabled.
110
+ */
111
+ export declare function syncIndexTool(options?: SearchToolOptions): import("@mastra/core/tools").Tool<{
112
+ index?: string | undefined;
113
+ }, {
114
+ index: string;
115
+ synced: boolean;
116
+ }, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, string, unknown>;