@fabric-harness/databricks 0.16.1 → 0.18.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 (77) 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/client.d.ts +37 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +110 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/consumption.d.ts +45 -0
  14. package/dist/consumption.d.ts.map +1 -0
  15. package/dist/consumption.js +85 -0
  16. package/dist/consumption.js.map +1 -0
  17. package/dist/cost-budget-actuals.d.ts +27 -0
  18. package/dist/cost-budget-actuals.d.ts.map +1 -0
  19. package/dist/cost-budget-actuals.js +265 -0
  20. package/dist/cost-budget-actuals.js.map +1 -0
  21. package/dist/embeddings.d.ts +18 -0
  22. package/dist/embeddings.d.ts.map +1 -0
  23. package/dist/embeddings.js +24 -0
  24. package/dist/embeddings.js.map +1 -0
  25. package/dist/feature-serving.d.ts +17 -0
  26. package/dist/feature-serving.d.ts.map +1 -0
  27. package/dist/feature-serving.js +29 -0
  28. package/dist/feature-serving.js.map +1 -0
  29. package/dist/genie.d.ts +22 -0
  30. package/dist/genie.d.ts.map +1 -0
  31. package/dist/genie.js +60 -0
  32. package/dist/genie.js.map +1 -0
  33. package/dist/governance.d.ts +66 -0
  34. package/dist/governance.d.ts.map +1 -0
  35. package/dist/governance.js +111 -0
  36. package/dist/governance.js.map +1 -0
  37. package/dist/identity.d.ts +38 -0
  38. package/dist/identity.d.ts.map +1 -0
  39. package/dist/identity.js +56 -0
  40. package/dist/identity.js.map +1 -0
  41. package/dist/index.d.ts +131 -80
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +105 -227
  44. package/dist/index.js.map +1 -1
  45. package/dist/lakebase.d.ts +49 -0
  46. package/dist/lakebase.d.ts.map +1 -0
  47. package/dist/lakebase.js +25 -0
  48. package/dist/lakebase.js.map +1 -0
  49. package/dist/lakeflow.d.ts +28 -0
  50. package/dist/lakeflow.d.ts.map +1 -0
  51. package/dist/lakeflow.js +75 -0
  52. package/dist/lakeflow.js.map +1 -0
  53. package/dist/mock-provider.d.ts +26 -0
  54. package/dist/mock-provider.d.ts.map +1 -0
  55. package/dist/mock-provider.js +66 -0
  56. package/dist/mock-provider.js.map +1 -0
  57. package/dist/model.d.ts +29 -0
  58. package/dist/model.d.ts.map +1 -0
  59. package/dist/model.js +50 -0
  60. package/dist/model.js.map +1 -0
  61. package/dist/sql-exec.d.ts +17 -0
  62. package/dist/sql-exec.d.ts.map +1 -0
  63. package/dist/sql-exec.js +36 -0
  64. package/dist/sql-exec.js.map +1 -0
  65. package/dist/sql-sandbox.d.ts +1 -1
  66. package/dist/sql-sandbox.d.ts.map +1 -1
  67. package/dist/sql-sandbox.js +1 -1
  68. package/dist/sql-sandbox.js.map +1 -1
  69. package/dist/tools.d.ts +71 -0
  70. package/dist/tools.d.ts.map +1 -0
  71. package/dist/tools.js +176 -0
  72. package/dist/tools.js.map +1 -0
  73. package/dist/vector-search.d.ts +24 -0
  74. package/dist/vector-search.d.ts.map +1 -0
  75. package/dist/vector-search.js +63 -0
  76. package/dist/vector-search.js.map +1 -0
  77. package/package.json +14 -2
