diff --git a/knip.json b/knip.json index e42dd21c6..3cec36a06 100644 --- a/knip.json +++ b/knip.json @@ -16,6 +16,8 @@ "@databricks/sdk-files", "@databricks/sdk-genie", "@databricks/sdk-jobs", + "@databricks/sdk-uc-tables", + "@databricks/sdk-vectorsearch", "@databricks/sdk-options", "@databricks/sdk-scim", "@databricks/sdk-statementexecution", diff --git a/packages/appkit/package.json b/packages/appkit/package.json index fd0165dfc..243527830 100644 --- a/packages/appkit/package.json +++ b/packages/appkit/package.json @@ -77,6 +77,8 @@ "@databricks/sdk-files": "0.52.0", "@databricks/sdk-genie": "0.54.0", "@databricks/sdk-jobs": "0.57.0", + "@databricks/sdk-uc-tables": "0.52.0", + "@databricks/sdk-vectorsearch": "0.51.0", "@databricks/sdk-options": "0.51.0", "@databricks/sdk-scim": "0.51.0", "@databricks/sdk-statementexecution": "0.52.0", diff --git a/packages/appkit/src/connectors/ai-search/client.ts b/packages/appkit/src/connectors/ai-search/client.ts index f4ed44b15..4f49f6064 100644 --- a/packages/appkit/src/connectors/ai-search/client.ts +++ b/packages/appkit/src/connectors/ai-search/client.ts @@ -7,10 +7,8 @@ import { TelemetryManager, } from "../../telemetry"; import type { WorkspaceClient } from "../../workspace-client"; -import { contextFromAbortSignal } from "../context"; import type { AiSearchConnectorConfig, - UcTableInfo, VsIndexInfo, VsNextPageParams, VsQueryParams, @@ -19,6 +17,28 @@ import type { const logger = createLogger("connectors:ai-search"); +/** + * POST through the raw `request()` seam, not the typed `VectorSearchClient`: + * its generated model has no `debug_level` (request) or `debug_info` (response), + * so unmarshal would strip the timings the plugin reports, and its reranker + * shape differs. Raw JSON keeps the exact wire shape `VsRawResponse` describes. + */ +async function postJson( + workspaceClient: WorkspaceClient, + path: string, + body: unknown, + signal?: AbortSignal, +): Promise { + const res = await workspaceClient.request({ + method: "POST", + path, + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + signal, + }); + return (await res.json()) as T; +} + export class AiSearchConnector { private readonly telemetry: TelemetryProvider; @@ -83,17 +103,12 @@ export class AiSearchConnector { async (span: Span) => { const startTime = Date.now(); try { - const response = (await workspaceClient.apiClient.request( - { - method: "POST", - path: `/api/2.0/vector-search/indexes/${params.indexName}/query`, - payload: body, - headers: new Headers({ "Content-Type": "application/json" }), - raw: false, - query: {}, - }, - contextFromAbortSignal(signal), - )) as VsRawResponse; + const response = await postJson( + workspaceClient, + `/api/2.0/vector-search/indexes/${params.indexName}/query`, + body, + signal, + ); const duration = Date.now() - startTime; span.setAttribute("vs.result_count", response.result.row_count); @@ -153,20 +168,15 @@ export class AiSearchConnector { }, async (span: Span) => { try { - const response = (await workspaceClient.apiClient.request( + const response = await postJson( + workspaceClient, + `/api/2.0/vector-search/indexes/${params.indexName}/query-next-page`, { - method: "POST", - path: `/api/2.0/vector-search/indexes/${params.indexName}/query-next-page`, - payload: { - endpoint_name: params.endpointName, - page_token: params.pageToken, - }, - headers: new Headers({ "Content-Type": "application/json" }), - raw: false, - query: {}, + endpoint_name: params.endpointName, + page_token: params.pageToken, }, - contextFromAbortSignal(signal), - )) as VsRawResponse; + signal, + ); span.setAttribute("vs.result_count", response.result.row_count); span.setStatus({ code: SpanStatusCode.OK }); @@ -193,16 +203,24 @@ export class AiSearchConnector { indexName: string, signal?: AbortSignal, ): Promise { - return (await workspaceClient.apiClient.request( - { - method: "GET", - path: `/api/2.0/vector-search/indexes/${indexName}`, - headers: new Headers({ "Content-Type": "application/json" }), - raw: false, - query: {}, + const index = await workspaceClient.vectorSearch.getVectorIndex( + { name: indexName }, + { signal }, + ); + // Map the camelCase model back to the snake_case `VsIndexInfo` callers read. + const spec = + index.indexSpec?.$case === "deltaSyncIndexSpec" + ? index.indexSpec.deltaSyncIndexSpec + : undefined; + return { + index_type: index.indexType as VsIndexInfo["index_type"], + delta_sync_index_spec: spec && { + source_table: spec.sourceTable, + embedding_vector_columns: spec.embeddingVectorColumns?.map((c) => ({ + name: c.name ?? "", + })), }, - contextFromAbortSignal(signal), - )) as VsIndexInfo; + }; } /** @@ -214,16 +232,10 @@ export class AiSearchConnector { sourceTable: string, signal?: AbortSignal, ): Promise { - const table = (await workspaceClient.apiClient.request( - { - method: "GET", - path: `/api/2.1/unity-catalog/tables/${sourceTable}`, - headers: new Headers({ "Content-Type": "application/json" }), - raw: false, - query: {}, - }, - contextFromAbortSignal(signal), - )) as UcTableInfo; - return (table.columns ?? []).map((c) => c.name); + const table = await workspaceClient.tables.getTable( + { fullNameArg: sourceTable }, + { signal }, + ); + return (table.columns ?? []).flatMap((c) => (c.name ? [c.name] : [])); } } diff --git a/packages/appkit/src/connectors/ai-search/types.ts b/packages/appkit/src/connectors/ai-search/types.ts index 0d3e175b2..f87fefafb 100644 --- a/packages/appkit/src/connectors/ai-search/types.ts +++ b/packages/appkit/src/connectors/ai-search/types.ts @@ -31,11 +31,6 @@ export interface VsIndexInfo { }; } -/** Subset of the Unity Catalog get-table response used for column discovery. */ -export interface UcTableInfo { - columns?: Array<{ name: string }>; -} - export interface VsRawResponse { manifest: { column_count: number; diff --git a/packages/appkit/src/plugins/ai-search/tests/ai-search.test.ts b/packages/appkit/src/plugins/ai-search/tests/ai-search.test.ts index f9277932f..b6a2307a0 100644 --- a/packages/appkit/src/plugins/ai-search/tests/ai-search.test.ts +++ b/packages/appkit/src/plugins/ai-search/tests/ai-search.test.ts @@ -7,7 +7,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { withEnv } from "../../../testing"; import { useTestCache } from "../../../testing/test-cache"; -import { Context } from "../../../workspace-client"; vi.mock("../../../context", () => ({ getWorkspaceClient: vi.fn(() => mockWorkspaceClient), @@ -119,17 +118,28 @@ const validVsResponse = { debug_info: { response_time: 35 }, }; +// Records each raw `WorkspaceRequest`; resolves to the JSON body the facade's +// `request()` would return as a `Response`. const mockRequest = vi.fn().mockResolvedValue(validVsResponse); +const mockGetVectorIndex = vi.fn(); +const mockGetTable = vi.fn(); const mockWorkspaceClient = { - apiClient: { request: mockRequest }, + request: async (req: unknown) => Response.json(await mockRequest(req)), + vectorSearch: { getVectorIndex: mockGetVectorIndex }, + tables: { getTable: mockGetTable }, }; +/** JSON body of the n-th raw request sent through `request()`. */ +const bodyOf = (n = 0) => JSON.parse(mockRequest.mock.calls[n][0].body); + import { AiSearchPlugin } from "../ai-search"; describe("AiSearchPlugin", () => { beforeEach(() => { mockRequest.mockClear(); mockRequest.mockResolvedValue(validVsResponse); + mockGetVectorIndex.mockReset(); + mockGetTable.mockReset(); }); describe("setup()", () => { @@ -218,25 +228,22 @@ describe("AiSearchPlugin", () => { describe("setup() column auto-discovery", () => { const originalNodeEnv = process.env.NODE_ENV; - // Route GET metadata calls to discovery fixtures; POST queries stay on the - // default validVsResponse. - const routeByPath = (opts: { method: string; path: string }) => { - if (opts.path.endsWith("/query")) return Promise.resolve(validVsResponse); - if (opts.path.startsWith("/api/2.0/vector-search/indexes/")) { - return Promise.resolve({ - index_type: "DELTA_SYNC", - delta_sync_index_spec: { - source_table: "cat.sch.src", - embedding_vector_columns: [{ name: "__vec" }], + // Discovery goes through the typed modular clients (camelCase models); + // queries stay on the raw `request()` mock and its default validVsResponse. + const mockDiscovery = () => { + mockGetVectorIndex.mockResolvedValue({ + indexType: "DELTA_SYNC", + indexSpec: { + $case: "deltaSyncIndexSpec", + deltaSyncIndexSpec: { + sourceTable: "cat.sch.src", + embeddingVectorColumns: [{ name: "__vec" }], }, - }); - } - if (opts.path.startsWith("/api/2.1/unity-catalog/tables/")) { - return Promise.resolve({ - columns: [{ name: "id" }, { name: "body" }, { name: "__vec" }], - }); - } - return Promise.resolve(validVsResponse); + }, + }); + mockGetTable.mockResolvedValue({ + columns: [{ name: "id" }, { name: "body" }, { name: "__vec" }], + }); }; afterEach(() => { @@ -245,7 +252,7 @@ describe("AiSearchPlugin", () => { it("fills columns from the source table in development and warns", async () => { process.env.NODE_ENV = "development"; - mockRequest.mockImplementation(routeByPath); + mockDiscovery(); const plugin = new AiSearchPlugin({ indexes: { docs: { indexName: "cat.sch.idx" } }, }); @@ -254,15 +261,20 @@ describe("AiSearchPlugin", () => { // Discovered columns, minus the embedding vector column. await plugin.query("docs", { queryText: "q" }); - const queryCall = mockRequest.mock.calls.find((c) => - c[0].path.endsWith("/query"), + expect(mockGetVectorIndex).toHaveBeenCalledWith( + { name: "cat.sch.idx" }, + expect.anything(), + ); + expect(mockGetTable).toHaveBeenCalledWith( + { fullNameArg: "cat.sch.src" }, + expect.anything(), ); - expect(queryCall?.[0].payload.columns).toEqual(["id", "body"]); + expect(bodyOf().columns).toEqual(["id", "body"]); }); it("does not discover columns outside development", async () => { process.env.NODE_ENV = "production"; - mockRequest.mockImplementation(routeByPath); + mockDiscovery(); // Columns set so the prod no-columns guard doesn't fire; this test only // asserts discovery doesn't run outside development. const plugin = new AiSearchPlugin({ @@ -272,25 +284,21 @@ describe("AiSearchPlugin", () => { await plugin.setup(); // No get-index / get-table calls were made. - const metadataCalls = mockRequest.mock.calls.filter( - (c) => !c[0].path.endsWith("/query"), - ); - expect(metadataCalls).toHaveLength(0); + expect(mockGetVectorIndex).not.toHaveBeenCalled(); + expect(mockGetTable).not.toHaveBeenCalled(); }); it("skips (does not throw) when an index already has columns", async () => { process.env.NODE_ENV = "development"; - mockRequest.mockImplementation(routeByPath); + mockDiscovery(); const plugin = new AiSearchPlugin({ indexes: { docs: { indexName: "cat.sch.idx", columns: ["id"] } }, }); await plugin.setup(); - const metadataCalls = mockRequest.mock.calls.filter( - (c) => !c[0].path.endsWith("/query"), - ); - expect(metadataCalls).toHaveLength(0); + expect(mockGetVectorIndex).not.toHaveBeenCalled(); + expect(mockGetTable).not.toHaveBeenCalled(); }); }); @@ -378,16 +386,18 @@ describe("AiSearchPlugin", () => { expect.objectContaining({ method: "POST", path: "/api/2.0/vector-search/indexes/cat.sch.idx/query", + signal: expect.any(AbortSignal), }), - // 2nd arg is the SDK Context bridging the execution's abort signal. - expect.any(Context), ); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.query_text).toBe("test query"); expect(callBody.query_type).toBe("HYBRID"); expect(callBody.num_results).toBe(10); expect(callBody.columns).toEqual(["id", "title"]); + // Not in the modular request model; the raw `request()` path must keep it + // so the response carries `debug_info` (queryTimeMs). + expect(callBody.debug_level).toBe(1); }); it("throws Error for unknown alias", async () => { @@ -418,7 +428,7 @@ describe("AiSearchPlugin", () => { filters: { category: ["books"] }, }); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); // VS expects a JSON-encoded string under `filters_json`; a raw object // under `filters` is silently ignored by the API. expect(callBody.filters).toBeUndefined(); @@ -440,7 +450,7 @@ describe("AiSearchPlugin", () => { await plugin.setup(); await plugin.query("test", { queryText: "test" }); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.reranker.model).toBe("databricks_reranker"); expect(callBody.reranker.parameters.columns_to_rerank).toEqual([ "title", @@ -464,7 +474,7 @@ describe("AiSearchPlugin", () => { await plugin.query("test", { queryText: "test" }); expect(mockEmbeddingFn).toHaveBeenCalledWith("test"); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.query_vector).toEqual([0.1, 0.2, 0.3]); expect(callBody.query_text).toBeUndefined(); }); @@ -485,7 +495,7 @@ describe("AiSearchPlugin", () => { await plugin.query("test", { queryText: "test" }); expect(mockEmbeddingFn).toHaveBeenCalledWith("test"); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.query_vector).toEqual([0.1, 0.2, 0.3]); expect(callBody.query_text).toBe("test"); }); @@ -506,7 +516,7 @@ describe("AiSearchPlugin", () => { await plugin.query("test", { queryText: "test" }); expect(mockEmbeddingFn).not.toHaveBeenCalled(); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.query_text).toBe("test"); expect(callBody.query_vector).toBeUndefined(); }); @@ -613,7 +623,7 @@ describe("AiSearchPlugin", () => { columns: ["id"], }); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.query_type).toBe("ANN"); expect(callBody.num_results).toBe(5); expect(callBody.columns).toEqual(["id"]); @@ -632,7 +642,7 @@ describe("AiSearchPlugin", () => { await plugin.setup(); await plugin.query("test", { queryText: "q" }); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.reranker.parameters.columns_to_rerank).toEqual(["title"]); }); @@ -649,7 +659,7 @@ describe("AiSearchPlugin", () => { await plugin.setup(); await plugin.query("test", { queryText: "q", reranker: false }); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.reranker).toBeUndefined(); }); @@ -661,7 +671,7 @@ describe("AiSearchPlugin", () => { }); await plugin.query("test", { queryText: "q" }); - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.reranker).toBeUndefined(); expect(callBody.columns).toEqual([]); }); @@ -1012,7 +1022,7 @@ describe("AiSearchPlugin", () => { // demo is configured with columns ["id", "title"]; the request's // columns must not widen the projection. - const callBody = mockRequest.mock.calls[0][0].payload; + const callBody = bodyOf(); expect(callBody.columns).toEqual(["id", "title"]); }); @@ -1094,10 +1104,10 @@ describe("AiSearchPlugin", () => { expect(mockRequest).toHaveBeenCalledWith( expect.objectContaining({ path: "/api/2.0/vector-search/indexes/cat.sch.paged/query-next-page", - payload: { endpoint_name: "ep", page_token: "t" }, + signal: expect.any(AbortSignal), }), - expect.any(Context), ); + expect(bodyOf()).toEqual({ endpoint_name: "ep", page_token: "t" }); expect(res.json).toHaveBeenCalled(); }); }); diff --git a/packages/appkit/src/testing/mock-workspace-client.ts b/packages/appkit/src/testing/mock-workspace-client.ts index bd65eff3d..3b21896a7 100644 --- a/packages/appkit/src/testing/mock-workspace-client.ts +++ b/packages/appkit/src/testing/mock-workspace-client.ts @@ -69,6 +69,8 @@ const FACADE_SERVICES = [ "warehouses", "genie", "jobs", + "vectorSearch", + "tables", "statementExecution", "servingEndpoints", "currentUser", diff --git a/packages/shared/package.json b/packages/shared/package.json index 451fbcbc0..33df9896a 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -54,6 +54,8 @@ "@databricks/sdk-files": "0.52.0", "@databricks/sdk-genie": "0.54.0", "@databricks/sdk-jobs": "0.57.0", + "@databricks/sdk-uc-tables": "0.52.0", + "@databricks/sdk-vectorsearch": "0.51.0", "@databricks/sdk-options": "0.51.0", "@databricks/sdk-scim": "0.51.0", "@databricks/sdk-statementexecution": "0.52.0", diff --git a/packages/shared/src/workspace-client/client.ts b/packages/shared/src/workspace-client/client.ts index ff0074ca5..e51635507 100644 --- a/packages/shared/src/workspace-client/client.ts +++ b/packages/shared/src/workspace-client/client.ts @@ -24,6 +24,10 @@ import { type JobsClient, buildFilesClient, type FilesClient, + buildTablesClient, + type TablesClient, + buildVectorSearchClient, + type VectorSearchClient, type StatementExecutionClient, type WarehousesClient, type WorkspaceAuth, @@ -41,6 +45,8 @@ export class AppKitWorkspaceClient implements WorkspaceClient { #genie?: GenieClient; #jobs?: JobsClient; #files?: FilesClient; + #vectorSearch?: VectorSearchClient; + #tables?: TablesClient; constructor(opts: WorkspaceClientOptions) { this.#opts = opts; @@ -78,6 +84,23 @@ export class AppKitWorkspaceClient implements WorkspaceClient { return this.#jobs; } + // Migrated to the modular SDK — built lazily, independent of the legacy client. + // Migrated to the modular SDK — built lazily, independent of the legacy client. + get vectorSearch(): VectorSearchClient { + if (!this.#vectorSearch) { + this.#vectorSearch = buildVectorSearchClient(this.#opts); + } + return this.#vectorSearch; + } + + // Migrated to the modular SDK — built lazily, independent of the legacy client. + get tables(): TablesClient { + if (!this.#tables) { + this.#tables = buildTablesClient(this.#opts); + } + return this.#tables; + } + // Migrated to the modular SDK — built lazily, independent of the legacy client. get statementExecution(): StatementExecutionClient { if (!this.#statementExecution) { diff --git a/packages/shared/src/workspace-client/modular.ts b/packages/shared/src/workspace-client/modular.ts index b9135ada4..a4b68a77e 100644 --- a/packages/shared/src/workspace-client/modular.ts +++ b/packages/shared/src/workspace-client/modular.ts @@ -8,8 +8,8 @@ * * Migrated services are built here as per-service clients; the facade delegates * their accessors to these instead of the legacy monolithic client. Currently - * `warehouses`, `statementExecution`, `currentUser` (SCIM), `genie` and `jobs` - * are migrated, plus the auth + raw-request seam ({@link buildWorkspaceAuth}); + * `warehouses`, `statementExecution`, `currentUser` (SCIM), `genie`, `jobs`, `vectorSearch` + * and `tables` (UC) are migrated, plus the auth + raw-request seam ({@link buildWorkspaceAuth}); * every other service still routes through `legacy.ts`. * * NOTE: statementExecution relies on a pinned pnpm patch @@ -49,6 +49,8 @@ import { JobsClient } from "@databricks/sdk-jobs/v2"; import type { ClientOptions } from "@databricks/sdk-options/client"; import { ScimClient } from "@databricks/sdk-scim/v1"; import { StatementExecutionClient } from "@databricks/sdk-statementexecution/v1"; +import { TablesClient } from "@databricks/sdk-uc-tables/v1"; +import { VectorSearchClient } from "@databricks/sdk-vectorsearch/v1"; import { WarehousesClient } from "@databricks/sdk-warehouses/v1"; import { ApiError } from "./errors"; @@ -375,12 +377,30 @@ export function buildFilesClient(opts: WorkspaceClientOptions): FilesClient { return new FilesClient(mapToClientOptions(opts)); } +/** + * Build a modular Vector Search client from wrapper options. Only index metadata + * (`getVectorIndex`) goes typed: the query endpoints use the raw `request()` + * seam because the generated model drops `debug_level` / `debug_info`. + */ +export function buildVectorSearchClient( + opts: WorkspaceClientOptions, +): VectorSearchClient { + return new VectorSearchClient(mapToClientOptions(opts)); +} + +/** Build a modular Unity Catalog Tables client from wrapper options. */ +export function buildTablesClient(opts: WorkspaceClientOptions): TablesClient { + return new TablesClient(mapToClientOptions(opts)); +} + // ── Client type re-exports (for the facade accessor types) ─────────────── export type { FilesClient } from "@databricks/sdk-files/v2"; export type { GenieClient } from "@databricks/sdk-genie/v1"; export type { JobsClient } from "@databricks/sdk-jobs/v2"; export type { ScimClient } from "@databricks/sdk-scim/v1"; export type { StatementExecutionClient } from "@databricks/sdk-statementexecution/v1"; +export type { TablesClient } from "@databricks/sdk-uc-tables/v1"; +export type { VectorSearchClient } from "@databricks/sdk-vectorsearch/v1"; export type { WarehousesClient } from "@databricks/sdk-warehouses/v1"; // ── Model type re-exports ──────────────────────────────────────────────── diff --git a/packages/shared/src/workspace-client/types.ts b/packages/shared/src/workspace-client/types.ts index b737ab401..82b275f90 100644 --- a/packages/shared/src/workspace-client/types.ts +++ b/packages/shared/src/workspace-client/types.ts @@ -22,6 +22,8 @@ import type { GenieClient, JobsClient, FilesClient, + TablesClient, + VectorSearchClient, } from "./modular"; // Legacy SDK type namespaces for un-migrated services, re-exported so AppKit @@ -60,6 +62,12 @@ export interface WorkspaceClient extends WorkspaceAuth { /** Jobs (modular SDK, Jobs API 2.2). */ readonly jobs: JobsClient; + /** Vector Search (modular SDK; index metadata only, queries use `request()`). */ + readonly vectorSearch: VectorSearchClient; + + /** Unity Catalog Tables (modular SDK). */ + readonly tables: TablesClient; + /** Statement Execution (modular SDK). */ readonly statementExecution: StatementExecutionClient; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3c6b8a5cf..c72820060 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -307,6 +307,12 @@ importers: '@databricks/sdk-statementexecution': specifier: 0.52.0 version: 0.52.0(patch_hash=9377a46b883b548d47116662bf73b159a4da51ec28b9ff1896a7e4a7841c240c) + '@databricks/sdk-uc-tables': + specifier: 0.52.0 + version: 0.52.0 + '@databricks/sdk-vectorsearch': + specifier: 0.51.0 + version: 0.51.0 '@databricks/sdk-warehouses': specifier: 0.53.0 version: 0.53.0 @@ -649,6 +655,12 @@ importers: '@databricks/sdk-statementexecution': specifier: 0.52.0 version: 0.52.0(patch_hash=9377a46b883b548d47116662bf73b159a4da51ec28b9ff1896a7e4a7841c240c) + '@databricks/sdk-uc-tables': + specifier: 0.52.0 + version: 0.52.0 + '@databricks/sdk-vectorsearch': + specifier: 0.51.0 + version: 0.51.0 '@databricks/sdk-warehouses': specifier: 0.53.0 version: 0.53.0 @@ -2057,6 +2069,14 @@ packages: resolution: {integrity: sha512-ymDGDW67PJ/0VujM89mUrE6mbbrabsKJP5LvPv8ZbgzPR0bm0DwXMcQzvS0XUt0UGITjV2gqbx5jQwP3ijtOmg==} engines: {node: '>=22.0.0'} + '@databricks/sdk-uc-tables@0.52.0': + resolution: {integrity: sha512-Dlqu3+O1krk6ogBX/uJGUDn1xMdt0gVMvrpmf16XkPelmgzwrbdWWtU2LU/zlcCBrb3XvhPPUpxVVHmyNS8Pjg==} + engines: {node: '>=22.0.0'} + + '@databricks/sdk-vectorsearch@0.51.0': + resolution: {integrity: sha512-Hr5z5lbT4pt0FV7L+gvKIFdp0PlWtyH14bs6+rJsCxcgwV6BQhuuVecJv8M4FB8QdsDZd2Us/JVIa5LwHHVORA==} + engines: {node: '>=22.0.0'} + '@databricks/sdk-warehouses@0.53.0': resolution: {integrity: sha512-+NlLn/HP3+5YUxTKlp0+zwsbAGaU2GHl8C+8JlWk04VLmBZhJg/PJnr4WlNrQVTAzqH01dy4DmK7MfqyOetHRg==} engines: {node: '>=22.0.0'} @@ -14407,6 +14427,24 @@ snapshots: json-bigint: 1.0.0 zod: 4.3.6 + '@databricks/sdk-uc-tables@0.52.0': + dependencies: + '@databricks/sdk-auth': 0.51.0 + '@databricks/sdk-core': 0.51.0 + '@databricks/sdk-options': 0.51.0 + '@js-temporal/polyfill': 0.5.1 + json-bigint: 1.0.0 + zod: 4.3.6 + + '@databricks/sdk-vectorsearch@0.51.0': + dependencies: + '@databricks/sdk-auth': 0.51.0 + '@databricks/sdk-core': 0.51.0 + '@databricks/sdk-options': 0.51.0 + '@js-temporal/polyfill': 0.5.1 + json-bigint: 1.0.0 + zod: 4.3.6 + '@databricks/sdk-warehouses@0.53.0': dependencies: '@databricks/sdk-auth': 0.51.0