@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.
- package/dist/agent.d.ts +45 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +206 -0
- package/dist/agent.js.map +1 -0
- package/dist/ai.d.ts +19 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +22 -0
- package/dist/ai.js.map +1 -0
- package/dist/app.d.ts +81 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +87 -0
- package/dist/app.js.map +1 -0
- package/dist/client.d.ts +44 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +114 -0
- package/dist/client.js.map +1 -0
- package/dist/consumption.d.ts +45 -0
- package/dist/consumption.d.ts.map +1 -0
- package/dist/consumption.js +85 -0
- package/dist/consumption.js.map +1 -0
- package/dist/cost-budget-actuals.d.ts +27 -0
- package/dist/cost-budget-actuals.d.ts.map +1 -0
- package/dist/cost-budget-actuals.js +265 -0
- package/dist/cost-budget-actuals.js.map +1 -0
- package/dist/embeddings.d.ts +18 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +24 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/feature-serving.d.ts +17 -0
- package/dist/feature-serving.d.ts.map +1 -0
- package/dist/feature-serving.js +29 -0
- package/dist/feature-serving.js.map +1 -0
- package/dist/genie.d.ts +22 -0
- package/dist/genie.d.ts.map +1 -0
- package/dist/genie.js +60 -0
- package/dist/genie.js.map +1 -0
- package/dist/governance.d.ts +70 -0
- package/dist/governance.d.ts.map +1 -0
- package/dist/governance.js +123 -0
- package/dist/governance.js.map +1 -0
- package/dist/identity.d.ts +72 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +119 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +143 -80
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +111 -227
- package/dist/index.js.map +1 -1
- package/dist/lakebase.d.ts +49 -0
- package/dist/lakebase.d.ts.map +1 -0
- package/dist/lakebase.js +25 -0
- package/dist/lakebase.js.map +1 -0
- package/dist/lakeflow.d.ts +28 -0
- package/dist/lakeflow.d.ts.map +1 -0
- package/dist/lakeflow.js +75 -0
- package/dist/lakeflow.js.map +1 -0
- package/dist/mlflow-tracing.d.ts +111 -0
- package/dist/mlflow-tracing.d.ts.map +1 -0
- package/dist/mlflow-tracing.js +167 -0
- package/dist/mlflow-tracing.js.map +1 -0
- package/dist/mock-provider.d.ts +26 -0
- package/dist/mock-provider.d.ts.map +1 -0
- package/dist/mock-provider.js +66 -0
- package/dist/mock-provider.js.map +1 -0
- package/dist/model.d.ts +29 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +50 -0
- package/dist/model.js.map +1 -0
- package/dist/persistence.d.ts +73 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +82 -0
- package/dist/persistence.js.map +1 -0
- package/dist/serving-usage.d.ts +48 -0
- package/dist/serving-usage.d.ts.map +1 -0
- package/dist/serving-usage.js +100 -0
- package/dist/serving-usage.js.map +1 -0
- package/dist/sql-exec.d.ts +17 -0
- package/dist/sql-exec.d.ts.map +1 -0
- package/dist/sql-exec.js +36 -0
- package/dist/sql-exec.js.map +1 -0
- package/dist/sql-sandbox.d.ts +1 -1
- package/dist/sql-sandbox.d.ts.map +1 -1
- package/dist/sql-sandbox.js +1 -1
- package/dist/sql-sandbox.js.map +1 -1
- package/dist/telemetry-sink.d.ts +29 -0
- package/dist/telemetry-sink.d.ts.map +1 -0
- package/dist/telemetry-sink.js +129 -0
- package/dist/telemetry-sink.js.map +1 -0
- package/dist/tools.d.ts +71 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +176 -0
- package/dist/tools.js.map +1 -0
- package/dist/vector-search.d.ts +24 -0
- package/dist/vector-search.d.ts.map +1 -0
- package/dist/vector-search.js +63 -0
- package/dist/vector-search.js.map +1 -0
- package/dist/volumes-attachment-store.d.ts +64 -0
- package/dist/volumes-attachment-store.d.ts.map +1 -0
- package/dist/volumes-attachment-store.js +172 -0
- package/dist/volumes-attachment-store.js.map +1 -0
- package/package.json +20 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-provider.js","sourceRoot":"","sources":["../src/mock-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/model.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ModelProvider } from '@fabric-harness/sdk';
|
|
2
|
+
export interface DatabricksModelOptions {
|
|
3
|
+
/** Workspace host, e.g. https://adb-1234567890.0.cloud.databricks.com */
|
|
4
|
+
host: string;
|
|
5
|
+
/**
|
|
6
|
+
* Bearer token, or a resolver awaited per request. Pass a resolver for OAuth principal tokens
|
|
7
|
+
* (service-principal / on-behalf-of) so long-lived agents don't pin a stale token.
|
|
8
|
+
*/
|
|
9
|
+
token: string | (() => string | Promise<string>);
|
|
10
|
+
/** Serving-endpoint name used when a request doesn't specify a model. */
|
|
11
|
+
defaultModel?: string;
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Mosaic AI Model Serving provider. Databricks serving endpoints expose an OpenAI-compatible chat
|
|
16
|
+
* API at `<host>/serving-endpoints/chat/completions` with the endpoint name carried as the `model`
|
|
17
|
+
* field, so this is a thin configuration of {@link OpenAICompatibleModelProvider} — streaming,
|
|
18
|
+
* tool-calls and reasoning effort come for free.
|
|
19
|
+
*/
|
|
20
|
+
export declare function databricksFoundationModelProvider(options: DatabricksModelOptions): ModelProvider;
|
|
21
|
+
/**
|
|
22
|
+
* Register `databricks/<endpoint>` and `mosaic-ai/<endpoint>` model refs so they resolve via
|
|
23
|
+
* `FABRIC_MODEL` / `init({ model })`. Idempotent. Call this explicitly (the `databricks()` bundle
|
|
24
|
+
* does it for you) — registration is NOT an import side-effect, since the package is `sideEffects:
|
|
25
|
+
* false` and a self-registering import could be tree-shaken. Credentials are read from
|
|
26
|
+
* `providers.databricks` then env (`DATABRICKS_HOST`, `DATABRICKS_TOKEN`/`DATABRICKS_API_KEY`).
|
|
27
|
+
*/
|
|
28
|
+
export declare function registerDatabricksModelProvider(): void;
|
|
29
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,qBAAqB,CAAC;AAE/E,MAAM,WAAW,sBAAsB;IACrC,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,sBAAsB,GAAG,aAAa,CAUhG;AAmBD;;;;;;GAMG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD"}
|
package/dist/model.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { OpenAICompatibleModelProvider, registerModelProvider } from '@fabric-harness/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Mosaic AI Model Serving provider. Databricks serving endpoints expose an OpenAI-compatible chat
|
|
4
|
+
* API at `<host>/serving-endpoints/chat/completions` with the endpoint name carried as the `model`
|
|
5
|
+
* field, so this is a thin configuration of {@link OpenAICompatibleModelProvider} — streaming,
|
|
6
|
+
* tool-calls and reasoning effort come for free.
|
|
7
|
+
*/
|
|
8
|
+
export function databricksFoundationModelProvider(options) {
|
|
9
|
+
const baseUrl = `${options.host.replace(/\/$/, '')}/serving-endpoints`;
|
|
10
|
+
return new OpenAICompatibleModelProvider({
|
|
11
|
+
name: 'databricks',
|
|
12
|
+
baseUrl,
|
|
13
|
+
apiKey: typeof options.token === 'string' ? options.token : '',
|
|
14
|
+
...(typeof options.token === 'function' ? { tokenProvider: options.token } : {}),
|
|
15
|
+
...(options.defaultModel !== undefined ? { defaultModel: options.defaultModel } : {}),
|
|
16
|
+
...(options.headers !== undefined ? { headers: options.headers } : {}),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const factory = (parsed, providers, env, warnings) => {
|
|
20
|
+
const settings = providers?.databricks ?? providers?.['mosaic-ai'];
|
|
21
|
+
const host = settings?.baseUrl ?? env.DATABRICKS_HOST;
|
|
22
|
+
if (!host)
|
|
23
|
+
throw new Error('Missing Databricks host. Set DATABRICKS_HOST or providers.databricks.baseUrl.');
|
|
24
|
+
const token = settings?.apiKey?.trim() || env[settings?.apiKeyEnv ?? 'DATABRICKS_TOKEN']?.trim() || env.DATABRICKS_API_KEY?.trim();
|
|
25
|
+
if (!token)
|
|
26
|
+
throw new Error('Missing Databricks token. Set DATABRICKS_TOKEN or providers.databricks.apiKey/apiKeyEnv.');
|
|
27
|
+
return {
|
|
28
|
+
model: parsed.modelId,
|
|
29
|
+
provider: databricksFoundationModelProvider({ host, token, defaultModel: parsed.modelId }),
|
|
30
|
+
providerName: 'databricks',
|
|
31
|
+
modelId: parsed.modelId,
|
|
32
|
+
warnings,
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
let registered = false;
|
|
36
|
+
/**
|
|
37
|
+
* Register `databricks/<endpoint>` and `mosaic-ai/<endpoint>` model refs so they resolve via
|
|
38
|
+
* `FABRIC_MODEL` / `init({ model })`. Idempotent. Call this explicitly (the `databricks()` bundle
|
|
39
|
+
* does it for you) — registration is NOT an import side-effect, since the package is `sideEffects:
|
|
40
|
+
* false` and a self-registering import could be tree-shaken. Credentials are read from
|
|
41
|
+
* `providers.databricks` then env (`DATABRICKS_HOST`, `DATABRICKS_TOKEN`/`DATABRICKS_API_KEY`).
|
|
42
|
+
*/
|
|
43
|
+
export function registerDatabricksModelProvider() {
|
|
44
|
+
if (registered)
|
|
45
|
+
return;
|
|
46
|
+
registered = true;
|
|
47
|
+
registerModelProvider('databricks', factory);
|
|
48
|
+
registerModelProvider('mosaic-ai', factory);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAgB3F;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,OAA+B;IAC/E,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC;IACvE,OAAO,IAAI,6BAA6B,CAAC;QACvC,IAAI,EAAE,YAAY;QAClB,OAAO;QACP,MAAM,EAAE,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC9D,GAAG,CAAC,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,GAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;IACzE,MAAM,QAAQ,GAAG,SAAS,EAAE,UAAU,IAAI,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,QAAQ,EAAE,OAAO,IAAI,GAAG,CAAC,eAAe,CAAC;IACtD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,SAAS,IAAI,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACnI,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;IACxH,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,OAAO;QACrB,QAAQ,EAAE,iCAAiC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1F,YAAY,EAAE,YAAY;QAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC;AAEF,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B;IAC7C,IAAI,UAAU;QAAE,OAAO;IACvB,UAAU,GAAG,IAAI,CAAC;IAClB,qBAAqB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7C,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { AgentSubmissionStore, ConversationStreamStore, PersistenceAdapter, SessionStore } from '@fabric-harness/sdk';
|
|
2
|
+
import type { LakebaseClient, LakebaseClientOptions } from './lakebase.js';
|
|
3
|
+
/**
|
|
4
|
+
* The slice of `@fabric-harness/node` this adapter assembles. Loaded
|
|
5
|
+
* dynamically (node is an optional peer — Databricks Apps always run on
|
|
6
|
+
* Node, but this package stays importable without it); injectable for tests.
|
|
7
|
+
*/
|
|
8
|
+
export interface DatabricksPersistenceStoreModule {
|
|
9
|
+
PostgresSessionStore: new (options: {
|
|
10
|
+
client: LakebaseClient;
|
|
11
|
+
initialize?: boolean;
|
|
12
|
+
}) => SessionStore;
|
|
13
|
+
PostgresSubmissionStore: new (options: {
|
|
14
|
+
client: LakebaseClient;
|
|
15
|
+
initialize?: boolean;
|
|
16
|
+
}) => AgentSubmissionStore;
|
|
17
|
+
PostgresConversationStreamStore: new (options: {
|
|
18
|
+
client: LakebaseClient;
|
|
19
|
+
initialize?: boolean;
|
|
20
|
+
}) => ConversationStreamStore;
|
|
21
|
+
ensurePostgresSubmissionTables(client: LakebaseClient): Promise<void>;
|
|
22
|
+
ensurePostgresConversationStreamTables(client: LakebaseClient): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export interface DatabricksPersistenceOptions {
|
|
25
|
+
/**
|
|
26
|
+
* Lakebase connection options (rotating-OAuth `token` supported), or an
|
|
27
|
+
* already-constructed client to reuse.
|
|
28
|
+
*/
|
|
29
|
+
lakebase: LakebaseClientOptions | LakebaseClient;
|
|
30
|
+
/** Override the `@fabric-harness/node` loader (tests / bundlers). */
|
|
31
|
+
loadStores?: () => Promise<DatabricksPersistenceStoreModule>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Everything the v2 runtime persists, on Lakebase, in one adapter:
|
|
35
|
+
* sessions (canonical conversation state), durable agent submissions
|
|
36
|
+
* (admission/FIFO/leases/settlement), and offset-addressable conversation
|
|
37
|
+
* streams. Implements the SDK {@link PersistenceAdapter} contract, so it
|
|
38
|
+
* plugs straight into `init({ persistence })`; the extra `connect*` methods
|
|
39
|
+
* feed `startDevServer({ submissionStore, conversationStreamStore })`.
|
|
40
|
+
*/
|
|
41
|
+
export interface DatabricksPersistence extends PersistenceAdapter {
|
|
42
|
+
readonly client: LakebaseClient;
|
|
43
|
+
connect(): Promise<SessionStore>;
|
|
44
|
+
connectSubmissionStore(): Promise<AgentSubmissionStore>;
|
|
45
|
+
connectConversationStreamStore(): Promise<ConversationStreamStore>;
|
|
46
|
+
/** All three stores in one call (server wiring convenience). */
|
|
47
|
+
connectAll(): Promise<{
|
|
48
|
+
store: SessionStore;
|
|
49
|
+
submissionStore: AgentSubmissionStore;
|
|
50
|
+
conversationStreamStore: ConversationStreamStore;
|
|
51
|
+
}>;
|
|
52
|
+
/** Idempotent schema setup for every store (CREATE TABLE IF NOT EXISTS). */
|
|
53
|
+
migrate(): Promise<void>;
|
|
54
|
+
close(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* One-call Lakebase persistence for Databricks-hosted agents.
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* const persistence = databricksPersistence({
|
|
61
|
+
* lakebase: { host, database: 'fabric', user: clientId, token: identity },
|
|
62
|
+
* });
|
|
63
|
+
* const { store, submissionStore, conversationStreamStore } = await persistence.connectAll();
|
|
64
|
+
* await startDevServer({ submissionStore, conversationStreamStore });
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* The Postgres store implementations come from `@fabric-harness/node`
|
|
68
|
+
* (optional peer) and run unchanged against Lakebase — the only Databricks
|
|
69
|
+
* specifics are the rotating-token pool and TLS defaults from
|
|
70
|
+
* {@link lakebaseClient}.
|
|
71
|
+
*/
|
|
72
|
+
export declare function databricksPersistence(options: DatabricksPersistenceOptions): DatabricksPersistence;
|
|
73
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE3E;;;;GAIG;AACH,MAAM,WAAW,gCAAgC;IAC/C,oBAAoB,EAAE,KAAK,OAAO,EAAE;QAAE,MAAM,EAAE,cAAc,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,YAAY,CAAC;IACtG,uBAAuB,EAAE,KAAK,OAAO,EAAE;QAAE,MAAM,EAAE,cAAc,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,oBAAoB,CAAC;IACjH,+BAA+B,EAAE,KAAK,OAAO,EAAE;QAAE,MAAM,EAAE,cAAc,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,uBAAuB,CAAC;IAC5H,8BAA8B,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,sCAAsC,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,QAAQ,EAAE,qBAAqB,GAAG,cAAc,CAAC;IACjD,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,gCAAgC,CAAC,CAAC;CAC9D;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IACjC,sBAAsB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxD,8BAA8B,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACnE,gEAAgE;IAChE,UAAU,IAAI,OAAO,CAAC;QACpB,KAAK,EAAE,YAAY,CAAC;QACpB,eAAe,EAAE,oBAAoB,CAAC;QACtC,uBAAuB,EAAE,uBAAuB,CAAC;KAClD,CAAC,CAAC;IACH,4EAA4E;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,qBAAqB,CA2DlG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { lakebaseClient } from './lakebase.js';
|
|
2
|
+
/**
|
|
3
|
+
* One-call Lakebase persistence for Databricks-hosted agents.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* const persistence = databricksPersistence({
|
|
7
|
+
* lakebase: { host, database: 'fabric', user: clientId, token: identity },
|
|
8
|
+
* });
|
|
9
|
+
* const { store, submissionStore, conversationStreamStore } = await persistence.connectAll();
|
|
10
|
+
* await startDevServer({ submissionStore, conversationStreamStore });
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* The Postgres store implementations come from `@fabric-harness/node`
|
|
14
|
+
* (optional peer) and run unchanged against Lakebase — the only Databricks
|
|
15
|
+
* specifics are the rotating-token pool and TLS defaults from
|
|
16
|
+
* {@link lakebaseClient}.
|
|
17
|
+
*/
|
|
18
|
+
export function databricksPersistence(options) {
|
|
19
|
+
const client = isLakebaseClient(options.lakebase) ? options.lakebase : lakebaseClient(options.lakebase);
|
|
20
|
+
const ownsClient = !isLakebaseClient(options.lakebase);
|
|
21
|
+
const loadStores = options.loadStores ?? defaultStoreLoader;
|
|
22
|
+
let modulePromise;
|
|
23
|
+
const stores = () => {
|
|
24
|
+
modulePromise ??= loadStores();
|
|
25
|
+
return modulePromise;
|
|
26
|
+
};
|
|
27
|
+
let sessionStore;
|
|
28
|
+
let submissionStore;
|
|
29
|
+
let conversationStreamStore;
|
|
30
|
+
const persistence = {
|
|
31
|
+
client,
|
|
32
|
+
async connect() {
|
|
33
|
+
const module = await stores();
|
|
34
|
+
sessionStore ??= new module.PostgresSessionStore({ client });
|
|
35
|
+
return sessionStore;
|
|
36
|
+
},
|
|
37
|
+
async connectSubmissionStore() {
|
|
38
|
+
const module = await stores();
|
|
39
|
+
submissionStore ??= new module.PostgresSubmissionStore({ client });
|
|
40
|
+
return submissionStore;
|
|
41
|
+
},
|
|
42
|
+
async connectConversationStreamStore() {
|
|
43
|
+
const module = await stores();
|
|
44
|
+
conversationStreamStore ??= new module.PostgresConversationStreamStore({ client });
|
|
45
|
+
return conversationStreamStore;
|
|
46
|
+
},
|
|
47
|
+
async connectAll() {
|
|
48
|
+
return {
|
|
49
|
+
store: await persistence.connect(),
|
|
50
|
+
submissionStore: await persistence.connectSubmissionStore(),
|
|
51
|
+
conversationStreamStore: await persistence.connectConversationStreamStore(),
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
async migrate() {
|
|
55
|
+
const module = await stores();
|
|
56
|
+
// Session tables initialize inside the store constructor; the
|
|
57
|
+
// submission/stream ensure functions are exported directly.
|
|
58
|
+
await persistence.connect();
|
|
59
|
+
await module.ensurePostgresSubmissionTables(client);
|
|
60
|
+
await module.ensurePostgresConversationStreamTables(client);
|
|
61
|
+
},
|
|
62
|
+
async close() {
|
|
63
|
+
if (ownsClient)
|
|
64
|
+
await client.end();
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
return persistence;
|
|
68
|
+
}
|
|
69
|
+
function isLakebaseClient(value) {
|
|
70
|
+
return typeof value.query === 'function';
|
|
71
|
+
}
|
|
72
|
+
async function defaultStoreLoader() {
|
|
73
|
+
try {
|
|
74
|
+
// Dynamic specifier keeps bundlers from hard-wiring the optional peer.
|
|
75
|
+
const specifier = '@fabric-harness/node';
|
|
76
|
+
return (await import(specifier));
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new Error(`databricksPersistence() requires the optional "@fabric-harness/node" package (it provides the Postgres store implementations). Install it alongside @fabric-harness/databricks. ${error instanceof Error ? error.message : String(error)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAkD/C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAqC;IACzE,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxG,MAAM,UAAU,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAE5D,IAAI,aAAoE,CAAC;IACzE,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,aAAa,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,IAAI,YAAsC,CAAC;IAC3C,IAAI,eAAiD,CAAC;IACtD,IAAI,uBAA4D,CAAC;IAEjE,MAAM,WAAW,GAA0B;QACzC,MAAM;QAEN,KAAK,CAAC,OAAO;YACX,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;YAC9B,YAAY,KAAK,IAAI,MAAM,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7D,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,KAAK,CAAC,sBAAsB;YAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;YAC9B,eAAe,KAAK,IAAI,MAAM,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACnE,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,KAAK,CAAC,8BAA8B;YAClC,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;YAC9B,uBAAuB,KAAK,IAAI,MAAM,CAAC,+BAA+B,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACnF,OAAO,uBAAuB,CAAC;QACjC,CAAC;QAED,KAAK,CAAC,UAAU;YACd,OAAO;gBACL,KAAK,EAAE,MAAM,WAAW,CAAC,OAAO,EAAE;gBAClC,eAAe,EAAE,MAAM,WAAW,CAAC,sBAAsB,EAAE;gBAC3D,uBAAuB,EAAE,MAAM,WAAW,CAAC,8BAA8B,EAAE;aAC5E,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,OAAO;YACX,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;YAC9B,8DAA8D;YAC9D,4DAA4D;YAC5D,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,MAAM,CAAC,sCAAsC,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC;QAED,KAAK,CAAC,KAAK;YACT,IAAI,UAAU;gBAAE,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACrC,CAAC;KACF,CAAC;IAEF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA+C;IACvE,OAAO,OAAQ,KAAwB,CAAC,KAAK,KAAK,UAAU,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,IAAI,CAAC;QACH,uEAAuE;QACvE,MAAM,SAAS,GAAG,sBAAsB,CAAC;QACzC,OAAO,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAgD,CAAC;IAClF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mLAAmL,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5O,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { FabricEvent, SubmissionTelemetrySink } from '@fabric-harness/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Serving usage capture (v2 migration, workstream C7): attribute model/serving
|
|
4
|
+
* spend to submissions through the ambient submission context.
|
|
5
|
+
*/
|
|
6
|
+
export interface ServingUsageCaptureOptions {
|
|
7
|
+
/** Telemetry sink receiving `submission_usage` events (e.g. `databricksTelemetry().sink`). */
|
|
8
|
+
sink: SubmissionTelemetrySink;
|
|
9
|
+
/** Failure reporter for sink errors (default: silent, matching fire-and-forget telemetry). */
|
|
10
|
+
onError?: (error: unknown) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Build an `onEvent` fan-in that turns model-usage events into
|
|
14
|
+
* `submission_usage` telemetry. For every {@link FabricEvent} carrying
|
|
15
|
+
* `data.usage` (`{ inputTokens?, outputTokens?, costUsd? }`, at least one
|
|
16
|
+
* numeric field) — and optionally `data.model` — while an ambient
|
|
17
|
+
* {@link currentSubmissionContext} is set, it emits one `submission_usage`
|
|
18
|
+
* event stamped with the submission correlation (submission/attempt ids,
|
|
19
|
+
* agent identity, tenant, actor).
|
|
20
|
+
*
|
|
21
|
+
* Events observed outside a submission context are dropped silently — not
|
|
22
|
+
* every session turn belongs to a submission. The submission context does not
|
|
23
|
+
* carry the submission kind, so emitted events use `kind: 'unknown'`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function servingUsageCapture(options: ServingUsageCaptureOptions): (event: FabricEvent) => void;
|
|
26
|
+
export interface InferenceTableUsageQueryOptions {
|
|
27
|
+
/** Fully-qualified inference/payload table, `catalog.schema.table`. */
|
|
28
|
+
fullTableName: string;
|
|
29
|
+
/** Only aggregate requests at or after this ISO-8601 instant. */
|
|
30
|
+
sinceIso?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* SQL aggregating a serving endpoint's inference/payload table by
|
|
34
|
+
* `client_request_id` — one row per submission with the request count and the
|
|
35
|
+
* first/last request timestamps — for offline joins against
|
|
36
|
+
* `fh_submission_telemetry.submission_id`.
|
|
37
|
+
*
|
|
38
|
+
* Join contract: callers MUST send the submission id as the serving request's
|
|
39
|
+
* `client_request_id` (e.g. the `client_request_id` field on the
|
|
40
|
+
* serving-endpoint invocation) — the inference table records it verbatim, and
|
|
41
|
+
* this query's `submission_id` column only joins when that convention holds.
|
|
42
|
+
* Rows without a `client_request_id` (traffic from other callers) are
|
|
43
|
+
* excluded. Assumes the AI Gateway payload-table schema (`request_time`
|
|
44
|
+
* timestamp column); adapt the projection for classic inference tables that
|
|
45
|
+
* use `timestamp_ms`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function inferenceTableUsageQuery(options: InferenceTableUsageQueryOptions): string;
|
|
48
|
+
//# sourceMappingURL=serving-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serving-usage.d.ts","sourceRoot":"","sources":["../src/serving-usage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,8FAA8F;IAC9F,IAAI,EAAE,uBAAuB,CAAC;IAC9B,8FAA8F;IAC9F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAiCrG;AAuBD,MAAM,WAAW,+BAA+B;IAC9C,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,+BAA+B,GAAG,MAAM,CAyBzF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { currentSubmissionContext, emitSubmissionTelemetry } from '@fabric-harness/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Build an `onEvent` fan-in that turns model-usage events into
|
|
4
|
+
* `submission_usage` telemetry. For every {@link FabricEvent} carrying
|
|
5
|
+
* `data.usage` (`{ inputTokens?, outputTokens?, costUsd? }`, at least one
|
|
6
|
+
* numeric field) — and optionally `data.model` — while an ambient
|
|
7
|
+
* {@link currentSubmissionContext} is set, it emits one `submission_usage`
|
|
8
|
+
* event stamped with the submission correlation (submission/attempt ids,
|
|
9
|
+
* agent identity, tenant, actor).
|
|
10
|
+
*
|
|
11
|
+
* Events observed outside a submission context are dropped silently — not
|
|
12
|
+
* every session turn belongs to a submission. The submission context does not
|
|
13
|
+
* carry the submission kind, so emitted events use `kind: 'unknown'`.
|
|
14
|
+
*/
|
|
15
|
+
export function servingUsageCapture(options) {
|
|
16
|
+
return (event) => {
|
|
17
|
+
try {
|
|
18
|
+
const usage = usageOf(event);
|
|
19
|
+
if (!usage)
|
|
20
|
+
return;
|
|
21
|
+
const context = currentSubmissionContext();
|
|
22
|
+
if (!context)
|
|
23
|
+
return;
|
|
24
|
+
const model = typeof event.data?.model === 'string' ? event.data.model : undefined;
|
|
25
|
+
const at = Date.parse(event.timestamp);
|
|
26
|
+
emitSubmissionTelemetry(options.sink, {
|
|
27
|
+
type: 'submission_usage',
|
|
28
|
+
submissionId: context.submissionId,
|
|
29
|
+
attemptId: context.attemptId,
|
|
30
|
+
kind: 'unknown',
|
|
31
|
+
agent: context.agent,
|
|
32
|
+
instanceId: context.instanceId,
|
|
33
|
+
session: context.session,
|
|
34
|
+
at: Number.isFinite(at) ? at : Date.now(),
|
|
35
|
+
...(context.tenantId !== undefined ? { tenantId: context.tenantId } : {}),
|
|
36
|
+
...(context.actor !== undefined ? { actor: context.actor } : {}),
|
|
37
|
+
...(model !== undefined ? { model } : {}),
|
|
38
|
+
...(usage.inputTokens !== undefined ? { inputTokens: usage.inputTokens } : {}),
|
|
39
|
+
...(usage.outputTokens !== undefined ? { outputTokens: usage.outputTokens } : {}),
|
|
40
|
+
...(usage.costUsd !== undefined ? { costUsd: usage.costUsd } : {}),
|
|
41
|
+
}, options.onError);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
options.onError?.(error);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** `data.usage` with at least one numeric field, else `undefined`. */
|
|
49
|
+
function usageOf(event) {
|
|
50
|
+
const raw = event.data?.usage;
|
|
51
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
52
|
+
return undefined;
|
|
53
|
+
const usage = raw;
|
|
54
|
+
const fields = {
|
|
55
|
+
...(typeof usage.inputTokens === 'number' ? { inputTokens: usage.inputTokens } : {}),
|
|
56
|
+
...(typeof usage.outputTokens === 'number' ? { outputTokens: usage.outputTokens } : {}),
|
|
57
|
+
...(typeof usage.costUsd === 'number' ? { costUsd: usage.costUsd } : {}),
|
|
58
|
+
};
|
|
59
|
+
return Object.keys(fields).length > 0 ? fields : undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* SQL aggregating a serving endpoint's inference/payload table by
|
|
63
|
+
* `client_request_id` — one row per submission with the request count and the
|
|
64
|
+
* first/last request timestamps — for offline joins against
|
|
65
|
+
* `fh_submission_telemetry.submission_id`.
|
|
66
|
+
*
|
|
67
|
+
* Join contract: callers MUST send the submission id as the serving request's
|
|
68
|
+
* `client_request_id` (e.g. the `client_request_id` field on the
|
|
69
|
+
* serving-endpoint invocation) — the inference table records it verbatim, and
|
|
70
|
+
* this query's `submission_id` column only joins when that convention holds.
|
|
71
|
+
* Rows without a `client_request_id` (traffic from other callers) are
|
|
72
|
+
* excluded. Assumes the AI Gateway payload-table schema (`request_time`
|
|
73
|
+
* timestamp column); adapt the projection for classic inference tables that
|
|
74
|
+
* use `timestamp_ms`.
|
|
75
|
+
*/
|
|
76
|
+
export function inferenceTableUsageQuery(options) {
|
|
77
|
+
if (!/^[A-Za-z0-9_]+\.[A-Za-z0-9_]+\.[A-Za-z0-9_]+$/.test(options.fullTableName)) {
|
|
78
|
+
throw new Error(`databricks serving-usage: fullTableName must be catalog.schema.table, got: ${options.fullTableName}`);
|
|
79
|
+
}
|
|
80
|
+
let since = '';
|
|
81
|
+
if (options.sinceIso !== undefined) {
|
|
82
|
+
// Strict shape check first — Date.parse alone is far too lenient to gate a SQL literal.
|
|
83
|
+
const isoShape = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,3})?(Z|[+-]\d{2}:\d{2})$/;
|
|
84
|
+
const parsed = Date.parse(options.sinceIso);
|
|
85
|
+
if (!isoShape.test(options.sinceIso) || !Number.isFinite(parsed)) {
|
|
86
|
+
throw new Error(`databricks serving-usage: sinceIso is not a valid ISO-8601 instant: ${options.sinceIso}`);
|
|
87
|
+
}
|
|
88
|
+
since = `\n AND request_time >= TIMESTAMP '${new Date(parsed).toISOString()}'`;
|
|
89
|
+
}
|
|
90
|
+
return `SELECT
|
|
91
|
+
client_request_id AS submission_id,
|
|
92
|
+
COUNT(*) AS request_count,
|
|
93
|
+
MIN(request_time) AS first_request_at,
|
|
94
|
+
MAX(request_time) AS last_request_at
|
|
95
|
+
FROM ${options.fullTableName}
|
|
96
|
+
WHERE client_request_id IS NOT NULL${since}
|
|
97
|
+
GROUP BY client_request_id
|
|
98
|
+
ORDER BY last_request_at DESC`;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=serving-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serving-usage.js","sourceRoot":"","sources":["../src/serving-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { JsonObject } from '@fabric-harness/sdk';
|
|
2
|
+
import type { DatabricksRestClient } from './client.js';
|
|
3
|
+
export interface SqlParameter {
|
|
4
|
+
name: string;
|
|
5
|
+
value: string;
|
|
6
|
+
/** SQL type for the named marker (e.g. 'DATE'). Defaults to STRING on the Databricks side. */
|
|
7
|
+
type?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface StatementPoll {
|
|
10
|
+
intervalMs: number;
|
|
11
|
+
timeoutMs: number;
|
|
12
|
+
}
|
|
13
|
+
/** Submit a parameterized SQL statement and poll to a terminal state. Named parameters → injection-safe. */
|
|
14
|
+
export declare function runStatement(client: DatabricksRestClient, warehouseId: string, statement: string, parameters: SqlParameter[], poll: StatementPoll): Promise<unknown>;
|
|
15
|
+
/** Map a statement response's columns + rows into objects keyed by column name. */
|
|
16
|
+
export declare function parseStatementRows(response: unknown): JsonObject[];
|
|
17
|
+
//# sourceMappingURL=sql-exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-exec.d.ts","sourceRoot":"","sources":["../src/sql-exec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAWD,4GAA4G;AAC5G,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,YAAY,EAAE,EAC1B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,EAAE,CAUlE"}
|
package/dist/sql-exec.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const TERMINAL_STATES = new Set(['SUCCEEDED', 'FAILED', 'CANCELED', 'CLOSED']);
|
|
2
|
+
/** Submit a parameterized SQL statement and poll to a terminal state. Named parameters → injection-safe. */
|
|
3
|
+
export async function runStatement(client, warehouseId, statement, parameters, poll) {
|
|
4
|
+
const submit = await client.post('/api/2.0/sql/statements', {
|
|
5
|
+
warehouse_id: warehouseId,
|
|
6
|
+
statement,
|
|
7
|
+
wait_timeout: '30s',
|
|
8
|
+
disposition: 'INLINE',
|
|
9
|
+
...(parameters.length > 0 ? { parameters } : {}),
|
|
10
|
+
});
|
|
11
|
+
if (TERMINAL_STATES.has(submit.status?.state ?? ''))
|
|
12
|
+
return submit;
|
|
13
|
+
const id = submit.statement_id;
|
|
14
|
+
if (!id)
|
|
15
|
+
return submit;
|
|
16
|
+
const deadline = Date.now() + poll.timeoutMs;
|
|
17
|
+
let current = submit;
|
|
18
|
+
while (!TERMINAL_STATES.has(current.status?.state ?? '') && Date.now() < deadline) {
|
|
19
|
+
await new Promise((resolve) => setTimeout(resolve, poll.intervalMs));
|
|
20
|
+
current = await client.get(`/api/2.0/sql/statements/${encodeURIComponent(id)}`);
|
|
21
|
+
}
|
|
22
|
+
return current;
|
|
23
|
+
}
|
|
24
|
+
/** Map a statement response's columns + rows into objects keyed by column name. */
|
|
25
|
+
export function parseStatementRows(response) {
|
|
26
|
+
const res = response;
|
|
27
|
+
const columns = res.manifest?.schema?.columns ?? res.manifest?.columns ?? [];
|
|
28
|
+
const names = columns.map((c) => c.name);
|
|
29
|
+
const rows = res.result?.data_array ?? [];
|
|
30
|
+
return rows.map((row) => {
|
|
31
|
+
const record = {};
|
|
32
|
+
names.forEach((name, i) => { record[name] = row[i]; });
|
|
33
|
+
return record;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=sql-exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-exec.js","sourceRoot":"","sources":["../src/sql-exec.ts"],"names":[],"mappings":"AAsBA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE/E,4GAA4G;AAC5G,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA4B,EAC5B,WAAmB,EACnB,SAAiB,EACjB,UAA0B,EAC1B,IAAmB;IAEnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAoB,yBAAyB,EAAE;QAC7E,YAAY,EAAE,WAAW;QACzB,SAAS;QACT,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,QAAQ;QACrB,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAC,CAAC;IACH,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;QAAE,OAAO,MAAM,CAAC;IACnE,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;IAC/B,IAAI,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;IAC7C,IAAI,OAAO,GAAsB,MAAM,CAAC;IACxC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAClF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACrE,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAoB,2BAA2B,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,MAAM,GAAG,GAAG,QAA6B,CAAC;IAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC;IAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,IAAI,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/sql-sandbox.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SandboxEnv } from '@fabric-harness/sdk';
|
|
2
|
-
import { DatabricksRestClient } from './
|
|
2
|
+
import { DatabricksRestClient } from './client.js';
|
|
3
3
|
/**
|
|
4
4
|
* Sandbox backend that maps `exec(command)` to a Databricks SQL Statement
|
|
5
5
|
* Execution API call against a SQL Warehouse. Useful for data agents whose
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-sandbox.d.ts","sourceRoot":"","sources":["../src/sql-sandbox.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"sql-sandbox.d.ts","sourceRoot":"","sources":["../src/sql-sandbox.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC/B,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B;AASD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,UAAU,CAsFrF"}
|
package/dist/sql-sandbox.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRemoteSandboxEnv } from '@fabric-harness/sdk';
|
|
2
|
-
import { DatabricksRestClient } from './
|
|
2
|
+
import { DatabricksRestClient } from './client.js';
|
|
3
3
|
export function databricksSqlSandbox(options) {
|
|
4
4
|
const client = options.client ?? new DatabricksRestClient({
|
|
5
5
|
host: options.host,
|
package/dist/sql-sandbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-sandbox.js","sourceRoot":"","sources":["../src/sql-sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"sql-sandbox.js","sourceRoot":"","sources":["../src/sql-sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SubmissionTelemetrySink } from '@fabric-harness/sdk';
|
|
2
|
+
import type { DatabricksLineageRecord } from './governance.js';
|
|
3
|
+
import type { LakebaseClient } from './lakebase.js';
|
|
4
|
+
/**
|
|
5
|
+
* Cost + lineage as core telemetry (v2, workstream C4): submission lifecycle
|
|
6
|
+
* events and governed tool-call lineage land in Lakebase tables keyed by the
|
|
7
|
+
* same `submissionId` that drives events, settlement, and audit — so spend,
|
|
8
|
+
* lineage, and outcomes join on one stable key. Writes are fire-and-forget:
|
|
9
|
+
* a telemetry failure must never affect execution.
|
|
10
|
+
*/
|
|
11
|
+
export interface DatabricksTelemetryOptions {
|
|
12
|
+
client: LakebaseClient;
|
|
13
|
+
/** Create the telemetry tables on first use. Default true. */
|
|
14
|
+
initialize?: boolean;
|
|
15
|
+
/** Failure reporter (default console.error). */
|
|
16
|
+
onError?: (context: string, error: unknown) => void;
|
|
17
|
+
}
|
|
18
|
+
export interface DatabricksTelemetry {
|
|
19
|
+
/** Wire into `createSubmissionRunner({ telemetry })`. */
|
|
20
|
+
sink: SubmissionTelemetrySink;
|
|
21
|
+
/** Wire into `withGovernance({ onLineage })` / the `databricks()` bundle. */
|
|
22
|
+
onLineage: (record: DatabricksLineageRecord) => void;
|
|
23
|
+
/** Idempotent schema setup (also runs lazily on first write). */
|
|
24
|
+
migrate(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/** Create the telemetry tables when absent. Idempotent. */
|
|
27
|
+
export declare function ensureDatabricksTelemetryTables(client: LakebaseClient): Promise<void>;
|
|
28
|
+
export declare function databricksTelemetry(options: DatabricksTelemetryOptions): DatabricksTelemetry;
|
|
29
|
+
//# sourceMappingURL=telemetry-sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-sink.d.ts","sourceRoot":"","sources":["../src/telemetry-sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4B,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gDAAgD;IAChD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,IAAI,EAAE,uBAAuB,CAAC;IAC9B,6EAA6E;IAC7E,SAAS,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACrD,iEAAiE;IACjE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,2DAA2D;AAC3D,wBAAsB,+BAA+B,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C3F;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,mBAAmB,CA6F5F"}
|