@fabric-harness/databricks 0.16.1 → 1.0.0

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.
Files changed (101) hide show
  1. package/dist/agent.d.ts +45 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +206 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/ai.d.ts +19 -0
  6. package/dist/ai.d.ts.map +1 -0
  7. package/dist/ai.js +22 -0
  8. package/dist/ai.js.map +1 -0
  9. package/dist/app.d.ts +81 -0
  10. package/dist/app.d.ts.map +1 -0
  11. package/dist/app.js +87 -0
  12. package/dist/app.js.map +1 -0
  13. package/dist/client.d.ts +44 -0
  14. package/dist/client.d.ts.map +1 -0
  15. package/dist/client.js +114 -0
  16. package/dist/client.js.map +1 -0
  17. package/dist/consumption.d.ts +45 -0
  18. package/dist/consumption.d.ts.map +1 -0
  19. package/dist/consumption.js +85 -0
  20. package/dist/consumption.js.map +1 -0
  21. package/dist/cost-budget-actuals.d.ts +27 -0
  22. package/dist/cost-budget-actuals.d.ts.map +1 -0
  23. package/dist/cost-budget-actuals.js +265 -0
  24. package/dist/cost-budget-actuals.js.map +1 -0
  25. package/dist/embeddings.d.ts +18 -0
  26. package/dist/embeddings.d.ts.map +1 -0
  27. package/dist/embeddings.js +24 -0
  28. package/dist/embeddings.js.map +1 -0
  29. package/dist/feature-serving.d.ts +17 -0
  30. package/dist/feature-serving.d.ts.map +1 -0
  31. package/dist/feature-serving.js +29 -0
  32. package/dist/feature-serving.js.map +1 -0
  33. package/dist/genie.d.ts +22 -0
  34. package/dist/genie.d.ts.map +1 -0
  35. package/dist/genie.js +60 -0
  36. package/dist/genie.js.map +1 -0
  37. package/dist/governance.d.ts +70 -0
  38. package/dist/governance.d.ts.map +1 -0
  39. package/dist/governance.js +123 -0
  40. package/dist/governance.js.map +1 -0
  41. package/dist/identity.d.ts +72 -0
  42. package/dist/identity.d.ts.map +1 -0
  43. package/dist/identity.js +119 -0
  44. package/dist/identity.js.map +1 -0
  45. package/dist/index.d.ts +143 -80
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +111 -227
  48. package/dist/index.js.map +1 -1
  49. package/dist/lakebase.d.ts +49 -0
  50. package/dist/lakebase.d.ts.map +1 -0
  51. package/dist/lakebase.js +25 -0
  52. package/dist/lakebase.js.map +1 -0
  53. package/dist/lakeflow.d.ts +28 -0
  54. package/dist/lakeflow.d.ts.map +1 -0
  55. package/dist/lakeflow.js +75 -0
  56. package/dist/lakeflow.js.map +1 -0
  57. package/dist/mlflow-tracing.d.ts +111 -0
  58. package/dist/mlflow-tracing.d.ts.map +1 -0
  59. package/dist/mlflow-tracing.js +167 -0
  60. package/dist/mlflow-tracing.js.map +1 -0
  61. package/dist/mock-provider.d.ts +26 -0
  62. package/dist/mock-provider.d.ts.map +1 -0
  63. package/dist/mock-provider.js +66 -0
  64. package/dist/mock-provider.js.map +1 -0
  65. package/dist/model.d.ts +29 -0
  66. package/dist/model.d.ts.map +1 -0
  67. package/dist/model.js +50 -0
  68. package/dist/model.js.map +1 -0
  69. package/dist/persistence.d.ts +73 -0
  70. package/dist/persistence.d.ts.map +1 -0
  71. package/dist/persistence.js +82 -0
  72. package/dist/persistence.js.map +1 -0
  73. package/dist/serving-usage.d.ts +48 -0
  74. package/dist/serving-usage.d.ts.map +1 -0
  75. package/dist/serving-usage.js +100 -0
  76. package/dist/serving-usage.js.map +1 -0
  77. package/dist/sql-exec.d.ts +17 -0
  78. package/dist/sql-exec.d.ts.map +1 -0
  79. package/dist/sql-exec.js +36 -0
  80. package/dist/sql-exec.js.map +1 -0
  81. package/dist/sql-sandbox.d.ts +1 -1
  82. package/dist/sql-sandbox.d.ts.map +1 -1
  83. package/dist/sql-sandbox.js +1 -1
  84. package/dist/sql-sandbox.js.map +1 -1
  85. package/dist/telemetry-sink.d.ts +29 -0
  86. package/dist/telemetry-sink.d.ts.map +1 -0
  87. package/dist/telemetry-sink.js +129 -0
  88. package/dist/telemetry-sink.js.map +1 -0
  89. package/dist/tools.d.ts +71 -0
  90. package/dist/tools.d.ts.map +1 -0
  91. package/dist/tools.js +176 -0
  92. package/dist/tools.js.map +1 -0
  93. package/dist/vector-search.d.ts +24 -0
  94. package/dist/vector-search.d.ts.map +1 -0
  95. package/dist/vector-search.js +63 -0
  96. package/dist/vector-search.js.map +1 -0
  97. package/dist/volumes-attachment-store.d.ts +64 -0
  98. package/dist/volumes-attachment-store.d.ts.map +1 -0
  99. package/dist/volumes-attachment-store.js +172 -0
  100. package/dist/volumes-attachment-store.js.map +1 -0
  101. package/package.json +20 -3
