@dbx-tools/appkit 0.9.5 → 0.9.6

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 (47) hide show
  1. package/README.md +9 -9
  2. package/index.ts +12 -6
  3. package/lib/index.d.ts +12 -6
  4. package/lib/index.js +9 -5
  5. package/lib/src/_cache-storage.js +10 -24
  6. package/lib/src/appkit.js +5 -5
  7. package/lib/src/brand-context.js +11 -0
  8. package/lib/src/bundle.d.ts +8 -8
  9. package/lib/src/bundle.js +8 -8
  10. package/lib/src/databricks.js +3 -3
  11. package/lib/src/identity.js +7 -7
  12. package/lib/src/lakebase-resolver.d.ts +1 -1
  13. package/lib/src/lakebase-resolver.js +22 -21
  14. package/lib/src/migration.d.ts +17 -0
  15. package/lib/src/migration.js +28 -0
  16. package/lib/src/pgaddress.d.ts +24 -97
  17. package/lib/src/pgaddress.js +32 -161
  18. package/lib/src/plugin-execution.d.ts +17 -0
  19. package/lib/src/plugin-execution.js +28 -0
  20. package/lib/src/{plugin.d.ts → plugin-registry.d.ts} +9 -13
  21. package/lib/src/plugin-registry.js +97 -0
  22. package/lib/src/provision.js +5 -5
  23. package/lib/src/tool-provider.d.ts +17 -0
  24. package/lib/src/tool-provider.js +20 -0
  25. package/lib/src/toolkit-entries.js +34 -0
  26. package/lib/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +5 -4
  28. package/src/_cache-storage.ts +12 -25
  29. package/src/appkit.ts +4 -6
  30. package/src/brand-context.ts +13 -0
  31. package/src/bundle.ts +11 -11
  32. package/src/databricks.ts +2 -2
  33. package/src/identity.ts +6 -6
  34. package/src/lakebase-resolver.ts +21 -20
  35. package/src/migration.ts +40 -0
  36. package/src/pgaddress.ts +46 -196
  37. package/src/plugin-execution.ts +42 -0
  38. package/src/{plugin.ts → plugin-registry.ts} +14 -17
  39. package/src/provision.ts +4 -4
  40. package/src/tool-provider.ts +34 -0
  41. package/lib/src/brand.js +0 -11
  42. package/lib/src/plugin.js +0 -97
  43. package/lib/src/toolkit.js +0 -34
  44. package/src/brand.ts +0 -13
  45. /package/lib/src/{brand.d.ts → brand-context.d.ts} +0 -0
  46. /package/lib/src/{toolkit.d.ts → toolkit-entries.d.ts} +0 -0
  47. /package/src/{toolkit.ts → toolkit-entries.ts} +0 -0
package/src/pgaddress.ts CHANGED
@@ -1,218 +1,68 @@
1
1
  /**
2
- * Flexible address parser for Lakebase Postgres connection inputs.
2
+ * Lakebase PostgreSQL address parsing backed by `@dbx-tools/core-rs`.
3
3
  *
4
- * Accepts whatever shape a user is likely to paste into
5
- * `LAKEBASE_ENDPOINT` (or the matching config field) and extracts
6
- * every recognizable piece. Whatever it can't recover is left for the
7
- * Lakebase resolver to discover.
8
- *
9
- * Recognized formats:
10
- *
11
- * - **Postgres URI** -
12
- * `postgresql://user@host:port/db?sslmode=require` (also `postgres://`).
13
- * Yields `user`, `host`, `port`, `database`, `sslMode`.
14
- *
15
- * - **Canonical endpoint resource path** -
16
- * `projects/{p}/branches/{b}/endpoints/{e}` -
17
- * yields `project`, `branch`, `endpointId`, and the original string as
18
- * `endpoint` (already in lakebase's expected form).
19
- *
20
- * - **Database resource path** -
21
- * `projects/{p}/branches/{b}/databases/{d}` -
22
- * yields `project`, `branch`, and `databaseResourceId` (the UC
23
- * resource leaf, not `PGDATABASE`; the resolver looks up the real
24
- * Postgres name via REST).
25
- *
26
- * - **Branch resource path** -
27
- * `projects/{p}/branches/{b}` - yields `project`, `branch`.
28
- *
29
- * - **Project resource path** -
30
- * `projects/{p}` - yields `project`.
31
- *
32
- * - **Bare hostname** -
33
- * `ep-steep-forest-e199v43w.database.eastus2.azuredatabricks.net` -
34
- * yields `host` only; the resolver reverse-looks up the owning
35
- * endpoint to recover the resource path.
36
- *
37
- * - **Bare project id** -
38
- * `dbx-tools-demo` (1-63 chars, lowercase letters/digits/hyphens) -
39
- * yields `project`.
40
- *
41
- * Returns an empty object for inputs it doesn't recognize.
4
+ * Rust owns the recognized URL, resource-path, hostname, project-id, and SSL
5
+ * mode rules. This module preserves AppKit's existing namespace, string SSL
6
+ * spelling, sparse records, and nullable input compatibility.
42
7
  *
43
8
  * @module
44
9
  */
45
10
 
46
- import { object } from "@dbx-tools/shared-core";
11
+ import {
12
+ parseAddress as parseNativeAddress,
13
+ parseResourcePath as parseNativeResourcePath,
14
+ SslMode as NativeSslMode,
15
+ type ParsedAddress as NativeParsedAddress,
16
+ } from "@dbx-tools/core-rs";
47
17
 
48
- /** Postgres TLS modes accepted by {@link SslMode}, in `PGSSLMODE` spelling. */
49
- export const SSL_MODES = ["require", "disable", "prefer"] as const;
18
+ type NativeSslModeName = Extract<keyof typeof NativeSslMode, string>;
50
19
 
51
- /** Postgres TLS mode passed through to `pg`. */
52
- export type SslMode = (typeof SSL_MODES)[number];
20
+ /** PostgreSQL TLS mode in `PGSSLMODE` spelling. */
21
+ export type SslMode = Lowercase<NativeSslModeName>;
53
22
 