@@ -0,0 +1,27 @@
1
+ import type { ActualCostSource, CostLimit } from '@fabric-harness/sdk';
2
+ import type { DatabricksRestClient } from './client.js';
3
+ import type { StatementPoll } from './sql-exec.js';
4
+ export interface DatabricksActualCostSourceOptions {
5
+ /** Cache TTL in milliseconds. Default 60_000. */
6
+ cacheTtlMs?: number;
7
+ /** Tag key prefix for filtering usage rows. Default `'fabric'`. */
8
+ tagPrefix?: string;
9
+ /** Polling configuration for statement execution. */
10
+ poll?: StatementPoll;
11
+ }
12
+ /**
13
+ * Create a Databricks-backed `ActualCostSource` that queries `system.billing.usage`
14
+ * joined to `system.billing.list_prices` for real spend data.
15
+ *
16
+ * Results are cached per-scope-key for `cacheTtlMs` (default 60s) to avoid
17
+ * hammering the SQL warehouse.
18
+ */
19
+ export declare function databricksActualCostSource(client: DatabricksRestClient, warehouseId: string, options?: DatabricksActualCostSourceOptions): ActualCostSource;
20
+ export declare function databricksTenantCostLimit(client: DatabricksRestClient, warehouseId: string, tenantId: string, options: {
21
+ perHourUsd?: number;
22
+ perDayUsd?: number;
23
+ perMonthUsd?: number;
24
+ cacheTtlMs?: number;
25
+ onExceed?: 'throw' | 'approve';
26
+ }): CostLimit;
27
+ //# sourceMappingURL=cost-budget-actuals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-budget-actuals.d.ts","sourceRoot":"","sources":["../src/cost-budget-actuals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAKhB,SAAS,EACV,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,eAAe,CAAC;AAEjE,MAAM,WAAW,iCAAiC;IAChD,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAiLD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,oBAAoB,EAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,iCAAsC,GAC9C,gBAAgB,CAoHlB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,oBAAoB,EAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC,GACA,SAAS,CAcX"}
@@ -0,0 +1,265 @@
1
+ import { parseScopeKey, tenantCostLimit } from '@fabric-harness/sdk';
2
+ import { runStatement, parseStatementRows } from './sql-exec.js';
3
+ function toNumber(value) {
4
+ const n = typeof value === 'number' ? value : Number(value);
5
+ return Number.isFinite(n) ? n : 0;
6
+ }
7
+ function deriveDateWindow(parsed) {
8
+ const period = parsed.period;
9
+ if (!period)
10
+ return undefined;
11
+ const parts = period.split(':');
12
+ const periodType = parts[0];
13
+ const periodValue = parts.slice(1).join(':');
14
+ if (!periodValue)
15
+ return undefined;
16
+ switch (periodType) {
17
+ case 'day': {
18
+ // day:YYYY-MM-DD
19
+ return { startDate: periodValue, endDate: periodValue };
20
+ }
21
+ case 'hour': {
22
+ // hour:YYYY-MM-DDTHH:00Z → use the date portion
23
+ const date = periodValue.match(/^(\d{4}-\d{2}-\d{2})/)?.[1];
24
+ return date ? { startDate: date, endDate: date } : undefined;
25
+ }
26
+ case 'month': {
27
+ // month:YYYY-MM
28
+ const [year, month] = periodValue.split('-');
29
+ if (!year || !month)
30
+ return undefined;
31
+ const lastDay = new Date(Number(year), Number(month), 0).getDate();
32
+ return {
33
+ startDate: `${year}-${month}-01`,
34
+ endDate: `${year}-${month}-${String(lastDay).padStart(2, '0')}`,
35
+ };
36
+ }
37
+ default:
38
+ return undefined;
39
+ }
40
+ }
41
+ function buildCostQuery(tagPrefix, attribution) {
42
+ const tagAgent = `${tagPrefix}.agent`;
43
+ const tagTenant = `${tagPrefix}.tenant`;
44
+ const tagUser = `${tagPrefix}.user`;
45
+ const conditions = [
46
+ 'u.usage_date >= :start_date AND u.usage_date <= :end_date',
47
+ ];
48
+ if (attribution?.agentId) {
49
+ conditions.push(`u.tags['${tagAgent}'] = :agent_id`);
50
+ }
51
+ if (attribution?.tenantId) {
52
+ conditions.push(`u.tags['${tagTenant}'] = :tenant_id`);
53
+ }
54
+ if (attribution?.userId) {
55
+ conditions.push(`u.tags['${tagUser}'] = :user_id`);
56
+ }
57
+ return [
58
+ 'SELECT',
59
+ ' SUM(u.usage_quantity * lp.pricing.default) AS list_cost_usd,',
60
+ ' SUM(u.usage_quantity) AS quantity',
61
+ 'FROM system.billing.usage u',
62
+ 'LEFT JOIN system.billing.list_prices lp',
63
+ ' ON u.cloud = lp.cloud AND u.sku_name = lp.sku_name AND u.usage_unit = lp.usage_unit',
64
+ ' AND u.usage_end_time >= lp.price_start_time',
65
+ ' AND (lp.price_end_time IS NULL OR u.usage_end_time < lp.price_end_time)',
66
+ `WHERE ${conditions.join(' AND ')}`,
67
+ ].join('\n');
68
+ }
69
+ function buildAttributionQuery(tagPrefix, filters) {
70
+ const tagAgent = `${tagPrefix}.agent`;
71
+ const tagTenant = `${tagPrefix}.tenant`;
72
+ const tagUser = `${tagPrefix}.user`;
73
+ const conditions = [
74
+ 'u.usage_date >= :start_date AND u.usage_date <= :end_date',
75
+ ];
76
+ const parameters = [
77
+ { name: 'start_date', value: filters.startDate ?? '', type: 'DATE' },
78
+ { name: 'end_date', value: filters.endDate ?? '', type: 'DATE' },
79
+ ];
80
+ if (filters.agentId) {
81
+ conditions.push(`u.tags['${tagAgent}'] = :agent_id`);
82
+ parameters.push({ name: 'agent_id', value: filters.agentId });
83
+ }
84
+ if (filters.tenantId) {
85
+ conditions.push(`u.tags['${tagTenant}'] = :tenant_id`);
86
+ parameters.push({ name: 'tenant_id', value: filters.tenantId });
87
+ }
88
+ if (filters.userId) {
89
+ conditions.push(`u.tags['${tagUser}'] = :user_id`);
90
+ parameters.push({ name: 'user_id', value: filters.userId });
91
+ }
92
+ if (filters.model) {
93
+ conditions.push('u.sku_name = :model');
94
+ parameters.push({ name: 'model', value: filters.model });
95
+ }
96
+ if (filters.provider) {
97
+ conditions.push('u.cloud = :provider');
98
+ parameters.push({ name: 'provider', value: filters.provider });
99
+ }
100
+ const groupBy = filters.groupBy ?? ['agentId', 'tenantId', 'userId', 'model', 'provider'];
101
+ const groupColumns = [];
102
+ const selectColumns = [];
103
+ for (const dim of groupBy) {
104
+ switch (dim) {
105
+ case 'agentId':
106
+ selectColumns.push(`u.tags['${tagAgent}'] AS agentId`);
107
+ groupColumns.push(`u.tags['${tagAgent}']`);
108
+ break;
109
+ case 'tenantId':
110
+ selectColumns.push(`u.tags['${tagTenant}'] AS tenantId`);
111
+ groupColumns.push(`u.tags['${tagTenant}']`);
112
+ break;
113
+ case 'userId':
114
+ selectColumns.push(`u.tags['${tagUser}'] AS userId`);
115
+ groupColumns.push(`u.tags['${tagUser}']`);
116
+ break;
117
+ case 'model':
118
+ selectColumns.push('u.sku_name AS model');
119
+ groupColumns.push('u.sku_name');
120
+ break;
121
+ case 'provider':
122
+ selectColumns.push('u.cloud AS provider');
123
+ groupColumns.push('u.cloud');
124
+ break;
125
+ case 'sessionId':
126
+ // sessionId is not stored in billing tags; skip as a group dimension
127
+ break;
128
+ case 'turnId':
129
+ // turnId is not stored in billing tags; skip as a group dimension
130
+ break;
131
+ }
132
+ }
133
+ selectColumns.push("CONCAT('day:', u.usage_date) AS period", 'SUM(u.usage_quantity * lp.pricing.default) AS actualUsd', 'SUM(u.usage_quantity) AS actualDbus', 'COUNT(*) AS calls');
134
+ groupColumns.push("CONCAT('day:', u.usage_date)");
135
+ const query = [
136
+ 'SELECT',
137
+ ` ${selectColumns.join(',\n ')}`,
138
+ 'FROM system.billing.usage u',
139
+ 'LEFT JOIN system.billing.list_prices lp',
140
+ ' ON u.cloud = lp.cloud AND u.sku_name = lp.sku_name AND u.usage_unit = lp.usage_unit',
141
+ ' AND u.usage_end_time >= lp.price_start_time',
142
+ ' AND (lp.price_end_time IS NULL OR u.usage_end_time < lp.price_end_time)',
143
+ `WHERE ${conditions.join(' AND ')}`,
144
+ `GROUP BY ${groupColumns.join(', ')}`,
145
+ 'ORDER BY actualUsd DESC',
146
+ ].join('\n');
147
+ return { query, parameters };
148
+ }
149
+ /**
150
+ * Create a Databricks-backed `ActualCostSource` that queries `system.billing.usage`
151
+ * joined to `system.billing.list_prices` for real spend data.
152
+ *
153
+ * Results are cached per-scope-key for `cacheTtlMs` (default 60s) to avoid
154
+ * hammering the SQL warehouse.
155
+ */
156
+ export function databricksActualCostSource(client, warehouseId, options = {}) {
157
+ const cacheTtlMs = options.cacheTtlMs ?? 60_000;
158
+ const tagPrefix = options.tagPrefix ?? 'fabric';
159
+ const poll = options.poll ?? { intervalMs: 2000, timeoutMs: 120_000 };
160
+ const cache = new Map();
161
+ return {
162
+ async getUsd(scopeKey, attribution, queryOptions) {
163
+ const ttl = queryOptions?.cacheTtlMs ?? cacheTtlMs;
164
+ const now = Date.now();
165
+ // Check cache first
166
+ const cached = cache.get(scopeKey);
167
+ if (cached && cached.expiresAt > now) {
168
+ const result = {
169
+ usd: cached.usd,
170
+ };
171
+ if (cached.dbus !== undefined)
172
+ result.dbus = cached.dbus;
173
+ result.actualsFetchedAt = cached.fetchedAt;
174
+ result.cacheTtlMs = ttl;
175
+ return result;
176
+ }
177
+ const parsed = parseScopeKey(scopeKey);
178
+ if (!parsed) {
179
+ return { usd: 0, cacheTtlMs: ttl };
180
+ }
181
+ const dateWindow = deriveDateWindow(parsed);
182
+ if (!dateWindow) {
183
+ return { usd: 0, cacheTtlMs: ttl };
184
+ }
185
+ const parameters = [
186
+ { name: 'start_date', value: dateWindow.startDate, type: 'DATE' },
187
+ { name: 'end_date', value: dateWindow.endDate, type: 'DATE' },
188
+ ];
189
+ if (attribution?.agentId) {
190
+ parameters.push({ name: 'agent_id', value: attribution.agentId });
191
+ }
192
+ if (attribution?.tenantId) {
193
+ parameters.push({ name: 'tenant_id', value: attribution.tenantId });
194
+ }
195
+ if (attribution?.userId) {
196
+ parameters.push({ name: 'user_id', value: attribution.userId });
197
+ }
198
+ const response = await runStatement(client, warehouseId, buildCostQuery(tagPrefix, attribution), parameters, poll);
199
+ const rows = parseStatementRows(response);
200
+ const usd = rows.reduce((sum, r) => sum + toNumber(r.list_cost_usd), 0);
201
+ const dbus = rows.reduce((sum, r) => sum + toNumber(r.quantity), 0);
202
+ const fetchedAt = new Date().toISOString();
203
+ cache.set(scopeKey, {
204
+ usd,
205
+ dbus: dbus || undefined,
206
+ fetchedAt,
207
+ expiresAt: now + ttl,
208
+ });
209
+ const result = {
210
+ usd,
211
+ };
212
+ if (dbus)
213
+ result.dbus = dbus;
214
+ result.actualsFetchedAt = fetchedAt;
215
+ result.cacheTtlMs = ttl;
216
+ return result;
217
+ },
218
+ async queryAttribution(filters) {
219
+ if (!filters.startDate || !filters.endDate) {
220
+ throw new Error('queryAttribution requires startDate and endDate');
221
+ }
222
+ const { query, parameters } = buildAttributionQuery(tagPrefix, filters);
223
+ const response = await runStatement(client, warehouseId, query, parameters, poll);
224
+ const rows = parseStatementRows(response);
225
+ return rows.map((r) => {
226
+ const row = {
227
+ period: String(r.period ?? ''),
228
+ estimatedUsd: 0,
229
+ actualUsd: toNumber(r.actualUsd),
230
+ actualDbus: toNumber(r.actualDbus),
231
+ deltaUsd: toNumber(r.actualUsd),
232
+ calls: toNumber(r.calls),
233
+ };
234
+ if (r.agentId)
235
+ row.agentId = String(r.agentId);
236
+ if (r.userId)
237
+ row.userId = String(r.userId);
238
+ if (r.tenantId)
239
+ row.tenantId = String(r.tenantId);
240
+ if (r.model)
241
+ row.model = String(r.model);
242
+ if (r.provider)
243
+ row.provider = String(r.provider);
244
+ return row;
245
+ });
246
+ },
247
+ };
248
+ }
249
+ export function databricksTenantCostLimit(client, warehouseId, tenantId, options) {
250
+ const base = tenantCostLimit(tenantId, {
251
+ ...(options.perHourUsd !== undefined ? { perHourUsd: options.perHourUsd } : {}),
252
+ ...(options.perDayUsd !== undefined ? { perDayUsd: options.perDayUsd } : {}),
253
+ ...(options.perMonthUsd !== undefined ? { perMonthUsd: options.perMonthUsd } : {}),
254
+ ...(options.onExceed ? { onExceed: options.onExceed } : {}),
255
+ });
256
+ const opts = {};
257
+ if (options.cacheTtlMs !== undefined)
258
+ opts.cacheTtlMs = options.cacheTtlMs;
259
+ return {
260
+ ...base,
261
+ scopeSource: 'external',
262
+ actualSource: databricksActualCostSource(client, warehouseId, opts),
263
+ };
264
+ }
265
+ //# sourceMappingURL=cost-budget-actuals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-budget-actuals.js","sourceRoot":"","sources":["../src/cost-budget-actuals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { EmbeddingProvider } from '@fabric-harness/sdk';
2
+ import type { DatabricksRestClient } from './client.js';
3
+ export interface DatabricksEmbeddingsOptions {
4
+ client: DatabricksRestClient;
5
+ /** Serving-endpoint name of the embedding model. */
6
+ endpoint: string;
7
+ name?: string;
8
+ }
9
+ /**
10
+ * Embeddings via a Mosaic AI serving **embedding** endpoint. Databricks exposes the OpenAI-compatible
11
+ * embeddings surface at `<host>/serving-endpoints/embeddings` with the endpoint name as `model`.
12
+ * Reuses the bundle's REST client, so it inherits the rotating UC-principal token.
13
+ *
14
+ * (URL/response schema worth a smoke test against a live embedding endpoint — chat and embeddings
15
+ * share the OpenAI-compatible convention but endpoint families can differ.)
16
+ */
17
+ export declare function databricksEmbeddings(options: DatabricksEmbeddingsOptions): EmbeddingProvider;
18
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,iBAAiB,CAa5F"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Embeddings via a Mosaic AI serving **embedding** endpoint. Databricks exposes the OpenAI-compatible
3
+ * embeddings surface at `<host>/serving-endpoints/embeddings` with the endpoint name as `model`.
4
+ * Reuses the bundle's REST client, so it inherits the rotating UC-principal token.
5
+ *
6
+ * (URL/response schema worth a smoke test against a live embedding endpoint — chat and embeddings
7
+ * share the OpenAI-compatible convention but endpoint families can differ.)
8
+ */
9
+ export function databricksEmbeddings(options) {
10
+ return {
11
+ name: options.name ?? 'databricks',
12
+ async embed(texts) {
13
+ if (texts.length === 0)
14
+ return [];
15
+ const response = await options.client.post('/serving-endpoints/embeddings', {
16
+ model: options.endpoint,
17
+ input: texts,
18
+ });
19
+ const data = [...(response.data ?? [])].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
20
+ return data.map((entry) => entry.embedding);
21
+ },
22
+ };
23
+ }
24
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAcA;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAoC;IACvE,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,YAAY;QAClC,KAAK,CAAC,KAAK,CAAC,KAAe;YACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAA0B,+BAA+B,EAAE;gBACnG,KAAK,EAAE,OAAO,CAAC,QAAQ;gBACvB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;YACxF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { JsonObject, ToolDef } from '@fabric-harness/sdk';
2
+ import type { DatabricksRestClient } from './client.js';
3
+ export interface DatabricksFeatureLookupToolOptions {
4
+ /** Feature Serving endpoint name (serves features from an online table / feature spec). */
5
+ endpoint: string;
6
+ name?: string;
7
+ description?: string;
8
+ }
9
+ /**
10
+ * Low-latency feature lookup from a Databricks **Feature Serving** endpoint (backed by an Online
11
+ * Table). The model passes primary-key records; the endpoint returns the served feature values.
12
+ * Drives serving consumption and keeps features governed by Unity Catalog under the bundle principal.
13
+ */
14
+ export declare function databricksFeatureLookupTool(client: DatabricksRestClient, options: DatabricksFeatureLookupToolOptions): ToolDef<{
15
+ records: JsonObject[];
16
+ }, unknown>;
17
+ //# sourceMappingURL=feature-serving.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-serving.d.ts","sourceRoot":"","sources":["../src/feature-serving.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,kCAAkC;IACjD,2FAA2F;IAC3F,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,kCAAkC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,EAAE,OAAO,CAAC,CAsBlK"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Low-latency feature lookup from a Databricks **Feature Serving** endpoint (backed by an Online
3
+ * Table). The model passes primary-key records; the endpoint returns the served feature values.
4
+ * Drives serving consumption and keeps features governed by Unity Catalog under the bundle principal.
5
+ */
6
+ export function databricksFeatureLookupTool(client, options) {
7
+ return {
8
+ name: options.name ?? 'databricks_feature_lookup',
9
+ description: options.description ?? 'Look up low-latency features for primary-key records from a Databricks Feature Serving endpoint.',
10
+ inputSchema: {
11
+ type: 'object',
12
+ additionalProperties: false,
13
+ properties: {
14
+ records: {
15
+ type: 'array',
16
+ items: { type: 'object', additionalProperties: true },
17
+ minItems: 1,
18
+ description: 'Primary-key records, e.g. [{ "user_id": 123 }].',
19
+ },
20
+ },
21
+ required: ['records'],
22
+ },
23
+ metadata: { effect: 'read', provider: 'databricks', service: 'feature-serving' },
24
+ execute: (input) => client.post(`/serving-endpoints/${encodeURIComponent(options.endpoint)}/invocations`, {
25
+ dataframe_records: input.records,
26
+ }),
27
+ };
28
+ }
29
+ //# sourceMappingURL=feature-serving.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-serving.js","sourceRoot":"","sources":["../src/feature-serving.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAA4B,EAAE,OAA2C;IACnH,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,2BAA2B;QACjD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,kGAAkG;QACtI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;oBACrD,QAAQ,EAAE,CAAC;oBACX,WAAW,EAAE,iDAAiD;iBAC/D;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE;QAChF,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE;YACxG,iBAAiB,EAAE,KAAK,CAAC,OAAO;SACjC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ToolDef } from '@fabric-harness/sdk';
2
+ import type { DatabricksRestClient } from './client.js';
3
+ export interface DatabricksGenieToolOptions {
4
+ /** AI/BI Genie space id. */
5
+ spaceId: string;
6
+ name?: string;
7
+ description?: string;
8
+ pollIntervalMs?: number;
9
+ timeoutMs?: number;
10
+ }
11
+ /**
12
+ * AI/BI Genie — delegate a natural-language analytics question to a governed Genie space. Genie
13
+ * generates and runs SQL on the warehouse and returns an answer; this tool returns the answer text,
14
+ * the generated SQL, and the result rows. Pass `conversationId` to continue a multi-turn thread.
15
+ *
16
+ * Genie response field names vary by API version — parsed defensively; smoke-test against a live space.
17
+ */
18
+ export declare function databricksGenieTool(client: DatabricksRestClient, options: DatabricksGenieToolOptions): ToolDef<{
19
+ question: string;
20
+ conversationId?: string;
21
+ }, unknown>;
22
+ //# sourceMappingURL=genie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genie.d.ts","sourceRoot":"","sources":["../src/genie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,0BAA0B;IACzC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,CAoDtK"}
package/dist/genie.js ADDED
@@ -0,0 +1,60 @@
1
+ const TERMINAL_STATES = new Set(['COMPLETED', 'FAILED', 'CANCELLED', 'QUERY_RESULT_EXPIRED']);
2
+ const enc = encodeURIComponent;
3
+ /**
4
+ * AI/BI Genie — delegate a natural-language analytics question to a governed Genie space. Genie
5
+ * generates and runs SQL on the warehouse and returns an answer; this tool returns the answer text,
6
+ * the generated SQL, and the result rows. Pass `conversationId` to continue a multi-turn thread.
7
+ *
8
+ * Genie response field names vary by API version — parsed defensively; smoke-test against a live space.
9
+ */
10
+ export function databricksGenieTool(client, options) {
11
+ const intervalMs = options.pollIntervalMs ?? 2000;
12
+ const timeoutMs = options.timeoutMs ?? 120_000;
13
+ const space = `/api/2.0/genie/spaces/${enc(options.spaceId)}`;
14
+ return {
15
+ name: options.name ?? 'databricks_genie_ask',
16
+ description: options.description ?? 'Ask a natural-language analytics question in a Databricks AI/BI Genie space; returns the answer, generated SQL, and result rows.',
17
+ inputSchema: {
18
+ type: 'object',
19
+ additionalProperties: false,
20
+ properties: { question: { type: 'string' }, conversationId: { type: 'string' } },
21
+ required: ['question'],
22
+ },
23
+ metadata: { effect: 'execute', provider: 'databricks', service: 'genie' },
24
+ async execute(input) {
25
+ let conversationId = input.conversationId;
26
+ let messageId;
27
+ if (conversationId) {
28
+ const res = await client.post(`${space}/conversations/${enc(conversationId)}/messages`, { content: input.question });
29
+ messageId = String(res.message_id ?? res.id ?? '');
30
+ }
31
+ else {
32
+ const res = await client.post(`${space}/start-conversation`, { content: input.question });
33
+ conversationId = String(res.conversation_id ?? res.conversation?.id ?? '');
34
+ messageId = String(res.message_id ?? res.message?.id ?? '');
35
+ }
36
+ const messagePath = `${space}/conversations/${enc(conversationId)}/messages/${enc(messageId)}`;
37
+ const deadline = Date.now() + timeoutMs;
38
+ let message = await client.get(messagePath);
39
+ while (!TERMINAL_STATES.has(message.status ?? '') && Date.now() < deadline) {
40
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
41
+ message = await client.get(messagePath);
42
+ }
43
+ const text = message.attachments?.map((a) => a.text?.content).filter(Boolean).join('\n') || undefined;
44
+ const sql = message.attachments?.find((a) => a.query?.query)?.query?.query;
45
+ let result;
46
+ if (sql) {
47
+ result = await client.get(`${messagePath}/query-result`).catch(() => undefined);
48
+ }
49
+ return {
50
+ conversationId,
51
+ messageId,
52
+ status: message.status,
53
+ ...(text ? { text } : {}),
54
+ ...(sql ? { sql } : {}),
55
+ ...(result !== undefined ? { result } : {}),
56
+ };
57
+ },
58
+ };
59
+ }
60
+ //# sourceMappingURL=genie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genie.js","sourceRoot":"","sources":["../src/genie.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { ApprovalPolicyRule, CapabilityPolicy, JsonObject, ToolDef } from '@fabric-harness/sdk';
2
+ /**
3
+ * Governance for Databricks tools is **layered on top of Unity Catalog, never a replacement.** UC
4
+ * enforces table/row/column ACLs natively via the acting principal (see identity.ts). These helpers
5
+ * add the things UC doesn't: an **audit/lineage** stamp on every tool call, **approval routing** for
6
+ * sensitive operations, and an **egress allowlist** pinned to the workspace — all expressed through
7
+ * the SDK's existing `CapabilityPolicy`, so the loop enforces them without a bespoke engine.
8
+ */
9
+ export interface DatabricksLineageRecord {
10
+ tool: string;
11
+ /** From the tool's `metadata.service` (e.g. 'sql', 'unity-catalog', 'jobs'). */
12
+ service?: string;
13
+ provider?: string;
14
+ /** Stable label for the acting principal — never the token. */
15
+ principal?: string;
16
+ catalog?: string;
17
+ schema?: string;
18
+ input: JsonObject;
19
+ startedAt: string;
20
+ finishedAt: string;
21
+ ok: boolean;
22
+ error?: string;
23
+ }
24
+ export interface DatabricksGovernanceOptions {
25
+ /** Stable label for the acting principal, recorded in lineage. Never pass a token here. */
26
+ principal?: string;
27
+ /** Sink for lineage/audit records. Defaults to no-op; wire to OTel / `onEvent` at the app layer. */
28
+ onLineage?: (record: DatabricksLineageRecord) => void;
29
+ /**
30
+ * Optional belt-and-suspenders catalog allowlist. Calls whose input references a catalog outside
31
+ * the list are rejected before execution. UC remains the source of truth; this is defense in depth.
32
+ */
33
+ catalogs?: string[];
34
+ /** Clock injection for tests. */
35
+ now?: () => Date;
36
+ }
37
+ /** Wraps one Databricks tool to stamp lineage/audit and enforce the optional catalog allowlist. */
38
+ export declare function withGovernance<I, O>(tool: ToolDef<I, O>, options?: DatabricksGovernanceOptions): ToolDef<I, O>;
39
+ /** Wraps a set of Databricks tools with {@link withGovernance}. */
40
+ export declare function withGovernanceTools(tools: ToolDef[], options?: DatabricksGovernanceOptions): ToolDef[];
41
+ export interface DatabricksApprovalRuleOptions {
42
+ /** Opaque approval audience (e.g. 'data-steward'). */
43
+ audience: string;
44
+ /** Restrict to these `metadata.service` values. Default: gate every write/execute tool. */
45
+ services?: string[];
46
+ reason?: string;
47
+ ttlSeconds?: number;
48
+ }
49
+ /** Builds approval rules (one per gated tool) for `CapabilityPolicy.toolPolicy.approvalRules`. */
50
+ export declare function databricksApprovalRules(tools: ToolDef[], options: DatabricksApprovalRuleOptions): ApprovalPolicyRule[];
51
+ export interface DatabricksGovernancePolicyOptions {
52
+ tools: ToolDef[];
53
+ /** Workspace host(s) to pin outbound egress to (URL or bare host). */
54
+ host?: string | string[];
55
+ /** When set, sensitive tools route to this approval audience. */
56
+ stewardAudience?: string;
57
+ approvalServices?: string[];
58
+ ttlSeconds?: number;
59
+ }
60
+ /**
61
+ * Assembles a `CapabilityPolicy` for a Databricks tool set: approval routing for sensitive
62
+ * operations (if `stewardAudience` is set) plus an egress allowlist pinned to the workspace host(s).
63
+ * Used by the `databricks()` bundle; can also be merged into an agent's own policy.
64
+ */
65
+ export declare function databricksGovernancePolicy(options: DatabricksGovernancePolicyOptions): CapabilityPolicy;
66
+ //# sourceMappingURL=governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.d.ts","sourceRoot":"","sources":["../src/governance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAErG;;;;;;GAMG;AAEH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACtD;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAeD,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAsClH;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,OAAO,GAAE,2BAAgC,GAAG,OAAO,EAAE,CAE1G;AAED,MAAM,WAAW,6BAA6B;IAC5C,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAQD,kGAAkG;AAClG,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,6BAA6B,GAAG,kBAAkB,EAAE,CAUtH;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAcD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,iCAAiC,GAAG,gBAAgB,CAcvG"}