@@ -0,0 +1,129 @@
1
+ /** Create the telemetry tables when absent. Idempotent. */
2
+ export async function ensureDatabricksTelemetryTables(client) {
3
+ await client.query(`CREATE TABLE IF NOT EXISTS fh_submission_telemetry (
4
+ id BIGSERIAL PRIMARY KEY,
5
+ submission_id TEXT NOT NULL,
6
+ event_type TEXT NOT NULL,
7
+ kind TEXT NOT NULL,
8
+ agent TEXT NOT NULL,
9
+ instance_id TEXT NOT NULL,
10
+ session TEXT NOT NULL,
11
+ attempt_id TEXT,
12
+ attempt_count INTEGER,
13
+ outcome TEXT,
14
+ error TEXT,
15
+ duration_ms BIGINT,
16
+ model TEXT,
17
+ input_tokens BIGINT,
18
+ output_tokens BIGINT,
19
+ cost_usd DOUBLE PRECISION,
20
+ tenant_id TEXT,
21
+ principal_kind TEXT,
22
+ principal_id TEXT,
23
+ at BIGINT NOT NULL
24
+ )`);
25
+ await client.query('CREATE INDEX IF NOT EXISTS fh_submission_telemetry_submission_idx ON fh_submission_telemetry (submission_id)');
26
+ await client.query(`CREATE TABLE IF NOT EXISTS fh_lineage (
27
+ id BIGSERIAL PRIMARY KEY,
28
+ submission_id TEXT,
29
+ attempt_id TEXT,
30
+ tool TEXT NOT NULL,
31
+ service TEXT,
32
+ provider TEXT,
33
+ principal TEXT,
34
+ catalog TEXT,
35
+ schema_name TEXT,
36
+ ok BOOLEAN NOT NULL,
37
+ error TEXT,
38
+ tenant_id TEXT,
39
+ input JSONB,
40
+ started_at TEXT NOT NULL,
41
+ finished_at TEXT NOT NULL
42
+ )`);
43
+ await client.query('CREATE INDEX IF NOT EXISTS fh_lineage_submission_idx ON fh_lineage (submission_id)');
44
+ }
45
+ export function databricksTelemetry(options) {
46
+ const { client } = options;
47
+ const onError = options.onError ??
48
+ ((context, error) => {
49
+ console.error(`[fabric-harness:databricks-telemetry] ${context}:`, error);
50
+ });
51
+ let initialized;
52
+ const ensure = () => {
53
+ if (options.initialize === false)
54
+ return Promise.resolve();
55
+ initialized ??= ensureDatabricksTelemetryTables(client).catch((error) => {
56
+ initialized = undefined;
57
+ throw error;
58
+ });
59
+ return initialized;
60
+ };
61
+ async function writeEvent(event) {
62
+ await ensure();
63
+ const attemptId = 'attemptId' in event ? (event.attemptId ?? null) : null;
64
+ const attemptCount = 'attemptCount' in event ? (event.attemptCount ?? null) : null;
65
+ const outcome = event.type === 'submission_settled' ? event.outcome : null;
66
+ const error = event.type === 'submission_settled' ? (event.error ?? null) : null;
67
+ const durationMs = event.type === 'submission_settled' ? (event.durationMs ?? null) : null;
68
+ const model = event.type === 'submission_usage' ? (event.model ?? null) : null;
69
+ const inputTokens = event.type === 'submission_usage' ? (event.inputTokens ?? null) : null;
70
+ const outputTokens = event.type === 'submission_usage' ? (event.outputTokens ?? null) : null;
71
+ const costUsd = event.type === 'submission_usage' ? (event.costUsd ?? null) : null;
72
+ await client.query(`INSERT INTO fh_submission_telemetry
73
+ (submission_id, event_type, kind, agent, instance_id, session, attempt_id, attempt_count, outcome, error, duration_ms, model, input_tokens, output_tokens, cost_usd, tenant_id, principal_kind, principal_id, at)
74
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19)`, [
75
+ event.submissionId,
76
+ event.type,
77
+ event.kind,
78
+ event.agent,
79
+ event.instanceId,
80
+ event.session,
81
+ attemptId,
82
+ attemptCount,
83
+ outcome,
84
+ error,
85
+ durationMs,
86
+ model,
87
+ inputTokens,
88
+ outputTokens,
89
+ costUsd,
90
+ event.tenantId ?? null,
91
+ event.actor?.principal?.kind ?? null,
92
+ event.actor?.principal?.id ?? null,
93
+ event.at,
94
+ ]);
95
+ }
96
+ async function writeLineage(record) {
97
+ await ensure();
98
+ await client.query(`INSERT INTO fh_lineage
99
+ (submission_id, attempt_id, tool, service, provider, principal, catalog, schema_name, ok, error, tenant_id, input, started_at, finished_at)
100
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12::jsonb, $13, $14)`, [
101
+ record.submissionId ?? null,
102
+ record.attemptId ?? null,
103
+ record.tool,
104
+ record.service ?? null,
105
+ record.provider ?? null,
106
+ record.principal ?? null,
107
+ record.catalog ?? null,
108
+ record.schema ?? null,
109
+ record.ok,
110
+ record.error ?? null,
111
+ record.tenantId ?? null,
112
+ JSON.stringify(record.input ?? {}),
113
+ record.startedAt,
114
+ record.finishedAt,
115
+ ]);
116
+ }
117
+ return {
118
+ sink: {
119
+ record(event) {
120
+ return writeEvent(event);
121
+ },
122
+ },
123
+ onLineage(record) {
124
+ void writeLineage(record).catch((error) => onError(`lineage write failed for ${record.tool}`, error));
125
+ },
126
+ migrate: ensure,
127
+ };
128
+ }
129
+ //# sourceMappingURL=telemetry-sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-sink.js","sourceRoot":"","sources":["../src/telemetry-sink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { FilesystemSource, JsonObject, ToolDef } from '@fabric-harness/sdk';
2
+ import type { DatabricksRestClient } from './client.js';
3
+ export interface DatabricksSqlToolOptions {
4
+ warehouseId: string;
5
+ name?: string;
6
+ description?: string;
7
+ waitTimeout?: string;
8
+ disposition?: 'INLINE' | 'EXTERNAL_LINKS';
9
+ }
10
+ export declare function databricksSqlTool(client: DatabricksRestClient, options: DatabricksSqlToolOptions): ToolDef<{
11
+ statement: string;
12
+ catalog?: string;
13
+ schema?: string;
14
+ }, unknown>;
15
+ export declare function databricksRunJobTool(client: DatabricksRestClient, options?: {
16
+ name?: string;
17
+ description?: string;
18
+ }): ToolDef<{
19
+ jobId: number;
20
+ notebookParams?: JsonObject;
21
+ pythonParams?: string[];
22
+ jarParams?: string[];
23
+ }, unknown>;
24
+ export declare function databricksNotebookTool(client: DatabricksRestClient, options?: {
25
+ name?: string;
26
+ description?: string;
27
+ existingClusterId?: string;
28
+ }): ToolDef<{
29
+ notebookPath: string;
30
+ baseParameters?: JsonObject;
31
+ runName?: string;
32
+ }, unknown>;
33
+ export declare function databricksMlflowLogMetricTool(client: DatabricksRestClient, options?: {
34
+ name?: string;
35
+ description?: string;
36
+ }): ToolDef<{
37
+ runId: string;
38
+ key: string;
39
+ value: number;
40
+ step?: number;
41
+ timestamp?: number;
42
+ }, unknown>;
43
+ export declare function databricksMlflowLogParamTool(client: DatabricksRestClient, options?: {
44
+ name?: string;
45
+ description?: string;
46
+ }): ToolDef<{
47
+ runId: string;
48
+ key: string;
49
+ value: string;
50
+ }, unknown>;
51
+ export declare function unityCatalogTablesTool(client: DatabricksRestClient, options?: {
52
+ name?: string;
53
+ description?: string;
54
+ }): ToolDef<{
55
+ catalog: string;
56
+ schema: string;
57
+ }, unknown>;
58
+ export declare function databricksTableInfoTool(client: DatabricksRestClient, options?: {
59
+ name?: string;
60
+ description?: string;
61
+ }): ToolDef<{
62
+ fullName: string;
63
+ }, unknown>;
64
+ export interface DatabricksWorkspaceSourceOptions {
65
+ name?: string;
66
+ include?: (path: string) => boolean;
67
+ recursive?: boolean;
68
+ format?: 'SOURCE' | 'HTML' | 'JUPYTER' | 'DBC';
69
+ }
70
+ export declare function databricksWorkspaceSource(client: DatabricksRestClient, rootPath: string, options?: DatabricksWorkspaceSourceOptions): FilesystemSource;
71
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/dist/tools.js ADDED
@@ -0,0 +1,176 @@
1
+ export function databricksSqlTool(client, options) {
2
+ return {
3
+ name: options.name ?? 'databricks_sql',
4
+ description: options.description ?? 'Run a SQL statement on a Databricks SQL Warehouse.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ additionalProperties: false,
8
+ properties: {
9
+ statement: { type: 'string' },
10
+ catalog: { type: 'string' },
11
+ schema: { type: 'string' },
12
+ },
13
+ required: ['statement'],
14
+ },
15
+ metadata: { effect: 'execute', provider: 'databricks', service: 'sql' },
16
+ execute: (input) => client.post('/api/2.0/sql/statements', {
17
+ warehouse_id: options.warehouseId,
18
+ statement: input.statement,
19
+ wait_timeout: options.waitTimeout ?? '30s',
20
+ disposition: options.disposition ?? 'INLINE',
21
+ ...(input.catalog ? { catalog: input.catalog } : {}),
22
+ ...(input.schema ? { schema: input.schema } : {}),
23
+ }),
24
+ };
25
+ }
26
+ export function databricksRunJobTool(client, options = {}) {
27
+ return {
28
+ name: options.name ?? 'databricks_run_job',
29
+ description: options.description ?? 'Trigger an existing Databricks job by job id.',
30
+ inputSchema: {
31
+ type: 'object',
32
+ additionalProperties: false,
33
+ properties: {
34
+ jobId: { type: 'number' },
35
+ notebookParams: { type: 'object', additionalProperties: true },
36
+ pythonParams: { type: 'array', items: { type: 'string' } },
37
+ jarParams: { type: 'array', items: { type: 'string' } },
38
+ },
39
+ required: ['jobId'],
40
+ },
41
+ metadata: { effect: 'execute', provider: 'databricks', service: 'jobs' },
42
+ execute: (input) => client.post('/api/2.1/jobs/run-now', {
43
+ job_id: input.jobId,
44
+ ...(input.notebookParams ? { notebook_params: input.notebookParams } : {}),
45
+ ...(input.pythonParams ? { python_params: input.pythonParams } : {}),
46
+ ...(input.jarParams ? { jar_params: input.jarParams } : {}),
47
+ }),
48
+ };
49
+ }
50
+ export function databricksNotebookTool(client, options = {}) {
51
+ return {
52
+ name: options.name ?? 'databricks_run_notebook',
53
+ description: options.description ?? 'Submit a one-off Databricks notebook run.',
54
+ inputSchema: {
55
+ type: 'object',
56
+ additionalProperties: false,
57
+ properties: {
58
+ notebookPath: { type: 'string' },
59
+ baseParameters: { type: 'object', additionalProperties: true },
60
+ runName: { type: 'string' },
61
+ },
62
+ required: ['notebookPath'],
63
+ },
64
+ metadata: { effect: 'execute', provider: 'databricks', service: 'jobs' },
65
+ execute: (input) => client.post('/api/2.1/jobs/runs/submit', {
66
+ run_name: input.runName ?? `fabric-harness:${input.notebookPath}`,
67
+ ...(options.existingClusterId ? { existing_cluster_id: options.existingClusterId } : {}),
68
+ notebook_task: {
69
+ notebook_path: input.notebookPath,
70
+ ...(input.baseParameters ? { base_parameters: input.baseParameters } : {}),
71
+ },
72
+ }),
73
+ };
74
+ }
75
+ export function databricksMlflowLogMetricTool(client, options = {}) {
76
+ return {
77
+ name: options.name ?? 'databricks_mlflow_log_metric',
78
+ description: options.description ?? 'Log a metric to an MLflow run hosted in Databricks.',
79
+ inputSchema: {
80
+ type: 'object',
81
+ additionalProperties: false,
82
+ properties: {
83
+ runId: { type: 'string' },
84
+ key: { type: 'string' },
85
+ value: { type: 'number' },
86
+ step: { type: 'number' },
87
+ timestamp: { type: 'number' },
88
+ },
89
+ required: ['runId', 'key', 'value'],
90
+ },
91
+ metadata: { effect: 'write', provider: 'databricks', service: 'mlflow' },
92
+ execute: (input) => client.post('/api/2.0/mlflow/runs/log-metric', {
93
+ run_id: input.runId,
94
+ key: input.key,
95
+ value: input.value,
96
+ timestamp: input.timestamp ?? Date.now(),
97
+ ...(input.step !== undefined ? { step: input.step } : {}),
98
+ }),
99
+ };
100
+ }
101
+ export function databricksMlflowLogParamTool(client, options = {}) {
102
+ return {
103
+ name: options.name ?? 'databricks_mlflow_log_param',
104
+ description: options.description ?? 'Log a parameter to an MLflow run hosted in Databricks.',
105
+ inputSchema: {
106
+ type: 'object',
107
+ additionalProperties: false,
108
+ properties: { runId: { type: 'string' }, key: { type: 'string' }, value: { type: 'string' } },
109
+ required: ['runId', 'key', 'value'],
110
+ },
111
+ metadata: { effect: 'write', provider: 'databricks', service: 'mlflow' },
112
+ execute: (input) => client.post('/api/2.0/mlflow/runs/log-parameter', { run_id: input.runId, key: input.key, value: input.value }),
113
+ };
114
+ }
115
+ export function unityCatalogTablesTool(client, options = {}) {
116
+ return {
117
+ name: options.name ?? 'databricks_unity_catalog_tables',
118
+ description: options.description ?? 'List Unity Catalog tables in a catalog and schema.',
119
+ inputSchema: {
120
+ type: 'object',
121
+ additionalProperties: false,
122
+ properties: { catalog: { type: 'string' }, schema: { type: 'string' } },
123
+ required: ['catalog', 'schema'],
124
+ },
125
+ metadata: { effect: 'read', provider: 'databricks', service: 'unity-catalog' },
126
+ execute: (input) => client.get('/api/2.1/unity-catalog/tables', { catalog_name: input.catalog, schema_name: input.schema }),
127
+ };
128
+ }
129
+ export function databricksTableInfoTool(client, options = {}) {
130
+ return {
131
+ name: options.name ?? 'databricks_table_info',
132
+ description: options.description ?? 'Describe a Unity Catalog table (columns, types, comment) by its full name (catalog.schema.table).',
133
+ inputSchema: {
134
+ type: 'object',
135
+ additionalProperties: false,
136
+ properties: { fullName: { type: 'string' } },
137
+ required: ['fullName'],
138
+ },
139
+ metadata: { effect: 'read', provider: 'databricks', service: 'unity-catalog' },
140
+ execute: (input) => client.get(`/api/2.1/unity-catalog/tables/${encodeURIComponent(input.fullName)}`),
141
+ };
142
+ }
143
+ export function databricksWorkspaceSource(client, rootPath, options = {}) {
144
+ const include = options.include ?? (() => true);
145
+ return {
146
+ name: options.name ?? `databricks-workspace:${rootPath}`,
147
+ async *entries() {
148
+ yield* walkWorkspace(client, rootPath, rootPath, include, options.recursive ?? true, options.format ?? 'SOURCE');
149
+ },
150
+ };
151
+ }
152
+ async function* walkWorkspace(client, root, current, include, recursive, format) {
153
+ const listing = await client.get('/api/2.0/workspace/list', { path: current });
154
+ for (const object of listing.objects ?? []) {
155
+ if (object.object_type === 'DIRECTORY') {
156
+ if (recursive)
157
+ yield* walkWorkspace(client, root, object.path, include, recursive, format);
158
+ continue;
159
+ }
160
+ const relative = object.path.slice(root.length).replace(/^\/+/, '');
161
+ if (!relative || !include(relative))
162
+ continue;
163
+ const exported = await client.get('/api/2.0/workspace/export', { path: object.path, format });
164
+ yield { path: relative, content: exported.content ? base64ToBytes(exported.content) : new Uint8Array() };
165
+ }
166
+ }
167
+ function base64ToBytes(value) {
168
+ if (typeof Buffer !== 'undefined')
169
+ return new Uint8Array(Buffer.from(value, 'base64'));
170
+ const binary = atob(value);
171
+ const bytes = new Uint8Array(binary.length);
172
+ for (let i = 0; i < binary.length; i += 1)
173
+ bytes[i] = binary.charCodeAt(i);
174
+ return bytes;
175
+ }
176
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { EmbeddingProvider, Retriever } from '@fabric-harness/sdk';
2
+ import type { DatabricksRestClient } from './client.js';
3
+ export interface DatabricksVectorSearchOptions {
4
+ client: DatabricksRestClient;
5
+ /** Full index name: `catalog.schema.index`. */
6
+ index: string;
7
+ /** Column that holds the chunk text returned to the model. */
8
+ textColumn: string;
9
+ /** Columns to retrieve. Defaults to `[textColumn]` plus `idColumn` when set. */
10
+ columns?: string[];
11
+ /** Column to surface as `RetrievedChunk.id`. */
12
+ idColumn?: string;
13
+ /**
14
+ * `'text'` (default) for Databricks-managed-embedding indexes (send `query_text`); `'vector'` for
15
+ * self-managed / direct-access indexes (embed the query via `embeddings` and send `query_vector`).
16
+ */
17
+ queryType?: 'text' | 'vector';
18
+ /** Required when `queryType: 'vector'`. */
19
+ embeddings?: EmbeddingProvider;
20
+ name?: string;
21
+ }
22
+ /** Databricks Mosaic AI Vector Search as a {@link Retriever}. Runs under the bundle's UC principal. */
23
+ export declare function databricksVectorSearch(options: DatabricksVectorSearchOptions): Retriever;
24
+ //# sourceMappingURL=vector-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["../src/vector-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAA+C,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AASD,uGAAuG;AACvG,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,SAAS,CAyBxF"}
@@ -0,0 +1,63 @@
1
+ const SCORE_COLUMN = 'score';
2
+ /** Databricks Mosaic AI Vector Search as a {@link Retriever}. Runs under the bundle's UC principal. */
3
+ export function databricksVectorSearch(options) {
4
+ const queryType = options.queryType ?? 'text';
5
+ const columns = options.columns ?? dedupe([options.textColumn, ...(options.idColumn ? [options.idColumn] : [])]);
6
+ return {
7
+ name: options.name ?? `databricks-vector-search:${options.index}`,
8
+ async retrieve(query, opts = {}) {
9
+ const body = { columns, num_results: opts.k ?? 5 };
10
+ if (opts.filter)
11
+ body.filters_json = JSON.stringify(opts.filter);
12
+ if (queryType === 'vector') {
13
+ if (!options.embeddings)
14
+ throw new Error('databricks vector search: queryType "vector" requires an embeddings provider.');
15
+ const [vector] = await options.embeddings.embed([query]);
16
+ if (!vector)
17
+ throw new Error('databricks vector search: embeddings returned no vector for the query.');
18
+ body.query_vector = vector;
19
+ }
20
+ else {
21
+ body.query_text = query;
22
+ }
23
+ const response = await options.client.post(`/api/2.0/vector-search/indexes/${encodeURIComponent(options.index)}/query`, body);
24
+ return mapResults(response, options, columns);
25
+ },
26
+ };
27
+ }
28
+ function mapResults(response, options, requestedColumns) {
29
+ const names = (response.manifest?.columns ?? []).map((c) => c.name);
30
+ const requested = new Set(requestedColumns);
31
+ // Identify the score column: a literal `score`, else a single trailing column the response
32
+ // appended beyond what we requested (Databricks adds the similarity score). Never treat a
33
+ // requested column as the score — that would mis-attribute a numeric metadata field.
34
+ const lastName = names[names.length - 1];
35
+ const scoreColumn = names.includes(SCORE_COLUMN)
36
+ ? SCORE_COLUMN
37
+ : (lastName && !requested.has(lastName) ? lastName : undefined);
38
+ const rows = response.result?.data_array ?? [];
39
+ return rows.map((row) => {
40
+ const record = {};
41
+ names.forEach((name, i) => { record[name] = row[i]; });
42
+ const text = String(record[options.textColumn] ?? '');
43
+ const scoreRaw = scoreColumn ? record[scoreColumn] : undefined;
44
+ const score = typeof scoreRaw === 'number' ? scoreRaw : undefined;
45
+ const idRaw = options.idColumn ? record[options.idColumn] : undefined;
46
+ const metadata = { ...record };
47
+ delete metadata[options.textColumn];
48
+ if (scoreColumn)
49
+ delete metadata[scoreColumn];
50
+ if (options.idColumn)
51
+ delete metadata[options.idColumn];
52
+ return {
53
+ ...(idRaw != null ? { id: String(idRaw) } : {}),
54
+ text,
55
+ ...(score !== undefined ? { score } : {}),
56
+ metadata,
57
+ };
58
+ });
59
+ }
60
+ function dedupe(values) {
61
+ return [...new Set(values)];
62
+ }
63
+ //# sourceMappingURL=vector-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.js","sourceRoot":"","sources":["../src/vector-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { AttachmentPutInput, AttachmentRef, AttachmentStore, StoredAttachment } from '@fabric-harness/sdk';
2
+ /**
3
+ * Unity Catalog Volumes attachment backend (v2 migration, workstream C2).
4
+ *
5
+ * Implements the SDK {@link AttachmentStore} contract on a UC Volume via the
6
+ * Databricks Files API, so attachment bytes are governed by Unity Catalog
7
+ * grants like every other Databricks asset. Layout under the volume:
8
+ *
9
+ * ```
10
+ * /Volumes/<catalog>/<schema>/<volume>/<rootPrefix>/<encodeURIComponent(scope)>/<digest[0:2]>/<digest>
11
+ * /Volumes/<catalog>/<schema>/<volume>/<rootPrefix>/<encodeURIComponent(scope)>/<digest[0:2]>/<digest>.json
12
+ * ```
13
+ *
14
+ * The bare `<digest>` file holds the raw bytes; the `<digest>.json` sidecar
15
+ * holds the {@link AttachmentRef} metadata and doubles as the record's
16
+ * existence marker: `put` is first-write-wins per `(scope, digest)` — when the
17
+ * sidecar already exists the put is a no-op, so the first stored ref metadata
18
+ * is retained (contract semantics).
19
+ *
20
+ * The JSON-only `DatabricksRestClient` cannot carry raw request/response
21
+ * bodies, so this store uses its own minimal fetch path with per-request
22
+ * bearer-token resolution (mirroring the client's rotating-token handling).
23
+ * Requests are single-shot (no transport retries) — the harness treats
24
+ * attachment materialization failures as submission admission failures and
25
+ * retries at that level.
26
+ */
27
+ export interface UcVolumesAttachmentStoreOptions {
28
+ /** Workspace host, e.g. `https://adb-1234567890.0.cloud.databricks.com`. */
29
+ host: string;
30
+ /** Static PAT or rotating token resolver (resolved per request). */
31
+ token: string | (() => string | Promise<string>);
32
+ catalog: string;
33
+ schema: string;
34
+ volume: string;
35
+ /** Directory under the volume root holding all attachments. Default `fh-attachments`. */
36
+ rootPrefix?: string;
37
+ fetchImpl?: typeof fetch;
38
+ }
39
+ export declare class UcVolumesAttachmentStore implements AttachmentStore {
40
+ private readonly host;
41
+ private readonly token;
42
+ private readonly fetchImpl;
43
+ private readonly volumeRoot;
44
+ private readonly rootPrefix;
45
+ constructor(options: UcVolumesAttachmentStoreOptions);
46
+ put(input: AttachmentPutInput): Promise<void>;
47
+ get(scope: string, digest: string): Promise<StoredAttachment | null>;
48
+ getByAttachmentId(scope: string, attachmentId: string): Promise<StoredAttachment | null>;
49
+ list(scope: string): Promise<AttachmentRef[]>;
50
+ delete(scope: string, digest: string): Promise<void>;
51
+ private scopeDir;
52
+ private bytesPath;
53
+ private refPath;
54
+ private writeFile;
55
+ /** Raw file bytes, or `null` when the file does not exist (404). */
56
+ private readFile;
57
+ /** True when the file existed and was deleted; false on 404. */
58
+ private deleteFile;
59
+ /** Immediate children of a directory; empty for a missing directory (404). */
60
+ private listDirectory;
61
+ private request;
62
+ private fail;
63
+ }
64
+ //# sourceMappingURL=volumes-attachment-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volumes-attachment-store.d.ts","sourceRoot":"","sources":["../src/volumes-attachment-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,+BAA+B;IAC9C,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAaD,qBAAa,wBAAyB,YAAW,eAAe;IAC9D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,EAAE,+BAA+B;IAQ9C,GAAG,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAUpE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAOxF,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAa7C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1D,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,OAAO;YAMD,SAAS;IAQvB,oEAAoE;YACtD,QAAQ;IAOtB,gEAAgE;YAClD,UAAU;IAOxB,8EAA8E;YAChE,aAAa;YAgBb,OAAO;YAqBP,IAAI;CAOnB"}