@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,45 @@
1
+ import type { AgentProfile, AgentTriggers, DefinedAgent, JsonObject, ModelProvider, SandboxBackend, Schema, Skill, ToolDef } from '@fabric-harness/sdk';
2
+ import type { CapabilityPolicy, CostLimit, ApprovalOptions } from '@fabric-harness/sdk';
3
+ import type { DatabricksBundle, DatabricksBundleConfig } from './index.js';
4
+ export interface DatabricksAgentOptions {
5
+ name?: string;
6
+ description?: string;
7
+ instructions?: string;
8
+ input?: Schema<JsonObject>;
9
+ output?: Schema<unknown>;
10
+ model?: string;
11
+ target?: 'node' | 'temporal-worker';
12
+ skills?: Skill[];
13
+ triggers?: AgentTriggers;
14
+ databricks: DatabricksBundleConfig;
15
+ modelProvider?: ModelProvider;
16
+ tools?: ToolDef[] | string[];
17
+ sandbox?: SandboxBackend;
18
+ profile?: AgentProfile;
19
+ policy?: CapabilityPolicy;
20
+ costBudget?: CostLimit;
21
+ approvals?: ApprovalOptions;
22
+ }
23
+ export interface DefineDatabricksAgentOptions {
24
+ name?: string;
25
+ description?: string;
26
+ instructions?: string;
27
+ input?: Schema<JsonObject>;
28
+ output?: Schema<unknown>;
29
+ model?: string;
30
+ target?: 'node' | 'temporal-worker';
31
+ skills?: Skill[];
32
+ triggers?: AgentTriggers;
33
+ databricks?: DatabricksBundleConfig;
34
+ modelProvider?: ModelProvider;
35
+ tools?: ToolDef[] | string[];
36
+ sandbox?: SandboxBackend;
37
+ profile?: AgentProfile;
38
+ policy?: CapabilityPolicy;
39
+ costBudget?: CostLimit;
40
+ approvals?: ApprovalOptions;
41
+ }
42
+ export declare function databricksAgent(options: DatabricksAgentOptions): DefinedAgent<JsonObject, unknown>;
43
+ export declare function defineDatabricksAgent(options?: DefineDatabricksAgentOptions): DefinedAgent<JsonObject, unknown>;
44
+ export declare function resolveToolRefs(bundle: DatabricksBundle, refs: string[]): ToolDef[];
45
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,aAAa,EAAE,YAAY,EAAiB,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACxL,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAExF,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAI3E,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACpC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,sBAAsB,CAAC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACpC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAuGD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAElG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,4BAA4B,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAuE/G;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAgCnF"}
package/dist/agent.js ADDED
@@ -0,0 +1,206 @@
1
+ import { agent } from '@fabric-harness/sdk/strict';
2
+ import { databricks } from './index.js';
3
+ function resolveTools(bundle, tools) {
4
+ if (!tools)
5
+ return [];
6
+ const stringTools = tools.filter((t) => typeof t === 'string');
7
+ const toolDefs = tools.filter((t) => typeof t !== 'string');
8
+ if (stringTools.length > 0) {
9
+ const resolved = resolveToolRefs(bundle, stringTools);
10
+ return [...resolved, ...toolDefs];
11
+ }
12
+ return toolDefs;
13
+ }
14
+ function mergeProfile(options) {
15
+ const profile = options?.profile;
16
+ if (!profile)
17
+ return {};
18
+ return {
19
+ ...(profile.name !== undefined ? { name: profile.name } : {}),
20
+ ...(profile.description !== undefined ? { description: profile.description } : {}),
21
+ ...(profile.instructions !== undefined ? { instructions: profile.instructions } : {}),
22
+ ...(profile.model !== undefined ? { model: profile.model } : {}),
23
+ ...(profile.skills !== undefined ? { skills: profile.skills } : {}),
24
+ ...(profile.tools !== undefined ? { tools: profile.tools } : {}),
25
+ ...(profile.policy !== undefined ? { policy: profile.policy } : {}),
26
+ ...(profile.costBudget !== undefined ? { costBudget: profile.costBudget } : {}),
27
+ ...(profile.approvals !== undefined ? { approvals: profile.approvals } : {}),
28
+ ...(profile.sandbox !== undefined ? { sandbox: profile.sandbox } : {}),
29
+ };
30
+ }
31
+ function mergeOptions(options) {
32
+ const profile = mergeProfile(options);
33
+ return {
34
+ ...profile,
35
+ ...options,
36
+ ...(profile.skills || options.skills ? { skills: [...(profile.skills ?? []), ...(options.skills ?? [])] } : {}),
37
+ ...(profile.tools || options.tools ? { tools: [...(profile.tools ?? []), ...(options.tools ?? [])] } : {}),
38
+ };
39
+ }
40
+ /**
41
+ * Shared run body for both `databricksAgent` and `defineDatabricksAgent`. Threads the bundle's
42
+ * UC-principal model provider through by default — env-driven agents get the Databricks
43
+ * foundation model unless an explicit provider is supplied (or `--mock` overrides it upstream).
44
+ */
45
+ async function runWithBundle(context, bundle, options) {
46
+ const extraTools = resolveTools(bundle, options.tools);
47
+ const agent = await context.init({
48
+ modelProvider: options.modelProvider ?? bundle.modelProvider,
49
+ tools: [...bundle.tools, ...extraTools],
50
+ policy: bundle.policy,
51
+ ...(bundle.store ? { store: bundle.store } : {}),
52
+ ...(options.skills ? { skills: options.skills } : {}),
53
+ ...(options.sandbox ? { sandbox: options.sandbox } : {}),
54
+ });
55
+ const session = await agent.session();
56
+ const question = context.input?.question ?? 'What would you like to know?';
57
+ return session.prompt(question);
58
+ }
59
+ function buildAgentDefinition(options) {
60
+ const merged = mergeOptions(options);
61
+ const bundle = databricks(merged.databricks);
62
+ const def = {
63
+ run: (context) => runWithBundle(context, bundle, {
64
+ ...(merged.modelProvider ? { modelProvider: merged.modelProvider } : {}),
65
+ ...(merged.tools ? { tools: merged.tools } : {}),
66
+ ...(merged.skills ? { skills: merged.skills } : {}),
67
+ ...(merged.sandbox ? { sandbox: merged.sandbox } : {}),
68
+ }),
69
+ };
70
+ if (merged.name !== undefined)
71
+ def.name = merged.name;
72
+ if (merged.description !== undefined)
73
+ def.description = merged.description;
74
+ if (merged.instructions !== undefined)
75
+ def.instructions = merged.instructions;
76
+ if (merged.input !== undefined)
77
+ def.input = merged.input;
78
+ if (merged.output !== undefined)
79
+ def.output = merged.output;
80
+ if (merged.model !== undefined)
81
+ def.model = merged.model;
82
+ if (merged.target !== undefined)
83
+ def.target = merged.target;
84
+ if (merged.skills !== undefined)
85
+ def.skills = merged.skills;
86
+ if (merged.triggers !== undefined)
87
+ def.triggers = merged.triggers;
88
+ if (merged.policy !== undefined)
89
+ def.policy = merged.policy;
90
+ if (merged.costBudget !== undefined)
91
+ def.costBudget = merged.costBudget;
92
+ if (merged.approvals !== undefined)
93
+ def.approvals = merged.approvals;
94
+ return def;
95
+ }
96
+ export function databricksAgent(options) {
97
+ return agent(buildAgentDefinition(options));
98
+ }
99
+ export function defineDatabricksAgent(options) {
100
+ const merged = options ? mergeOptions(options) : {};
101
+ const def = {
102
+ run: async (context) => {
103
+ // If explicit databricks config is provided, use it directly
104
+ if (merged.databricks) {
105
+ const bundle = databricks(merged.databricks);
106
+ return runWithBundle(context, bundle, {
107
+ ...(merged.modelProvider ? { modelProvider: merged.modelProvider } : {}),
108
+ ...(merged.tools ? { tools: merged.tools } : {}),
109
+ ...(merged.skills ? { skills: merged.skills } : {}),
110
+ ...(merged.sandbox ? { sandbox: merged.sandbox } : {}),
111
+ });
112
+ }
113
+ // Otherwise, read from env (or use a dummy config in mock mode)
114
+ const env = context.env ?? {};
115
+ const host = env.DATABRICKS_HOST;
116
+ if (!host && env.FABRIC_MOCK !== '1') {
117
+ throw new Error('Missing DATABRICKS_HOST environment variable. Set it or pass an explicit databricks config.');
118
+ }
119
+ const token = env.DATABRICKS_TOKEN;
120
+ const clientId = env.DATABRICKS_CLIENT_ID;
121
+ const clientSecret = env.DATABRICKS_CLIENT_SECRET;
122
+ if (!token && !(clientId && clientSecret) && env.FABRIC_MOCK !== '1') {
123
+ throw new Error('Missing Databricks credentials. Set DATABRICKS_TOKEN or both DATABRICKS_CLIENT_ID and DATABRICKS_CLIENT_SECRET.');
124
+ }
125
+ // In real mode the relevant fields are guaranteed by the guards above; in mock mode this
126
+ // principal is discarded (FABRIC_MOCK overrides it below), so empty-string fallbacks are safe.
127
+ const principal = token
128
+ ? { kind: 'pat', token }
129
+ : { kind: 'service-principal', host: host ?? '', clientId: clientId ?? '', clientSecret: clientSecret ?? '' };
130
+ const config = {
131
+ host: host ?? 'https://mock.databricks.com',
132
+ principal: env.FABRIC_MOCK === '1' ? { kind: 'pat', token: 'mock-token' } : principal,
133
+ ...(env.DATABRICKS_MODEL ? { model: env.DATABRICKS_MODEL } : {}),
134
+ ...(env.DATABRICKS_WAREHOUSE_ID ? { warehouseId: env.DATABRICKS_WAREHOUSE_ID } : {}),
135
+ ...(env.FABRIC_MOCK === '1' ? { warehouseId: 'mock-warehouse-id' } : {}),
136
+ };
137
+ const bundle = databricks(config);
138
+ // Default to the bundle's UC-principal Databricks foundation model so env-driven agents
139
+ // actually consume the Databricks serving endpoint. `--mock` overrides this upstream
140
+ // (see packages/node/src/run.ts), and an explicit modelProvider still wins.
141
+ return runWithBundle(context, bundle, {
142
+ ...(merged.modelProvider ? { modelProvider: merged.modelProvider } : {}),
143
+ ...(merged.tools ? { tools: merged.tools } : {}),
144
+ ...(merged.skills ? { skills: merged.skills } : {}),
145
+ ...(merged.sandbox ? { sandbox: merged.sandbox } : {}),
146
+ });
147
+ },
148
+ };
149
+ if (merged.name !== undefined)
150
+ def.name = merged.name;
151
+ if (merged.description !== undefined)
152
+ def.description = merged.description;
153
+ if (merged.instructions !== undefined)
154
+ def.instructions = merged.instructions;
155
+ if (merged.input !== undefined)
156
+ def.input = merged.input;
157
+ if (merged.output !== undefined)
158
+ def.output = merged.output;
159
+ if (merged.model !== undefined)
160
+ def.model = merged.model;
161
+ if (merged.target !== undefined)
162
+ def.target = merged.target;
163
+ if (merged.skills !== undefined)
164
+ def.skills = merged.skills;
165
+ if (merged.triggers !== undefined)
166
+ def.triggers = merged.triggers;
167
+ if (merged.policy !== undefined)
168
+ def.policy = merged.policy;
169
+ if (merged.costBudget !== undefined)
170
+ def.costBudget = merged.costBudget;
171
+ if (merged.approvals !== undefined)
172
+ def.approvals = merged.approvals;
173
+ return agent(def);
174
+ }
175
+ export function resolveToolRefs(bundle, refs) {
176
+ const toolMap = new Map();
177
+ for (const tool of bundle.tools) {
178
+ toolMap.set(tool.name, tool);
179
+ }
180
+ const shortNameMap = {
181
+ 'sql': 'databricks_sql',
182
+ 'tables': 'databricks_unity_catalog_tables',
183
+ 'table-info': 'databricks_table_info',
184
+ 'search': 'search',
185
+ 'ai-query': 'databricks_ai_query',
186
+ 'genie': 'databricks_genie_ask',
187
+ 'lakeflow-list': 'databricks_pipeline_list',
188
+ 'lakeflow-status': 'databricks_pipeline_status',
189
+ 'lakeflow-start': 'databricks_pipeline_start',
190
+ 'lakeflow-stop': 'databricks_pipeline_stop',
191
+ 'consumption': 'databricks_consumption',
192
+ 'feature-lookup': 'databricks_feature_lookup',
193
+ };
194
+ const result = [];
195
+ for (const ref of refs) {
196
+ const fullName = shortNameMap[ref] ?? ref;
197
+ const tool = toolMap.get(fullName);
198
+ if (!tool) {
199
+ const available = [...toolMap.keys()].join(', ');
200
+ throw new Error(`Unknown tool reference "${ref}". Available tools: ${available}`);
201
+ }
202
+ result.push(tool);
203
+ }
204
+ return result;
205
+ }
206
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/ai.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import type { ToolDef } from '@fabric-harness/sdk';
2
+ import type { DatabricksRestClient } from './client.js';
3
+ export interface DatabricksAiQueryToolOptions {
4
+ warehouseId: string;
5
+ name?: string;
6
+ description?: string;
7
+ pollIntervalMs?: number;
8
+ timeoutMs?: number;
9
+ }
10
+ /**
11
+ * `ai_query(endpoint, request)` — run model inference inside the SQL warehouse against a serving
12
+ * endpoint. Drives both serving and SQL-warehouse consumption. Uses named SQL parameters, so the
13
+ * endpoint and request are never string-interpolated into SQL.
14
+ */
15
+ export declare function databricksAiQueryTool(client: DatabricksRestClient, options: DatabricksAiQueryToolOptions): ToolDef<{
16
+ endpoint: string;
17
+ request: string;
18
+ }, unknown>;
19
+ //# sourceMappingURL=ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGxD,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,CAAC,CAoBlK"}
package/dist/ai.js ADDED
@@ -0,0 +1,22 @@
1
+ import { runStatement } from './sql-exec.js';
2
+ /**
3
+ * `ai_query(endpoint, request)` — run model inference inside the SQL warehouse against a serving
4
+ * endpoint. Drives both serving and SQL-warehouse consumption. Uses named SQL parameters, so the
5
+ * endpoint and request are never string-interpolated into SQL.
6
+ */
7
+ export function databricksAiQueryTool(client, options) {
8
+ const poll = { intervalMs: options.pollIntervalMs ?? 2000, timeoutMs: options.timeoutMs ?? 120_000 };
9
+ return {
10
+ name: options.name ?? 'databricks_ai_query',
11
+ description: options.description ?? 'Run model inference inside the SQL warehouse via ai_query() against a Databricks serving endpoint.',
12
+ inputSchema: {
13
+ type: 'object',
14
+ additionalProperties: false,
15
+ properties: { endpoint: { type: 'string' }, request: { type: 'string' } },
16
+ required: ['endpoint', 'request'],
17
+ },
18
+ metadata: { effect: 'execute', provider: 'databricks', service: 'ai-functions' },
19
+ execute: (input) => runStatement(client, options.warehouseId, 'SELECT ai_query(:endpoint, :request) AS result', [{ name: 'endpoint', value: input.endpoint }, { name: 'request', value: input.request }], poll),
20
+ };
21
+ }
22
+ //# sourceMappingURL=ai.js.map
package/dist/ai.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAU7C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA4B,EAAE,OAAqC;IACvG,MAAM,IAAI,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,EAAE,CAAC;IACrG,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,qBAAqB;QAC3C,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,oGAAoG;QACxI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACzE,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;SAClC;QACD,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE;QAChF,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAC9B,MAAM,EACN,OAAO,CAAC,WAAW,EACnB,gDAAgD,EAChD,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EACxF,IAAI,CACL;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,37 @@
1
+ export interface DatabricksClientOptions {
2
+ host: string;
3
+ token: string | (() => string | Promise<string>);
4
+ fetchImpl?: typeof fetch;
5
+ /**
6
+ * Retries *after* the initial request for transient failures (429/5xx/network). Default 3, i.e.
7
+ * up to 4 total attempts. This is a best-effort transport-level retry, NOT an idempotency
8
+ * mechanism: non-idempotent POSTs (e.g. `/sql/statements`, `/jobs/run-now`) can duplicate work if
9
+ * a request actually reached the server before failing. Set `maxRetries: 0` to disable, or use
10
+ * Databricks' own idempotency tokens where the API supports them.
11
+ */
12
+ maxRetries?: number;
13
+ /** Base backoff in ms (exponential per attempt; `Retry-After` honored when present). Default 500. */
14
+ retryBaseDelayMs?: number;
15
+ /** Abort signal forwarded to every request. */
16
+ signal?: AbortSignal;
17
+ }
18
+ export declare class DatabricksRestClient {
19
+ private readonly host;
20
+ private readonly token;
21
+ private readonly fetchImpl;
22
+ private readonly maxRetries;
23
+ private readonly retryBaseDelayMs;
24
+ private readonly signal;
25
+ constructor(options: DatabricksClientOptions);
26
+ get<T>(path: string, query?: Record<string, string | number | boolean | undefined>): Promise<T>;
27
+ post<T>(path: string, body?: unknown, query?: Record<string, string | number | boolean | undefined>): Promise<T>;
28
+ request<T>(method: string, path: string, body?: unknown, query?: Record<string, string | number | boolean | undefined>): Promise<T>;
29
+ }
30
+ export declare function createDatabricksClient(options: DatabricksClientOptions): DatabricksRestClient;
31
+ export interface DatabricksWaitOptions {
32
+ pollIntervalMs?: number;
33
+ timeoutMs?: number;
34
+ }
35
+ export declare function waitForDatabricksRun(client: DatabricksRestClient, runId: number, options?: DatabricksWaitOptions): Promise<Record<string, unknown>>;
36
+ export declare function waitForDatabricksStatement(client: DatabricksRestClient, statementId: string, options?: DatabricksWaitOptions): Promise<Record<string, unknown>>;
37
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAeD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;gBAErC,OAAO,EAAE,uBAAuB;IAS5C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI/F,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1G,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAyC9I;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,oBAAoB,CAE7F;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAS7J;AAED,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASzK"}
package/dist/client.js ADDED
@@ -0,0 +1,110 @@
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
+ constructor(options) {
22
+ this.host = options.host.replace(/\/$/, '');
23
+ this.token = options.token;
24
+ this.fetchImpl = options.fetchImpl ?? fetch;
25
+ this.maxRetries = options.maxRetries ?? 3;
26
+ this.retryBaseDelayMs = options.retryBaseDelayMs ?? 500;
27
+ this.signal = options.signal;
28
+ }
29
+ get(path, query) {
30
+ return this.request('GET', path, undefined, query);
31
+ }
32
+ post(path, body, query) {
33
+ return this.request('POST', path, body, query);
34
+ }
35
+ async request(method, path, body, query = {}) {
36
+ const url = new URL(`${this.host}${path.startsWith('/') ? path : `/${path}`}`);
37
+ for (const [key, value] of Object.entries(query))
38
+ if (value !== undefined)
39
+ url.searchParams.set(key, String(value));
40
+ for (let attempt = 0;; attempt += 1) {
41
+ // Resolve the (possibly rotating) token on every attempt.
42
+ const token = typeof this.token === 'function' ? await this.token() : this.token;
43
+ const init = {
44
+ method,
45
+ headers: {
46
+ authorization: `Bearer ${token}`,
47
+ ...(body !== undefined ? { 'content-type': 'application/json' } : {}),
48
+ },
49
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
50
+ ...(this.signal ? { signal: this.signal } : {}),
51
+ };
52
+ let response;
53
+ try {
54
+ response = await this.fetchImpl(url, init);
55
+ }
56
+ catch (error) {
57
+ // Network error — retry transient failures, but never swallow an abort.
58
+ if (this.signal?.aborted || attempt >= this.maxRetries)
59
+ throw error;
60
+ await new Promise((resolve) => setTimeout(resolve, this.retryBaseDelayMs * 2 ** attempt));
61
+ continue;
62
+ }
63
+ if (response.ok) {
64
+ if (response.status === 204)
65
+ return undefined;
66
+ return await response.json();
67
+ }
68
+ if (isRetryableStatus(response.status) && attempt < this.maxRetries) {
69
+ await new Promise((resolve) => setTimeout(resolve, retryDelayMs(response, attempt, this.retryBaseDelayMs)));
70
+ continue;
71
+ }
72
+ const text = redactText(await response.text(), { additionalSecrets: [token] });
73
+ throw new Error(`databricks: ${response.status} ${response.statusText}: ${text.slice(0, 2000)}`);
74
+ }
75
+ }
76
+ }
77
+ export function createDatabricksClient(options) {
78
+ return new DatabricksRestClient(options);
79
+ }
80
+ export async function waitForDatabricksRun(client, runId, options = {}) {
81
+ const deadline = Date.now() + (options.timeoutMs ?? 600_000);
82
+ const interval = options.pollIntervalMs ?? 5_000;
83
+ let current = await client.get('/api/2.1/jobs/runs/get', { run_id: runId });
84
+ while (!isTerminalDatabricksRunState(current) && Date.now() < deadline) {
85
+ await new Promise((resolve) => setTimeout(resolve, interval));
86
+ current = await client.get('/api/2.1/jobs/runs/get', { run_id: runId });
87
+ }
88
+ return current;
89
+ }
90
+ export async function waitForDatabricksStatement(client, statementId, options = {}) {
91
+ const deadline = Date.now() + (options.timeoutMs ?? 300_000);
92
+ const interval = options.pollIntervalMs ?? 2_000;
93
+ let current = await client.get(`/api/2.0/sql/statements/${encodeURIComponent(statementId)}`);
94
+ while (!isTerminalDatabricksStatementState(current) && Date.now() < deadline) {
95
+ await new Promise((resolve) => setTimeout(resolve, interval));
96
+ current = await client.get(`/api/2.0/sql/statements/${encodeURIComponent(statementId)}`);
97
+ }
98
+ return current;
99
+ }
100
+ function isTerminalDatabricksRunState(run) {
101
+ const state = run.state;
102
+ const lifeCycle = state?.life_cycle_state;
103
+ return lifeCycle === 'TERMINATED' || lifeCycle === 'SKIPPED' || lifeCycle === 'INTERNAL_ERROR';
104
+ }
105
+ function isTerminalDatabricksStatementState(statement) {
106
+ const status = statement.status;
107
+ const state = status?.state;
108
+ return state === 'SUCCEEDED' || state === 'FAILED' || state === 'CANCELED' || state === 'CLOSED';
109
+ }
110
+ //# 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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"}