@fabric-harness/databricks 0.16.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/agent.d.ts +45 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +206 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/ai.d.ts +19 -0
  6. package/dist/ai.d.ts.map +1 -0
  7. package/dist/ai.js +22 -0
  8. package/dist/ai.js.map +1 -0
  9. package/dist/app.d.ts +81 -0
  10. package/dist/app.d.ts.map +1 -0
  11. package/dist/app.js +87 -0
  12. package/dist/app.js.map +1 -0
  13. package/dist/client.d.ts +44 -0
  14. package/dist/client.d.ts.map +1 -0
  15. package/dist/client.js +114 -0
  16. package/dist/client.js.map +1 -0
  17. package/dist/consumption.d.ts +45 -0
  18. package/dist/consumption.d.ts.map +1 -0
  19. package/dist/consumption.js +85 -0
  20. package/dist/consumption.js.map +1 -0
  21. package/dist/cost-budget-actuals.d.ts +27 -0
  22. package/dist/cost-budget-actuals.d.ts.map +1 -0
  23. package/dist/cost-budget-actuals.js +265 -0
  24. package/dist/cost-budget-actuals.js.map +1 -0
  25. package/dist/embeddings.d.ts +18 -0
  26. package/dist/embeddings.d.ts.map +1 -0
  27. package/dist/embeddings.js +24 -0
  28. package/dist/embeddings.js.map +1 -0
  29. package/dist/feature-serving.d.ts +17 -0
  30. package/dist/feature-serving.d.ts.map +1 -0
  31. package/dist/feature-serving.js +29 -0
  32. package/dist/feature-serving.js.map +1 -0
  33. package/dist/genie.d.ts +22 -0
  34. package/dist/genie.d.ts.map +1 -0
  35. package/dist/genie.js +60 -0
  36. package/dist/genie.js.map +1 -0
  37. package/dist/governance.d.ts +70 -0
  38. package/dist/governance.d.ts.map +1 -0
  39. package/dist/governance.js +123 -0
  40. package/dist/governance.js.map +1 -0
  41. package/dist/identity.d.ts +72 -0
  42. package/dist/identity.d.ts.map +1 -0
  43. package/dist/identity.js +119 -0
  44. package/dist/identity.js.map +1 -0
  45. package/dist/index.d.ts +143 -80
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +111 -227
  48. package/dist/index.js.map +1 -1
  49. package/dist/lakebase.d.ts +49 -0
  50. package/dist/lakebase.d.ts.map +1 -0
  51. package/dist/lakebase.js +25 -0
  52. package/dist/lakebase.js.map +1 -0
  53. package/dist/lakeflow.d.ts +28 -0
  54. package/dist/lakeflow.d.ts.map +1 -0
  55. package/dist/lakeflow.js +75 -0
  56. package/dist/lakeflow.js.map +1 -0
  57. package/dist/mlflow-tracing.d.ts +111 -0
  58. package/dist/mlflow-tracing.d.ts.map +1 -0
  59. package/dist/mlflow-tracing.js +167 -0
  60. package/dist/mlflow-tracing.js.map +1 -0
  61. package/dist/mock-provider.d.ts +26 -0
  62. package/dist/mock-provider.d.ts.map +1 -0
  63. package/dist/mock-provider.js +66 -0
  64. package/dist/mock-provider.js.map +1 -0
  65. package/dist/model.d.ts +29 -0
  66. package/dist/model.d.ts.map +1 -0
  67. package/dist/model.js +50 -0
  68. package/dist/model.js.map +1 -0
  69. package/dist/persistence.d.ts +73 -0
  70. package/dist/persistence.d.ts.map +1 -0
  71. package/dist/persistence.js +82 -0
  72. package/dist/persistence.js.map +1 -0
  73. package/dist/serving-usage.d.ts +48 -0
  74. package/dist/serving-usage.d.ts.map +1 -0
  75. package/dist/serving-usage.js +100 -0
  76. package/dist/serving-usage.js.map +1 -0
  77. package/dist/sql-exec.d.ts +17 -0
  78. package/dist/sql-exec.d.ts.map +1 -0
  79. package/dist/sql-exec.js +36 -0
  80. package/dist/sql-exec.js.map +1 -0
  81. package/dist/sql-sandbox.d.ts +1 -1
  82. package/dist/sql-sandbox.d.ts.map +1 -1
  83. package/dist/sql-sandbox.js +1 -1
  84. package/dist/sql-sandbox.js.map +1 -1
  85. package/dist/telemetry-sink.d.ts +29 -0
  86. package/dist/telemetry-sink.d.ts.map +1 -0
  87. package/dist/telemetry-sink.js +129 -0
  88. package/dist/telemetry-sink.js.map +1 -0
  89. package/dist/tools.d.ts +71 -0
  90. package/dist/tools.d.ts.map +1 -0
  91. package/dist/tools.js +176 -0
  92. package/dist/tools.js.map +1 -0
  93. package/dist/vector-search.d.ts +24 -0
  94. package/dist/vector-search.d.ts.map +1 -0
  95. package/dist/vector-search.js +63 -0
  96. package/dist/vector-search.js.map +1 -0
  97. package/dist/volumes-attachment-store.d.ts +64 -0
  98. package/dist/volumes-attachment-store.d.ts.map +1 -0
  99. package/dist/volumes-attachment-store.js +172 -0
  100. package/dist/volumes-attachment-store.js.map +1 -0
  101. package/package.json +20 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-provider.js","sourceRoot":"","sources":["../src/mock-provider.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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"}
@@ -1,5 +1,5 @@
1
1
  import type { SandboxEnv } from '@fabric-harness/sdk';
2
- import { DatabricksRestClient } from './index.js';
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,YAAY,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;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"}
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"}
@@ -1,5 +1,5 @@
1
1
  import { createRemoteSandboxEnv } from '@fabric-harness/sdk';
2
- import { DatabricksRestClient } from './index.js';
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,
@@ -1 +1 @@
1
- {"version":3,"file":"sql-sandbox.js","sourceRoot":"","sources":["../src/sql-sandbox.ts"],"names":[],"mappings":"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"}
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"}