54
- /**
55
- * Optional Lakebase Postgres connection fields shared by parsed addresses,
56
- * resolver/env inputs, and resolved connections.
57
- */
58
- export interface LakebaseConnectionInputs {
59
- /** Lakebase project id. Resolved from the workspace when unset. */
60
- project?: string;
61
- /** Branch id within the project. Defaults to the project's default branch. */
62
- branch?: string;
63
- /**
64
- * Canonical endpoint resource path (`projects/.../endpoints/...`), from
65
- * `LAKEBASE_ENDPOINT`. Defaults to the branch's read-write endpoint.
66
- */
67
- endpoint?: string;
68
- /** Postgres database name (`PGDATABASE`). Defaults to `databricks_postgres`. */
69
- database?: string;
70
- /** Postgres hostname (`PGHOST`). Defaults to the resolved endpoint's host. */
71
- host?: string;
72
- /** Postgres port (`PGPORT`). Defaults to 5432. */
73
- port?: number;
74
- /** Postgres TLS mode (`PGSSLMODE`). Defaults to `require`. */
75
- sslMode?: SslMode;
76
- }
23
+ /** Postgres TLS modes accepted by the native parser, in `PGSSLMODE` spelling. */
24
+ export const SSL_MODES: readonly SslMode[] = Object.keys(NativeSslMode)
25
+ .filter((name): name is NativeSslModeName => Number.isNaN(Number(name)))
26
+ .map((name) => name.toLowerCase() as SslMode);
77
27
 
78
- /** Pieces recovered from parsing a single address or resource-path input. */
79
- export interface ParsedAddress extends LakebaseConnectionInputs {
80
- /** Endpoint leaf id (last segment of an endpoint resource path). */
81
- endpointId?: string;
82
- /**
83
- * Database resource id leaf from a `.../databases/{id}` path. Not the
84
- * Postgres database name.
85
- */
86
- databaseResourceId?: string;
87
- /** Postgres user (URI-decoded if encoded). */
88
- user?: string;
89
- }
28
+ /** Native parser output with AppKit's existing string SSL spelling. */
29
+ export type ParsedAddress = {
30
+ [Key in keyof NativeParsedAddress]: Key extends "sslMode"
31
+ ? SslMode | undefined
32
+ : NativeParsedAddress[Key];
33
+ };
90
34
 
91
- const URL_SCHEME_RE = /^(postgres|postgresql):\/\//i;
92
- const PROJECT_ID_RE = /^[a-z][a-z0-9-]{0,61}[a-z0-9]$|^[a-z]$/;
93
- const HOSTNAME_HINT_RE = /^[a-z0-9][a-z0-9-]*(\.[a-z0-9][a-z0-9-]*)+$/i;
35
+ /** Inputs shared by parsing and Lakebase connection resolution. */
36
+ export type LakebaseConnectionInputs = ParsedAddress;
94
37
 
