@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.
- package/README.md +9 -9
- package/index.ts +12 -6
- package/lib/index.d.ts +12 -6
- package/lib/index.js +9 -5
- package/lib/src/_cache-storage.js +10 -24
- package/lib/src/appkit.js +5 -5
- package/lib/src/brand-context.js +11 -0
- package/lib/src/bundle.d.ts +8 -8
- package/lib/src/bundle.js +8 -8
- package/lib/src/databricks.js +3 -3
- package/lib/src/identity.js +7 -7
- package/lib/src/lakebase-resolver.d.ts +1 -1
- package/lib/src/lakebase-resolver.js +22 -21
- package/lib/src/migration.d.ts +17 -0
- package/lib/src/migration.js +28 -0
- package/lib/src/pgaddress.d.ts +24 -97
- package/lib/src/pgaddress.js +32 -161
- package/lib/src/plugin-execution.d.ts +17 -0
- package/lib/src/plugin-execution.js +28 -0
- package/lib/src/{plugin.d.ts → plugin-registry.d.ts} +9 -13
- package/lib/src/plugin-registry.js +97 -0
- package/lib/src/provision.js +5 -5
- package/lib/src/tool-provider.d.ts +17 -0
- package/lib/src/tool-provider.js +20 -0
- package/lib/src/toolkit-entries.js +34 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
- package/src/_cache-storage.ts +12 -25
- package/src/appkit.ts +4 -6
- package/src/brand-context.ts +13 -0
- package/src/bundle.ts +11 -11
- package/src/databricks.ts +2 -2
- package/src/identity.ts +6 -6
- package/src/lakebase-resolver.ts +21 -20
- package/src/migration.ts +40 -0
- package/src/pgaddress.ts +46 -196
- package/src/plugin-execution.ts +42 -0
- package/src/{plugin.ts → plugin-registry.ts} +14 -17
- package/src/provision.ts +4 -4
- package/src/tool-provider.ts +34 -0
- package/lib/src/brand.js +0 -11
- package/lib/src/plugin.js +0 -97
- package/lib/src/toolkit.js +0 -34
- package/src/brand.ts +0 -13
- /package/lib/src/{brand.d.ts → brand-context.d.ts} +0 -0
- /package/lib/src/{toolkit.d.ts → toolkit-entries.d.ts} +0 -0
- /package/src/{toolkit.ts → toolkit-entries.ts} +0 -0
package/lib/src/provision.js
CHANGED
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
* @module
|
|
22
22
|
*/
|
|
23
23
|
import { createLakebasePool, getWorkspaceClient, ValidationError } from "@databricks/appkit";
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
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 (
|
|
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:
|
|
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
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -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.
|
|
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.
|
|
35
|
-
"@dbx-tools/
|
|
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.
|
|
53
|
+
"version": "0.9.6",
|
|
53
54
|
"types": "./lib/index.d.ts",
|
|
54
55
|
"type": "module",
|
|
55
56
|
"exports": {
|
package/src/_cache-storage.ts
CHANGED
|
@@ -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 {
|
|
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:
|
|
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 (
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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:
|
|
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 {
|
|
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
|
-
|
|
163
|
-
|
|
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 {
|
|
10
|
+
import { configUtils } from "@dbx-tools/core";
|
|
11
11
|
|
|
12
12
|
export type BundleValidateJson = Record<string, unknown>;
|
|
13
|
-
export type ConfigFile =
|
|
14
|
-
export type ConfigMapValue =
|
|
15
|
-
export type ConfigSource =
|
|
16
|
-
export type ResolveConfigValueOptions =
|
|
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 =
|
|
19
|
-
export const flattenAppYamlEnv =
|
|
20
|
-
export const flattenAppEnv =
|
|
21
|
-
export const 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(
|
|
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(
|
|
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 {
|
|
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
|
-
|
|
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 {
|
|
57
|
-
import {
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
137
|
+
return stringUtils.trimToNull(req?.header(USER_EMAIL_HEADER)) ?? undefined;
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
/**
|
package/src/lakebase-resolver.ts
CHANGED
|
@@ -42,14 +42,15 @@ import {
|
|
|
42
42
|
getWorkspaceClient,
|
|
43
43
|
ValidationError,
|
|
44
44
|
} from "@databricks/appkit";
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
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(
|
|
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 ${
|
|
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 =
|
|
227
|
-
if (
|
|
225
|
+
const parsed = parseNativeSslMode(value);
|
|
226
|
+
if (parsed === undefined) {
|
|
228
227
|
throw ValidationError.invalidValue("PGSSLMODE", value, SSL_MODES.join(", "));
|
|
229
228
|
}
|
|
230
|
-
return parsed
|
|
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
|
|
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>` > `
|
|
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 ??
|
|
267
|
+
const rawAddress = config?.endpoint ?? configUtils.resolveValue("LAKEBASE_ENDPOINT");
|
|
269
268
|
const parsed = parseAddress(rawAddress);
|
|
270
|
-
const portEnv = parsePort(
|
|
271
|
-
const sslModeEnv = parseSslMode(
|
|
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 ??
|
|
280
|
-
host: config?.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:
|
|
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 =
|
|
671
|
-
const slug =
|
|
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(
|
package/src/migration.ts
ADDED
|
@@ -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
|
+
}
|