@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
package/dist/client.js ADDED
@@ -0,0 +1,114 @@
1
+ import { redactText } from '@fabric-harness/sdk';
2
+ function isRetryableStatus(status) {
3
+ return status === 429 || (status >= 500 && status <= 599);
4
+ }
5
+ function retryDelayMs(response, attempt, base) {
6
+ const retryAfter = response.headers.get('retry-after');
7
+ if (retryAfter) {
8
+ const seconds = Number(retryAfter);
9
+ if (Number.isFinite(seconds))
10
+ return seconds * 1000;
11
+ }
12
+ return base * 2 ** attempt;
13
+ }
14
+ export class DatabricksRestClient {
15
+ host;
16
+ token;
17
+ fetchImpl;
18
+ maxRetries;
19
+ retryBaseDelayMs;
20
+ signal;
21
+ extraHeaders;
22
+ constructor(options) {
23
+ this.host = options.host.replace(/\/$/, '');
24
+ this.token = options.token;
25
+ this.fetchImpl = options.fetchImpl ?? fetch;
26
+ this.maxRetries = options.maxRetries ?? 3;
27
+ this.retryBaseDelayMs = options.retryBaseDelayMs ?? 500;
28
+ this.signal = options.signal;
29
+ this.extraHeaders = options.extraHeaders;
30
+ }
31
+ get(path, query) {
32
+ return this.request('GET', path, undefined, query);
33
+ }
34
+ post(path, body, query) {
35
+ return this.request('POST', path, body, query);
36
+ }
37
+ async request(method, path, body, query = {}) {
38
+ const url = new URL(`${this.host}${path.startsWith('/') ? path : `/${path}`}`);
39
+ for (const [key, value] of Object.entries(query))
40
+ if (value !== undefined)
41
+ url.searchParams.set(key, String(value));
42
+ for (let attempt = 0;; attempt += 1) {
43
+ // Resolve the (possibly rotating) token on every attempt.
44
+ const token = typeof this.token === 'function' ? await this.token() : this.token;
45
+ const extra = typeof this.extraHeaders === 'function' ? await this.extraHeaders() : this.extraHeaders;
46
+ const init = {
47
+ method,
48
+ headers: {
49
+ authorization: `Bearer ${token}`,
50
+ ...(body !== undefined ? { 'content-type': 'application/json' } : {}),
51
+ ...extra,
52
+ },
53
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
54
+ ...(this.signal ? { signal: this.signal } : {}),
55
+ };
56
+ let response;
57
+ try {
58
+ response = await this.fetchImpl(url, init);
59
+ }
60
+ catch (error) {
61
+ // Network error — retry transient failures, but never swallow an abort.
62
+ if (this.signal?.aborted || attempt >= this.maxRetries)
63
+ throw error;
64
+ await new Promise((resolve) => setTimeout(resolve, this.retryBaseDelayMs * 2 ** attempt));
65
+ continue;
66
+ }
67
+ if (response.ok) {
68
+ if (response.status === 204)
69
+ return undefined;
70
+ return await response.json();
71
+ }
72
+ if (isRetryableStatus(response.status) && attempt < this.maxRetries) {
73
+ await new Promise((resolve) => setTimeout(resolve, retryDelayMs(response, attempt, this.retryBaseDelayMs)));
74
+ continue;
75
+ }
76
+ const text = redactText(await response.text(), { additionalSecrets: [token] });
77
+ throw new Error(`databricks: ${response.status} ${response.statusText}: ${text.slice(0, 2000)}`);
78
+ }
79
+ }
80
+ }
81
+ export function createDatabricksClient(options) {
82
+ return new DatabricksRestClient(options);
83
+ }
84
+ export async function waitForDatabricksRun(client, runId, options = {}) {
85
+ const deadline = Date.now() + (options.timeoutMs ?? 600_000);
86
+ const interval = options.pollIntervalMs ?? 5_000;
87
+ let current = await client.get('/api/2.1/jobs/runs/get', { run_id: runId });
88
+ while (!isTerminalDatabricksRunState(current) && Date.now() < deadline) {
89
+ await new Promise((resolve) => setTimeout(resolve, interval));
90
+ current = await client.get('/api/2.1/jobs/runs/get', { run_id: runId });
91
+ }
92
+ return current;
93
+ }
94
+ export async function waitForDatabricksStatement(client, statementId, options = {}) {
95
+ const deadline = Date.now() + (options.timeoutMs ?? 300_000);
96
+ const interval = options.pollIntervalMs ?? 2_000;
97
+ let current = await client.get(`/api/2.0/sql/statements/${encodeURIComponent(statementId)}`);
98
+ while (!isTerminalDatabricksStatementState(current) && Date.now() < deadline) {
99
+ await new Promise((resolve) => setTimeout(resolve, interval));
100
+ current = await client.get(`/api/2.0/sql/statements/${encodeURIComponent(statementId)}`);
101
+ }
102
+ return current;
103
+ }
104
+ function isTerminalDatabricksRunState(run) {
105
+ const state = run.state;
106
+ const lifeCycle = state?.life_cycle_state;
107
+ return lifeCycle === 'TERMINATED' || lifeCycle === 'SKIPPED' || lifeCycle === 'INTERNAL_ERROR';
108
+ }
109
+ function isTerminalDatabricksStatementState(statement) {
110
+ const status = statement.status;
111
+ const state = status?.state;
112
+ return state === 'SUCCEEDED' || state === 'FAILED' || state === 'CANCELED' || state === 'CLOSED';
113
+ }
114
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { JsonObject, ToolDef } from '@fabric-harness/sdk';
2
+ import type { DatabricksRestClient } from './client.js';
3
+ export type ConsumptionGroupBy = 'sku' | 'day';
4
+ export interface ConsumptionSummaryOptions {
5
+ /** Inclusive start date, `YYYY-MM-DD`. */
6
+ startDate: string;
7
+ /** Inclusive end date, `YYYY-MM-DD`. Defaults to `startDate`'s caller-provided window end. */
8
+ endDate: string;
9
+ groupBy?: ConsumptionGroupBy;
10
+ }
11
+ export interface ConsumptionSummary {
12
+ startDate: string;
13
+ endDate: string;
14
+ groupBy: ConsumptionGroupBy;
15
+ rows: JsonObject[];
16
+ totalDbus: number;
17
+ totalListCostUsd: number;
18
+ }
19
+ export interface DatabricksConsumptionOptions {
20
+ warehouseId: string;
21
+ pollIntervalMs?: number;
22
+ timeoutMs?: number;
23
+ }
24
+ /**
25
+ * System-Tables consumption reporting. Reads `system.billing.usage` joined to `list_prices` to report
26
+ * real DBUs + list cost — the "prove the consumption" artifact for chargeback and partner credit.
27
+ */
28
+ export declare function databricksConsumption(client: DatabricksRestClient, options: DatabricksConsumptionOptions): {
29
+ summary(opts: ConsumptionSummaryOptions): Promise<ConsumptionSummary>;
30
+ };
31
+ export type DatabricksConsumption = ReturnType<typeof databricksConsumption>;
32
+ export interface DatabricksConsumptionToolOptions extends DatabricksConsumptionOptions {
33
+ name?: string;
34
+ description?: string;
35
+ /** Clock injection for tests / determinism. */
36
+ now?: () => Date;
37
+ }
38
+ /** Agent-callable consumption report over the last `days` (default 30) or an explicit date window. */
39
+ export declare function databricksConsumptionTool(client: DatabricksRestClient, options: DatabricksConsumptionToolOptions): ToolDef<{
40
+ days?: number;
41
+ startDate?: string;
42
+ endDate?: string;
43
+ groupBy?: ConsumptionGroupBy;
44
+ }, unknown>;
45
+ //# sourceMappingURL=consumption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumption.d.ts","sourceRoot":"","sources":["../src/consumption.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGxD,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,KAAK,CAAC;AAQ/C,MAAM,WAAW,yBAAyB;IACxC,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,4BAA4B;kBAGjF,yBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC;EAuB9E;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE7E,MAAM,WAAW,gCAAiC,SAAQ,4BAA4B;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAMD,sGAAsG;AACtG,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,gCAAgC,GAAG,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;CAAE,EAAE,OAAO,CAAC,CA4B1N"}
@@ -0,0 +1,85 @@
1
+ import { parseStatementRows, runStatement } from './sql-exec.js';
2
+ // Allowlisted group expressions — never interpolated from user/model input.
3
+ const GROUP_COLUMNS = {
4
+ sku: { select: 'u.sku_name AS sku, u.usage_unit AS unit', group: 'u.sku_name, u.usage_unit' },
5
+ day: { select: 'u.usage_date AS day', group: 'u.usage_date' },
6
+ };
7
+ function buildQuery(groupBy) {
8
+ const g = GROUP_COLUMNS[groupBy];
9
+ return [
10
+ `SELECT ${g.select},`,
11
+ ' SUM(u.usage_quantity) AS quantity,',
12
+ ' SUM(u.usage_quantity * lp.pricing.default) AS list_cost_usd',
13
+ 'FROM system.billing.usage u',
14
+ 'LEFT JOIN system.billing.list_prices lp',
15
+ ' ON u.cloud = lp.cloud AND u.sku_name = lp.sku_name AND u.usage_unit = lp.usage_unit',
16
+ ' AND u.usage_end_time >= lp.price_start_time',
17
+ ' AND (lp.price_end_time IS NULL OR u.usage_end_time < lp.price_end_time)',
18
+ 'WHERE u.usage_date >= :start_date AND u.usage_date <= :end_date',
19
+ `GROUP BY ${g.group}`,
20
+ 'ORDER BY list_cost_usd DESC',
21
+ ].join('\n');
22
+ }
23
+ function toNumber(value) {
24
+ const n = typeof value === 'number' ? value : Number(value);
25
+ return Number.isFinite(n) ? n : 0;
26
+ }
27
+ /**
28
+ * System-Tables consumption reporting. Reads `system.billing.usage` joined to `list_prices` to report
29
+ * real DBUs + list cost — the "prove the consumption" artifact for chargeback and partner credit.
30
+ */
31
+ export function databricksConsumption(client, options) {
32
+ const poll = { intervalMs: options.pollIntervalMs ?? 2000, timeoutMs: options.timeoutMs ?? 120_000 };
33
+ return {
34
+ async summary(opts) {
35
+ const groupBy = opts.groupBy ?? 'sku';
36
+ const response = await runStatement(client, options.warehouseId, buildQuery(groupBy), [
37
+ { name: 'start_date', value: opts.startDate, type: 'DATE' },
38
+ { name: 'end_date', value: opts.endDate, type: 'DATE' },
39
+ ], poll);
40
+ const rows = parseStatementRows(response);
41
+ return {
42
+ startDate: opts.startDate,
43
+ endDate: opts.endDate,
44
+ groupBy,
45
+ rows,
46
+ totalDbus: rows.reduce((sum, r) => sum + toNumber(r.quantity), 0),
47
+ totalListCostUsd: rows.reduce((sum, r) => sum + toNumber(r.list_cost_usd), 0),
48
+ };
49
+ },
50
+ };
51
+ }
52
+ function isoDate(date) {
53
+ return date.toISOString().slice(0, 10);
54
+ }
55
+ /** Agent-callable consumption report over the last `days` (default 30) or an explicit date window. */
56
+ export function databricksConsumptionTool(client, options) {
57
+ const reporter = databricksConsumption(client, options);
58
+ const now = options.now ?? (() => new Date());
59
+ return {
60
+ name: options.name ?? 'databricks_consumption',
61
+ description: options.description ?? 'Report real Databricks consumption (DBUs and list cost) from system.billing over a date window.',
62
+ inputSchema: {
63
+ type: 'object',
64
+ additionalProperties: false,
65
+ properties: {
66
+ days: { type: 'number', minimum: 1 },
67
+ startDate: { type: 'string' },
68
+ endDate: { type: 'string' },
69
+ groupBy: { type: 'string', enum: ['sku', 'day'] },
70
+ },
71
+ },
72
+ metadata: { effect: 'read', provider: 'databricks', service: 'system-tables' },
73
+ execute: (input) => {
74
+ const endDate = input.endDate ?? isoDate(now());
75
+ let startDate = input.startDate;
76
+ if (!startDate) {
77
+ const start = now();
78
+ start.setUTCDate(start.getUTCDate() - (input.days ?? 30));
79
+ startDate = isoDate(start);
80
+ }
81
+ return reporter.summary({ startDate, endDate, ...(input.groupBy ? { groupBy: input.groupBy } : {}) });
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=consumption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumption.js","sourceRoot":"","sources":["../src/consumption.ts"],"names":[],"mappings":"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"}
@@ -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"}