@dbx-tools/appkit 0.9.4 → 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
@@ -21,8 +21,8 @@
21
21
  * @module
22
22
  */
23
23
  import { createLakebasePool, getWorkspaceClient, ValidationError } from "@databricks/appkit";
24
- import { config } from "@dbx-tools/core";
25
- import { error, log } from "@dbx-tools/shared-core";
24
+ import { configUtils } from "@dbx-tools/core";
25
+ import { errorUtils, log } from "@dbx-tools/shared-core";
26
26
  const defaultLogger = log.logger("provision");
27
27
  /** AppKit persistent-cache schema (see AppKit's `PersistentStorage`). */
28
28
  const CACHE_SCHEMA = "appkit";
@@ -89,7 +89,7 @@ export function cacheGrantStatements(role) {
89
89
  * await provision.provisionCacheSchema("app-service-principal@databricks.com");
90
90
  */
91
91
  export async function provisionCacheSchema(role, logger = defaultLogger) {
92
- if (config.isDatabricksAppEnv()) {
92
+ if (configUtils.isDatabricksAppEnv()) {
93
93
  logger.debug("autopg: skip cache provisioning (inside a Databricks App)");
94
94
  return;
95
95
  }
@@ -123,11 +123,11 @@ export async function provisionCacheSchema(role, logger = defaultLogger) {
123
123
  catch (err) {
124
124
  logger.warn("autopg: cache provisioning failed (continuing)", {
125
125
  schema: CACHE_SCHEMA,
126
- error: error.errorMessage(err),
126
+ error: errorUtils.errorMessage(err),
127
127
  });
128
128
  }
129
129
  finally {
130
130
  await pool.end().catch(() => { });
131
131
  }
132
132
  }
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFOUMseUVBQXlFO0FBQ3pFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxNQUFNLFlBQVksR0FBRywyQkFBMkIsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFFcEM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPO1FBQ0wsaUNBQWlDLE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDdEQsZ0RBQWdELE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDckUsbURBQW1ELE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDeEUsc0NBQXNDLE1BQU0sMkJBQTJCLE1BQU0sRUFBRTtRQUMvRSxzQ0FBc0MsTUFBTSw4QkFBOEIsTUFBTSxFQUFFO0tBQ25GLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsSUFBd0IsRUFDeEIsU0FBcUIsYUFBYTtJQUVsQyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQzFFLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU87SUFDVCxDQUFDO0lBQ0QsZ0VBQWdFO0lBQ2hFLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDBFQUEwRTtJQUMxRSxpRkFBaUY7SUFDakYsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUk7UUFDVixlQUFlLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLHVCQUF1QixFQUFFLGtCQUFrQjtRQUMzQyxpQkFBaUIsRUFBRSxvQkFBb0I7S0FDeEMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUM1QixrRUFBa0UsRUFDbEUsQ0FBQyxZQUFZLENBQUMsQ0FDZixDQUFDO1FBQ0YsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsaURBQWlELEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUMxRixPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssTUFBTSxHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFO1lBQzVELE1BQU0sRUFBRSxZQUFZO1lBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGFrZWJhc2UgY2FjaGUtc2NoZW1hIGdyYW50IGZpeC11cC5cbiAqXG4gKiBBcHBLaXQncyBwZXJzaXN0ZW50IGNhY2hlIChgQ2FjaGVNYW5hZ2VyYCAtPiBgUGVyc2lzdGVudFN0b3JhZ2VgKSB1c2VzIGFcbiAqIHNjaGVtYSBgYXBwa2l0YCBhbmQgYSB0YWJsZSBgYXBwa2l0LmFwcGtpdF9jYWNoZV9lbnRyaWVzYC4gV2hlbiB0aGUgY29ubmVjdGluZ1xuICogRGF0YWJyaWNrcyBpZGVudGl0eSBsYWNrcyBwcml2aWxlZ2VzIG9uIHRoYXQgc2NoZW1hLCB0aGUgY2FjaGUgbWlncmF0aW9uXG4gKiB0aHJvd3MsIGFuZCBiZWNhdXNlIEFwcEtpdCBpcyB0eXBpY2FsbHkgcnVuIHdpdGggYGNhY2hlLnN0cmljdFBlcnNpc3RlbmNlOlxuICogdHJ1ZWAsIHRoZSBjYWNoZSBpcyBzaWxlbnRseSBzd2l0Y2hlZCB0byBhIGRpc2FibGVkIGluLW1lbW9yeSBzdHViIC0gc28gZXZlcnlcbiAqIHBlcnNpc3RlbnQgcmVhZCAoY2hhcnQgbG9uZy1wb2xsLCBoaXN0b3J5LCBldGMuKSBtaXNzZXMgYW5kIDQwNHMuXG4gKlxuICogVGhpcyBncmFudHMgdGhlIGNvbm5lY3Rpbmcgcm9sZSBmdWxsIHJpZ2h0cyBvbiB0aGUgY2FjaGUgc2NoZW1hLCBidXQgb25seSB3aGVuXG4gKiB0aGUgc2NoZW1hIEFMUkVBRFkgRVhJU1RTIC0gaXQgbmV2ZXIgY3JlYXRlcyB0aGUgc2NoZW1hIGl0c2VsZi4gUnVuIGZyb20gYVxuICogTE9DQUwgaWRlbnRpdHkgdGhhdCBvd25zIHRoZSBzY2hlbWEgKG9yIGhvbGRzIGdyYW50IG9wdGlvbiBvbiBpdCk7IGl0IGlzXG4gKiBza2lwcGVkIGluc2lkZSBhIERhdGFicmlja3MgQXBwLCB3aGVyZSB0aGUgYXBwIFNQIGNhbm5vdCBncmFudCBhbmQgaXRzXG4gKiBQb3N0Z3JlcyByb2xlIGRvZXMgbm90IGV4aXN0IHVudGlsIGl0cyBmaXJzdCBjb25uZWN0aW9uLlxuICpcbiAqIE11c3QgcnVuIEFGVEVSIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IGhhcyB3cml0dGVuIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uXG4gKiB0byBgcHJvY2Vzcy5lbnZgIChzbyBgY3JlYXRlTGFrZWJhc2VQb29sYCBwaWNrcyB1cCBob3N0IC8gZGF0YWJhc2UgLyBlbmRwb2ludClcbiAqIGFuZCBCRUZPUkUgYGNyZWF0ZUFwcGAgaW5pdGlhbGl6ZXMgdGhlIGNhY2hlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVMYWtlYmFzZVBvb2wsIGdldFdvcmtzcGFjZUNsaWVudCwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgZXJyb3IsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmNvbnN0IGRlZmF1bHRMb2dnZXIgPSBsb2cubG9nZ2VyKFwicHJvdmlzaW9uXCIpO1xuXG4vKiogQXBwS2l0IHBlcnNpc3RlbnQtY2FjaGUgc2NoZW1hIChzZWUgQXBwS2l0J3MgYFBlcnNpc3RlbnRTdG9yYWdlYCkuICovXG5jb25zdCBDQUNIRV9TQ0hFTUEgPSBcImFwcGtpdFwiO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgYSBMYWtlYmFzZSBQb3N0Z3JlcyByb2xlIGNhbiBsZWdpdGltYXRlbHkgY29udGFpbjogd29ya3NwYWNlXG4gKiBpZGVudGl0aWVzIGFyZSBlbWFpbHMsIHNlcnZpY2UgcHJpbmNpcGFscyBhcmUgVVVJRHMuXG4gKi9cbmNvbnN0IFJPTEVfUEFUVEVSTiA9IC9eW0EtWmEtejAtOS5fQCstXXsxLDI1NX0kLztcblxuLyoqXG4gKiBQcm92aXNpb25pbmcgcnVucyBhdCBib290IGFzIHRoZSBsb2NhbCBkZXZlbG9wZXIgaWRlbnRpdHksIGJlZm9yZSBhbnkgcGx1Z2luXG4gKiBleGlzdHMsIHNvIGl0IGlzIG91dHNpZGUgQXBwS2l0J3MgaW50ZXJjZXB0b3IgY2hhaW4gYW5kIGluaGVyaXRzIG5vIHRpbWVvdXRcbiAqIGZyb20gaXQuIEJvdGggYm91bmRzIGFyZSBleHBsaWNpdCBmb3IgdGhhdCByZWFzb24uXG4gKi9cbmNvbnN0IENPTk5FQ1RfVElNRU9VVF9NUyA9IDEwXzAwMDtcbmNvbnN0IFNUQVRFTUVOVF9USU1FT1VUX01TID0gMTVfMDAwO1xuXG4vKipcbiAqIFF1b3RlIGEgUG9zdGdyZXMgaWRlbnRpZmllcjogd3JhcCBpbiBkb3VibGUgcXVvdGVzIGFuZCBkb3VibGUgYW55IGVtYmVkZGVkXG4gKiBxdW90ZS4gU2NoZW1hIGFuZCByb2xlIG5hbWVzIGFyZSBpZGVudGlmaWVycywgYW5kIFBvc3RncmVzIGRvZXMgbm90IGFjY2VwdCBhXG4gKiBiaW5kIHBhcmFtZXRlciBpbiBhbiBpZGVudGlmaWVyIHBvc2l0aW9uLCBzbyBxdW90aW5nIGlzIHRoZSBvbmx5IGRlZmVuc2VcbiAqIGF2YWlsYWJsZSBmb3IgdGhlc2Ugc3RhdGVtZW50cy4gTGFrZWJhc2Ugcm9sZSBuYW1lcyBhcmUgdXN1YWxseSBlbWFpbHNcbiAqIChgdXNlckBob3N0YCksIHdoaWNoIG11c3QgYmUgcXVvdGVkIHRvIGJlIGEgdmFsaWQgaWRlbnRpZmllciBhdCBhbGwuXG4gKi9cbmZ1bmN0aW9uIHF1b3RlSWRlbnQoaWRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgXCIke2lkZW50LnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbnQgZ3JhbnRzIHRoYXQgbWFrZSB0aGUgKGFscmVhZHktZXhpc3RpbmcpIEFwcEtpdCBjYWNoZSBzY2hlbWEgZnVsbHlcbiAqIHVzYWJsZSBieSBgcm9sZWAuIFRoZSBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTYCBsaW5lcyBjb3ZlciB0aGUgY2FjaGUgdGFibGVcbiAqIHdoZW5ldmVyIHRoZSBzY2hlbWEgb3duZXIgY3JlYXRlcyBpdCBsYXRlci5cbiAqXG4gKiBUaHJvd3MgYSB7QGxpbmsgVmFsaWRhdGlvbkVycm9yfSB3aGVuIGByb2xlYCBpcyBub3QgYSBwbGF1c2libGUgUG9zdGdyZXMgcm9sZVxuICogbmFtZSwgc2luY2UgdGhlIHZhbHVlIGxhbmRzIGluIGFuIGlkZW50aWZpZXIgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUdyYW50U3RhdGVtZW50cyhyb2xlOiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmICghUk9MRV9QQVRURVJOLnRlc3Qocm9sZSkpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFwicm9sZVwiLCByb2xlLCBcImEgUG9zdGdyZXMgcm9sZSBuYW1lXCIpO1xuICB9XG4gIGNvbnN0IHNjaGVtYSA9IHF1b3RlSWRlbnQoQ0FDSEVfU0NIRU1BKTtcbiAgY29uc3QgdGFyZ2V0ID0gcXVvdGVJZGVudChyb2xlKTtcbiAgcmV0dXJuIFtcbiAgICBgR1JBTlQgVVNBR0UsIENSRUFURSBPTiBTQ0hFTUEgJHtzY2hlbWF9IFRPICR7dGFyZ2V0fWAsXG4gICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BICR7c2NoZW1hfSBUTyAke3RhcmdldH1gLFxuICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSAke3NjaGVtYX0gVE8gJHt0YXJnZXR9YCxcbiAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSAke3NjaGVtYX0gR1JBTlQgQUxMIE9OIFRBQkxFUyBUTyAke3RhcmdldH1gLFxuICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BICR7c2NoZW1hfSBHUkFOVCBBTEwgT04gU0VRVUVOQ0VTIFRPICR7dGFyZ2V0fWAsXG4gIF07XG59XG5cbi8qKlxuICogR3JhbnQgYHJvbGVgIHJpZ2h0cyBvbiB0aGUgQXBwS2l0IGNhY2hlIHNjaGVtYSwgYnV0IG9ubHkgd2hlbiB0aGF0IHNjaGVtYVxuICogYWxyZWFkeSBleGlzdHMuXG4gKlxuICogTm8tb3BzIGluc2lkZSBhIERhdGFicmlja3MgQXBwIGVudiwgd2hlbiBgcm9sZWAgaXMgdW5kZWZpbmVkLCBvciB3aGVuIHRoZVxuICogc2NoZW1hIGlzIGFic2VudC4gQmVzdC1lZmZvcnQgb3RoZXJ3aXNlOiBhbnkgZmFpbHVyZSAoZS5nLiB0aGUgbG9jYWwgaWRlbnRpdHlcbiAqIGRvZXNuJ3Qgb3duIHRoZSBzY2hlbWEpIGlzIGxvZ2dlZCBhbmQgc3dhbGxvd2VkIHNvIGl0IG5ldmVyIGJsb2NrcyBzdGFydHVwIC1cbiAqIGEgZGlzYWJsZWQgY2FjaGUgaXMgZGVncmFkZWQsIG5vdCBmYXRhbC5cbiAqXG4gKiBAcGFyYW0gcm9sZSAtIFBvc3RncmVzIHJvbGUgdG8gZ3JhbnQgdG8gYW5kIGNvbm5lY3QgYXMgKHRoZSByZXNvbHZlZFxuICogICB3b3Jrc3BhY2UtY2xpZW50IGlkZW50aXR5KTsgc2tpcHMgd2hlbiB1bmRlZmluZWQuXG4gKiBAcGFyYW0gbG9nZ2VyIC0gTG9nZ2VyIHRvIHJlcG9ydCBwcm9ncmVzcyBvbi4gRGVmYXVsdHMgdG8gdGhpcyBtb2R1bGUncy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgcHJvdmlzaW9uIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgcHJvdmlzaW9uLnByb3Zpc2lvbkNhY2hlU2NoZW1hKFwiYXBwLXNlcnZpY2UtcHJpbmNpcGFsQGRhdGFicmlja3MuY29tXCIpO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlzaW9uQ2FjaGVTY2hlbWEoXG4gIHJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbG9nZ2VyOiBsb2cuTG9nZ2VyID0gZGVmYXVsdExvZ2dlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29uZmlnLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBza2lwIGNhY2hlIHByb3Zpc2lvbmluZyAoaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHApXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXJvbGUpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKGNvdWxkIG5vdCByZXNvbHZlIGNvbm5lY3Rpbmcgcm9sZSlcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIFBhc3MgYHVzZXJgIGV4cGxpY2l0bHk6IGF1dG9wZyByZXNvbHZlcyB0aGUgY29ubmVjdGlvbiB0YXJnZXRcbiAgLy8gKGhvc3QvZGF0YWJhc2UvZW5kcG9pbnQpIGJ1dCBub3QgdGhlIGlkZW50aXR5LCBzbyBgY3JlYXRlTGFrZWJhc2VQb29sYCdzXG4gIC8vIHN5bmNocm9ub3VzIHVzZXJuYW1lIGxvb2t1cCB3b3VsZCBvdGhlcndpc2UgdGhyb3cuIGBnZXRXb3Jrc3BhY2VDbGllbnQoe30pYFxuICAvLyByZXR1cm5zIGEgZnJlc2ggZGVmYXVsdC1hdXRoIGNsaWVudCAtIGxpdGVyYWxseSBgbmV3IFdvcmtzcGFjZUNsaWVudCh7fSlgLFxuICAvLyBidXQgYnVpbHQgYWdhaW5zdCB0aGUgU0RLIHZlcnNpb24gQXBwS2l0J3MgYGNyZWF0ZUxha2ViYXNlUG9vbGAgZXhwZWN0c1xuICAvLyAoaW1wb3J0aW5nIHRoZSBTREsgY2xhc3MgZGlyZWN0bHkgaGVyZSBwdWxscyBhIG5ld2VyLCB0eXBlLWluY29tcGF0aWJsZSBjb3B5KS5cbiAgY29uc3QgcG9vbCA9IGNyZWF0ZUxha2ViYXNlUG9vbCh7XG4gICAgdXNlcjogcm9sZSxcbiAgICB3b3Jrc3BhY2VDbGllbnQ6IGdldFdvcmtzcGFjZUNsaWVudCh7fSksXG4gICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IENPTk5FQ1RfVElNRU9VVF9NUyxcbiAgICBzdGF0ZW1lbnRfdGltZW91dDogU1RBVEVNRU5UX1RJTUVPVVRfTVMsXG4gIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgcG9vbC5xdWVyeShcbiAgICAgIFwiU0VMRUNUIDEgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2NoZW1hdGEgV0hFUkUgc2NoZW1hX25hbWUgPSAkMVwiLFxuICAgICAgW0NBQ0hFX1NDSEVNQV0sXG4gICAgKTtcbiAgICBpZiAoZm91bmQucm93Q291bnQgPT09IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKHNjaGVtYSBhYnNlbnQpXCIsIHsgc2NoZW1hOiBDQUNIRV9TQ0hFTUEgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3FsIG9mIGNhY2hlR3JhbnRTdGF0ZW1lbnRzKHJvbGUpKSB7XG4gICAgICBhd2FpdCBwb29sLnF1ZXJ5KHNxbCk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwiYXV0b3BnOiBncmFudGVkIGNhY2hlIHNjaGVtYVwiLCB7IHNjaGVtYTogQ0FDSEVfU0NIRU1BLCByb2xlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogY2FjaGUgcHJvdmlzaW9uaW5nIGZhaWxlZCAoY29udGludWluZylcIiwge1xuICAgICAgc2NoZW1hOiBDQUNIRV9TQ0hFTUEsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcG9vbC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cbn1cbiJdfQ==
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFOUMseUVBQXlFO0FBQ3pFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxNQUFNLFlBQVksR0FBRywyQkFBMkIsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFFcEM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPO1FBQ0wsaUNBQWlDLE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDdEQsZ0RBQWdELE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDckUsbURBQW1ELE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDeEUsc0NBQXNDLE1BQU0sMkJBQTJCLE1BQU0sRUFBRTtRQUMvRSxzQ0FBc0MsTUFBTSw4QkFBOEIsTUFBTSxFQUFFO0tBQ25GLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsSUFBd0IsRUFDeEIsU0FBcUIsYUFBYTtJQUVsQyxJQUFJLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQzFFLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU87SUFDVCxDQUFDO0lBQ0QsZ0VBQWdFO0lBQ2hFLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDBFQUEwRTtJQUMxRSxpRkFBaUY7SUFDakYsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUk7UUFDVixlQUFlLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLHVCQUF1QixFQUFFLGtCQUFrQjtRQUMzQyxpQkFBaUIsRUFBRSxvQkFBb0I7S0FDeEMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUM1QixrRUFBa0UsRUFDbEUsQ0FBQyxZQUFZLENBQUMsQ0FDZixDQUFDO1FBQ0YsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsaURBQWlELEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUMxRixPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssTUFBTSxHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFO1lBQzVELE1BQU0sRUFBRSxZQUFZO1lBQ3BCLEtBQUssRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGFrZWJhc2UgY2FjaGUtc2NoZW1hIGdyYW50IGZpeC11cC5cbiAqXG4gKiBBcHBLaXQncyBwZXJzaXN0ZW50IGNhY2hlIChgQ2FjaGVNYW5hZ2VyYCAtPiBgUGVyc2lzdGVudFN0b3JhZ2VgKSB1c2VzIGFcbiAqIHNjaGVtYSBgYXBwa2l0YCBhbmQgYSB0YWJsZSBgYXBwa2l0LmFwcGtpdF9jYWNoZV9lbnRyaWVzYC4gV2hlbiB0aGUgY29ubmVjdGluZ1xuICogRGF0YWJyaWNrcyBpZGVudGl0eSBsYWNrcyBwcml2aWxlZ2VzIG9uIHRoYXQgc2NoZW1hLCB0aGUgY2FjaGUgbWlncmF0aW9uXG4gKiB0aHJvd3MsIGFuZCBiZWNhdXNlIEFwcEtpdCBpcyB0eXBpY2FsbHkgcnVuIHdpdGggYGNhY2hlLnN0cmljdFBlcnNpc3RlbmNlOlxuICogdHJ1ZWAsIHRoZSBjYWNoZSBpcyBzaWxlbnRseSBzd2l0Y2hlZCB0byBhIGRpc2FibGVkIGluLW1lbW9yeSBzdHViIC0gc28gZXZlcnlcbiAqIHBlcnNpc3RlbnQgcmVhZCAoY2hhcnQgbG9uZy1wb2xsLCBoaXN0b3J5LCBldGMuKSBtaXNzZXMgYW5kIDQwNHMuXG4gKlxuICogVGhpcyBncmFudHMgdGhlIGNvbm5lY3Rpbmcgcm9sZSBmdWxsIHJpZ2h0cyBvbiB0aGUgY2FjaGUgc2NoZW1hLCBidXQgb25seSB3aGVuXG4gKiB0aGUgc2NoZW1hIEFMUkVBRFkgRVhJU1RTIC0gaXQgbmV2ZXIgY3JlYXRlcyB0aGUgc2NoZW1hIGl0c2VsZi4gUnVuIGZyb20gYVxuICogTE9DQUwgaWRlbnRpdHkgdGhhdCBvd25zIHRoZSBzY2hlbWEgKG9yIGhvbGRzIGdyYW50IG9wdGlvbiBvbiBpdCk7IGl0IGlzXG4gKiBza2lwcGVkIGluc2lkZSBhIERhdGFicmlja3MgQXBwLCB3aGVyZSB0aGUgYXBwIFNQIGNhbm5vdCBncmFudCBhbmQgaXRzXG4gKiBQb3N0Z3JlcyByb2xlIGRvZXMgbm90IGV4aXN0IHVudGlsIGl0cyBmaXJzdCBjb25uZWN0aW9uLlxuICpcbiAqIE11c3QgcnVuIEFGVEVSIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IGhhcyB3cml0dGVuIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uXG4gKiB0byBgcHJvY2Vzcy5lbnZgIChzbyBgY3JlYXRlTGFrZWJhc2VQb29sYCBwaWNrcyB1cCBob3N0IC8gZGF0YWJhc2UgLyBlbmRwb2ludClcbiAqIGFuZCBCRUZPUkUgYGNyZWF0ZUFwcGAgaW5pdGlhbGl6ZXMgdGhlIGNhY2hlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVMYWtlYmFzZVBvb2wsIGdldFdvcmtzcGFjZUNsaWVudCwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBkZWZhdWx0TG9nZ2VyID0gbG9nLmxvZ2dlcihcInByb3Zpc2lvblwiKTtcblxuLyoqIEFwcEtpdCBwZXJzaXN0ZW50LWNhY2hlIHNjaGVtYSAoc2VlIEFwcEtpdCdzIGBQZXJzaXN0ZW50U3RvcmFnZWApLiAqL1xuY29uc3QgQ0FDSEVfU0NIRU1BID0gXCJhcHBraXRcIjtcblxuLyoqXG4gKiBDaGFyYWN0ZXJzIGEgTGFrZWJhc2UgUG9zdGdyZXMgcm9sZSBjYW4gbGVnaXRpbWF0ZWx5IGNvbnRhaW46IHdvcmtzcGFjZVxuICogaWRlbnRpdGllcyBhcmUgZW1haWxzLCBzZXJ2aWNlIHByaW5jaXBhbHMgYXJlIFVVSURzLlxuICovXG5jb25zdCBST0xFX1BBVFRFUk4gPSAvXltBLVphLXowLTkuX0ArLV17MSwyNTV9JC87XG5cbi8qKlxuICogUHJvdmlzaW9uaW5nIHJ1bnMgYXQgYm9vdCBhcyB0aGUgbG9jYWwgZGV2ZWxvcGVyIGlkZW50aXR5LCBiZWZvcmUgYW55IHBsdWdpblxuICogZXhpc3RzLCBzbyBpdCBpcyBvdXRzaWRlIEFwcEtpdCdzIGludGVyY2VwdG9yIGNoYWluIGFuZCBpbmhlcml0cyBubyB0aW1lb3V0XG4gKiBmcm9tIGl0LiBCb3RoIGJvdW5kcyBhcmUgZXhwbGljaXQgZm9yIHRoYXQgcmVhc29uLlxuICovXG5jb25zdCBDT05ORUNUX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG5jb25zdCBTVEFURU1FTlRfVElNRU9VVF9NUyA9IDE1XzAwMDtcblxuLyoqXG4gKiBRdW90ZSBhIFBvc3RncmVzIGlkZW50aWZpZXI6IHdyYXAgaW4gZG91YmxlIHF1b3RlcyBhbmQgZG91YmxlIGFueSBlbWJlZGRlZFxuICogcXVvdGUuIFNjaGVtYSBhbmQgcm9sZSBuYW1lcyBhcmUgaWRlbnRpZmllcnMsIGFuZCBQb3N0Z3JlcyBkb2VzIG5vdCBhY2NlcHQgYVxuICogYmluZCBwYXJhbWV0ZXIgaW4gYW4gaWRlbnRpZmllciBwb3NpdGlvbiwgc28gcXVvdGluZyBpcyB0aGUgb25seSBkZWZlbnNlXG4gKiBhdmFpbGFibGUgZm9yIHRoZXNlIHN0YXRlbWVudHMuIExha2ViYXNlIHJvbGUgbmFtZXMgYXJlIHVzdWFsbHkgZW1haWxzXG4gKiAoYHVzZXJAaG9zdGApLCB3aGljaCBtdXN0IGJlIHF1b3RlZCB0byBiZSBhIHZhbGlkIGlkZW50aWZpZXIgYXQgYWxsLlxuICovXG5mdW5jdGlvbiBxdW90ZUlkZW50KGlkZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFwiJHtpZGVudC5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbn1cblxuLyoqXG4gKiBJZGVtcG90ZW50IGdyYW50cyB0aGF0IG1ha2UgdGhlIChhbHJlYWR5LWV4aXN0aW5nKSBBcHBLaXQgY2FjaGUgc2NoZW1hIGZ1bGx5XG4gKiB1c2FibGUgYnkgYHJvbGVgLiBUaGUgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFU2AgbGluZXMgY292ZXIgdGhlIGNhY2hlIHRhYmxlXG4gKiB3aGVuZXZlciB0aGUgc2NoZW1hIG93bmVyIGNyZWF0ZXMgaXQgbGF0ZXIuXG4gKlxuICogVGhyb3dzIGEge0BsaW5rIFZhbGlkYXRpb25FcnJvcn0gd2hlbiBgcm9sZWAgaXMgbm90IGEgcGxhdXNpYmxlIFBvc3RncmVzIHJvbGVcbiAqIG5hbWUsIHNpbmNlIHRoZSB2YWx1ZSBsYW5kcyBpbiBhbiBpZGVudGlmaWVyIHBvc2l0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVHcmFudFN0YXRlbWVudHMocm9sZTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBpZiAoIVJPTEVfUEFUVEVSTi50ZXN0KHJvbGUpKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcInJvbGVcIiwgcm9sZSwgXCJhIFBvc3RncmVzIHJvbGUgbmFtZVwiKTtcbiAgfVxuICBjb25zdCBzY2hlbWEgPSBxdW90ZUlkZW50KENBQ0hFX1NDSEVNQSk7XG4gIGNvbnN0IHRhcmdldCA9IHF1b3RlSWRlbnQocm9sZSk7XG4gIHJldHVybiBbXG4gICAgYEdSQU5UIFVTQUdFLCBDUkVBVEUgT04gU0NIRU1BICR7c2NoZW1hfSBUTyAke3RhcmdldH1gLFxuICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgVEFCTEVTIElOIFNDSEVNQSAke3NjaGVtYX0gVE8gJHt0YXJnZXR9YCxcbiAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgJHtzY2hlbWF9IFRPICR7dGFyZ2V0fWAsXG4gICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgJHtzY2hlbWF9IEdSQU5UIEFMTCBPTiBUQUJMRVMgVE8gJHt0YXJnZXR9YCxcbiAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSAke3NjaGVtYX0gR1JBTlQgQUxMIE9OIFNFUVVFTkNFUyBUTyAke3RhcmdldH1gLFxuICBdO1xufVxuXG4vKipcbiAqIEdyYW50IGByb2xlYCByaWdodHMgb24gdGhlIEFwcEtpdCBjYWNoZSBzY2hlbWEsIGJ1dCBvbmx5IHdoZW4gdGhhdCBzY2hlbWFcbiAqIGFscmVhZHkgZXhpc3RzLlxuICpcbiAqIE5vLW9wcyBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCBlbnYsIHdoZW4gYHJvbGVgIGlzIHVuZGVmaW5lZCwgb3Igd2hlbiB0aGVcbiAqIHNjaGVtYSBpcyBhYnNlbnQuIEJlc3QtZWZmb3J0IG90aGVyd2lzZTogYW55IGZhaWx1cmUgKGUuZy4gdGhlIGxvY2FsIGlkZW50aXR5XG4gKiBkb2Vzbid0IG93biB0aGUgc2NoZW1hKSBpcyBsb2dnZWQgYW5kIHN3YWxsb3dlZCBzbyBpdCBuZXZlciBibG9ja3Mgc3RhcnR1cCAtXG4gKiBhIGRpc2FibGVkIGNhY2hlIGlzIGRlZ3JhZGVkLCBub3QgZmF0YWwuXG4gKlxuICogQHBhcmFtIHJvbGUgLSBQb3N0Z3JlcyByb2xlIHRvIGdyYW50IHRvIGFuZCBjb25uZWN0IGFzICh0aGUgcmVzb2x2ZWRcbiAqICAgd29ya3NwYWNlLWNsaWVudCBpZGVudGl0eSk7IHNraXBzIHdoZW4gdW5kZWZpbmVkLlxuICogQHBhcmFtIGxvZ2dlciAtIExvZ2dlciB0byByZXBvcnQgcHJvZ3Jlc3Mgb24uIERlZmF1bHRzIHRvIHRoaXMgbW9kdWxlJ3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IHByb3Zpc2lvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGF3YWl0IHByb3Zpc2lvbi5wcm92aXNpb25DYWNoZVNjaGVtYShcImFwcC1zZXJ2aWNlLXByaW5jaXBhbEBkYXRhYnJpY2tzLmNvbVwiKTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbkNhY2hlU2NoZW1hKFxuICByb2xlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGxvZ2dlcjogbG9nLkxvZ2dlciA9IGRlZmF1bHRMb2dnZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNvbmZpZ1V0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBza2lwIGNhY2hlIHByb3Zpc2lvbmluZyAoaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHApXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXJvbGUpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKGNvdWxkIG5vdCByZXNvbHZlIGNvbm5lY3Rpbmcgcm9sZSlcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIFBhc3MgYHVzZXJgIGV4cGxpY2l0bHk6IGF1dG9wZyByZXNvbHZlcyB0aGUgY29ubmVjdGlvbiB0YXJnZXRcbiAgLy8gKGhvc3QvZGF0YWJhc2UvZW5kcG9pbnQpIGJ1dCBub3QgdGhlIGlkZW50aXR5LCBzbyBgY3JlYXRlTGFrZWJhc2VQb29sYCdzXG4gIC8vIHN5bmNocm9ub3VzIHVzZXJuYW1lIGxvb2t1cCB3b3VsZCBvdGhlcndpc2UgdGhyb3cuIGBnZXRXb3Jrc3BhY2VDbGllbnQoe30pYFxuICAvLyByZXR1cm5zIGEgZnJlc2ggZGVmYXVsdC1hdXRoIGNsaWVudCAtIGxpdGVyYWxseSBgbmV3IFdvcmtzcGFjZUNsaWVudCh7fSlgLFxuICAvLyBidXQgYnVpbHQgYWdhaW5zdCB0aGUgU0RLIHZlcnNpb24gQXBwS2l0J3MgYGNyZWF0ZUxha2ViYXNlUG9vbGAgZXhwZWN0c1xuICAvLyAoaW1wb3J0aW5nIHRoZSBTREsgY2xhc3MgZGlyZWN0bHkgaGVyZSBwdWxscyBhIG5ld2VyLCB0eXBlLWluY29tcGF0aWJsZSBjb3B5KS5cbiAgY29uc3QgcG9vbCA9IGNyZWF0ZUxha2ViYXNlUG9vbCh7XG4gICAgdXNlcjogcm9sZSxcbiAgICB3b3Jrc3BhY2VDbGllbnQ6IGdldFdvcmtzcGFjZUNsaWVudCh7fSksXG4gICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IENPTk5FQ1RfVElNRU9VVF9NUyxcbiAgICBzdGF0ZW1lbnRfdGltZW91dDogU1RBVEVNRU5UX1RJTUVPVVRfTVMsXG4gIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgcG9vbC5xdWVyeShcbiAgICAgIFwiU0VMRUNUIDEgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2NoZW1hdGEgV0hFUkUgc2NoZW1hX25hbWUgPSAkMVwiLFxuICAgICAgW0NBQ0hFX1NDSEVNQV0sXG4gICAgKTtcbiAgICBpZiAoZm91bmQucm93Q291bnQgPT09IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKHNjaGVtYSBhYnNlbnQpXCIsIHsgc2NoZW1hOiBDQUNIRV9TQ0hFTUEgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3FsIG9mIGNhY2hlR3JhbnRTdGF0ZW1lbnRzKHJvbGUpKSB7XG4gICAgICBhd2FpdCBwb29sLnF1ZXJ5KHNxbCk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwiYXV0b3BnOiBncmFudGVkIGNhY2hlIHNjaGVtYVwiLCB7IHNjaGVtYTogQ0FDSEVfU0NIRU1BLCByb2xlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogY2FjaGUgcHJvdmlzaW9uaW5nIGZhaWxlZCAoY29udGludWluZylcIiwge1xuICAgICAgc2NoZW1hOiBDQUNIRV9TQ0hFTUEsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwb29sLmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,17 @@
1
+ /** AppKit plugin base for tools backed by the native registry helpers. */
2
+ import { Plugin, type BasePluginConfig } from "@databricks/appkit";
3
+ import { type AgentToolDefinition, type ToolProvider, type ToolRegistry } from "@databricks/appkit/beta";
4
+ /**
5
+ * Implements AppKit's `ToolProvider` contract from one native tool registry.
6
+ *
7
+ * Subclasses own only their registry entries. Validation, LLM-friendly schema
8
+ * errors, tool descriptions, and dispatch stay on AppKit's native helpers.
9
+ */
10
+ export declare abstract class ToolRegistryPlugin<TConfig extends BasePluginConfig = BasePluginConfig> extends Plugin<TConfig> implements ToolProvider {
11
+ /** Native AppKit tool entries exposed by this plugin. */
12
+ protected abstract get toolRegistry(): ToolRegistry;
13
+ /** Tool definitions offered to an AppKit agent. */
14
+ getAgentTools(): AgentToolDefinition[];
15
+ /** Validate and dispatch one AppKit agent tool call. */
16
+ executeAgentTool(name: string, args: unknown, signal?: AbortSignal): Promise<unknown>;
17
+ }
@@ -0,0 +1,20 @@
1
+ /** AppKit plugin base for tools backed by the native registry helpers. */
2
+ import { Plugin } from "@databricks/appkit";
3
+ import { executeFromRegistry, toolsFromRegistry, } from "@databricks/appkit/beta";
4
+ /**
5
+ * Implements AppKit's `ToolProvider` contract from one native tool registry.
6
+ *
7
+ * Subclasses own only their registry entries. Validation, LLM-friendly schema
8
+ * errors, tool descriptions, and dispatch stay on AppKit's native helpers.
9
+ */
10
+ export class ToolRegistryPlugin extends Plugin {
11
+ /** Tool definitions offered to an AppKit agent. */
12
+ getAgentTools() {
13
+ return toolsFromRegistry(this.toolRegistry);
14
+ }
15
+ /** Validate and dispatch one AppKit agent tool call. */
16
+ executeAgentTool(name, args, signal) {
17
+ return executeFromRegistry(this.toolRegistry, name, args, signal);
18
+ }
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBFQUEwRTtBQUUxRSxPQUFPLEVBQUUsTUFBTSxFQUF5QixNQUFNLG9CQUFvQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsaUJBQWlCLEdBSWxCLE1BQU0seUJBQXlCLENBQUM7QUFFakM7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQWdCLGtCQUNwQixTQUFRLE1BQWU7SUFNdkIsbURBQW1EO0lBQ25ELGFBQWE7UUFDWCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELGdCQUFnQixDQUFDLElBQVksRUFBRSxJQUFhLEVBQUUsTUFBb0I7UUFDaEUsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEFwcEtpdCBwbHVnaW4gYmFzZSBmb3IgdG9vbHMgYmFja2VkIGJ5IHRoZSBuYXRpdmUgcmVnaXN0cnkgaGVscGVycy4gKi9cblxuaW1wb3J0IHsgUGx1Z2luLCB0eXBlIEJhc2VQbHVnaW5Db25maWcgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBleGVjdXRlRnJvbVJlZ2lzdHJ5LFxuICB0b29sc0Zyb21SZWdpc3RyeSxcbiAgdHlwZSBBZ2VudFRvb2xEZWZpbml0aW9uLFxuICB0eXBlIFRvb2xQcm92aWRlcixcbiAgdHlwZSBUb29sUmVnaXN0cnksXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuXG4vKipcbiAqIEltcGxlbWVudHMgQXBwS2l0J3MgYFRvb2xQcm92aWRlcmAgY29udHJhY3QgZnJvbSBvbmUgbmF0aXZlIHRvb2wgcmVnaXN0cnkuXG4gKlxuICogU3ViY2xhc3NlcyBvd24gb25seSB0aGVpciByZWdpc3RyeSBlbnRyaWVzLiBWYWxpZGF0aW9uLCBMTE0tZnJpZW5kbHkgc2NoZW1hXG4gKiBlcnJvcnMsIHRvb2wgZGVzY3JpcHRpb25zLCBhbmQgZGlzcGF0Y2ggc3RheSBvbiBBcHBLaXQncyBuYXRpdmUgaGVscGVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRvb2xSZWdpc3RyeVBsdWdpbjxUQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyA9IEJhc2VQbHVnaW5Db25maWc+XG4gIGV4dGVuZHMgUGx1Z2luPFRDb25maWc+XG4gIGltcGxlbWVudHMgVG9vbFByb3ZpZGVyXG57XG4gIC8qKiBOYXRpdmUgQXBwS2l0IHRvb2wgZW50cmllcyBleHBvc2VkIGJ5IHRoaXMgcGx1Z2luLiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHRvb2xSZWdpc3RyeSgpOiBUb29sUmVnaXN0cnk7XG5cbiAgLyoqIFRvb2wgZGVmaW5pdGlvbnMgb2ZmZXJlZCB0byBhbiBBcHBLaXQgYWdlbnQuICovXG4gIGdldEFnZW50VG9vbHMoKTogQWdlbnRUb29sRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdG9vbHNGcm9tUmVnaXN0cnkodGhpcy50b29sUmVnaXN0cnkpO1xuICB9XG5cbiAgLyoqIFZhbGlkYXRlIGFuZCBkaXNwYXRjaCBvbmUgQXBwS2l0IGFnZW50IHRvb2wgY2FsbC4gKi9cbiAgZXhlY3V0ZUFnZW50VG9vbChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVGcm9tUmVnaXN0cnkodGhpcy50b29sUmVnaXN0cnksIG5hbWUsIGFyZ3MsIHNpZ25hbCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,34 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC1lbnRyaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xraXQtZW50cmllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBSUgsdUZBQXVGO0FBQ3ZGLE1BQU0sVUFBVSxJQUFJLENBQ2xCLFNBQWlCLEVBQ2pCLFVBQWtCLEVBQ2xCLFVBQTBCLEVBQUU7SUFFNUIsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbkUsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksR0FBRyxVQUFVLEdBQUcsR0FBRyxTQUFTLEVBQUUsQ0FBQztBQUM1RixDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxPQUFPLENBQ3JCLFVBQWtCLEVBQ2xCLFdBQTJDLEVBQzNDLFVBQTBCLEVBQUU7SUFFNUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELElBQUksR0FBRyxLQUFLLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM1QixPQUFPO1lBQ0w7Z0JBQ0UsR0FBRztnQkFDSDtvQkFDRSxZQUFZLEVBQUUsSUFBYTtvQkFDM0IsVUFBVTtvQkFDVixTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUk7b0JBQzFCLEdBQUcsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7b0JBQ2pDLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVztpQkFDYjthQUN6QjtTQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHlwZS1vd25lZCBBcHBLaXQgdG9vbGtpdCBlbnRyeSBjb25zdHJ1Y3Rpb24gc2hhcmVkIGJ5IGRieC10b29scyBhZGQtb25zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFnZW50VG9vbERlZmluaXRpb24sIFRvb2xraXRFbnRyeSwgVG9vbGtpdE9wdGlvbnMgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcblxuLyoqIFJlc29sdmUgb25lIGxvY2FsIHRvb2wgbmFtZSB0aHJvdWdoIEFwcEtpdCB0b29sa2l0IGZpbHRlcmluZyBhbmQgbmFtaW5nIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZShcbiAgbG9jYWxOYW1lOiBzdHJpbmcsXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgb3B0aW9uczogVG9vbGtpdE9wdGlvbnMgPSB7fSxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAob3B0aW9ucy5vbmx5ICYmICFvcHRpb25zLm9ubHkuaW5jbHVkZXMobG9jYWxOYW1lKSkgcmV0dXJuIG51bGw7XG4gIGlmIChvcHRpb25zLmV4Y2VwdD8uaW5jbHVkZXMobG9jYWxOYW1lKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBvcHRpb25zLnJlbmFtZT8uW2xvY2FsTmFtZV0gPz8gYCR7b3B0aW9ucy5wcmVmaXggPz8gYCR7cGx1Z2luTmFtZX0uYH0ke2xvY2FsTmFtZX1gO1xufVxuXG4vKiogQ29udmVydCBBcHBLaXQgdG9vbCBkZWZpbml0aW9ucyBpbnRvIHB1YmxpYyB0b29sa2l0IHJlZmVyZW5jZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZW50cmllcyhcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uczogcmVhZG9ubHkgQWdlbnRUb29sRGVmaW5pdGlvbltdLFxuICBvcHRpb25zOiBUb29sa2l0T3B0aW9ucyA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgVG9vbGtpdEVudHJ5PiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgZGVmaW5pdGlvbnMuZmxhdE1hcCgoZGVmaW5pdGlvbikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gbmFtZShkZWZpbml0aW9uLm5hbWUsIHBsdWdpbk5hbWUsIG9wdGlvbnMpO1xuICAgICAgaWYgKGtleSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgW1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfX3Rvb2xraXRSZWY6IHRydWUgYXMgY29uc3QsXG4gICAgICAgICAgICBwbHVnaW5OYW1lLFxuICAgICAgICAgICAgbG9jYWxOYW1lOiBkZWZpbml0aW9uLm5hbWUsXG4gICAgICAgICAgICBkZWY6IHsgLi4uZGVmaW5pdGlvbiwgbmFtZToga2V5IH0sXG4gICAgICAgICAgICBhbm5vdGF0aW9uczogZGVmaW5pdGlvbi5hbm5vdGF0aW9ucyxcbiAgICAgICAgICB9IHNhdGlzZmllcyBUb29sa2l0RW50cnksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH0pLFxuICApO1xufVxuIl19
@@ -1 +1 @@
1
- {"root":["../src/_auto-configure.ts","../src/_cache-storage.ts","../src/appkit.ts","../src/brand.ts","../src/bundle.ts","../src/databricks.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/pgaddress.ts","../src/plugin.ts","../src/provision.ts","../src/toolkit.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/_auto-configure.ts","../src/_cache-storage.ts","../src/appkit.ts","../src/brand-context.ts","../src/bundle.ts","../src/databricks.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/migration.ts","../src/pgaddress.ts","../src/plugin-execution.ts","../src/plugin-registry.ts","../src/provision.ts","../src/tool-provider.ts","../src/toolkit-entries.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@databricks/appkit": "0.81.0",
23
- "@dbx-tools/test-polyglot": "^0.9.4",
23
+ "@dbx-tools/test-polyglot": "^0.9.6",
24
24
  "@types/bun": "1.3.14",
25
25
  "@types/node": "^24.6.0",
26
26
  "typescript": "^5.9.3",
@@ -31,8 +31,9 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@databricks/sdk-experimental": "^0.17.0",
34
- "@dbx-tools/core": "^0.9.4",
35
- "@dbx-tools/shared-core": "^0.9.4",
34
+ "@dbx-tools/core": "^0.9.6",
35
+ "@dbx-tools/core-rs": "^0.9.6",
36
+ "@dbx-tools/shared-core": "^0.9.6",
36
37
  "zod": "4.3.6"
37
38
  },
38
39
  "main": "./lib/index.js",
@@ -49,7 +50,7 @@
49
50
  "./package.json": "./package.json"
50
51
  }
51
52
  },
52
- "version": "0.9.4",
53
+ "version": "0.9.6",
53
54
  "types": "./lib/index.d.ts",
54
55
  "type": "module",
55
56
  "exports": {
@@ -17,23 +17,11 @@
17
17
  import { createRequire } from "node:module";
18
18
  import { dirname, join } from "node:path";
19
19
  import { createLakebasePool, getWorkspaceClient, type CacheConfig } from "@databricks/appkit";
20
- import { error, hash, log } from "@dbx-tools/shared-core";
20
+ import { errorUtils, hash, log } from "@dbx-tools/shared-core";
21
+ import { handleOwnershipMigrationError } from "./migration.ts";
21
22
 
22
23
  const logger = log.logger("cache-storage");
23
24
 
24
- /** Process-wide dedupe for soft migration warnings. */
25
- const loggedMigrationErrors = new Set<string>();
26
-
27
- /** Whether `LOG_LEVEL` is currently at or below debug. */
28
- function isDebugEnabled(): boolean {
29
- return log.isLevelEnabled("debug");
30
- }
31
-
32
- /** Whether a migration failed only because this role does not own an existing object. */
33
- function isOwnershipMigrationError(err: unknown): boolean {
34
- return error.errorContext(err).hasMessage("must be owner");
35
- }
36
-
37
25
  type LakebasePool = ReturnType<typeof createLakebasePool>;
38
26
  type CacheStorage = NonNullable<CacheConfig["storage"]>;
39
27
 
@@ -77,7 +65,7 @@ export function loadPersistentStorage(): PersistentStorageConstructor | undefine
77
65
  return loaded;
78
66
  } catch (err) {
79
67
  logger.debug("soft persistent cache skipped (PersistentStorage unavailable)", {
80
- error: error.errorMessage(err),
68
+ error: errorUtils.errorMessage(err),
81
69
  });
82
70
  persistentStorageCtor = undefined;
83
71
  return undefined;
@@ -125,15 +113,14 @@ export function softenInitialize(
125
113
  try {
126
114
  if (!(await skipMigrations?.())) await originalInitialize();
127
115
  } catch (err) {
128
- if (!isOwnershipMigrationError(err)) throw err;
129
- const message = error.errorMessage(err);
130
- if (!loggedMigrationErrors.has(message)) {
131
- loggedMigrationErrors.add(message);
132
- if (isDebugEnabled()) {
133
- logger.error("persistent cache migration failed", err);
134
- } else {
135
- logger.warn("persistent cache migration failed", { error: message });
136
- }
116
+ if (
117
+ !handleOwnershipMigrationError(err, {
118
+ scope: "cache-storage",
119
+ logger,
120
+ event: "persistent cache migration failed",
121
+ })
122
+ ) {
123
+ throw err;
137
124
  }
138
125
  }
139
126
  })();
@@ -189,7 +176,7 @@ export async function createSoftPersistentStorage(
189
176
  return storage;
190
177
  } catch (err) {
191
178
  logger.debug("soft persistent cache unavailable", {
192
- error: error.errorMessage(err),
179
+ error: errorUtils.errorMessage(err),
193
180
  });
194
181
  if (pool) {
195
182
  await pool.end().catch(() => {});
package/src/appkit.ts CHANGED
@@ -35,11 +35,11 @@ import {
35
35
  // AppKit's root barrel re-exports `PluginData` but not `PluginMap`; the package
36
36
  // publishes this subpath for exactly that type.
37
37
  import type { PluginMap } from "@databricks/appkit/dist/shared/src/plugin";
38
- import { async, log } from "@dbx-tools/shared-core";
38
+ import { asyncUtils, log } from "@dbx-tools/shared-core";
39
39
 
40
40
  import { resolveAutoConfigurePolicy } from "./_auto-configure.ts";
41
41
  import { createSoftPersistentStorage } from "./_cache-storage.ts";
42
- import { loadBrandContext } from "./brand.ts";
42
+ import { loadBrandContext } from "./brand-context.ts";
43
43
  import {
44
44
  createInterceptorContext,
45
45
  type Interceptor,
@@ -159,8 +159,8 @@ export async function autoConfigure<T extends AppKitPlugins>(
159
159
  }
160
160
 
161
161
  const controller = new AbortController();
162
- async.tieAbortSignal(controller, signal);
163
- async.tieAbortSignal(controller, AbortSignal.timeout(AUTO_CONFIGURE_TIMEOUT_MS));
162
+ asyncUtils.tieAbortSignal(controller, signal);
163
+ asyncUtils.tieAbortSignal(controller, AbortSignal.timeout(AUTO_CONFIGURE_TIMEOUT_MS));
164
164
 
165
165
  logger.debug("autoConfigure: resolve lakebase", {
166
166
  provision: policy.provision,
@@ -414,5 +414,3 @@ export async function ensureInitialized(): Promise<void> {
414
414
  await createApp({ plugins: [], autoConfigure: false });
415
415
  logger.debug("ensureInitialized: bare AppKit initialization complete");
416
416
  }
417
-
418
-
@@ -0,0 +1,13 @@
1
+ import { brandFiles } from "@dbx-tools/core";
2
+ import { brandUtils, type BrandContext } from "@dbx-tools/shared-core";
3
+
4
+ let activeBrandContext: BrandContext = brandUtils.defaultBrandContext;
5
+
6
+ export async function loadBrandContext(cwd: string = process.cwd()): Promise<BrandContext> {
7
+ activeBrandContext = await brandFiles.loadBrandContext(cwd);
8
+ return activeBrandContext;
9
+ }
10
+
11
+ export function getBrandContext(): BrandContext {
12
+ return activeBrandContext;
13
+ }
package/src/bundle.ts CHANGED
@@ -7,26 +7,26 @@
7
7
  * @module
8
8
  */
9
9
 
10
- import { config as coreConfig } from "@dbx-tools/core";
10
+ import { configUtils } from "@dbx-tools/core";
11
11
 
12
12
  export type BundleValidateJson = Record<string, unknown>;
13
- export type ConfigFile = coreConfig.ConfigFile;
14
- export type ConfigMapValue = coreConfig.ConfigMapValue;
15
- export type ConfigSource = coreConfig.ConfigSource;
16
- export type ResolveConfigValueOptions = coreConfig.ConfigOptions;
13
+ export type ConfigFile = configUtils.ConfigFile;
14
+ export type ConfigMapValue = configUtils.ConfigMapValue;
15
+ export type ConfigSource = configUtils.ConfigSource;
16
+ export type ResolveConfigValueOptions = configUtils.ConfigOptions;
17
17
 
18
- export const bundleAppResourceSchema = coreConfig.bundleResourceSchema;
19
- export const flattenAppYamlEnv = coreConfig.flattenAppEnv;
20
- export const flattenAppEnv = coreConfig.flattenBundleEnv;
21
- export const getBundlePath = coreConfig.getBundlePath;
18
+ export const bundleAppResourceSchema = configUtils.bundleResourceSchema;
19
+ export const flattenAppYamlEnv = configUtils.flattenAppEnv;
20
+ export const flattenAppEnv = configUtils.flattenBundleEnv;
21
+ export const getBundlePath = configUtils.getBundlePath;
22
22
 
23
23
  export function bundle(cwd?: string): Promise<ConfigFile | undefined> {
24
- return Promise.resolve(coreConfig.bundleFile(cwd));
24
+ return Promise.resolve(configUtils.bundleFile(cwd));
25
25
  }
26
26
 
27
27
  export function resolveConfigValue(
28
28
  name: string,
29
29
  options: ResolveConfigValueOptions = {},
30
30
  ): Promise<string | undefined> {
31
- return Promise.resolve(coreConfig.resolveValue(name, options));
31
+ return Promise.resolve(configUtils.resolveValue(name, options));
32
32
  }
package/src/databricks.ts CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  import type { CancellationToken } from "@databricks/sdk-experimental";
14
14
  import { Context } from "@databricks/sdk-experimental";
15
- import { async } from "@dbx-tools/shared-core";
15
+ import { asyncUtils } from "@dbx-tools/shared-core";
16
16
 
17
17
  /** Either an SDK `Context` or a WHATWG `AbortSignal`. */
18
18
  export type ContextLike = Context | AbortSignal;
@@ -54,7 +54,7 @@ export function toContext(source: AbortController | ContextLike, input?: Context
54
54
  return new Context({ cancellationToken: signalToCancellationToken(source) });
55
55
  }
56
56
  if (input instanceof AbortSignal) {
57
- async.tieAbortSignal(source, input);
57
+ asyncUtils.tieAbortSignal(source, input);
58
58
  } else if (input instanceof Context) {
59
59
  const token = input.cancellationToken;
60
60
  if (token) tieCancellationToken(source, token);
package/src/identity.ts CHANGED
@@ -53,8 +53,8 @@
53
53
  */
54
54
 
55
55
  import { ConfigurationError } from "@databricks/appkit";
56
- import { config } from "@dbx-tools/core";
57
- import { string, token } from "@dbx-tools/shared-core";
56
+ import { configUtils } from "@dbx-tools/core";
57
+ import { stringUtils, token } from "@dbx-tools/shared-core";
58
58
 
59
59
  /**
60
60
  * Header the Databricks Apps front door forwards the caller's OBO token on.
@@ -104,7 +104,7 @@ export function resolveIdentityMode(
104
104
  envKeys: string | readonly string[],
105
105
  field = "identity",
106
106
  ): IdentityMode {
107
- const raw = config.string(configured, envKeys, config.ENV_ONLY);
107
+ const raw = configUtils.string(configured, envKeys, configUtils.ENV_ONLY);
108
108
  if (raw === undefined) return DEFAULT_IDENTITY_MODE;
109
109
  const mode = raw.toLowerCase() as IdentityMode;
110
110
  if (!IDENTITY_MODES.includes(mode)) {
@@ -124,17 +124,17 @@ export function resolveIdentityMode(
124
124
  * the first Databricks call.
125
125
  */
126
126
  export function requestAccessToken(req: HeaderBearing | undefined): string | undefined {
127
- return string.trimToNull(req?.header(ACCESS_TOKEN_HEADER)) ?? undefined;
127
+ return stringUtils.trimToNull(req?.header(ACCESS_TOKEN_HEADER)) ?? undefined;
128
128
  }
129
129
 
130
130
  /** The forwarded user id on `req`, or `undefined`. */
131
131
  export function requestUserId(req: HeaderBearing | undefined): string | undefined {
132
- return string.trimToNull(req?.header(USER_ID_HEADER)) ?? undefined;
132
+ return stringUtils.trimToNull(req?.header(USER_ID_HEADER)) ?? undefined;
133
133
  }
134
134
 
135
135
  /** The forwarded user email on `req`, or `undefined`. */
136
136
  export function requestUserEmail(req: HeaderBearing | undefined): string | undefined {
137
- return string.trimToNull(req?.header(USER_EMAIL_HEADER)) ?? undefined;
137
+ return stringUtils.trimToNull(req?.header(USER_EMAIL_HEADER)) ?? undefined;
138
138
  }
139
139
 
140
140
  /**
@@ -42,14 +42,15 @@ import {
42
42
  getWorkspaceClient,
43
43
  ValidationError,
44
44
  } from "@databricks/appkit";
45
- import { config as coreConfig, project } from "@dbx-tools/core";
46
- import { async, log, object, string } from "@dbx-tools/shared-core";
45
+ import { configUtils, projectUtils } from "@dbx-tools/core";
46
+ import { asyncUtils, log, object, stringUtils } from "@dbx-tools/shared-core";
47
47
  import { z } from "zod";
48
48
 
49
49
  import { toContext } from "./databricks.ts";
50
50
  import {
51
51
  parseAddress,
52
52
  parseResourcePath,
53
+ parseSslMode as parseNativeSslMode,
53
54
  SSL_MODES,
54
55
  type LakebaseConnectionInputs,
55
56
  type SslMode,
@@ -194,9 +195,7 @@ const operationSchema = z.object({
194
195
  type Operation = z.infer<typeof operationSchema>;
195
196
 
196
197
  /** `PGPORT` must land inside the TCP port range. */
197
- const portSchema = z.coerce.number().int().min(1).max(coreConfig.MAX_TCP_PORT);
198
-
199
- const sslModeSchema = z.enum(SSL_MODES);
198
+ const portSchema = z.coerce.number().int().min(1).max(configUtils.MAX_TCP_PORT);
200
199
 
201
200
  /**
202
201
  * Validate a `PGPORT`-shaped value. Returns `undefined` when unset, and throws
@@ -210,7 +209,7 @@ export function parsePort(value: string | number | undefined): number | undefine
210
209
  throw ValidationError.invalidValue(
211
210
  "PGPORT",
212
211
  value,
213
- `a TCP port between 1 and ${coreConfig.MAX_TCP_PORT}`,
212
+ `a TCP port between 1 and ${configUtils.MAX_TCP_PORT}`,
214
213
  );
215
214
  }
216
215
  return parsed.data;
@@ -223,11 +222,11 @@ export function parsePort(value: string | number | undefined): number | undefine
223
222
  */
224
223
  export function parseSslMode(value: string | undefined): SslMode | undefined {
225
224
  if (value === undefined || value === "") return undefined;
226
- const parsed = sslModeSchema.safeParse(value.trim().toLowerCase());
227
- if (!parsed.success) {
225
+ const parsed = parseNativeSslMode(value);
226
+ if (parsed === undefined) {
228
227
  throw ValidationError.invalidValue("PGSSLMODE", value, SSL_MODES.join(", "));
229
228
  }
230
- return parsed.data;
229
+ return parsed;
231
230
  }
232
231
 
233
232
  /**
@@ -247,14 +246,14 @@ export function nextPollDelay(attempt: number, baseMs: number): number {
247
246
  * instead of finishing its backoff first.
248
247
  */
249
248
  export function pollDelay(attempt: number, baseMs: number, signal?: AbortSignal): Promise<void> {
250
- return async.sleep(nextPollDelay(attempt, baseMs), signal);
249
+ return asyncUtils.sleep(nextPollDelay(attempt, baseMs), signal);
251
250
  }
252
251
 
253
252
  /**
254
253
  * Pull resolver inputs from `process.env`, parse the address blob, and
255
254
  * layer explicit config on top with this precedence:
256
255
  *
257
- * `config.<field>` > `coreConfig.resolveValue` (shared config sources) >
256
+ * `config.<field>` > `configUtils.resolveValue` (shared config sources) >
258
257
  * whatever {@link parseAddress} recovered from the
259
258
  * `endpoint` / `LAKEBASE_ENDPOINT` blob.
260
259
  *
@@ -265,10 +264,12 @@ export function pollDelay(attempt: number, baseMs: number, signal?: AbortSignal)
265
264
  export async function readLakebaseInputs(
266
265
  config?: LakebaseResolverInputs,
267
266
  ): Promise<LakebaseResolverInputs> {
268
- const rawAddress = config?.endpoint ?? coreConfig.resolveValue("LAKEBASE_ENDPOINT");
267
+ const rawAddress = config?.endpoint ?? configUtils.resolveValue("LAKEBASE_ENDPOINT");
269
268
  const parsed = parseAddress(rawAddress);
270
- const portEnv = parsePort(coreConfig.resolveValue("PGPORT"));
271
- const sslModeEnv = parseSslMode(coreConfig.resolveValue("PGSSLMODE"));
269
+ const portEnv = parsePort(configUtils.resolveValue("PGPORT"));
270
+ const sslModeEnv = parseSslMode(configUtils.resolveValue("PGSSLMODE"));
271
+ const configuredSslMode = parseSslMode(config?.sslMode);
272
+ const parsedSslMode = parseSslMode(parsed.sslMode);
272
273
  return {
273
274
  project: config?.project ?? parsed.project,
274
275
  branch: config?.branch ?? parsed.branch,
@@ -276,10 +277,10 @@ export async function readLakebaseInputs(
276
277
  // bare hostnames set `host` instead and leave `endpoint` undefined
277
278
  // until the REST resolver fills it in.
278
279
  endpoint: parsed.endpoint,
279
- database: config?.database ?? coreConfig.resolveValue("PGDATABASE") ?? parsed.database,
280
- host: config?.host ?? coreConfig.resolveValue("PGHOST") ?? parsed.host,
280
+ database: config?.database ?? configUtils.resolveValue("PGDATABASE") ?? parsed.database,
281
+ host: config?.host ?? configUtils.resolveValue("PGHOST") ?? parsed.host,
281
282
  port: config?.port ?? portEnv ?? parsed.port,
282
- sslMode: config?.sslMode ?? sslModeEnv ?? parsed.sslMode,
283
+ sslMode: configuredSslMode ?? sslModeEnv ?? parsedSslMode,
283
284
  autoCreate: config?.autoCreate,
284
285
  };
285
286
  }
@@ -309,7 +310,7 @@ export async function resolveLakebaseConnection(
309
310
  const inputs = await readLakebaseInputs(config);
310
311
  let { project, branch, endpoint, database, host } = inputs;
311
312
  const port = inputs.port ?? DEFAULT_PORT;
312
- const sslMode = inputs.sslMode ?? DEFAULT_SSL_MODE;
313
+ const sslMode = parseSslMode(inputs.sslMode) ?? DEFAULT_SSL_MODE;
313
314
 
314
315
  // Resource paths may carry redundant info; harvest project/branch
315
316
  // from any canonical path that snuck in via PGDATABASE or similar.
@@ -667,8 +668,8 @@ async function pickOrCreateProject(
667
668
  * `autoCreate` id in that case.
668
669
  */
669
670
  async function defaultProjectId(): Promise<string> {
670
- const name = project.name();
671
- const slug = string.toSlugWithOptions({ maxLength: PROJECT_ID_MAX_LEN }, name);
671
+ const name = projectUtils.name();
672
+ const slug = stringUtils.toSlugWithOptions({ maxLength: PROJECT_ID_MAX_LEN }, name);
672
673
  if (!slug || !/^[a-z]/.test(slug)) {
673
674
  logger.warn("autopg: project name does not slugify to a Lakebase project id", { name });
674
675
  throw ConfigurationError.invalidConnection(
@@ -0,0 +1,40 @@
1
+ /** Shared classification and logging policy for soft database migrations. */
2
+
3
+ import { errorUtils, log, type Logger } from "@dbx-tools/shared-core";
4
+
5
+ const loggedOwnershipErrors = new Set<string>();
6
+
7
+ /** Inputs for one ownership-only migration failure. */
8
+ export interface OwnershipMigrationErrorOptions {
9
+ /** Stable subsystem key used to deduplicate equivalent warnings. */
10
+ readonly scope: string;
11
+ readonly logger: Pick<Logger, "error" | "warn">;
12
+ readonly event: string;
13
+ readonly context?: Readonly<Record<string, unknown>>;
14
+ }
15
+
16
+ /** Whether a migration failed because the current role does not own an object. */
17
+ export function isOwnershipMigrationError(cause: unknown): boolean {
18
+ return errorUtils.errorContext(cause).hasMessage("must be owner");
19
+ }
20
+
21
+ /**
22
+ * Classify and log an ownership-only migration failure once per subsystem.
23
+ * Returns `false` for every other failure so callers can rethrow it.
24
+ */
25
+ export function handleOwnershipMigrationError(
26
+ cause: unknown,
27
+ options: OwnershipMigrationErrorOptions,
28
+ ): boolean {
29
+ if (!isOwnershipMigrationError(cause)) return false;
30
+ const message = errorUtils.errorMessage(cause);
31
+ const key = `${options.scope}\0${message}`;
32
+ if (loggedOwnershipErrors.has(key)) return true;
33
+ loggedOwnershipErrors.add(key);
34
+ if (log.isLevelEnabled("debug")) {
35
+ options.logger.error(options.event, cause);
36
+ } else {
37
+ options.logger.warn(options.event, { error: message, ...options.context });
38
+ }
39
+ return true;
40
+ }