95
- /**
96
- * Parse a Lakebase connection input into whatever pieces it carries.
97
- * See module docstring for the supported formats. Returns `{}` for
98
- * `undefined`, empty strings, and unrecognized inputs.
99
- *
100
- * @example
101
- * import { pgaddress } from "@dbx-tools/appkit";
102
- *
103
- * pgaddress.parseAddress("projects/demo/branches/production/endpoints/ep-1");
104
- * // { project: "demo", branch: "production", endpointId: "ep-1", endpoint: "projects/..." }
105
- *
106
- * pgaddress.parseAddress("postgresql://me@ep-1.database.azuredatabricks.net/app?sslmode=require");
107
- * // { host: "ep-1.database.azuredatabricks.net", user: "me", database: "app", sslMode: "require" }
108
- */
109
- export function parseAddress(input: string | undefined | null): ParsedAddress {
110
- if (!input) return {};
111
- const s = input.trim();
112
- if (!s) return {};
38
+ function sslModeName(mode: NativeParsedAddress["sslMode"]): SslMode | undefined {
39
+ return mode === undefined ? undefined : (NativeSslMode[mode].toLowerCase() as SslMode);
40
+ }
113
41
 
114
- if (URL_SCHEME_RE.test(s)) return parseUri(s);
115
- if (s.startsWith("projects/")) return parseResourcePathSegments(s);
116
- // Resource ids never contain dots; a dotted input must be a hostname.
117
- if (HOSTNAME_HINT_RE.test(s) && s.includes(".")) return { host: s };
118
- if (PROJECT_ID_RE.test(s)) return { project: s };
119
- return {};
42
+ function normalizeAddress(address: NativeParsedAddress): ParsedAddress {
43
+ const normalized = { ...address, sslMode: sslModeName(address.sslMode) } as ParsedAddress;
44
+ for (const key of Object.keys(normalized) as (keyof ParsedAddress)[]) {
45
+ if (normalized[key] === undefined) delete normalized[key];
46
+ }
47
+ return normalized;
120
48
  }
121
49
 
122
50
  /**
123
- * Parse a Lakebase `projects/...` resource path. Returns `{}` when the
124
- * input is not a resource path (so bare branch ids are not mistaken for
125
- * project ids).
51
+ * Parse a PostgreSQL URL, Lakebase resource path, hostname, or project id.
52
+ * Returns an empty record when the input is absent or unrecognized.
126
53
  */
127
- export function parseResourcePath(input: string | undefined | null): ParsedAddress {
128
- if (!input) return {};
129
- const s = input.trim();
130
- if (!s.startsWith("projects/")) return {};
131
- return parseResourcePathSegments(s);
54
+ export function parseAddress(input: string | null | undefined): ParsedAddress {
55
+ return normalizeAddress(parseNativeAddress(input ?? undefined));
132
56
  }
133
57
 
134
- function parseUri(s: string): ParsedAddress {
135
- let url: URL;
136
- try {
137
- url = new URL(s);
138
- } catch {
139
- return {};
140
- }
141
- const target = url.pathname.replace(/^\//, "");
142
- const decodedTarget = target ? decodeURIComponent(target) : "";
143
- const result: ParsedAddress = decodedTarget.startsWith("projects/")
144
- ? parseResourcePathSegments(decodedTarget)
145
- : {};
146
- if (url.hostname) result.host = url.hostname;
147
- const port = object.toNumber(url.port);
148
- if (port !== undefined) result.port = port;
149
- if (url.username) {
150
- try {
151
- result.user = decodeURIComponent(url.username);
152
- } catch {
153
- result.user = url.username;
154
- }
155
- }
156
- if (decodedTarget && !result.project) result.database = decodedTarget;
157
- const sslmodeRaw = url.searchParams.get("sslmode") ?? url.searchParams.get("sslMode");
158
- const sslmode = sslmodeRaw?.toLowerCase();
159
- if (isSslMode(sslmode)) {
160
- result.sslMode = sslmode;
161
- }
162
- return result;
58
+ /** Parse a canonical Lakebase `projects/...` resource path. */
59
+ export function parseResourcePath(input: string | null | undefined): ParsedAddress {
60
+ return normalizeAddress(parseNativeResourcePath(input ?? undefined));
163
61
  }
164
62
 
165
- function isSslMode(value: string | undefined): value is SslMode {
166
- return SSL_MODES.some((mode) => mode === value);
167
- }
168
-
169
- function parseResourcePathSegments(s: string): ParsedAddress {
170
- const parts = s.split("/");
171
- if (parts[0] !== "projects" || parts.length < 2) {
172
- return {};
173
- }
174
-
175
- const project = parts[1];
176
- if (!project) {
177
- return {};
178
- }
179
-
180
- if (parts.length === 2) {
181
- return { project };
182
- }
183
-
184
- if (parts.length === 4 && parts[2] === "branches" && parts[3]) {
185
- return { project, branch: parts[3] };
186
- }
187
-
188
- if (
189
- parts.length === 6 &&
190
- parts[2] === "branches" &&
191
- parts[4] === "endpoints" &&
192
- parts[3] &&
193
- parts[5]
194
- ) {
195
- return {
196
- project,
197
- branch: parts[3],
198
- endpointId: parts[5],
199
- endpoint: s,
200
- };
201
- }
202
-
203
- if (
204
- parts.length === 6 &&
205
- parts[2] === "branches" &&
206
- parts[4] === "databases" &&
207
- parts[3] &&
208
- parts[5]
209
- ) {
210
- return {
211
- project,
212
- branch: parts[3],
213
- databaseResourceId: parts[5],
214
- };
215
- }
216
-
217
- return {};
63
+ /** Normalize a PostgreSQL TLS mode through the native address parser. */
64
+ export function parseSslMode(input: string | null | undefined): SslMode | undefined {
65
+ if (input === undefined || input === null || input.trim() === "") return undefined;
66
+ const query = encodeURIComponent(input.trim());
67
+ return sslModeName(parseNativeAddress(`postgresql://localhost?sslmode=${query}`).sslMode);
218
68
  }
@@ -0,0 +1,42 @@
1
+ /** AppKit-specific adapters over the shared intercepted-execution contract. */
2
+
3
+ import { ExecutionError } from "@databricks/appkit";
4
+ import { execution, type Logger } from "@dbx-tools/shared-core";
5
+
6
+ /** Inputs for one plugin operation routed through AppKit interceptors. */
7
+ export interface RunPluginExecutionOptions<T, Settings> {
8
+ readonly plugin: string;
9
+ readonly logger: Pick<Logger, "warn">;
10
+ readonly operation: string;
11
+ readonly settings: Settings;
12
+ readonly execute: execution.Executor<Settings>;
13
+ readonly fn: (signal?: AbortSignal) => Promise<T>;
14
+ readonly signal?: AbortSignal;
15
+ }
16
+
17
+ /**
18
+ * Run and unwrap one AppKit plugin operation with the shared stable failure
19
+ * message, structured warning, status context, and cancellation behavior.
20
+ */
21
+ export function runPluginExecution<T, Settings>(
22
+ options: RunPluginExecutionOptions<T, Settings>,
23
+ ): Promise<T> {
24
+ return execution.run({
25
+ operation: options.operation,
26
+ settings: options.settings,
27
+ execute: options.execute,
28
+ fn: options.fn,
29
+ signal: options.signal,
30
+ canceled: ExecutionError.canceled,
31
+ failed: (failure) => {
32
+ options.logger.warn("execution-failed", {
33
+ operation: failure.operation,
34
+ status: failure.status,
35
+ error: failure.message,
36
+ });
37
+ return new ExecutionError(`${options.plugin}: ${failure.operation} failed`, {
38
+ context: { operation: failure.operation, status: failure.status },
39
+ });
40
+ },
41
+ });
42
+ }
@@ -20,7 +20,7 @@
20
20
  * @module
21
21
  */
22
22
 
23
- import { ConfigurationError } from "@databricks/appkit";
23
+ import { ConfigurationError, type PluginData, type ToPlugin } from "@databricks/appkit";
24
24
  import { log, type NameLike } from "@dbx-tools/shared-core";
25
25
 
26
26
  const logger = log.logger("plugin");
@@ -35,23 +35,20 @@ export interface PluginContextLike {
35
35
  getPlugins(): ReadonlyMap<string, unknown>;
36
36
  }
37
37
 
38
- type PluginData = {
39
- plugin: abstract new (...args: never[]) => unknown;
40
- name: string;
41
- };
42
-
43
38
  /**
44
39
  * Structural shape of an AppKit plugin factory (the result of
45
40
  * `toPlugin(SomePluginClass)`). Calling it returns a `PluginData` tuple whose
46
41
  * `plugin` field is the *class constructor* and whose `name` field carries the
47
42
  * registered plugin name as a literal string.
48
43
  *
49
- * Defined structurally so we don't pull `@databricks/appkit` into this as a
50
- * type dependency for the bound. Any function returning the same shape (e.g.
51
- * `lakebase`, `serving`, `genie`, or a user-defined `toPlugin(MyPlugin)`)
52
- * satisfies it.
44
+ * Uses AppKit's public factory contract so changes to the upstream descriptor
45
+ * remain visible here.
53
46
  */
54
- type PluginDataFactory = (...args: never[]) => PluginData;
47
+ type PluginConstructor = abstract new (...args: never[]) => unknown;
48
+ // `any` deliberately erases the factory-specific config while AppKit's public
49
+ // `ToPlugin` and `PluginData` still own the descriptor shape.
50
+ type PluginDataFactory = ToPlugin<PluginConstructor, any, string>;
51
+ type ErasedPluginData = PluginData<PluginConstructor, any, string>;
55
52
 
56
53
  /**
57
54
  * Maps a plugin factory back to the *instance* type of its plugin class.
@@ -66,7 +63,7 @@ type PluginInstanceOf<F extends PluginDataFactory> = InstanceType<ReturnType<F>[
66
63
  * `factory()` on every sibling lookup (which would allocate a fresh descriptor
67
64
  * tuple each time).
68
65
  */
69
- const dataCache = new WeakMap<PluginDataFactory, PluginData>();
66
+ const dataCache = new WeakMap<PluginDataFactory, ErasedPluginData>();
70
67
 
71
68
  /**
72
69
  * Returns the static `{ plugin, name }` descriptor for an AppKit plugin
@@ -75,7 +72,7 @@ const dataCache = new WeakMap<PluginDataFactory, PluginData>();
75
72
  export function data<F extends PluginDataFactory, D extends ReturnType<F>>(factory: F): D {
76
73
  const cached = dataCache.get(factory);
77
74
  // The cache is keyed by the erased `PluginDataFactory` bound, so `WeakMap`
78
- // hands back the widened `PluginData`; only the caller's `F` knows the exact
75
+ // hands back the widened descriptor; only the caller's `F` knows the exact
79
76
  // descriptor type.
80
77
  if (cached !== undefined) {
81
78
  return cached as D;
@@ -94,9 +91,9 @@ export function data<F extends PluginDataFactory, D extends ReturnType<F>>(facto
94
91
  *
95
92
  * @example
96
93
  * import { lakebase } from "@databricks/appkit";
97
- * import { plugin } from "@dbx-tools/appkit";
94
+ * import { pluginRegistry } from "@dbx-tools/appkit";
98
95
  *
99
- * const lake = plugin.instance(this.context, lakebase);
96
+ * const lake = pluginRegistry.instance(this.context, lakebase);
100
97
  * // ^^ inferred as LakebasePlugin | undefined
101
98
  * lake?.exports().pool;
102
99
  */
@@ -121,9 +118,9 @@ export function instance<F extends PluginDataFactory>(
121
118
  *
122
119
  * @example
123
120
  * import { lakebase } from "@databricks/appkit";
124
- * import { plugin } from "@dbx-tools/appkit";
121
+ * import { pluginRegistry } from "@dbx-tools/appkit";
125
122
  *
126
- * const pool = plugin.require(this.context, lakebase, "mastra").exports().pool;
123
+ * const pool = pluginRegistry.require(this.context, lakebase, "mastra").exports().pool;
127
124
  */
128
125
  export function require<F extends PluginDataFactory>(
129
126
  ctx: PluginContextLike | undefined,
package/src/provision.ts CHANGED
@@ -22,8 +22,8 @@
22
22
  */
23
23
 
24
24
  import { createLakebasePool, getWorkspaceClient, ValidationError } from "@databricks/appkit";
25
- import { config } from "@dbx-tools/core";
26
- import { error, log } from "@dbx-tools/shared-core";
25
+ import { configUtils } from "@dbx-tools/core";
26
+ import { errorUtils, log } from "@dbx-tools/shared-core";
27
27
 
28
28
  const defaultLogger = log.logger("provision");
29
29
 
@@ -100,7 +100,7 @@ export async function provisionCacheSchema(
100
100
  role: string | undefined,
101
101
  logger: log.Logger = defaultLogger,
102
102
  ): Promise<void> {
103
- if (config.isDatabricksAppEnv()) {
103
+ if (configUtils.isDatabricksAppEnv()) {
104
104
  logger.debug("autopg: skip cache provisioning (inside a Databricks App)");
105
105
  return;
106
106
  }
@@ -136,7 +136,7 @@ export async function provisionCacheSchema(
136
136
  } catch (err) {
137
137
  logger.warn("autopg: cache provisioning failed (continuing)", {
138
138
  schema: CACHE_SCHEMA,
139
- error: error.errorMessage(err),
139
+ error: errorUtils.errorMessage(err),
140
140
  });
141
141
  } finally {
142
142
  await pool.end().catch(() => {});
@@ -0,0 +1,34 @@
1
+ /** AppKit plugin base for tools backed by the native registry helpers. */
2
+
3
+ import { Plugin, type BasePluginConfig } from "@databricks/appkit";
4
+ import {
5
+ executeFromRegistry,
6
+ toolsFromRegistry,
7
+ type AgentToolDefinition,
8
+ type ToolProvider,
9
+ type ToolRegistry,
10
+ } from "@databricks/appkit/beta";
11
+
12
+ /**
13
+ * Implements AppKit's `ToolProvider` contract from one native tool registry.
14
+ *
15
+ * Subclasses own only their registry entries. Validation, LLM-friendly schema
16
+ * errors, tool descriptions, and dispatch stay on AppKit's native helpers.
17
+ */
18
+ export abstract class ToolRegistryPlugin<TConfig extends BasePluginConfig = BasePluginConfig>
19
+ extends Plugin<TConfig>
20
+ implements ToolProvider
21
+ {
22
+ /** Native AppKit tool entries exposed by this plugin. */
23
+ protected abstract get toolRegistry(): ToolRegistry;
24
+
25
+ /** Tool definitions offered to an AppKit agent. */
26
+ getAgentTools(): AgentToolDefinition[] {
27
+ return toolsFromRegistry(this.toolRegistry);
28
+ }
29
+
30
+ /** Validate and dispatch one AppKit agent tool call. */
31
+ executeAgentTool(name: string, args: unknown, signal?: AbortSignal): Promise<unknown> {
32
+ return executeFromRegistry(this.toolRegistry, name, args, signal);
33
+ }
34
+ }
package/lib/src/brand.js DELETED
@@ -1,11 +0,0 @@
1
- import { brand as coreBrand } from "@dbx-tools/core";
2
- import { brand as sharedBrand } from "@dbx-tools/shared-core";
3
- let activeBrandContext = sharedBrand.defaultBrandContext;
4
- export async function loadBrandContext(cwd = process.cwd()) {
5
- activeBrandContext = await coreBrand.loadBrandContext(cwd);
6
- return activeBrandContext;
7
- }
8
- export function getBrandContext() {
9
- return activeBrandContext;
10
- }
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnJhbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssSUFBSSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVqRixJQUFJLGtCQUFrQixHQUFpQixXQUFXLENBQUMsbUJBQW1CLENBQUM7QUFFdkUsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxNQUFjLE9BQU8sQ0FBQyxHQUFHLEVBQUU7SUFDaEUsa0JBQWtCLEdBQUcsTUFBTSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnJhbmQgYXMgY29yZUJyYW5kIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgYnJhbmQgYXMgc2hhcmVkQnJhbmQsIHR5cGUgQnJhbmRDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxubGV0IGFjdGl2ZUJyYW5kQ29udGV4dDogQnJhbmRDb250ZXh0ID0gc2hhcmVkQnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRCcmFuZENvbnRleHQoY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKTogUHJvbWlzZTxCcmFuZENvbnRleHQ+IHtcbiAgYWN0aXZlQnJhbmRDb250ZXh0ID0gYXdhaXQgY29yZUJyYW5kLmxvYWRCcmFuZENvbnRleHQoY3dkKTtcbiAgcmV0dXJuIGFjdGl2ZUJyYW5kQ29udGV4dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyYW5kQ29udGV4dCgpOiBCcmFuZENvbnRleHQge1xuICByZXR1cm4gYWN0aXZlQnJhbmRDb250ZXh0O1xufVxuIl19
package/lib/src/plugin.js DELETED
@@ -1,97 +0,0 @@
1
- /**
2
- * AppKit plugin lookup: typed access to sibling plugins registered on the
3
- * AppKit plugin context (`this.context` on any class that extends `Plugin`).
4
- *
5
- * Why these live here instead of in `@databricks/appkit`: AppKit exposes
6
- * `this.context.getPlugins()`, which returns `ReadonlyMap<string, BasePlugin>`,
7
- * but provides no typed lookup helper. Every caller ends up writing the same
8
- * `as InstanceType<ReturnType<typeof someFactory>["plugin"]>` cast. These
9
- * wrappers absorb that boilerplate.
10
- *
11
- * API shape: pass the plugin's factory (`lakebase`, `serving`, `genie`, or any
12
- * `toPlugin(...)` result) directly. TypeScript infers both the instance type
13
- * (so `.exports()` resolves) and the registered name (so the runtime lookup
14
- * works) from that single value. No `<T>` annotation or string literal needed
15
- * at the call site.
16
- *
17
- * Generic AppKit runtime (execution context, `WorkspaceClientLike`) lives in
18
- * `./appkit`; this module is plugin-lookup only.
19
- *
20
- * @module
21
- */
22
- import { ConfigurationError } from "@databricks/appkit";
23
- import { log } from "@dbx-tools/shared-core";
24
- const logger = log.logger("plugin");
25
- /**
26
- * Registry name returned by `factory().name`, keyed by the factory function.
27
- * Typical AppKit factories return stable metadata; caching avoids invoking
28
- * `factory()` on every sibling lookup (which would allocate a fresh descriptor
29
- * tuple each time).
30
- */
31
- const dataCache = new WeakMap();
32
- /**
33
- * Returns the static `{ plugin, name }` descriptor for an AppKit plugin
34
- * factory, caching per factory so repeated lookups do not allocate.
35
- */
36
- export function data(factory) {
37
- const cached = dataCache.get(factory);
38
- // The cache is keyed by the erased `PluginDataFactory` bound, so `WeakMap`
39
- // hands back the widened `PluginData`; only the caller's `F` knows the exact
40
- // descriptor type.
41
- if (cached !== undefined) {
42
- return cached;
43
- }
44
- const result = factory();
45
- dataCache.set(factory, result);
46
- return result;
47
- }
48
- /**
49
- * Look up a sibling plugin instance from the AppKit plugin context, keyed off
50
- * the factory's registered name and typed via its plugin class.
51
- *
52
- * Returns `undefined` when the context is missing or the plugin is not
53
- * registered. For required siblings prefer {@link require}.
54
- *
55
- * @example
56
- * import { lakebase } from "@databricks/appkit";
57
- * import { plugin } from "@dbx-tools/appkit";
58
- *
59
- * const lake = plugin.instance(this.context, lakebase);
60
- * // ^^ inferred as LakebasePlugin | undefined
61
- * lake?.exports().pool;
62
- */
63
- export function instance(ctx, factory) {
64
- if (!ctx)
65
- return undefined;
66
- const name = data(factory).name;
67
- // AppKit's registry is a `Map<string, unknown>`, so the instance type is only
68
- // recoverable from the factory the caller passed.
69
- return ctx.getPlugins().get(name);
70
- }
71
- /**
72
- * Like {@link instance} but throws when the plugin is not registered. Use for
73
- * siblings whose absence is a wiring bug rather than a runtime condition (e.g.
74
- * requiring `lakebase` when the caller has `storage` / `memory` enabled).
75
- *
76
- * `caller` is prepended to the error message so cross-plugin failures are easy
77
- * to attribute in logs.
78
- *
79
- * @example
80
- * import { lakebase } from "@databricks/appkit";
81
- * import { plugin } from "@dbx-tools/appkit";
82
- *
83
- * const pool = plugin.require(this.context, lakebase, "mastra").exports().pool;
84
- */
85
- export function require(ctx, factory, caller) {
86
- const found = instance(ctx, factory);
87
- if (found)
88
- return found;
89
- const prefix = typeof caller === "string" ? `${caller}: ` : caller?.name ? `${caller.name}: ` : "";
90
- const registeredName = data(factory).name;
91
- logger.debug("required plugin not registered", {
92
- plugin: registeredName,
93
- registered: [...(ctx?.getPlugins().keys() ?? [])],
94
- });
95
- throw ConfigurationError.resourceNotFound(`${prefix}plugin '${registeredName}'`, `Add ${registeredName}() to the plugins passed to createApp.`);
96
- }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsR0FBRyxFQUFpQixNQUFNLHdCQUF3QixDQUFDO0FBRTVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFxQ3BDOzs7OztHQUtHO0FBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQWlDLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBdUQsT0FBVTtJQUNuRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsbUJBQW1CO0lBQ25CLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sTUFBVyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUN6QixTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvQixPQUFPLE1BQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUN0QixHQUFrQyxFQUNsQyxPQUFVO0lBRVYsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2hDLDhFQUE4RTtJQUM5RSxrREFBa0Q7SUFDbEQsT0FBTyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBb0MsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQ3JCLEdBQWtDLEVBQ2xDLE9BQVUsRUFDVixNQUEwQjtJQUUxQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLElBQUksS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLE1BQU0sTUFBTSxHQUNWLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUU7UUFDN0MsTUFBTSxFQUFFLGNBQWM7UUFDdEIsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUNsRCxDQUFDLENBQUM7SUFDSCxNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN2QyxHQUFHLE1BQU0sV0FBVyxjQUFjLEdBQUcsRUFDckMsT0FBTyxjQUFjLHdDQUF3QyxDQUM5RCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiBsb29rdXA6IHR5cGVkIGFjY2VzcyB0byBzaWJsaW5nIHBsdWdpbnMgcmVnaXN0ZXJlZCBvbiB0aGVcbiAqIEFwcEtpdCBwbHVnaW4gY29udGV4dCAoYHRoaXMuY29udGV4dGAgb24gYW55IGNsYXNzIHRoYXQgZXh0ZW5kcyBgUGx1Z2luYCkuXG4gKlxuICogV2h5IHRoZXNlIGxpdmUgaGVyZSBpbnN0ZWFkIG9mIGluIGBAZGF0YWJyaWNrcy9hcHBraXRgOiBBcHBLaXQgZXhwb3Nlc1xuICogYHRoaXMuY29udGV4dC5nZXRQbHVnaW5zKClgLCB3aGljaCByZXR1cm5zIGBSZWFkb25seU1hcDxzdHJpbmcsIEJhc2VQbHVnaW4+YCxcbiAqIGJ1dCBwcm92aWRlcyBubyB0eXBlZCBsb29rdXAgaGVscGVyLiBFdmVyeSBjYWxsZXIgZW5kcyB1cCB3cml0aW5nIHRoZSBzYW1lXG4gKiBgYXMgSW5zdGFuY2VUeXBlPFJldHVyblR5cGU8dHlwZW9mIHNvbWVGYWN0b3J5PltcInBsdWdpblwiXT5gIGNhc3QuIFRoZXNlXG4gKiB3cmFwcGVycyBhYnNvcmIgdGhhdCBib2lsZXJwbGF0ZS5cbiAqXG4gKiBBUEkgc2hhcGU6IHBhc3MgdGhlIHBsdWdpbidzIGZhY3RvcnkgKGBsYWtlYmFzZWAsIGBzZXJ2aW5nYCwgYGdlbmllYCwgb3IgYW55XG4gKiBgdG9QbHVnaW4oLi4uKWAgcmVzdWx0KSBkaXJlY3RseS4gVHlwZVNjcmlwdCBpbmZlcnMgYm90aCB0aGUgaW5zdGFuY2UgdHlwZVxuICogKHNvIGAuZXhwb3J0cygpYCByZXNvbHZlcykgYW5kIHRoZSByZWdpc3RlcmVkIG5hbWUgKHNvIHRoZSBydW50aW1lIGxvb2t1cFxuICogd29ya3MpIGZyb20gdGhhdCBzaW5nbGUgdmFsdWUuIE5vIGA8VD5gIGFubm90YXRpb24gb3Igc3RyaW5nIGxpdGVyYWwgbmVlZGVkXG4gKiBhdCB0aGUgY2FsbCBzaXRlLlxuICpcbiAqIEdlbmVyaWMgQXBwS2l0IHJ1bnRpbWUgKGV4ZWN1dGlvbiBjb250ZXh0LCBgV29ya3NwYWNlQ2xpZW50TGlrZWApIGxpdmVzIGluXG4gKiBgLi9hcHBraXRgOyB0aGlzIG1vZHVsZSBpcyBwbHVnaW4tbG9va3VwIG9ubHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgdHlwZSBOYW1lTGlrZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJwbHVnaW5cIik7XG5cbi8qKlxuICogTWluaW1hbCBzdHJ1Y3R1cmFsIHNoYXBlIG9mIGB0aGlzLmNvbnRleHRgLiBXZSBtaXJyb3Igb25seSB0aGUgbWV0aG9kIHdlXG4gKiB0b3VjaCBpbnN0ZWFkIG9mIGRlcGVuZGluZyBvbiBBcHBLaXQncyBgUGx1Z2luQ29udGV4dGAgdHlwZSwgd2hpY2ggaXMgbm90XG4gKiBwYXJ0IG9mIHRoZSBwYWNrYWdlJ3MgYGV4cG9ydHNgIG1hcCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBpbXBvcnRlZC4gQW55XG4gKiBjb21wYXRpYmxlIG9iamVjdCAocmVhbCBgUGx1Z2luQ29udGV4dGAsIG1vY2tzLCB0ZXN0cykgc2F0aXNmaWVzIHRoaXMgc2hhcGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQ29udGV4dExpa2Uge1xuICBnZXRQbHVnaW5zKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgdW5rbm93bj47XG59XG5cbnR5cGUgUGx1Z2luRGF0YSA9IHtcbiAgcGx1Z2luOiBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IG5ldmVyW10pID0+IHVua25vd247XG4gIG5hbWU6IHN0cmluZztcbn07XG5cbi8qKlxuICogU3RydWN0dXJhbCBzaGFwZSBvZiBhbiBBcHBLaXQgcGx1Z2luIGZhY3RvcnkgKHRoZSByZXN1bHQgb2ZcbiAqIGB0b1BsdWdpbihTb21lUGx1Z2luQ2xhc3MpYCkuIENhbGxpbmcgaXQgcmV0dXJucyBhIGBQbHVnaW5EYXRhYCB0dXBsZSB3aG9zZVxuICogYHBsdWdpbmAgZmllbGQgaXMgdGhlICpjbGFzcyBjb25zdHJ1Y3RvciogYW5kIHdob3NlIGBuYW1lYCBmaWVsZCBjYXJyaWVzIHRoZVxuICogcmVnaXN0ZXJlZCBwbHVnaW4gbmFtZSBhcyBhIGxpdGVyYWwgc3RyaW5nLlxuICpcbiAqIERlZmluZWQgc3RydWN0dXJhbGx5IHNvIHdlIGRvbid0IHB1bGwgYEBkYXRhYnJpY2tzL2FwcGtpdGAgaW50byB0aGlzIGFzIGFcbiAqIHR5cGUgZGVwZW5kZW5jeSBmb3IgdGhlIGJvdW5kLiBBbnkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzYW1lIHNoYXBlIChlLmcuXG4gKiBgbGFrZWJhc2VgLCBgc2VydmluZ2AsIGBnZW5pZWAsIG9yIGEgdXNlci1kZWZpbmVkIGB0b1BsdWdpbihNeVBsdWdpbilgKVxuICogc2F0aXNmaWVzIGl0LlxuICovXG50eXBlIFBsdWdpbkRhdGFGYWN0b3J5ID0gKC4uLmFyZ3M6IG5ldmVyW10pID0+IFBsdWdpbkRhdGE7XG5cbi8qKlxuICogTWFwcyBhIHBsdWdpbiBmYWN0b3J5IGJhY2sgdG8gdGhlICppbnN0YW5jZSogdHlwZSBvZiBpdHMgcGx1Z2luIGNsYXNzLlxuICogTWlycm9ycyB0aGUgaW5saW5lIHBhdHRlcm4gdXNlcnMgd291bGQgb3RoZXJ3aXNlIHdyaXRlOlxuICogYEluc3RhbmNlVHlwZTxSZXR1cm5UeXBlPHR5cGVvZiBmYWN0b3J5PltcInBsdWdpblwiXT5gLlxuICovXG50eXBlIFBsdWdpbkluc3RhbmNlT2Y8RiBleHRlbmRzIFBsdWdpbkRhdGFGYWN0b3J5PiA9IEluc3RhbmNlVHlwZTxSZXR1cm5UeXBlPEY+W1wicGx1Z2luXCJdPjtcblxuLyoqXG4gKiBSZWdpc3RyeSBuYW1lIHJldHVybmVkIGJ5IGBmYWN0b3J5KCkubmFtZWAsIGtleWVkIGJ5IHRoZSBmYWN0b3J5IGZ1bmN0aW9uLlxuICogVHlwaWNhbCBBcHBLaXQgZmFjdG9yaWVzIHJldHVybiBzdGFibGUgbWV0YWRhdGE7IGNhY2hpbmcgYXZvaWRzIGludm9raW5nXG4gKiBgZmFjdG9yeSgpYCBvbiBldmVyeSBzaWJsaW5nIGxvb2t1cCAod2hpY2ggd291bGQgYWxsb2NhdGUgYSBmcmVzaCBkZXNjcmlwdG9yXG4gKiB0dXBsZSBlYWNoIHRpbWUpLlxuICovXG5jb25zdCBkYXRhQ2FjaGUgPSBuZXcgV2Vha01hcDxQbHVnaW5EYXRhRmFjdG9yeSwgUGx1Z2luRGF0YT4oKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdGF0aWMgYHsgcGx1Z2luLCBuYW1lIH1gIGRlc2NyaXB0b3IgZm9yIGFuIEFwcEtpdCBwbHVnaW5cbiAqIGZhY3RvcnksIGNhY2hpbmcgcGVyIGZhY3Rvcnkgc28gcmVwZWF0ZWQgbG9va3VwcyBkbyBub3QgYWxsb2NhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhPEYgZXh0ZW5kcyBQbHVnaW5EYXRhRmFjdG9yeSwgRCBleHRlbmRzIFJldHVyblR5cGU8Rj4+KGZhY3Rvcnk6IEYpOiBEIHtcbiAgY29uc3QgY2FjaGVkID0gZGF0YUNhY2hlLmdldChmYWN0b3J5KTtcbiAgLy8gVGhlIGNhY2hlIGlzIGtleWVkIGJ5IHRoZSBlcmFzZWQgYFBsdWdpbkRhdGFGYWN0b3J5YCBib3VuZCwgc28gYFdlYWtNYXBgXG4gIC8vIGhhbmRzIGJhY2sgdGhlIHdpZGVuZWQgYFBsdWdpbkRhdGFgOyBvbmx5IHRoZSBjYWxsZXIncyBgRmAga25vd3MgdGhlIGV4YWN0XG4gIC8vIGRlc2NyaXB0b3IgdHlwZS5cbiAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZCBhcyBEO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGZhY3RvcnkoKTtcbiAgZGF0YUNhY2hlLnNldChmYWN0b3J5LCByZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0IGFzIEQ7XG59XG5cbi8qKlxuICogTG9vayB1cCBhIHNpYmxpbmcgcGx1Z2luIGluc3RhbmNlIGZyb20gdGhlIEFwcEtpdCBwbHVnaW4gY29udGV4dCwga2V5ZWQgb2ZmXG4gKiB0aGUgZmFjdG9yeSdzIHJlZ2lzdGVyZWQgbmFtZSBhbmQgdHlwZWQgdmlhIGl0cyBwbHVnaW4gY2xhc3MuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjb250ZXh0IGlzIG1pc3Npbmcgb3IgdGhlIHBsdWdpbiBpcyBub3RcbiAqIHJlZ2lzdGVyZWQuIEZvciByZXF1aXJlZCBzaWJsaW5ncyBwcmVmZXIge0BsaW5rIHJlcXVpcmV9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGNvbnN0IGxha2UgPSBwbHVnaW4uaW5zdGFuY2UodGhpcy5jb250ZXh0LCBsYWtlYmFzZSk7XG4gKiAvLyAgICBeXiBpbmZlcnJlZCBhcyBMYWtlYmFzZVBsdWdpbiB8IHVuZGVmaW5lZFxuICogbGFrZT8uZXhwb3J0cygpLnBvb2w7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YW5jZTxGIGV4dGVuZHMgUGx1Z2luRGF0YUZhY3Rvcnk+KFxuICBjdHg6IFBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuICBmYWN0b3J5OiBGLFxuKTogUGx1Z2luSW5zdGFuY2VPZjxGPiB8IHVuZGVmaW5lZCB7XG4gIGlmICghY3R4KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBuYW1lID0gZGF0YShmYWN0b3J5KS5uYW1lO1xuICAvLyBBcHBLaXQncyByZWdpc3RyeSBpcyBhIGBNYXA8c3RyaW5nLCB1bmtub3duPmAsIHNvIHRoZSBpbnN0YW5jZSB0eXBlIGlzIG9ubHlcbiAgLy8gcmVjb3ZlcmFibGUgZnJvbSB0aGUgZmFjdG9yeSB0aGUgY2FsbGVyIHBhc3NlZC5cbiAgcmV0dXJuIGN0eC5nZXRQbHVnaW5zKCkuZ2V0KG5hbWUpIGFzIFBsdWdpbkluc3RhbmNlT2Y8Rj4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGlrZSB7QGxpbmsgaW5zdGFuY2V9IGJ1dCB0aHJvd3Mgd2hlbiB0aGUgcGx1Z2luIGlzIG5vdCByZWdpc3RlcmVkLiBVc2UgZm9yXG4gKiBzaWJsaW5ncyB3aG9zZSBhYnNlbmNlIGlzIGEgd2lyaW5nIGJ1ZyByYXRoZXIgdGhhbiBhIHJ1bnRpbWUgY29uZGl0aW9uIChlLmcuXG4gKiByZXF1aXJpbmcgYGxha2ViYXNlYCB3aGVuIHRoZSBjYWxsZXIgaGFzIGBzdG9yYWdlYCAvIGBtZW1vcnlgIGVuYWJsZWQpLlxuICpcbiAqIGBjYWxsZXJgIGlzIHByZXBlbmRlZCB0byB0aGUgZXJyb3IgbWVzc2FnZSBzbyBjcm9zcy1wbHVnaW4gZmFpbHVyZXMgYXJlIGVhc3lcbiAqIHRvIGF0dHJpYnV0ZSBpbiBsb2dzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGNvbnN0IHBvb2wgPSBwbHVnaW4ucmVxdWlyZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlLCBcIm1hc3RyYVwiKS5leHBvcnRzKCkucG9vbDtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmU8RiBleHRlbmRzIFBsdWdpbkRhdGFGYWN0b3J5PihcbiAgY3R4OiBQbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbiAgZmFjdG9yeTogRixcbiAgY2FsbGVyPzogTmFtZUxpa2UgfCBzdHJpbmcsXG4pOiBQbHVnaW5JbnN0YW5jZU9mPEY+IHtcbiAgY29uc3QgZm91bmQgPSBpbnN0YW5jZShjdHgsIGZhY3RvcnkpO1xuICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgY29uc3QgcHJlZml4ID1cbiAgICB0eXBlb2YgY2FsbGVyID09PSBcInN0cmluZ1wiID8gYCR7Y2FsbGVyfTogYCA6IGNhbGxlcj8ubmFtZSA/IGAke2NhbGxlci5uYW1lfTogYCA6IFwiXCI7XG4gIGNvbnN0IHJlZ2lzdGVyZWROYW1lID0gZGF0YShmYWN0b3J5KS5uYW1lO1xuICBsb2dnZXIuZGVidWcoXCJyZXF1aXJlZCBwbHVnaW4gbm90IHJlZ2lzdGVyZWRcIiwge1xuICAgIHBsdWdpbjogcmVnaXN0ZXJlZE5hbWUsXG4gICAgcmVnaXN0ZXJlZDogWy4uLihjdHg/LmdldFBsdWdpbnMoKS5rZXlzKCkgPz8gW10pXSxcbiAgfSk7XG4gIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgIGAke3ByZWZpeH1wbHVnaW4gJyR7cmVnaXN0ZXJlZE5hbWV9J2AsXG4gICAgYEFkZCAke3JlZ2lzdGVyZWROYW1lfSgpIHRvIHRoZSBwbHVnaW5zIHBhc3NlZCB0byBjcmVhdGVBcHAuYCxcbiAgKTtcbn1cbiJdfQ==
@@ -1,34 +0,0 @@
1
- /**
2
- * Type-owned AppKit toolkit entry construction shared by dbx-tools add-ons.
3
- *
4
- * @module
5
- */
6
- /** Resolve one local tool name through AppKit toolkit filtering and naming options. */
7
- export function name(localName, pluginName, options = {}) {
8
- if (options.only && !options.only.includes(localName))
9
- return null;
10
- if (options.except?.includes(localName))
11
- return null;
12
- return options.rename?.[localName] ?? `${options.prefix ?? `${pluginName}.`}${localName}`;
13
- }
14
- /** Convert AppKit tool definitions into public toolkit references. */
15
- export function entries(pluginName, definitions, options = {}) {
16
- return Object.fromEntries(definitions.flatMap((definition) => {
17
- const key = name(definition.name, pluginName, options);
18
- if (key === null)
19
- return [];
20
- return [
21
- [
22
- key,
23
- {
24
- __toolkitRef: true,
25
- pluginName,
26
- localName: definition.name,
27
- def: { ...definition, name: key },
28
- annotations: definition.annotations,
29
- },
30
- ],
31
- ];
32
- }));
33
- }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sa2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFJSCx1RkFBdUY7QUFDdkYsTUFBTSxVQUFVLElBQUksQ0FDbEIsU0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsVUFBMEIsRUFBRTtJQUU1QixJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNuRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3JELE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxHQUFHLFVBQVUsR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDO0FBQzVGLENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLE9BQU8sQ0FDckIsVUFBa0IsRUFDbEIsV0FBMkMsRUFDM0MsVUFBMEIsRUFBRTtJQUU1QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBSSxHQUFHLEtBQUssSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE9BQU87WUFDTDtnQkFDRSxHQUFHO2dCQUNIO29CQUNFLFlBQVksRUFBRSxJQUFhO29CQUMzQixVQUFVO29CQUNWLFNBQVMsRUFBRSxVQUFVLENBQUMsSUFBSTtvQkFDMUIsR0FBRyxFQUFFLEVBQUUsR0FBRyxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtvQkFDakMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO2lCQUNiO2FBQ3pCO1NBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlLW93bmVkIEFwcEtpdCB0b29sa2l0IGVudHJ5IGNvbnN0cnVjdGlvbiBzaGFyZWQgYnkgZGJ4LXRvb2xzIGFkZC1vbnMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgQWdlbnRUb29sRGVmaW5pdGlvbiwgVG9vbGtpdEVudHJ5LCBUb29sa2l0T3B0aW9ucyB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuXG4vKiogUmVzb2x2ZSBvbmUgbG9jYWwgdG9vbCBuYW1lIHRocm91Z2ggQXBwS2l0IHRvb2xraXQgZmlsdGVyaW5nIGFuZCBuYW1pbmcgb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lKFxuICBsb2NhbE5hbWU6IHN0cmluZyxcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICBvcHRpb25zOiBUb29sa2l0T3B0aW9ucyA9IHt9LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChvcHRpb25zLm9ubHkgJiYgIW9wdGlvbnMub25seS5pbmNsdWRlcyhsb2NhbE5hbWUpKSByZXR1cm4gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZXhjZXB0Py5pbmNsdWRlcyhsb2NhbE5hbWUpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIG9wdGlvbnMucmVuYW1lPy5bbG9jYWxOYW1lXSA/PyBgJHtvcHRpb25zLnByZWZpeCA/PyBgJHtwbHVnaW5OYW1lfS5gfSR7bG9jYWxOYW1lfWA7XG59XG5cbi8qKiBDb252ZXJ0IEFwcEtpdCB0b29sIGRlZmluaXRpb25zIGludG8gcHVibGljIHRvb2xraXQgcmVmZXJlbmNlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnRyaWVzKFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gIGRlZmluaXRpb25zOiByZWFkb25seSBBZ2VudFRvb2xEZWZpbml0aW9uW10sXG4gIG9wdGlvbnM6IFRvb2xraXRPcHRpb25zID0ge30sXG4pOiBSZWNvcmQ8c3RyaW5nLCBUb29sa2l0RW50cnk+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBkZWZpbml0aW9ucy5mbGF0TWFwKChkZWZpbml0aW9uKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBuYW1lKGRlZmluaXRpb24ubmFtZSwgcGx1Z2luTmFtZSwgb3B0aW9ucyk7XG4gICAgICBpZiAoa2V5ID09PSBudWxsKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIF9fdG9vbGtpdFJlZjogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgIHBsdWdpbk5hbWUsXG4gICAgICAgICAgICBsb2NhbE5hbWU6IGRlZmluaXRpb24ubmFtZSxcbiAgICAgICAgICAgIGRlZjogeyAuLi5kZWZpbml0aW9uLCBuYW1lOiBrZXkgfSxcbiAgICAgICAgICAgIGFubm90YXRpb25zOiBkZWZpbml0aW9uLmFubm90YXRpb25zLFxuICAgICAgICAgIH0gc2F0aXNmaWVzIFRvb2xraXRFbnRyeSxcbiAgICAgICAgXSxcbiAgICAgIF07XG4gICAgfSksXG4gICk7XG59XG4iXX0=
package/src/brand.ts DELETED
@@ -1,13 +0,0 @@
1
- import { brand as coreBrand } from "@dbx-tools/core";
2
- import { brand as sharedBrand, type BrandContext } from "@dbx-tools/shared-core";
3
-
4
- let activeBrandContext: BrandContext = sharedBrand.defaultBrandContext;
5
-
6
- export async function loadBrandContext(cwd: string = process.cwd()): Promise<BrandContext> {
7
- activeBrandContext = await coreBrand.loadBrandContext(cwd);
8
- return activeBrandContext;
9
- }
10
-
11
- export function getBrandContext(): BrandContext {
12
- return activeBrandContext;
13
- }
File without changes
File without changes
File without changes