@dbx-tools/appkit-generator 0.0.0-stage → 0.9.136
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/LICENSE +202 -0
- package/README.md +181 -2
- package/index.ts +44 -0
- package/lib/index.d.ts +40 -0
- package/lib/index.js +30 -0
- package/lib/src/assets.d.ts +33 -0
- package/lib/src/assets.js +224 -0
- package/lib/src/config.d.ts +75 -0
- package/lib/src/config.js +31 -0
- package/lib/src/dashboard.d.ts +30 -0
- package/lib/src/dashboard.js +257 -0
- package/lib/src/data.d.ts +17 -0
- package/lib/src/data.js +114 -0
- package/lib/src/defaults.d.ts +39 -0
- package/lib/src/defaults.js +36 -0
- package/lib/src/generate.d.ts +51 -0
- package/lib/src/generate.js +163 -0
- package/lib/src/genie.d.ts +51 -0
- package/lib/src/genie.js +84 -0
- package/lib/src/kpi.d.ts +22 -0
- package/lib/src/kpi.js +74 -0
- package/lib/src/manifest.json +72 -0
- package/lib/src/namespace.d.ts +36 -0
- package/lib/src/namespace.js +119 -0
- package/lib/src/operations.d.ts +42 -0
- package/lib/src/operations.js +96 -0
- package/lib/src/palette.d.ts +10 -0
- package/lib/src/palette.js +69 -0
- package/lib/src/plan.d.ts +21 -0
- package/lib/src/plan.js +33 -0
- package/lib/src/plugin.d.ts +619 -0
- package/lib/src/plugin.js +205 -0
- package/lib/src/research.d.ts +78 -0
- package/lib/src/research.js +235 -0
- package/lib/src/schema.d.ts +52 -0
- package/lib/src/schema.js +82 -0
- package/lib/src/structured.d.ts +27 -0
- package/lib/src/structured.js +30 -0
- package/lib/src/workflow.d.ts +314 -0
- package/lib/src/workflow.js +171 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +218 -4
- package/src/assets.ts +248 -0
- package/src/config.ts +98 -0
- package/src/dashboard.ts +295 -0
- package/src/data.ts +167 -0
- package/src/defaults.ts +61 -0
- package/src/generate.ts +250 -0
- package/src/genie.ts +111 -0
- package/src/kpi.ts +106 -0
- package/src/manifest.json +72 -0
- package/src/namespace.ts +192 -0
- package/src/operations.ts +171 -0
- package/src/palette.ts +81 -0
- package/src/plan.ts +59 -0
- package/src/plugin.ts +244 -0
- package/src/research.ts +382 -0
- package/src/schema.ts +114 -0
- package/src/structured.ts +54 -0
- package/src/workflow.ts +221 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-user Unity Catalog namespace derivation and provisioning.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { ConfigurationError, createWorkspaceClient, getExecutionContext, } from "@databricks/appkit";
|
|
7
|
+
import { databricks } from "@dbx-tools/appkit";
|
|
8
|
+
import { errorUtils, hash, stringUtils } from "@dbx-tools/shared-core";
|
|
9
|
+
import { GeneratedSchemaSchema, } from "@dbx-tools/shared-generator/workflow";
|
|
10
|
+
const OWNER_DIGEST_PROPERTY = "dbx_tools.generator.owner_digest";
|
|
11
|
+
const REQUEST_DIGEST_PROPERTY = "dbx_tools.generator.request_digest";
|
|
12
|
+
/** Derive a readable, bounded schema name with collision-resistant overflow. */
|
|
13
|
+
export function generatorSchemaName(principal, company, purpose) {
|
|
14
|
+
const base = stringUtils.toIdentifierWithOptions({
|
|
15
|
+
delimiter: "_",
|
|
16
|
+
omitEmailDomain: true,
|
|
17
|
+
maxLength: 96,
|
|
18
|
+
truncateStrategy: "hash",
|
|
19
|
+
truncateHashLength: 8,
|
|
20
|
+
}, principal, company, purpose);
|
|
21
|
+
return /^[a-z]/.test(base) ? base : `u_${base}`;
|
|
22
|
+
}
|
|
23
|
+
/** Resolve the active OBO caller and a separate app service-principal client. */
|
|
24
|
+
export async function resolveGeneratorIdentity() {
|
|
25
|
+
const context = getExecutionContext();
|
|
26
|
+
if (!("userId" in context)) {
|
|
27
|
+
throw new ConfigurationError("Generator operations require an on-behalf-of user context");
|
|
28
|
+
}
|
|
29
|
+
const current = await context.client.currentUser.me();
|
|
30
|
+
const principal = stringUtils.trimToNull(current.userName);
|
|
31
|
+
if (!principal) {
|
|
32
|
+
throw new ConfigurationError("The current Databricks user has no userName");
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
userClient: context.client,
|
|
36
|
+
serviceClient: createWorkspaceClient(),
|
|
37
|
+
principal,
|
|
38
|
+
userId: context.userId,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Return an existing schema, treating only a genuine not-found response as absent. */
|
|
42
|
+
async function getSchema(client, fullName) {
|
|
43
|
+
try {
|
|
44
|
+
return await client.toLegacyWorkspaceClient().schemas.get({ full_name: fullName });
|
|
45
|
+
}
|
|
46
|
+
catch (cause) {
|
|
47
|
+
const context = errorUtils.errorContext(cause);
|
|
48
|
+
if (context.hasStatusCode(404) || context.hasMessage("does not exist"))
|
|
49
|
+
return undefined;
|
|
50
|
+
throw cause;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Verify that an existing deterministic schema belongs to this user and request. */
|
|
54
|
+
function assertSchemaMarkers(schema, ownerDigest, requestDigest, fullName) {
|
|
55
|
+
if (schema.properties?.[OWNER_DIGEST_PROPERTY] !== ownerDigest ||
|
|
56
|
+
schema.properties?.[REQUEST_DIGEST_PROPERTY] !== requestDigest) {
|
|
57
|
+
throw new ConfigurationError(`Generator schema ${fullName} already exists with different ownership markers`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check-create-recheck one marked schema as the app service principal, then
|
|
62
|
+
* grant the OBO user full schema control while retaining SP ownership.
|
|
63
|
+
*/
|
|
64
|
+
export async function provisionGeneratorSchema(input, signal) {
|
|
65
|
+
const identity = await resolveGeneratorIdentity();
|
|
66
|
+
return provisionGeneratorSchemaWithIdentity(input, identity, signal);
|
|
67
|
+
}
|
|
68
|
+
/** Provision with explicit trusted clients, for plugin reuse and isolated tests. */
|
|
69
|
+
export async function provisionGeneratorSchemaWithIdentity(input, identity, signal) {
|
|
70
|
+
const catalog = stringUtils.trimToNull(input.catalog);
|
|
71
|
+
if (!catalog)
|
|
72
|
+
throw new ConfigurationError("GENERATOR_CATALOG is required");
|
|
73
|
+
const schemaName = generatorSchemaName(identity.principal, input.request.company, input.request.purpose);
|
|
74
|
+
const fullName = `${catalog}.${schemaName}`;
|
|
75
|
+
const ownerDigest = hash.fnvHash(identity.userId);
|
|
76
|
+
const requestDigest = hash.fnvHash(identity.userId, input.request.company, input.request.purpose);
|
|
77
|
+
const context = signal ? databricks.toContext(signal) : undefined;
|
|
78
|
+
await identity.userClient.toLegacyWorkspaceClient().catalogs.get({ name: catalog });
|
|
79
|
+
let schema = await getSchema(identity.serviceClient, fullName);
|
|
80
|
+
if (!schema) {
|
|
81
|
+
try {
|
|
82
|
+
await identity.serviceClient.toLegacyWorkspaceClient().schemas.create({
|
|
83
|
+
catalog_name: catalog,
|
|
84
|
+
name: schemaName,
|
|
85
|
+
comment: `Generated demo assets for ${identity.principal}`,
|
|
86
|
+
properties: {
|
|
87
|
+
[OWNER_DIGEST_PROPERTY]: ownerDigest,
|
|
88
|
+
[REQUEST_DIGEST_PROPERTY]: requestDigest,
|
|
89
|
+
},
|
|
90
|
+
}, context);
|
|
91
|
+
}
|
|
92
|
+
catch (cause) {
|
|
93
|
+
if (!errorUtils.errorContext(cause).hasMessage("already exists"))
|
|
94
|
+
throw cause;
|
|
95
|
+
}
|
|
96
|
+
schema = await getSchema(identity.serviceClient, fullName);
|
|
97
|
+
}
|
|
98
|
+
if (!schema) {
|
|
99
|
+
throw ConfigurationError.resourceNotFound("Generator schema", fullName);
|
|
100
|
+
}
|
|
101
|
+
assertSchemaMarkers(schema, ownerDigest, requestDigest, fullName);
|
|
102
|
+
await identity.serviceClient.toLegacyWorkspaceClient().grants.update({
|
|
103
|
+
securable_type: "SCHEMA",
|
|
104
|
+
full_name: fullName,
|
|
105
|
+
changes: [
|
|
106
|
+
{
|
|
107
|
+
principal: identity.principal,
|
|
108
|
+
add: ["ALL_PRIVILEGES", "MANAGE"],
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
}, context);
|
|
112
|
+
return GeneratedSchemaSchema.parse({
|
|
113
|
+
catalog,
|
|
114
|
+
schema: schemaName,
|
|
115
|
+
fullName,
|
|
116
|
+
principal: identity.principal,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZXNwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hbWVzcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsbUJBQW1CLEdBRXBCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxxQkFBcUIsR0FHdEIsTUFBTSxzQ0FBc0MsQ0FBQztBQUU5QyxNQUFNLHFCQUFxQixHQUFHLGtDQUFrQyxDQUFDO0FBQ2pFLE1BQU0sdUJBQXVCLEdBQUcsb0NBQW9DLENBQUM7QUFzQnJFLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsT0FBZTtJQUNyRixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsdUJBQXVCLENBQzlDO1FBQ0UsU0FBUyxFQUFFLEdBQUc7UUFDZCxlQUFlLEVBQUUsSUFBSTtRQUNyQixTQUFTLEVBQUUsRUFBRTtRQUNiLGdCQUFnQixFQUFFLE1BQU07UUFDeEIsa0JBQWtCLEVBQUUsQ0FBQztLQUN0QixFQUNELFNBQVMsRUFDVCxPQUFPLEVBQ1AsT0FBTyxDQUNSLENBQUM7SUFDRixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsd0JBQXdCO0lBQzVDLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDdEMsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJ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TUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFbEUsTUFBTSxRQUFRLENBQUMsYUFBYSxDQUFDLHVCQUF1QixFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FDbEU7UUFDRSxjQUFjLEVBQUUsUUFBUTtRQUN4QixTQUFTLEVBQUUsUUFBUTtRQUNuQixPQUFPLEVBQUU7WUFDUDtnQkFDRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7Z0JBQzdCLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQzthQUNsQztTQUNGO0tBQ0YsRUFDRCxPQUFPLENBQ1IsQ0FBQztJQUVGLE9BQU8scUJBQXFCLENBQUMsS0FBSyxDQUFDO1FBQ2pDLE9BQU87UUFDUCxNQUFNLEVBQUUsVUFBVTtRQUNsQixRQUFRO1FBQ1IsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO0tBQzlCLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlci11c2VyIFVuaXR5IENhdGFsb2cgbmFtZXNwYWNlIGRlcml2YXRpb24gYW5kIHByb3Zpc2lvbmluZy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBjcmVhdGVXb3Jrc3BhY2VDbGllbnQsXG4gIGdldEV4ZWN1dGlvbkNvbnRleHQsXG4gIHR5cGUgV29ya3NwYWNlQ2xpZW50LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBkYXRhYnJpY2tzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBoYXNoLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBHZW5lcmF0ZWRTY2hlbWFTY2hlbWEsXG4gIHR5cGUgR2VuZXJhdGVkU2NoZW1hLFxuICB0eXBlIEdlbmVyYXRvclJlcXVlc3QsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5lcmF0b3Ivd29ya2Zsb3dcIjtcblxuY29uc3QgT1dORVJfRElHRVNUX1BST1BFUlRZID0gXCJkYnhfdG9vbHMuZ2VuZXJhdG9yLm93bmVyX2RpZ2VzdFwiO1xuY29uc3QgUkVRVUVTVF9ESUdFU1RfUFJPUEVSVFkgPSBcImRieF90b29scy5nZW5lcmF0b3IucmVxdWVzdF9kaWdlc3RcIjtcblxuLyoqIElucHV0cyBuZWVkZWQgdG8gcHJvdmlzaW9uIG9uZSBkZXRlcm1pbmlzdGljIGdlbmVyYXRlZCBzY2hlbWEuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvblNjaGVtYUlucHV0IHtcbiAgLyoqIENvbmZpZ3VyZWQgcGFyZW50IGNhdGFsb2cuICovXG4gIGNhdGFsb2c6IHN0cmluZztcbiAgLyoqIENvbXBhbnkgYW5kIHB1cnBvc2UgdXNlZCB0byBkZXJpdmUgdGhlIHNjaGVtYSBuYW1lLiAqL1xuICByZXF1ZXN0OiBQaWNrPEdlbmVyYXRvclJlcXVlc3QsIFwiY29tcGFueVwiIHwgXCJwdXJwb3NlXCI+O1xufVxuXG4vKiogVHJ1c3RlZCB1c2VyIGlkZW50aXR5IGFuZCBjbGllbnRzIHJlc29sdmVkIGZyb20gdGhlIGFjdGl2ZSBBcHBLaXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdG9ySWRlbnRpdHkge1xuICAvKiogT0JPIHdvcmtzcGFjZSBjbGllbnQuICovXG4gIHVzZXJDbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgLyoqIFNlcnZpY2UtcHJpbmNpcGFsIHdvcmtzcGFjZSBjbGllbnQuICovXG4gIHNlcnZpY2VDbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgLyoqIFRydXN0ZWQgRGF0YWJyaWNrcyB1c2VyIG5hbWUuICovXG4gIHByaW5jaXBhbDogc3RyaW5nO1xuICAvKiogVHJ1c3RlZCBzdGFibGUgdXNlciBpZC4gKi9cbiAgdXNlcklkOiBzdHJpbmc7XG59XG5cbi8qKiBEZXJpdmUgYSByZWFkYWJsZSwgYm91bmRlZCBzY2hlbWEgbmFtZSB3aXRoIGNvbGxpc2lvbi1yZXNpc3RhbnQgb3ZlcmZsb3cuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdG9yU2NoZW1hTmFtZShwcmluY2lwYWw6IHN0cmluZywgY29tcGFueTogc3RyaW5nLCBwdXJwb3NlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gc3RyaW5nVXRpbHMudG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoXG4gICAge1xuICAgICAgZGVsaW1pdGVyOiBcIl9cIixcbiAgICAgIG9taXRFbWFpbERvbWFpbjogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogOTYsXG4gICAgICB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIixcbiAgICAgIHRydW5jYXRlSGFzaExlbmd0aDogOCxcbiAgICB9LFxuICAgIHByaW5jaXBhbCxcbiAgICBjb21wYW55LFxuICAgIHB1cnBvc2UsXG4gICk7XG4gIHJldHVybiAvXlthLXpdLy50ZXN0KGJhc2UpID8gYmFzZSA6IGB1XyR7YmFzZX1gO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgYWN0aXZlIE9CTyBjYWxsZXIgYW5kIGEgc2VwYXJhdGUgYXBwIHNlcnZpY2UtcHJpbmNpcGFsIGNsaWVudC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlR2VuZXJhdG9ySWRlbnRpdHkoKTogUHJvbWlzZTxHZW5lcmF0b3JJZGVudGl0eT4ge1xuICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBpZiAoIShcInVzZXJJZFwiIGluIGNvbnRleHQpKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcIkdlbmVyYXRvciBvcGVyYXRpb25zIHJlcXVpcmUgYW4gb24tYmVoYWxmLW9mIHVzZXIgY29udGV4dFwiKTtcbiAgfVxuICBjb25zdCBjdXJyZW50ID0gYXdhaXQgY29udGV4dC5jbGllbnQuY3VycmVudFVzZXIubWUoKTtcbiAgY29uc3QgcHJpbmNpcGFsID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjdXJyZW50LnVzZXJOYW1lKTtcbiAgaWYgKCFwcmluY2lwYWwpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFwiVGhlIGN1cnJlbnQgRGF0YWJyaWNrcyB1c2VyIGhhcyBubyB1c2VyTmFtZVwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHVzZXJDbGllbnQ6IGNvbnRleHQuY2xpZW50LFxuICAgIHNlcnZpY2VDbGllbnQ6IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpLFxuICAgIHByaW5jaXBhbCxcbiAgICB1c2VySWQ6IGNvbnRleHQudXNlcklkLFxuICB9O1xufVxuXG4vKiogUmV0dXJuIGFuIGV4aXN0aW5nIHNjaGVtYSwgdHJlYXRpbmcgb25seSBhIGdlbnVpbmUgbm90LWZvdW5kIHJlc3BvbnNlIGFzIGFic2VudC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFNjaGVtYShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4pOiBQcm9taXNlPFxuICB8IEF3YWl0ZWQ8UmV0dXJuVHlwZTxSZXR1cm5UeXBlPFdvcmtzcGFjZUNsaWVudFtcInRvTGVnYWN5V29ya3NwYWNlQ2xpZW50XCJdPltcInNjaGVtYXNcIl1bXCJnZXRcIl0+PlxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpLnNjaGVtYXMuZ2V0KHsgZnVsbF9uYW1lOiBmdWxsTmFtZSB9KTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gZXJyb3JVdGlscy5lcnJvckNvbnRleHQoY2F1c2UpO1xuICAgIGlmIChjb250ZXh0Lmhhc1N0YXR1c0NvZGUoNDA0KSB8fCBjb250ZXh0Lmhhc01lc3NhZ2UoXCJkb2VzIG5vdCBleGlzdFwiKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB0aHJvdyBjYXVzZTtcbiAgfVxufVxuXG4vKiogVmVyaWZ5IHRoYXQgYW4gZXhpc3RpbmcgZGV0ZXJtaW5pc3RpYyBzY2hlbWEgYmVsb25ncyB0byB0aGlzIHVzZXIgYW5kIHJlcXVlc3QuICovXG5mdW5jdGlvbiBhc3NlcnRTY2hlbWFNYXJrZXJzKFxuICBzY2hlbWE6IHsgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSxcbiAgb3duZXJEaWdlc3Q6IHN0cmluZyxcbiAgcmVxdWVzdERpZ2VzdDogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGlmIChcbiAgICBzY2hlbWEucHJvcGVydGllcz8uW09XTkVSX0RJR0VTVF9QUk9QRVJUWV0gIT09IG93bmVyRGlnZXN0IHx8XG4gICAgc2NoZW1hLnByb3BlcnRpZXM/LltSRVFVRVNUX0RJR0VTVF9QUk9QRVJUWV0gIT09IHJlcXVlc3REaWdlc3RcbiAgKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgIGBHZW5lcmF0b3Igc2NoZW1hICR7ZnVsbE5hbWV9IGFscmVhZHkgZXhpc3RzIHdpdGggZGlmZmVyZW50IG93bmVyc2hpcCBtYXJrZXJzYCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2stY3JlYXRlLXJlY2hlY2sgb25lIG1hcmtlZCBzY2hlbWEgYXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCwgdGhlblxuICogZ3JhbnQgdGhlIE9CTyB1c2VyIGZ1bGwgc2NoZW1hIGNvbnRyb2wgd2hpbGUgcmV0YWluaW5nIFNQIG93bmVyc2hpcC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbkdlbmVyYXRvclNjaGVtYShcbiAgaW5wdXQ6IFByb3Zpc2lvblNjaGVtYUlucHV0LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8R2VuZXJhdGVkU2NoZW1hPiB7XG4gIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgcmVzb2x2ZUdlbmVyYXRvcklkZW50aXR5KCk7XG4gIHJldHVybiBwcm92aXNpb25HZW5lcmF0b3JTY2hlbWFXaXRoSWRlbnRpdHkoaW5wdXQsIGlkZW50aXR5LCBzaWduYWwpO1xufVxuXG4vKiogUHJvdmlzaW9uIHdpdGggZXhwbGljaXQgdHJ1c3RlZCBjbGllbnRzLCBmb3IgcGx1Z2luIHJldXNlIGFuZCBpc29sYXRlZCB0ZXN0cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aXNpb25HZW5lcmF0b3JTY2hlbWFXaXRoSWRlbnRpdHkoXG4gIGlucHV0OiBQcm92aXNpb25TY2hlbWFJbnB1dCxcbiAgaWRlbnRpdHk6IEdlbmVyYXRvcklkZW50aXR5LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8R2VuZXJhdGVkU2NoZW1hPiB7XG4gIGNvbnN0IGNhdGFsb2cgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKGlucHV0LmNhdGFsb2cpO1xuICBpZiAoIWNhdGFsb2cpIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXCJHRU5FUkFUT1JfQ0FUQUxPRyBpcyByZXF1aXJlZFwiKTtcblxuICBjb25zdCBzY2hlbWFOYW1lID0gZ2VuZXJhdG9yU2NoZW1hTmFtZShcbiAgICBpZGVudGl0eS5wcmluY2lwYWwsXG4gICAgaW5wdXQucmVxdWVzdC5jb21wYW55LFxuICAgIGlucHV0LnJlcXVlc3QucHVycG9zZSxcbiAgKTtcbiAgY29uc3QgZnVsbE5hbWUgPSBgJHtjYXRhbG9nfS4ke3NjaGVtYU5hbWV9YDtcbiAgY29uc3Qgb3duZXJEaWdlc3QgPSBoYXNoLmZudkhhc2goaWRlbnRpdHkudXNlcklkKTtcbiAgY29uc3QgcmVxdWVzdERpZ2VzdCA9IGhhc2guZm52SGFzaChpZGVudGl0eS51c2VySWQsIGlucHV0LnJlcXVlc3QuY29tcGFueSwgaW5wdXQucmVxdWVzdC5wdXJwb3NlKTtcbiAgY29uc3QgY29udGV4dCA9IHNpZ25hbCA/IGRhdGFicmlja3MudG9Db250ZXh0KHNpZ25hbCkgOiB1bmRlZmluZWQ7XG5cbiAgYXdhaXQgaWRlbnRpdHkudXNlckNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpLmNhdGFsb2dzLmdldCh7IG5hbWU6IGNhdGFsb2cgfSk7XG5cbiAgbGV0IHNjaGVtYSA9IGF3YWl0IGdldFNjaGVtYShpZGVudGl0eS5zZXJ2aWNlQ2xpZW50LCBmdWxsTmFtZSk7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGlkZW50aXR5LnNlcnZpY2VDbGllbnQudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoKS5zY2hlbWFzLmNyZWF0ZShcbiAgICAgICAge1xuICAgICAgICAgIGNhdGFsb2dfbmFtZTogY2F0YWxvZyxcbiAgICAgICAgICBuYW1lOiBzY2hlbWFOYW1lLFxuICAgICAgICAgIGNvbW1lbnQ6IGBHZW5lcmF0ZWQgZGVtbyBhc3NldHMgZm9yICR7aWRlbnRpdHkucHJpbmNpcGFsfWAsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgW09XTkVSX0RJR0VTVF9QUk9QRVJUWV06IG93bmVyRGlnZXN0LFxuICAgICAgICAgICAgW1JFUVVFU1RfRElHRVNUX1BST1BFUlRZXTogcmVxdWVzdERpZ2VzdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgaWYgKCFlcnJvclV0aWxzLmVycm9yQ29udGV4dChjYXVzZSkuaGFzTWVzc2FnZShcImFscmVhZHkgZXhpc3RzXCIpKSB0aHJvdyBjYXVzZTtcbiAgICB9XG4gICAgc2NoZW1hID0gYXdhaXQgZ2V0U2NoZW1hKGlkZW50aXR5LnNlcnZpY2VDbGllbnQsIGZ1bGxOYW1lKTtcbiAgfVxuICBpZiAoIXNjaGVtYSkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFwiR2VuZXJhdG9yIHNjaGVtYVwiLCBmdWxsTmFtZSk7XG4gIH1cbiAgYXNzZXJ0U2NoZW1hTWFya2VycyhzY2hlbWEsIG93bmVyRGlnZXN0LCByZXF1ZXN0RGlnZXN0LCBmdWxsTmFtZSk7XG5cbiAgYXdhaXQgaWRlbnRpdHkuc2VydmljZUNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpLmdyYW50cy51cGRhdGUoXG4gICAge1xuICAgICAgc2VjdXJhYmxlX3R5cGU6IFwiU0NIRU1BXCIsXG4gICAgICBmdWxsX25hbWU6IGZ1bGxOYW1lLFxuICAgICAgY2hhbmdlczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJpbmNpcGFsOiBpZGVudGl0eS5wcmluY2lwYWwsXG4gICAgICAgICAgYWRkOiBbXCJBTExfUFJJVklMRUdFU1wiLCBcIk1BTkFHRVwiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBjb250ZXh0LFxuICApO1xuXG4gIHJldHVybiBHZW5lcmF0ZWRTY2hlbWFTY2hlbWEucGFyc2Uoe1xuICAgIGNhdGFsb2csXG4gICAgc2NoZW1hOiBzY2hlbWFOYW1lLFxuICAgIGZ1bGxOYW1lLFxuICAgIHByaW5jaXBhbDogaWRlbnRpdHkucHJpbmNpcGFsLFxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable generator operations shared by tools and workflow steps.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { BrandGenerationRequest, BrandPackage } from "@dbx-tools/shared-generator/brand";
|
|
7
|
+
import type { KpiResearchRequest, KpiResearchResult } from "@dbx-tools/shared-generator/kpi";
|
|
8
|
+
import type { CreateGeneratorPresentationRequest, GeneratedDashboard, GeneratedGenieSpace, GeneratedSchema, GeneratorPlan, MaterializeGeneratorDataRequest, MaterializedGeneratorData, PlanGeneratorDataRequest, ProvisionGeneratorSchemaRequest } from "@dbx-tools/shared-generator/workflow";
|
|
9
|
+
import type { ResolvedGeneratorConfig } from "./config.ts";
|
|
10
|
+
import type { BrandProgressReporter, BrandResearchClient } from "./research.ts";
|
|
11
|
+
/** Runtime dependencies captured by one generator plugin instance. */
|
|
12
|
+
export interface GeneratorOperationsOptions {
|
|
13
|
+
/** Resolved generator configuration. */
|
|
14
|
+
config: ResolvedGeneratorConfig;
|
|
15
|
+
/** Registered web-search plugin operations. */
|
|
16
|
+
researchClient: BrandResearchClient;
|
|
17
|
+
}
|
|
18
|
+
/** One behavior owner for every generator tool and workflow step. */
|
|
19
|
+
export declare class GeneratorOperations {
|
|
20
|
+
private readonly config;
|
|
21
|
+
private readonly researchClient;
|
|
22
|
+
/** Create operations over one isolated plugin runtime. */
|
|
23
|
+
constructor(options: GeneratorOperationsOptions);
|
|
24
|
+
/** Generate portable brand assets without KPI research or Databricks writes. */
|
|
25
|
+
generateBrand(request: BrandGenerationRequest, signal?: AbortSignal, onProgress?: BrandProgressReporter): Promise<BrandPackage>;
|
|
26
|
+
/** Research KPIs independently of any mutation workflow. */
|
|
27
|
+
researchKpis(request: KpiResearchRequest, signal?: AbortSignal): Promise<KpiResearchResult>;
|
|
28
|
+
/** Build a typed deterministic data plan. */
|
|
29
|
+
planData(request: PlanGeneratorDataRequest, signal?: AbortSignal): Promise<GeneratorPlan>;
|
|
30
|
+
/** Provision the active OBO user's deterministic schema. */
|
|
31
|
+
provisionSchema(request: ProvisionGeneratorSchemaRequest, signal?: AbortSignal): Promise<GeneratedSchema>;
|
|
32
|
+
/** Materialize generated data and validate its KPI aggregates. */
|
|
33
|
+
materializeData(request: MaterializeGeneratorDataRequest, signal?: AbortSignal): Promise<MaterializedGeneratorData>;
|
|
34
|
+
/** Create and publish a dashboard with automatic companion Genie. */
|
|
35
|
+
createDashboard(request: CreateGeneratorPresentationRequest, signal?: AbortSignal): Promise<GeneratedDashboard>;
|
|
36
|
+
/** Create a standalone Genie space for no-dashboard runs. */
|
|
37
|
+
createGenie(request: CreateGeneratorPresentationRequest, signal?: AbortSignal): Promise<GeneratedGenieSpace>;
|
|
38
|
+
/** Configured catalog or a deployment-time configuration error. */
|
|
39
|
+
private requiredCatalog;
|
|
40
|
+
/** Configured SQL warehouse or a deployment-time configuration error. */
|
|
41
|
+
private requiredWarehouseId;
|
|
42
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable generator operations shared by tools and workflow steps.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { ConfigurationError } from "@databricks/appkit";
|
|
7
|
+
import { createGeneratorDashboard } from "./dashboard.js";
|
|
8
|
+
import { materializeGeneratorData } from "./data.js";
|
|
9
|
+
import { generateBrandPackage } from "./generate.js";
|
|
10
|
+
import { createGeneratorGenieSpace } from "./genie.js";
|
|
11
|
+
import { researchKpis } from "./kpi.js";
|
|
12
|
+
import { provisionGeneratorSchema } from "./namespace.js";
|
|
13
|
+
import { planGeneratorData } from "./plan.js";
|
|
14
|
+
/** One behavior owner for every generator tool and workflow step. */
|
|
15
|
+
export class GeneratorOperations {
|
|
16
|
+
config;
|
|
17
|
+
researchClient;
|
|
18
|
+
/** Create operations over one isolated plugin runtime. */
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.config = options.config;
|
|
21
|
+
this.researchClient = options.researchClient;
|
|
22
|
+
}
|
|
23
|
+
/** Generate portable brand assets without KPI research or Databricks writes. */
|
|
24
|
+
generateBrand(request, signal, onProgress) {
|
|
25
|
+
return generateBrandPackage(request, {
|
|
26
|
+
client: this.researchClient,
|
|
27
|
+
...(this.config.model ? { model: this.config.model } : {}),
|
|
28
|
+
maxSources: this.config.maxSources,
|
|
29
|
+
sourceMaxLength: this.config.sourceMaxLength,
|
|
30
|
+
...(onProgress ? { onProgress } : {}),
|
|
31
|
+
}, signal);
|
|
32
|
+
}
|
|
33
|
+
/** Research KPIs independently of any mutation workflow. */
|
|
34
|
+
researchKpis(request, signal) {
|
|
35
|
+
return researchKpis(request, {
|
|
36
|
+
client: this.researchClient,
|
|
37
|
+
maxSources: this.config.maxSources,
|
|
38
|
+
sourceMaxLength: this.config.sourceMaxLength,
|
|
39
|
+
...(this.config.model ? { model: this.config.model } : {}),
|
|
40
|
+
}, signal);
|
|
41
|
+
}
|
|
42
|
+
/** Build a typed deterministic data plan. */
|
|
43
|
+
planData(request, signal) {
|
|
44
|
+
return planGeneratorData({
|
|
45
|
+
...request,
|
|
46
|
+
...(this.config.model ? { model: this.config.model } : {}),
|
|
47
|
+
}, signal);
|
|
48
|
+
}
|
|
49
|
+
/** Provision the active OBO user's deterministic schema. */
|
|
50
|
+
provisionSchema(request, signal) {
|
|
51
|
+
return provisionGeneratorSchema({
|
|
52
|
+
catalog: this.requiredCatalog(),
|
|
53
|
+
request: request.request,
|
|
54
|
+
}, signal);
|
|
55
|
+
}
|
|
56
|
+
/** Materialize generated data and validate its KPI aggregates. */
|
|
57
|
+
materializeData(request, signal) {
|
|
58
|
+
return materializeGeneratorData(request.location, request.plan, this.requiredWarehouseId(), signal);
|
|
59
|
+
}
|
|
60
|
+
/** Create and publish a dashboard with automatic companion Genie. */
|
|
61
|
+
createDashboard(request, signal) {
|
|
62
|
+
return createGeneratorDashboard({
|
|
63
|
+
location: request.location,
|
|
64
|
+
plan: request.plan,
|
|
65
|
+
brand: request.brand.brand,
|
|
66
|
+
company: request.request.company,
|
|
67
|
+
purpose: request.request.purpose,
|
|
68
|
+
warehouseId: this.requiredWarehouseId(),
|
|
69
|
+
}, signal);
|
|
70
|
+
}
|
|
71
|
+
/** Create a standalone Genie space for no-dashboard runs. */
|
|
72
|
+
createGenie(request, signal) {
|
|
73
|
+
return createGeneratorGenieSpace({
|
|
74
|
+
location: request.location,
|
|
75
|
+
plan: request.plan,
|
|
76
|
+
company: request.request.company,
|
|
77
|
+
purpose: request.request.purpose,
|
|
78
|
+
warehouseId: this.requiredWarehouseId(),
|
|
79
|
+
}, signal);
|
|
80
|
+
}
|
|
81
|
+
/** Configured catalog or a deployment-time configuration error. */
|
|
82
|
+
requiredCatalog() {
|
|
83
|
+
if (!this.config.catalog) {
|
|
84
|
+
throw new ConfigurationError("GENERATOR_CATALOG is required for generator mutations");
|
|
85
|
+
}
|
|
86
|
+
return this.config.catalog;
|
|
87
|
+
}
|
|
88
|
+
/** Configured SQL warehouse or a deployment-time configuration error. */
|
|
89
|
+
requiredWarehouseId() {
|
|
90
|
+
if (!this.config.warehouseId) {
|
|
91
|
+
throw new ConfigurationError("DATABRICKS_WAREHOUSE_ID is required for generator mutations");
|
|
92
|
+
}
|
|
93
|
+
return this.config.warehouseId;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWV4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVc5QyxxRUFBcUU7QUFDckUsTUFBTSxPQUFPLG1CQUFtQjtJQUNiLE1BQU0sQ0FBMEI7SUFDaEMsY0FBYyxDQUFzQjtJQUVyRCwwREFBMEQ7SUFDMUQsWUFBWSxPQUFtQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQy9DLENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsYUFBYSxDQUNYLE9BQStCLEVBQy9CLE1BQW9CLEVBQ3BCLFVBQWtDO1FBRWxDLE9BQU8sb0JBQW9CLENBQ3pCLE9BQU8sRUFDUDtZQUNFLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYztZQUMzQixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENB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QUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksa0JBQWtCLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUM3QixDQUFDO0lBRUQseUVBQXlFO0lBQ2pFLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksa0JBQWtCLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJldXNhYmxlIGdlbmVyYXRvciBvcGVyYXRpb25zIHNoYXJlZCBieSB0b29scyBhbmQgd29ya2Zsb3cgc3RlcHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgQnJhbmRHZW5lcmF0aW9uUmVxdWVzdCwgQnJhbmRQYWNrYWdlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmVyYXRvci9icmFuZFwiO1xuaW1wb3J0IHR5cGUgeyBLcGlSZXNlYXJjaFJlcXVlc3QsIEtwaVJlc2VhcmNoUmVzdWx0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmVyYXRvci9rcGlcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ3JlYXRlR2VuZXJhdG9yUHJlc2VudGF0aW9uUmVxdWVzdCxcbiAgR2VuZXJhdGVkRGFzaGJvYXJkLFxuICBHZW5lcmF0ZWRHZW5pZVNwYWNlLFxuICBHZW5lcmF0ZWRTY2hlbWEsXG4gIEdlbmVyYXRvclBsYW4sXG4gIE1hdGVyaWFsaXplR2VuZXJhdG9yRGF0YVJlcXVlc3QsXG4gIE1hdGVyaWFsaXplZEdlbmVyYXRvckRhdGEsXG4gIFBsYW5HZW5lcmF0b3JEYXRhUmVxdWVzdCxcbiAgUHJvdmlzaW9uR2VuZXJhdG9yU2NoZW1hUmVxdWVzdCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmVyYXRvci93b3JrZmxvd1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZEdlbmVyYXRvckNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VuZXJhdG9yRGFzaGJvYXJkIH0gZnJvbSBcIi4vZGFzaGJvYXJkLnRzXCI7XG5pbXBvcnQgeyBtYXRlcmlhbGl6ZUdlbmVyYXRvckRhdGEgfSBmcm9tIFwiLi9kYXRhLnRzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJyYW5kUGFja2FnZSB9IGZyb20gXCIuL2dlbmVyYXRlLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZW5lcmF0b3JHZW5pZVNwYWNlIH0gZnJvbSBcIi4vZ2VuaWUudHNcIjtcbmltcG9ydCB7IHJlc2VhcmNoS3BpcyB9IGZyb20gXCIuL2twaS50c1wiO1xuaW1wb3J0IHsgcHJvdmlzaW9uR2VuZXJhdG9yU2NoZW1hIH0gZnJvbSBcIi4vbmFtZXNwYWNlLnRzXCI7XG5pbXBvcnQgeyBwbGFuR2VuZXJhdG9yRGF0YSB9IGZyb20gXCIuL3BsYW4udHNcIjtcbmltcG9ydCB0eXBlIHsgQnJhbmRQcm9ncmVzc1JlcG9ydGVyLCBCcmFuZFJlc2VhcmNoQ2xpZW50IH0gZnJvbSBcIi4vcmVzZWFyY2gudHNcIjtcblxuLyoqIFJ1bnRpbWUgZGVwZW5kZW5jaWVzIGNhcHR1cmVkIGJ5IG9uZSBnZW5lcmF0b3IgcGx1Z2luIGluc3RhbmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0b3JPcGVyYXRpb25zT3B0aW9ucyB7XG4gIC8qKiBSZXNvbHZlZCBnZW5lcmF0b3IgY29uZmlndXJhdGlvbi4gKi9cbiAgY29uZmlnOiBSZXNvbHZlZEdlbmVyYXRvckNvbmZpZztcbiAgLyoqIFJlZ2lzdGVyZWQgd2ViLXNlYXJjaCBwbHVnaW4gb3BlcmF0aW9ucy4gKi9cbiAgcmVzZWFyY2hDbGllbnQ6IEJyYW5kUmVzZWFyY2hDbGllbnQ7XG59XG5cbi8qKiBPbmUgYmVoYXZpb3Igb3duZXIgZm9yIGV2ZXJ5IGdlbmVyYXRvciB0b29sIGFuZCB3b3JrZmxvdyBzdGVwLiAqL1xuZXhwb3J0IGNsYXNzIEdlbmVyYXRvck9wZXJhdGlvbnMge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWRHZW5lcmF0b3JDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzZWFyY2hDbGllbnQ6IEJyYW5kUmVzZWFyY2hDbGllbnQ7XG5cbiAgLyoqIENyZWF0ZSBvcGVyYXRpb25zIG92ZXIgb25lIGlzb2xhdGVkIHBsdWdpbiBydW50aW1lLiAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBHZW5lcmF0b3JPcGVyYXRpb25zT3B0aW9ucykge1xuICAgIHRoaXMuY29uZmlnID0gb3B0aW9ucy5jb25maWc7XG4gICAgdGhpcy5yZXNlYXJjaENsaWVudCA9IG9wdGlvbnMucmVzZWFyY2hDbGllbnQ7XG4gIH1cblxuICAvKiogR2VuZXJhdGUgcG9ydGFibGUgYnJhbmQgYXNzZXRzIHdpdGhvdXQgS1BJIHJlc2VhcmNoIG9yIERhdGFicmlja3Mgd3JpdGVzLiAqL1xuICBnZW5lcmF0ZUJyYW5kKFxuICAgIHJlcXVlc3Q6IEJyYW5kR2VuZXJhdGlvblJlcXVlc3QsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgb25Qcm9ncmVzcz86IEJyYW5kUHJvZ3Jlc3NSZXBvcnRlcixcbiAgKTogUHJvbWlzZTxCcmFuZFBhY2thZ2U+IHtcbiAgICByZXR1cm4gZ2VuZXJhdGVCcmFuZFBhY2thZ2UoXG4gICAgICByZXF1ZXN0LFxuICAgICAge1xuICAgICAgICBjbGllbnQ6IHRoaXMucmVzZWFyY2hDbGllbnQsXG4gICAgICAgIC4uLih0aGlzLmNvbmZpZy5tb2RlbCA/IHsgbW9kZWw6IHRoaXMuY29uZmlnLm1vZGVsIH0gOiB7fSksXG4gICAgICAgIG1heFNvdXJjZXM6IHRoaXMuY29uZmlnLm1heFNvdXJjZXMsXG4gICAgICAgIHNvdXJjZU1heExlbmd0aDogdGhpcy5jb25maWcuc291cmNlTWF4TGVuZ3RoLFxuICAgICAgICAuLi4ob25Qcm9ncmVzcyA/IHsgb25Qcm9ncmVzcyB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICB9XG5cbiAgLyoqIFJlc2VhcmNoIEtQSXMgaW5kZXBlbmRlbnRseSBvZiBhbnkgbXV0YXRpb24gd29ya2Zsb3cuICovXG4gIHJlc2VhcmNoS3BpcyhyZXF1ZXN0OiBLcGlSZXNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxLcGlSZXNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiByZXNlYXJjaEtwaXMoXG4gICAgICByZXF1ZXN0LFxuICAgICAge1xuICAgICAgICBjbGllbnQ6IHRoaXMucmVzZWFyY2hDbGllbnQsXG4gICAgICAgIG1heFNvdXJjZXM6IHRoaXMuY29uZmlnLm1heFNvdXJjZXMsXG4gICAgICAgIHNvdXJjZU1heExlbmd0aDogdGhpcy5jb25maWcuc291cmNlTWF4TGVuZ3RoLFxuICAgICAgICAuLi4odGhpcy5jb25maWcubW9kZWwgPyB7IG1vZGVsOiB0aGlzLmNvbmZpZy5tb2RlbCB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICB9XG5cbiAgLyoqIEJ1aWxkIGEgdHlwZWQgZGV0ZXJtaW5pc3RpYyBkYXRhIHBsYW4uICovXG4gIHBsYW5EYXRhKHJlcXVlc3Q6IFBsYW5HZW5lcmF0b3JEYXRhUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEdlbmVyYXRvclBsYW4+IHtcbiAgICByZXR1cm4gcGxhbkdlbmVyYXRvckRhdGEoXG4gICAgICB7XG4gICAgICAgIC4uLnJlcXVlc3QsXG4gICAgICAgIC4uLih0aGlzLmNvbmZpZy5tb2RlbCA/IHsgbW9kZWw6IHRoaXMuY29uZmlnLm1vZGVsIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gIH1cblxuICAvKiogUHJvdmlzaW9uIHRoZSBhY3RpdmUgT0JPIHVzZXIncyBkZXRlcm1pbmlzdGljIHNjaGVtYS4gKi9cbiAgcHJvdmlzaW9uU2NoZW1hKFxuICAgIHJlcXVlc3Q6IFByb3Zpc2lvbkdlbmVyYXRvclNjaGVtYVJlcXVlc3QsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8R2VuZXJhdGVkU2NoZW1hPiB7XG4gICAgcmV0dXJuIHByb3Zpc2lvbkdlbmVyYXRvclNjaGVtYShcbiAgICAgIHtcbiAgICAgICAgY2F0YWxvZzogdGhpcy5yZXF1aXJlZENhdGFsb2coKSxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdC5yZXF1ZXN0LFxuICAgICAgfSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICB9XG5cbiAgLyoqIE1hdGVyaWFsaXplIGdlbmVyYXRlZCBkYXRhIGFuZCB2YWxpZGF0ZSBpdHMgS1BJIGFnZ3JlZ2F0ZXMuICovXG4gIG1hdGVyaWFsaXplRGF0YShcbiAgICByZXF1ZXN0OiBNYXRlcmlhbGl6ZUdlbmVyYXRvckRhdGFSZXF1ZXN0LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPE1hdGVyaWFsaXplZEdlbmVyYXRvckRhdGE+IHtcbiAgICByZXR1cm4gbWF0ZXJpYWxpemVHZW5lcmF0b3JEYXRhKFxuICAgICAgcmVxdWVzdC5sb2NhdGlvbixcbiAgICAgIHJlcXVlc3QucGxhbixcbiAgICAgIHRoaXMucmVxdWlyZWRXYXJlaG91c2VJZCgpLFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuZCBwdWJsaXNoIGEgZGFzaGJvYXJkIHdpdGggYXV0b21hdGljIGNvbXBhbmlvbiBHZW5pZS4gKi9cbiAgY3JlYXRlRGFzaGJvYXJkKFxuICAgIHJlcXVlc3Q6IENyZWF0ZUdlbmVyYXRvclByZXNlbnRhdGlvblJlcXVlc3QsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8R2VuZXJhdGVkRGFzaGJvYXJkPiB7XG4gICAgcmV0dXJuIGNyZWF0ZUdlbmVyYXRvckRhc2hib2FyZChcbiAgICAgIHtcbiAgICAgICAgbG9jYXRpb246IHJlcXVlc3QubG9jYXRpb24sXG4gICAgICAgIHBsYW46IHJlcXVlc3QucGxhbixcbiAgICAgICAgYnJhbmQ6IHJlcXVlc3QuYnJhbmQuYnJhbmQsXG4gICAgICAgIGNvbXBhbnk6IHJlcXVlc3QucmVxdWVzdC5jb21wYW55LFxuICAgICAgICBwdXJwb3NlOiByZXF1ZXN0LnJlcXVlc3QucHVycG9zZSxcbiAgICAgICAgd2FyZWhvdXNlSWQ6IHRoaXMucmVxdWlyZWRXYXJlaG91c2VJZCgpLFxuICAgICAgfSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIHN0YW5kYWxvbmUgR2VuaWUgc3BhY2UgZm9yIG5vLWRhc2hib2FyZCBydW5zLiAqL1xuICBjcmVhdGVHZW5pZShcbiAgICByZXF1ZXN0OiBDcmVhdGVHZW5lcmF0b3JQcmVzZW50YXRpb25SZXF1ZXN0LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPEdlbmVyYXRlZEdlbmllU3BhY2U+IHtcbiAgICByZXR1cm4gY3JlYXRlR2VuZXJhdG9yR2VuaWVTcGFjZShcbiAgICAgIHtcbiAgICAgICAgbG9jYXRpb246IHJlcXVlc3QubG9jYXRpb24sXG4gICAgICAgIHBsYW46IHJlcXVlc3QucGxhbixcbiAgICAgICAgY29tcGFueTogcmVxdWVzdC5yZXF1ZXN0LmNvbXBhbnksXG4gICAgICAgIHB1cnBvc2U6IHJlcXVlc3QucmVxdWVzdC5wdXJwb3NlLFxuICAgICAgICB3YXJlaG91c2VJZDogdGhpcy5yZXF1aXJlZFdhcmVob3VzZUlkKCksXG4gICAgICB9LFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gIH1cblxuICAvKiogQ29uZmlndXJlZCBjYXRhbG9nIG9yIGEgZGVwbG95bWVudC10aW1lIGNvbmZpZ3VyYXRpb24gZXJyb3IuICovXG4gIHByaXZhdGUgcmVxdWlyZWRDYXRhbG9nKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5jYXRhbG9nKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFwiR0VORVJBVE9SX0NBVEFMT0cgaXMgcmVxdWlyZWQgZm9yIGdlbmVyYXRvciBtdXRhdGlvbnNcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5jYXRhbG9nO1xuICB9XG5cbiAgLyoqIENvbmZpZ3VyZWQgU1FMIHdhcmVob3VzZSBvciBhIGRlcGxveW1lbnQtdGltZSBjb25maWd1cmF0aW9uIGVycm9yLiAqL1xuICBwcml2YXRlIHJlcXVpcmVkV2FyZWhvdXNlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLndhcmVob3VzZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFwiREFUQUJSSUNLU19XQVJFSE9VU0VfSUQgaXMgcmVxdWlyZWQgZm9yIGdlbmVyYXRvciBtdXRhdGlvbnNcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy53YXJlaG91c2VJZDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility normalization for model-generated interface palettes.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { GeneratedBrandProfile } from "./schema.ts";
|
|
7
|
+
/** WCAG contrast ratio between two schema-valid hex colors. */
|
|
8
|
+
export declare function colorContrastRatio(foreground: string, background: string): number;
|
|
9
|
+
/** Make generated text and action colors readable against the page background. */
|
|
10
|
+
export declare function normalizeBrandPalette(profile: GeneratedBrandProfile): GeneratedBrandProfile;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility normalization for model-generated interface palettes.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
/** Expand a schema-validated hex color into RGB channels. */
|
|
7
|
+
function hexToRgb(color) {
|
|
8
|
+
const hex = color.slice(1);
|
|
9
|
+
const expanded = hex.length === 3 ? [...hex].map((value) => `${value}${value}`).join("") : hex.slice(0, 6);
|
|
10
|
+
return {
|
|
11
|
+
red: Number.parseInt(expanded.slice(0, 2), 16),
|
|
12
|
+
green: Number.parseInt(expanded.slice(2, 4), 16),
|
|
13
|
+
blue: Number.parseInt(expanded.slice(4, 6), 16),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Serialize RGB channels as a six-digit uppercase hex color. */
|
|
17
|
+
function rgbToHex(color) {
|
|
18
|
+
const channel = (value) => Math.round(value).toString(16).padStart(2, "0").toUpperCase();
|
|
19
|
+
return `#${channel(color.red)}${channel(color.green)}${channel(color.blue)}`;
|
|
20
|
+
}
|
|
21
|
+
/** WCAG relative luminance for one sRGB color. */
|
|
22
|
+
function relativeLuminance(color) {
|
|
23
|
+
const channel = (value) => {
|
|
24
|
+
const normalized = value / 255;
|
|
25
|
+
return normalized <= 0.04045 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;
|
|
26
|
+
};
|
|
27
|
+
return 0.2126 * channel(color.red) + 0.7152 * channel(color.green) + 0.0722 * channel(color.blue);
|
|
28
|
+
}
|
|
29
|
+
/** WCAG contrast ratio between two schema-valid hex colors. */
|
|
30
|
+
export function colorContrastRatio(foreground, background) {
|
|
31
|
+
const first = relativeLuminance(hexToRgb(foreground));
|
|
32
|
+
const second = relativeLuminance(hexToRgb(background));
|
|
33
|
+
const lighter = Math.max(first, second);
|
|
34
|
+
const darker = Math.min(first, second);
|
|
35
|
+
return (lighter + 0.05) / (darker + 0.05);
|
|
36
|
+
}
|
|
37
|
+
/** Blend a color toward black or white past the AA threshold with rendering margin. */
|
|
38
|
+
function ensureContrast(color, background, minimum = 5) {
|
|
39
|
+
if (colorContrastRatio(color, background) >= minimum)
|
|
40
|
+
return color;
|
|
41
|
+
const source = hexToRgb(color);
|
|
42
|
+
const backgroundIsLight = relativeLuminance(hexToRgb(background)) > 0.5;
|
|
43
|
+
const target = backgroundIsLight ? 0 : 255;
|
|
44
|
+
for (let amount = 0.05; amount <= 1; amount += 0.05) {
|
|
45
|
+
const candidate = rgbToHex({
|
|
46
|
+
red: source.red + (target - source.red) * amount,
|
|
47
|
+
green: source.green + (target - source.green) * amount,
|
|
48
|
+
blue: source.blue + (target - source.blue) * amount,
|
|
49
|
+
});
|
|
50
|
+
if (colorContrastRatio(candidate, background) >= minimum)
|
|
51
|
+
return candidate;
|
|
52
|
+
}
|
|
53
|
+
return backgroundIsLight ? "#000000" : "#FFFFFF";
|
|
54
|
+
}
|
|
55
|
+
/** Make generated text and action colors readable against the page background. */
|
|
56
|
+
export function normalizeBrandPalette(profile) {
|
|
57
|
+
const background = profile.colors.background;
|
|
58
|
+
return {
|
|
59
|
+
...profile,
|
|
60
|
+
colors: {
|
|
61
|
+
...profile.colors,
|
|
62
|
+
primary: ensureContrast(profile.colors.primary, background),
|
|
63
|
+
primaryHover: ensureContrast(profile.colors.primaryHover, background),
|
|
64
|
+
foreground: ensureContrast(profile.colors.foreground, background),
|
|
65
|
+
muted: ensureContrast(profile.colors.muted, background),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFsZXR0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYWxldHRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFVSCw2REFBNkQ7QUFDN0QsU0FBUyxRQUFRLENBQUMsS0FBYTtJQUM3QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sUUFBUSxHQUNaLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsT0FBTztRQUNMLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM5QyxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDaEQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQ2hELENBQUM7QUFDSixDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLFNBQVMsUUFBUSxDQUFDLEtBQVU7SUFDMUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDL0UsQ0FBQztBQUVELGtEQUFrRDtBQUNsRCxTQUFTLGlCQUFpQixDQUFDLEtBQVU7SUFDbkMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUNoQyxNQUFNLFVBQVUsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQy9CLE9BQU8sVUFBVSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDNUYsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwRyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxVQUFrQixFQUFFLFVBQWtCO0lBQ3ZFLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELHVGQUF1RjtBQUN2RixTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNwRSxJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxPQUFPO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbkUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE1BQU0saUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3hFLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUMzQyxLQUFLLElBQUksTUFBTSxHQUFHLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNwRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDekIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU07WUFDaEQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU07WUFDdEQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU07U0FDcEQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUksT0FBTztZQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdFLENBQUM7SUFDRCxPQUFPLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxPQUE4QjtJQUNsRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUM3QyxPQUFPO1FBQ0wsR0FBRyxPQUFPO1FBQ1YsTUFBTSxFQUFFO1lBQ04sR0FBRyxPQUFPLENBQUMsTUFBTTtZQUNqQixPQUFPLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQztZQUMzRCxZQUFZLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQztZQUNyRSxVQUFVLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUNqRSxLQUFLLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQztTQUN4RDtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBY2Nlc3NpYmlsaXR5IG5vcm1hbGl6YXRpb24gZm9yIG1vZGVsLWdlbmVyYXRlZCBpbnRlcmZhY2UgcGFsZXR0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVkQnJhbmRQcm9maWxlIH0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmludGVyZmFjZSBSZ2Ige1xuICByZWQ6IG51bWJlcjtcbiAgZ3JlZW46IG51bWJlcjtcbiAgYmx1ZTogbnVtYmVyO1xufVxuXG4vKiogRXhwYW5kIGEgc2NoZW1hLXZhbGlkYXRlZCBoZXggY29sb3IgaW50byBSR0IgY2hhbm5lbHMuICovXG5mdW5jdGlvbiBoZXhUb1JnYihjb2xvcjogc3RyaW5nKTogUmdiIHtcbiAgY29uc3QgaGV4ID0gY29sb3Iuc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGFuZGVkID1cbiAgICBoZXgubGVuZ3RoID09PSAzID8gWy4uLmhleF0ubWFwKCh2YWx1ZSkgPT4gYCR7dmFsdWV9JHt2YWx1ZX1gKS5qb2luKFwiXCIpIDogaGV4LnNsaWNlKDAsIDYpO1xuICByZXR1cm4ge1xuICAgIHJlZDogTnVtYmVyLnBhcnNlSW50KGV4cGFuZGVkLnNsaWNlKDAsIDIpLCAxNiksXG4gICAgZ3JlZW46IE51bWJlci5wYXJzZUludChleHBhbmRlZC5zbGljZSgyLCA0KSwgMTYpLFxuICAgIGJsdWU6IE51bWJlci5wYXJzZUludChleHBhbmRlZC5zbGljZSg0LCA2KSwgMTYpLFxuICB9O1xufVxuXG4vKiogU2VyaWFsaXplIFJHQiBjaGFubmVscyBhcyBhIHNpeC1kaWdpdCB1cHBlcmNhc2UgaGV4IGNvbG9yLiAqL1xuZnVuY3Rpb24gcmdiVG9IZXgoY29sb3I6IFJnYik6IHN0cmluZyB7XG4gIGNvbnN0IGNoYW5uZWwgPSAodmFsdWU6IG51bWJlcikgPT4gTWF0aC5yb3VuZCh2YWx1ZSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKS50b1VwcGVyQ2FzZSgpO1xuICByZXR1cm4gYCMke2NoYW5uZWwoY29sb3IucmVkKX0ke2NoYW5uZWwoY29sb3IuZ3JlZW4pfSR7Y2hhbm5lbChjb2xvci5ibHVlKX1gO1xufVxuXG4vKiogV0NBRyByZWxhdGl2ZSBsdW1pbmFuY2UgZm9yIG9uZSBzUkdCIGNvbG9yLiAqL1xuZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UoY29sb3I6IFJnYik6IG51bWJlciB7XG4gIGNvbnN0IGNoYW5uZWwgPSAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZSAvIDI1NTtcbiAgICByZXR1cm4gbm9ybWFsaXplZCA8PSAwLjA0MDQ1ID8gbm9ybWFsaXplZCAvIDEyLjkyIDogKChub3JtYWxpemVkICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNDtcbiAgfTtcbiAgcmV0dXJuIDAuMjEyNiAqIGNoYW5uZWwoY29sb3IucmVkKSArIDAuNzE1MiAqIGNoYW5uZWwoY29sb3IuZ3JlZW4pICsgMC4wNzIyICogY2hhbm5lbChjb2xvci5ibHVlKTtcbn1cblxuLyoqIFdDQUcgY29udHJhc3QgcmF0aW8gYmV0d2VlbiB0d28gc2NoZW1hLXZhbGlkIGhleCBjb2xvcnMuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JDb250cmFzdFJhdGlvKGZvcmVncm91bmQ6IHN0cmluZywgYmFja2dyb3VuZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgZmlyc3QgPSByZWxhdGl2ZUx1bWluYW5jZShoZXhUb1JnYihmb3JlZ3JvdW5kKSk7XG4gIGNvbnN0IHNlY29uZCA9IHJlbGF0aXZlTHVtaW5hbmNlKGhleFRvUmdiKGJhY2tncm91bmQpKTtcbiAgY29uc3QgbGlnaHRlciA9IE1hdGgubWF4KGZpcnN0LCBzZWNvbmQpO1xuICBjb25zdCBkYXJrZXIgPSBNYXRoLm1pbihmaXJzdCwgc2Vjb25kKTtcbiAgcmV0dXJuIChsaWdodGVyICsgMC4wNSkgLyAoZGFya2VyICsgMC4wNSk7XG59XG5cbi8qKiBCbGVuZCBhIGNvbG9yIHRvd2FyZCBibGFjayBvciB3aGl0ZSBwYXN0IHRoZSBBQSB0aHJlc2hvbGQgd2l0aCByZW5kZXJpbmcgbWFyZ2luLiAqL1xuZnVuY3Rpb24gZW5zdXJlQ29udHJhc3QoY29sb3I6IHN0cmluZywgYmFja2dyb3VuZDogc3RyaW5nLCBtaW5pbXVtID0gNSk6IHN0cmluZyB7XG4gIGlmIChjb2xvckNvbnRyYXN0UmF0aW8oY29sb3IsIGJhY2tncm91bmQpID49IG1pbmltdW0pIHJldHVybiBjb2xvcjtcbiAgY29uc3Qgc291cmNlID0gaGV4VG9SZ2IoY29sb3IpO1xuICBjb25zdCBiYWNrZ3JvdW5kSXNMaWdodCA9IHJlbGF0aXZlTHVtaW5hbmNlKGhleFRvUmdiKGJhY2tncm91bmQpKSA+IDAuNTtcbiAgY29uc3QgdGFyZ2V0ID0gYmFja2dyb3VuZElzTGlnaHQgPyAwIDogMjU1O1xuICBmb3IgKGxldCBhbW91bnQgPSAwLjA1OyBhbW91bnQgPD0gMTsgYW1vdW50ICs9IDAuMDUpIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSByZ2JUb0hleCh7XG4gICAgICByZWQ6IHNvdXJjZS5yZWQgKyAodGFyZ2V0IC0gc291cmNlLnJlZCkgKiBhbW91bnQsXG4gICAgICBncmVlbjogc291cmNlLmdyZWVuICsgKHRhcmdldCAtIHNvdXJjZS5ncmVlbikgKiBhbW91bnQsXG4gICAgICBibHVlOiBzb3VyY2UuYmx1ZSArICh0YXJnZXQgLSBzb3VyY2UuYmx1ZSkgKiBhbW91bnQsXG4gICAgfSk7XG4gICAgaWYgKGNvbG9yQ29udHJhc3RSYXRpbyhjYW5kaWRhdGUsIGJhY2tncm91bmQpID49IG1pbmltdW0pIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgcmV0dXJuIGJhY2tncm91bmRJc0xpZ2h0ID8gXCIjMDAwMDAwXCIgOiBcIiNGRkZGRkZcIjtcbn1cblxuLyoqIE1ha2UgZ2VuZXJhdGVkIHRleHQgYW5kIGFjdGlvbiBjb2xvcnMgcmVhZGFibGUgYWdhaW5zdCB0aGUgcGFnZSBiYWNrZ3JvdW5kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJyYW5kUGFsZXR0ZShwcm9maWxlOiBHZW5lcmF0ZWRCcmFuZFByb2ZpbGUpOiBHZW5lcmF0ZWRCcmFuZFByb2ZpbGUge1xuICBjb25zdCBiYWNrZ3JvdW5kID0gcHJvZmlsZS5jb2xvcnMuYmFja2dyb3VuZDtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcm9maWxlLFxuICAgIGNvbG9yczoge1xuICAgICAgLi4ucHJvZmlsZS5jb2xvcnMsXG4gICAgICBwcmltYXJ5OiBlbnN1cmVDb250cmFzdChwcm9maWxlLmNvbG9ycy5wcmltYXJ5LCBiYWNrZ3JvdW5kKSxcbiAgICAgIHByaW1hcnlIb3ZlcjogZW5zdXJlQ29udHJhc3QocHJvZmlsZS5jb2xvcnMucHJpbWFyeUhvdmVyLCBiYWNrZ3JvdW5kKSxcbiAgICAgIGZvcmVncm91bmQ6IGVuc3VyZUNvbnRyYXN0KHByb2ZpbGUuY29sb3JzLmZvcmVncm91bmQsIGJhY2tncm91bmQpLFxuICAgICAgbXV0ZWQ6IGVuc3VyZUNvbnRyYXN0KHByb2ZpbGUuY29sb3JzLm11dGVkLCBiYWNrZ3JvdW5kKSxcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured demo-data planning from brand and KPI research.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { BrandPackage } from "@dbx-tools/shared-generator/brand";
|
|
7
|
+
import type { KpiResearchResult } from "@dbx-tools/shared-generator/kpi";
|
|
8
|
+
import { type GeneratorPlan, type GeneratorRequest } from "@dbx-tools/shared-generator/workflow";
|
|
9
|
+
/** Inputs for deterministic demo-data planning. */
|
|
10
|
+
export interface PlanGeneratorDataInput {
|
|
11
|
+
/** Validated workflow request. */
|
|
12
|
+
request: GeneratorRequest;
|
|
13
|
+
/** Researched brand package. */
|
|
14
|
+
brand: BrandPackage;
|
|
15
|
+
/** Evidence-backed KPI research. */
|
|
16
|
+
kpiResearch: KpiResearchResult;
|
|
17
|
+
/** Optional model preference. */
|
|
18
|
+
model?: string;
|
|
19
|
+
}
|
|
20
|
+
/** Build a constrained plan that can be compiled without model-authored SQL. */
|
|
21
|
+
export declare function planGeneratorData(input: PlanGeneratorDataInput, signal?: AbortSignal): Promise<GeneratorPlan>;
|
package/lib/src/plan.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured demo-data planning from brand and KPI research.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { GeneratorPlanSchema, } from "@dbx-tools/shared-generator/workflow";
|
|
7
|
+
import { generateStructured } from "./structured.js";
|
|
8
|
+
/** Build a constrained plan that can be compiled without model-authored SQL. */
|
|
9
|
+
export async function planGeneratorData(input, signal) {
|
|
10
|
+
const generated = await generateStructured({
|
|
11
|
+
id: "demo-data-planner",
|
|
12
|
+
instructions: [
|
|
13
|
+
"Plan one denormalized Delta fact table for a realistic business demo.",
|
|
14
|
+
"Use only the supplied generator kinds and KPI aggregations.",
|
|
15
|
+
"Include an id column, a date column, two to six useful categories,",
|
|
16
|
+
"numeric columns needed by every KPI, and a measurable anomaly.",
|
|
17
|
+
"Do not write SQL. Do not invent unsupported generator fields.",
|
|
18
|
+
].join(" "),
|
|
19
|
+
prompt: JSON.stringify({
|
|
20
|
+
request: input.request,
|
|
21
|
+
brand: input.brand.brand,
|
|
22
|
+
kpis: input.kpiResearch.kpis,
|
|
23
|
+
}, null, 2),
|
|
24
|
+
schema: GeneratorPlanSchema,
|
|
25
|
+
...(input.model ? { model: input.model } : {}),
|
|
26
|
+
...(signal ? { signal } : {}),
|
|
27
|
+
});
|
|
28
|
+
return GeneratorPlanSchema.parse({
|
|
29
|
+
...generated,
|
|
30
|
+
rowCount: input.request.rowCount,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFJSCxPQUFPLEVBQ0wsbUJBQW1CLEdBR3BCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFjckQsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLEtBQTZCLEVBQzdCLE1BQW9CO0lBRXBCLE1BQU0sU0FBUyxHQUFHLE1BQU0sa0JBQWtCLENBQUM7UUFDekMsRUFBRSxFQUFFLG1CQUFtQjtRQUN2QixZQUFZLEVBQUU7WUFDWix1RUFBdUU7WUFDdkUsNkRBQTZEO1lBQzdELG9FQUFvRTtZQUNwRSxnRUFBZ0U7WUFDaEUsK0RBQStEO1NBQ2hFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUNwQjtZQUNFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQ3hCLElBQUksRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUk7U0FDN0IsRUFDRCxJQUFJLEVBQ0osQ0FBQyxDQUNGO1FBQ0QsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzlCLENBQUMsQ0FBQztJQUNILE9BQU8sbUJBQW1CLENBQUMsS0FBSyxDQUFDO1FBQy9CLEdBQUcsU0FBUztRQUNaLFFBQVEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7S0FDakMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RydWN0dXJlZCBkZW1vLWRhdGEgcGxhbm5pbmcgZnJvbSBicmFuZCBhbmQgS1BJIHJlc2VhcmNoLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJyYW5kUGFja2FnZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5lcmF0b3IvYnJhbmRcIjtcbmltcG9ydCB0eXBlIHsgS3BpUmVzZWFyY2hSZXN1bHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZ2VuZXJhdG9yL2twaVwiO1xuaW1wb3J0IHtcbiAgR2VuZXJhdG9yUGxhblNjaGVtYSxcbiAgdHlwZSBHZW5lcmF0b3JQbGFuLFxuICB0eXBlIEdlbmVyYXRvclJlcXVlc3QsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5lcmF0b3Ivd29ya2Zsb3dcIjtcbmltcG9ydCB7IGdlbmVyYXRlU3RydWN0dXJlZCB9IGZyb20gXCIuL3N0cnVjdHVyZWQudHNcIjtcblxuLyoqIElucHV0cyBmb3IgZGV0ZXJtaW5pc3RpYyBkZW1vLWRhdGEgcGxhbm5pbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYW5HZW5lcmF0b3JEYXRhSW5wdXQge1xuICAvKiogVmFsaWRhdGVkIHdvcmtmbG93IHJlcXVlc3QuICovXG4gIHJlcXVlc3Q6IEdlbmVyYXRvclJlcXVlc3Q7XG4gIC8qKiBSZXNlYXJjaGVkIGJyYW5kIHBhY2thZ2UuICovXG4gIGJyYW5kOiBCcmFuZFBhY2thZ2U7XG4gIC8qKiBFdmlkZW5jZS1iYWNrZWQgS1BJIHJlc2VhcmNoLiAqL1xuICBrcGlSZXNlYXJjaDogS3BpUmVzZWFyY2hSZXN1bHQ7XG4gIC8qKiBPcHRpb25hbCBtb2RlbCBwcmVmZXJlbmNlLiAqL1xuICBtb2RlbD86IHN0cmluZztcbn1cblxuLyoqIEJ1aWxkIGEgY29uc3RyYWluZWQgcGxhbiB0aGF0IGNhbiBiZSBjb21waWxlZCB3aXRob3V0IG1vZGVsLWF1dGhvcmVkIFNRTC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwbGFuR2VuZXJhdG9yRGF0YShcbiAgaW5wdXQ6IFBsYW5HZW5lcmF0b3JEYXRhSW5wdXQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxHZW5lcmF0b3JQbGFuPiB7XG4gIGNvbnN0IGdlbmVyYXRlZCA9IGF3YWl0IGdlbmVyYXRlU3RydWN0dXJlZCh7XG4gICAgaWQ6IFwiZGVtby1kYXRhLXBsYW5uZXJcIixcbiAgICBpbnN0cnVjdGlvbnM6IFtcbiAgICAgIFwiUGxhbiBvbmUgZGVub3JtYWxpemVkIERlbHRhIGZhY3QgdGFibGUgZm9yIGEgcmVhbGlzdGljIGJ1c2luZXNzIGRlbW8uXCIsXG4gICAgICBcIlVzZSBvbmx5IHRoZSBzdXBwbGllZCBnZW5lcmF0b3Iga2luZHMgYW5kIEtQSSBhZ2dyZWdhdGlvbnMuXCIsXG4gICAgICBcIkluY2x1ZGUgYW4gaWQgY29sdW1uLCBhIGRhdGUgY29sdW1uLCB0d28gdG8gc2l4IHVzZWZ1bCBjYXRlZ29yaWVzLFwiLFxuICAgICAgXCJudW1lcmljIGNvbHVtbnMgbmVlZGVkIGJ5IGV2ZXJ5IEtQSSwgYW5kIGEgbWVhc3VyYWJsZSBhbm9tYWx5LlwiLFxuICAgICAgXCJEbyBub3Qgd3JpdGUgU1FMLiBEbyBub3QgaW52ZW50IHVuc3VwcG9ydGVkIGdlbmVyYXRvciBmaWVsZHMuXCIsXG4gICAgXS5qb2luKFwiIFwiKSxcbiAgICBwcm9tcHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICByZXF1ZXN0OiBpbnB1dC5yZXF1ZXN0LFxuICAgICAgICBicmFuZDogaW5wdXQuYnJhbmQuYnJhbmQsXG4gICAgICAgIGtwaXM6IGlucHV0LmtwaVJlc2VhcmNoLmtwaXMsXG4gICAgICB9LFxuICAgICAgbnVsbCxcbiAgICAgIDIsXG4gICAgKSxcbiAgICBzY2hlbWE6IEdlbmVyYXRvclBsYW5TY2hlbWEsXG4gICAgLi4uKGlucHV0Lm1vZGVsID8geyBtb2RlbDogaW5wdXQubW9kZWwgfSA6IHt9KSxcbiAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiBHZW5lcmF0b3JQbGFuU2NoZW1hLnBhcnNlKHtcbiAgICAuLi5nZW5lcmF0ZWQsXG4gICAgcm93Q291bnQ6IGlucHV0LnJlcXVlc3Qucm93Q291bnQsXG4gIH0pO1xufVxuIl19
|