@dbx-tools/appkit-generator 0.0.0-stage → 0.9.138

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +181 -2
  3. package/index.ts +44 -0
  4. package/lib/index.d.ts +40 -0
  5. package/lib/index.js +30 -0
  6. package/lib/src/assets.d.ts +33 -0
  7. package/lib/src/assets.js +224 -0
  8. package/lib/src/config.d.ts +75 -0
  9. package/lib/src/config.js +31 -0
  10. package/lib/src/dashboard.d.ts +30 -0
  11. package/lib/src/dashboard.js +257 -0
  12. package/lib/src/data.d.ts +17 -0
  13. package/lib/src/data.js +114 -0
  14. package/lib/src/defaults.d.ts +39 -0
  15. package/lib/src/defaults.js +36 -0
  16. package/lib/src/generate.d.ts +51 -0
  17. package/lib/src/generate.js +163 -0
  18. package/lib/src/genie.d.ts +51 -0
  19. package/lib/src/genie.js +84 -0
  20. package/lib/src/kpi.d.ts +22 -0
  21. package/lib/src/kpi.js +74 -0
  22. package/lib/src/manifest.json +72 -0
  23. package/lib/src/namespace.d.ts +36 -0
  24. package/lib/src/namespace.js +119 -0
  25. package/lib/src/operations.d.ts +42 -0
  26. package/lib/src/operations.js +96 -0
  27. package/lib/src/palette.d.ts +10 -0
  28. package/lib/src/palette.js +69 -0
  29. package/lib/src/plan.d.ts +21 -0
  30. package/lib/src/plan.js +33 -0
  31. package/lib/src/plugin.d.ts +619 -0
  32. package/lib/src/plugin.js +205 -0
  33. package/lib/src/research.d.ts +78 -0
  34. package/lib/src/research.js +235 -0
  35. package/lib/src/schema.d.ts +52 -0
  36. package/lib/src/schema.js +82 -0
  37. package/lib/src/structured.d.ts +27 -0
  38. package/lib/src/structured.js +30 -0
  39. package/lib/src/workflow.d.ts +314 -0
  40. package/lib/src/workflow.js +171 -0
  41. package/lib/tsconfig.tsbuildinfo +1 -0
  42. package/package.json +218 -4
  43. package/src/assets.ts +248 -0
  44. package/src/config.ts +98 -0
  45. package/src/dashboard.ts +295 -0
  46. package/src/data.ts +167 -0
  47. package/src/defaults.ts +61 -0
  48. package/src/generate.ts +250 -0
  49. package/src/genie.ts +111 -0
  50. package/src/kpi.ts +106 -0
  51. package/src/manifest.json +72 -0
  52. package/src/namespace.ts +192 -0
  53. package/src/operations.ts +171 -0
  54. package/src/palette.ts +81 -0
  55. package/src/plan.ts +59 -0
  56. package/src/plugin.ts +244 -0
  57. package/src/research.ts +382 -0
  58. package/src/schema.ts +114 -0
  59. package/src/structured.ts +54 -0
  60. package/src/workflow.ts +221 -0
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Deterministic brand-asset discovery from an official page.
3
+ *
4
+ * @module
5
+ */
6
+ import { object } from "@dbx-tools/shared-core";
7
+ import { load } from "cheerio";
8
+ /** Normalize a page-relative asset reference to a public HTTPS URL. */
9
+ function assetUrl(value, baseUrl) {
10
+ if (!value?.trim())
11
+ return undefined;
12
+ try {
13
+ const resolved = new URL(value.trim(), baseUrl);
14
+ return resolved.protocol === "https:" ? resolved.toString() : undefined;
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ }
20
+ /** Add a normalized URL to a candidate list once. */
21
+ function appendCandidate(candidates, value, baseUrl) {
22
+ const resolved = assetUrl(value, baseUrl);
23
+ if (resolved && !candidates.includes(resolved))
24
+ candidates.push(resolved);
25
+ }
26
+ /** Collapse CDN size and format variants of the same mobile artwork. */
27
+ function mobileImageIdentity(value) {
28
+ const url = new URL(value);
29
+ if (/googleusercontent\.com$/i.test(url.hostname)) {
30
+ return `${url.origin}${url.pathname.replace(/=[^/]+$/, "")}`;
31
+ }
32
+ if (/mzstatic\.com$/i.test(url.hostname)) {
33
+ return `${url.origin}${url.pathname.replace(/\/[^/]+$/, "")}`;
34
+ }
35
+ return url.toString();
36
+ }
37
+ /**
38
+ * Find logo-like URLs nested in JSON-LD organization metadata.
39
+ *
40
+ * JSON-LD permits `logo` and `image` to be a URL, an object with a `url` or
41
+ * `contentUrl`, or an array. The bounded recursive walk accepts those forms
42
+ * without treating unrelated strings elsewhere in the document as assets.
43
+ */
44
+ function jsonLdAssetUrls(value, depth = 0, assetContext = false) {
45
+ if (depth > 8 || value === null || value === undefined)
46
+ return [];
47
+ if (typeof value === "string")
48
+ return assetContext ? [value] : [];
49
+ if (Array.isArray(value)) {
50
+ return value.flatMap((entry) => jsonLdAssetUrls(entry, depth + 1, assetContext));
51
+ }
52
+ if (!object.isRecord(value))
53
+ return [];
54
+ const direct = assetContext
55
+ ? [value.url, value.contentUrl].flatMap((entry) => (typeof entry === "string" ? [entry] : []))
56
+ : [];
57
+ return [
58
+ ...direct,
59
+ ...jsonLdAssetUrls(value.logo, depth + 1, true),
60
+ ...jsonLdAssetUrls(value.image, depth + 1, true),
61
+ ...jsonLdAssetUrls(value["@graph"], depth + 1, false),
62
+ ];
63
+ }
64
+ /** Collect mobile screenshots and image objects from JSON-LD. */
65
+ function jsonLdMobileImageUrls(value, depth = 0, imageContext = false) {
66
+ if (depth > 10 || value === null || value === undefined)
67
+ return [];
68
+ if (typeof value === "string")
69
+ return imageContext ? [value] : [];
70
+ if (Array.isArray(value)) {
71
+ return value.flatMap((entry) => jsonLdMobileImageUrls(entry, depth + 1, imageContext));
72
+ }
73
+ if (!object.isRecord(value))
74
+ return [];
75
+ const direct = imageContext
76
+ ? [value.url, value.contentUrl].flatMap((entry) => (typeof entry === "string" ? [entry] : []))
77
+ : [];
78
+ return [
79
+ ...direct,
80
+ ...jsonLdMobileImageUrls(value.screenshot, depth + 1, true),
81
+ ...jsonLdMobileImageUrls(value.image, depth + 1, true),
82
+ ...jsonLdMobileImageUrls(value.thumbnailUrl, depth + 1, true),
83
+ ...jsonLdMobileImageUrls(value["@graph"], depth + 1, false),
84
+ ];
85
+ }
86
+ /**
87
+ * Discover icon, logo, and favicon URLs from an official page.
88
+ *
89
+ * The function only returns URLs present in page metadata or markup. When the
90
+ * page omits an icon, it uses the conventional `/favicon.ico` URL on the same
91
+ * origin. The logo falls back to that icon so a generated context never points
92
+ * at the dbx-tools default artwork.
93
+ */
94
+ export function discoverBrandAssets(html, pageUrl) {
95
+ const $ = load(html);
96
+ const icons = [];
97
+ const logos = [];
98
+ $("link[rel]").each((_index, element) => {
99
+ const rel = ($(element).attr("rel") ?? "").toLowerCase();
100
+ if (rel.split(/\s+/).some((part) => part === "icon" || part === "apple-touch-icon")) {
101
+ appendCandidate(icons, $(element).attr("href"), pageUrl);
102
+ }
103
+ });
104
+ for (const selector of [
105
+ 'meta[property="og:image"]',
106
+ 'meta[property="og:logo"]',
107
+ 'meta[name="twitter:image"]',
108
+ ]) {
109
+ $(selector).each((_index, element) => {
110
+ appendCandidate(logos, $(element).attr("content"), pageUrl);
111
+ });
112
+ }
113
+ $("img").each((_index, element) => {
114
+ const descriptor = [
115
+ $(element).attr("alt"),
116
+ $(element).attr("class"),
117
+ $(element).attr("id"),
118
+ $(element).attr("data-testid"),
119
+ ]
120
+ .filter(Boolean)
121
+ .join(" ");
122
+ if (/\b(?:brand|logo|wordmark)\b/i.test(descriptor)) {
123
+ appendCandidate(logos, $(element).attr("src"), pageUrl);
124
+ }
125
+ });
126
+ $('script[type="application/ld+json"]').each((_index, element) => {
127
+ try {
128
+ const value = JSON.parse($(element).text());
129
+ for (const candidate of jsonLdAssetUrls(value)) {
130
+ appendCandidate(logos, candidate, pageUrl);
131
+ }
132
+ }
133
+ catch {
134
+ return;
135
+ }
136
+ });
137
+ const fallbackIcon = new URL("/favicon.ico", pageUrl).toString();
138
+ const icon = icons[0] ?? logos[0] ?? fallbackIcon;
139
+ const logo = logos[0] ?? icons[0] ?? fallbackIcon;
140
+ return {
141
+ icon: { light: icon },
142
+ logo: { light: logo },
143
+ favicon: icon,
144
+ };
145
+ }
146
+ /** Extract an app name plus representative screenshots/icons from a store page. */
147
+ export function discoverMobileAppVisuals(html, pageUrl) {
148
+ const $ = load(html);
149
+ const metadataImages = [];
150
+ const structuredImages = [];
151
+ const screenshotImages = [];
152
+ const iconImages = [];
153
+ const otherStoreImages = [];
154
+ for (const selector of ['meta[property="og:image"]', 'meta[name="twitter:image"]']) {
155
+ $(selector).each((_index, element) => {
156
+ appendCandidate(metadataImages, $(element).attr("content"), pageUrl);
157
+ });
158
+ }
159
+ $('script[type="application/ld+json"]').each((_index, element) => {
160
+ try {
161
+ const value = JSON.parse($(element).text());
162
+ for (const candidate of jsonLdMobileImageUrls(value)) {
163
+ appendCandidate(structuredImages, candidate, pageUrl);
164
+ }
165
+ }
166
+ catch {
167
+ return;
168
+ }
169
+ });
170
+ $("img").each((_index, element) => {
171
+ const descriptor = [
172
+ $(element).attr("alt"),
173
+ $(element).attr("class"),
174
+ $(element).attr("aria-label"),
175
+ ]
176
+ .filter(Boolean)
177
+ .join(" ");
178
+ const source = $(element).attr("src") ?? $(element).attr("data-src");
179
+ const isStoreImageHost = /(?:mzstatic|ggpht|googleusercontent)\./i.test(source ?? "");
180
+ const target = /\b(?:phone|screen|screenshot|tablet)\b/i.test(descriptor)
181
+ ? screenshotImages
182
+ : /\b(?:app|icon)\b/i.test(descriptor)
183
+ ? iconImages
184
+ : isStoreImageHost
185
+ ? otherStoreImages
186
+ : undefined;
187
+ if (target) {
188
+ appendCandidate(target, source, pageUrl);
189
+ const srcset = ($(element).attr("srcset") ?? $(element).attr("data-srcset"))
190
+ ?.split(",")
191
+ .at(-1)
192
+ ?.trim()
193
+ .split(/\s+/)[0];
194
+ appendCandidate(target, srcset, pageUrl);
195
+ }
196
+ });
197
+ $("picture source[srcset]").each((_index, element) => {
198
+ const srcset = $(element).attr("srcset")?.split(",").at(-1)?.trim().split(/\s+/)[0];
199
+ appendCandidate(screenshotImages, srcset, pageUrl);
200
+ });
201
+ const images = [];
202
+ const seenImages = new Set();
203
+ for (const candidate of [
204
+ ...metadataImages.slice(0, 1),
205
+ ...screenshotImages,
206
+ ...iconImages,
207
+ ...structuredImages,
208
+ ...otherStoreImages,
209
+ ]) {
210
+ const resolved = assetUrl(candidate, pageUrl);
211
+ if (!resolved)
212
+ continue;
213
+ const identity = mobileImageIdentity(resolved);
214
+ if (seenImages.has(identity))
215
+ continue;
216
+ seenImages.add(identity);
217
+ images.push(resolved);
218
+ }
219
+ const rawName = $('meta[property="og:title"]').attr("content") ?? $("h1").first().text() ?? $("title").text();
220
+ const appName = rawName.replace(/\s+(?:on the App Store|- Apps on Google Play).*$/i, "").trim() ||
221
+ new URL(pageUrl).hostname;
222
+ return { appName, imageUrls: images.slice(0, 6) };
223
+ }
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fzc2V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFvQi9CLHVFQUF1RTtBQUN2RSxTQUFTLFFBQVEsQ0FBQyxLQUF5QixFQUFFLE9BQWU7SUFDMUQsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyQyxJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEQsT0FBTyxRQUFRLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDMUUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQscURBQXFEO0FBQ3JELFNBQVMsZUFBZSxDQUFDLFVBQW9CLEVBQUUsS0FBeUIsRUFBRSxPQUFlO0lBQ3ZGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUMsSUFBSSxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLG1CQUFtQixDQUFDLEtBQWE7SUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsSUFBSSwwQkFBMEIsQ0FBQyxJ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LE9BQU8sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRO1lBQUUsU0FBUztRQUN4QixNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQUUsU0FBUztRQUN2QyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUNYLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hHLE1BQU0sT0FBTyxHQUNYLE9BQU8sQ0FBQyxPQUFPLENBQUMsbURBQW1ELEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFO1FBQy9FLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERldGVybWluaXN0aWMgYnJhbmQtYXNzZXQgZGlzY292ZXJ5IGZyb20gYW4gb2ZmaWNpYWwgcGFnZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQnJhbmRBc3NldFNldCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2JyYW5kLXV0aWxzXCI7XG5pbXBvcnQgeyBsb2FkIH0gZnJvbSBcImNoZWVyaW9cIjtcblxuLyoqIEFzc2V0IHJlZmVyZW5jZXMgZXh0cmFjdGVkIGZyb20gb25lIG9mZmljaWFsIEhUTUwgcGFnZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZEJyYW5kQXNzZXRzIHtcbiAgLyoqIFRoZW1lLWF3YXJlIGljb24gcmVmZXJlbmNlLiAqL1xuICBpY29uOiBCcmFuZEFzc2V0U2V0O1xuICAvKiogVGhlbWUtYXdhcmUgbG9nbyByZWZlcmVuY2UuICovXG4gIGxvZ286IEJyYW5kQXNzZXRTZXQ7XG4gIC8qKiBCcm93c2VyIGZhdmljb24gcmVmZXJlbmNlLiAqL1xuICBmYXZpY29uOiBzdHJpbmc7XG59XG5cbi8qKiBWaXN1YWwgcmVmZXJlbmNlcyBleHRyYWN0ZWQgZnJvbSBhbiBvZmZpY2lhbCBtb2JpbGUtc3RvcmUgcGFnZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZE1vYmlsZUFwcFZpc3VhbHMge1xuICAvKiogU3RvcmUgbGlzdGluZyBhcHBsaWNhdGlvbiBuYW1lLiAqL1xuICBhcHBOYW1lOiBzdHJpbmc7XG4gIC8qKiBBcHAgaWNvbiBhbmQgc2NyZWVuc2hvdCBVUkxzIGluIHBhZ2Ugb3JkZXIuICovXG4gIGltYWdlVXJsczogc3RyaW5nW107XG59XG5cbi8qKiBOb3JtYWxpemUgYSBwYWdlLXJlbGF0aXZlIGFzc2V0IHJlZmVyZW5jZSB0byBhIHB1YmxpYyBIVFRQUyBVUkwuICovXG5mdW5jdGlvbiBhc3NldFVybCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBiYXNlVXJsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlPy50cmltKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgVVJMKHZhbHVlLnRyaW0oKSwgYmFzZVVybCk7XG4gICAgcmV0dXJuIHJlc29sdmVkLnByb3RvY29sID09PSBcImh0dHBzOlwiID8gcmVzb2x2ZWQudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogQWRkIGEgbm9ybWFsaXplZCBVUkwgdG8gYSBjYW5kaWRhdGUgbGlzdCBvbmNlLiAqL1xuZnVuY3Rpb24gYXBwZW5kQ2FuZGlkYXRlKGNhbmRpZGF0ZXM6IHN0cmluZ1tdLCB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBiYXNlVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhc3NldFVybCh2YWx1ZSwgYmFzZVVybCk7XG4gIGlmIChyZXNvbHZlZCAmJiAhY2FuZGlkYXRlcy5pbmNsdWRlcyhyZXNvbHZlZCkpIGNhbmRpZGF0ZXMucHVzaChyZXNvbHZlZCk7XG59XG5cbi8qKiBDb2xsYXBzZSBDRE4gc2l6ZSBhbmQgZm9ybWF0IHZhcmlhbnRzIG9mIHRoZSBzYW1lIG1vYmlsZSBhcnR3b3JrLiAqL1xuZnVuY3Rpb24gbW9iaWxlSW1hZ2VJZGVudGl0eSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTCh2YWx1ZSk7XG4gIGlmICgvZ29vZ2xldXNlcmNvbnRlbnRcXC5jb20kL2kudGVzdCh1cmwuaG9zdG5hbWUpKSB7XG4gICAgcmV0dXJuIGAke3VybC5vcmlnaW59JHt1cmwucGF0aG5hbWUucmVwbGFjZSgvPVteL10rJC8sIFwiXCIpfWA7XG4gIH1cbiAgaWYgKC9tenN0YXRpY1xcLmNvbSQvaS50ZXN0KHVybC5ob3N0bmFtZSkpIHtcbiAgICByZXR1cm4gYCR7dXJsLm9yaWdpbn0ke3VybC5wYXRobmFtZS5yZXBsYWNlKC9cXC9bXi9dKyQvLCBcIlwiKX1gO1xuICB9XG4gIHJldHVybiB1cmwudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBGaW5kIGxvZ28tbGlrZSBVUkxzIG5lc3RlZCBpbiBKU09OLUxEIG9yZ2FuaXphdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBKU09OLUxEIHBlcm1pdHMgYGxvZ29gIGFuZCBgaW1hZ2VgIHRvIGJlIGEgVVJMLCBhbiBvYmplY3Qgd2l0aCBhIGB1cmxgIG9yXG4gKiBgY29udGVudFVybGAsIG9yIGFuIGFycmF5LiBUaGUgYm91bmRlZCByZWN1cnNpdmUgd2FsayBhY2NlcHRzIHRob3NlIGZvcm1zXG4gKiB3aXRob3V0IHRyZWF0aW5nIHVucmVsYXRlZCBzdHJpbmdzIGVsc2V3aGVyZSBpbiB0aGUgZG9jdW1lbnQgYXMgYXNzZXRzLlxuICovXG5mdW5jdGlvbiBqc29uTGRBc3NldFVybHModmFsdWU6IHVua25vd24sIGRlcHRoID0gMCwgYXNzZXRDb250ZXh0ID0gZmFsc2UpOiBzdHJpbmdbXSB7XG4gIGlmIChkZXB0aCA+IDggfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXNzZXRDb250ZXh0ID8gW3ZhbHVlXSA6IFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUuZmxhdE1hcCgoZW50cnkpID0+IGpzb25MZEFzc2V0VXJscyhlbnRyeSwgZGVwdGggKyAxLCBhc3NldENvbnRleHQpKTtcbiAgfVxuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiBbXTtcblxuICBjb25zdCBkaXJlY3QgPSBhc3NldENvbnRleHRcbiAgICA/IFt2YWx1ZS51cmwsIHZhbHVlLmNvbnRlbnRVcmxdLmZsYXRNYXAoKGVudHJ5KSA9PiAodHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiID8gW2VudHJ5XSA6IFtdKSlcbiAgICA6IFtdO1xuICByZXR1cm4gW1xuICAgIC4uLmRpcmVjdCxcbiAgICAuLi5qc29uTGRBc3NldFVybHModmFsdWUubG9nbywgZGVwdGggKyAxLCB0cnVlKSxcbiAgICAuLi5qc29uTGRBc3NldFVybHModmFsdWUuaW1hZ2UsIGRlcHRoICsgMSwgdHJ1ZSksXG4gICAgLi4uanNvbkxkQXNzZXRVcmxzKHZhbHVlW1wiQGdyYXBoXCJdLCBkZXB0aCArIDEsIGZhbHNlKSxcbiAgXTtcbn1cblxuLyoqIENvbGxlY3QgbW9iaWxlIHNjcmVlbnNob3RzIGFuZCBpbWFnZSBvYmplY3RzIGZyb20gSlNPTi1MRC4gKi9cbmZ1bmN0aW9uIGpzb25MZE1vYmlsZUltYWdlVXJscyh2YWx1ZTogdW5rbm93biwgZGVwdGggPSAwLCBpbWFnZUNvbnRleHQgPSBmYWxzZSk6IHN0cmluZ1tdIHtcbiAgaWYgKGRlcHRoID4gMTAgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gaW1hZ2VDb250ZXh0ID8gW3ZhbHVlXSA6IFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUuZmxhdE1hcCgoZW50cnkpID0+IGpzb25MZE1vYmlsZUltYWdlVXJscyhlbnRyeSwgZGVwdGggKyAxLCBpbWFnZUNvbnRleHQpKTtcbiAgfVxuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiBbXTtcbiAgY29uc3QgZGlyZWN0ID0gaW1hZ2VDb250ZXh0XG4gICAgPyBbdmFsdWUudXJsLCB2YWx1ZS5jb250ZW50VXJsXS5mbGF0TWFwKChlbnRyeSkgPT4gKHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiA/IFtlbnRyeV0gOiBbXSkpXG4gICAgOiBbXTtcbiAgcmV0dXJuIFtcbiAgICAuLi5kaXJlY3QsXG4gICAgLi4uanNvbkxkTW9iaWxlSW1hZ2VVcmxzKHZhbHVlLnNjcmVlbnNob3QsIGRlcHRoICsgMSwgdHJ1ZSksXG4gICAgLi4uanNvbkxkTW9iaWxlSW1hZ2VVcmxzKHZhbHVlLmltYWdlLCBkZXB0aCArIDEsIHRydWUpLFxuICAgIC4uLmpzb25MZE1vYmlsZUltYWdlVXJscyh2YWx1ZS50aHVtYm5haWxVcmwsIGRlcHRoICsgMSwgdHJ1ZSksXG4gICAgLi4uanNvbkxkTW9iaWxlSW1hZ2VVcmxzKHZhbHVlW1wiQGdyYXBoXCJdLCBkZXB0aCArIDEsIGZhbHNlKSxcbiAgXTtcbn1cblxuLyoqXG4gKiBEaXNjb3ZlciBpY29uLCBsb2dvLCBhbmQgZmF2aWNvbiBVUkxzIGZyb20gYW4gb2ZmaWNpYWwgcGFnZS5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gb25seSByZXR1cm5zIFVSTHMgcHJlc2VudCBpbiBwYWdlIG1ldGFkYXRhIG9yIG1hcmt1cC4gV2hlbiB0aGVcbiAqIHBhZ2Ugb21pdHMgYW4gaWNvbiwgaXQgdXNlcyB0aGUgY29udmVudGlvbmFsIGAvZmF2aWNvbi5pY29gIFVSTCBvbiB0aGUgc2FtZVxuICogb3JpZ2luLiBUaGUgbG9nbyBmYWxscyBiYWNrIHRvIHRoYXQgaWNvbiBzbyBhIGdlbmVyYXRlZCBjb250ZXh0IG5ldmVyIHBvaW50c1xuICogYXQgdGhlIGRieC10b29scyBkZWZhdWx0IGFydHdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNjb3ZlckJyYW5kQXNzZXRzKGh0bWw6IHN0cmluZywgcGFnZVVybDogc3RyaW5nKTogRGlzY292ZXJlZEJyYW5kQXNzZXRzIHtcbiAgY29uc3QgJCA9IGxvYWQoaHRtbCk7XG4gIGNvbnN0IGljb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBsb2dvczogc3RyaW5nW10gPSBbXTtcblxuICAkKFwibGlua1tyZWxdXCIpLmVhY2goKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHJlbCA9ICgkKGVsZW1lbnQpLmF0dHIoXCJyZWxcIikgPz8gXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocmVsLnNwbGl0KC9cXHMrLykuc29tZSgocGFydCkgPT4gcGFydCA9PT0gXCJpY29uXCIgfHwgcGFydCA9PT0gXCJhcHBsZS10b3VjaC1pY29uXCIpKSB7XG4gICAgICBhcHBlbmRDYW5kaWRhdGUoaWNvbnMsICQoZWxlbWVudCkuYXR0cihcImhyZWZcIiksIHBhZ2VVcmwpO1xuICAgIH1cbiAgfSk7XG5cbiAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBbXG4gICAgJ21ldGFbcHJvcGVydHk9XCJvZzppbWFnZVwiXScsXG4gICAgJ21ldGFbcHJvcGVydHk9XCJvZzpsb2dvXCJdJyxcbiAgICAnbWV0YVtuYW1lPVwidHdpdHRlcjppbWFnZVwiXScsXG4gIF0pIHtcbiAgICAkKHNlbGVjdG9yKS5lYWNoKChfaW5kZXgsIGVsZW1lbnQpID0+IHtcbiAgICAgIGFwcGVuZENhbmRpZGF0ZShsb2dvcywgJChlbGVtZW50KS5hdHRyKFwiY29udGVudFwiKSwgcGFnZVVybCk7XG4gICAgfSk7XG4gIH1cblxuICAkKFwiaW1nXCIpLmVhY2goKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBbXG4gICAgICAkKGVsZW1lbnQpLmF0dHIoXCJhbHRcIiksXG4gICAgICAkKGVsZW1lbnQpLmF0dHIoXCJjbGFzc1wiKSxcbiAgICAgICQoZWxlbWVudCkuYXR0cihcImlkXCIpLFxuICAgICAgJChlbGVtZW50KS5hdHRyKFwiZGF0YS10ZXN0aWRcIiksXG4gICAgXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGlmICgvXFxiKD86YnJhbmR8bG9nb3x3b3JkbWFyaylcXGIvaS50ZXN0KGRlc2NyaXB0b3IpKSB7XG4gICAgICBhcHBlbmRDYW5kaWRhdGUobG9nb3MsICQoZWxlbWVudCkuYXR0cihcInNyY1wiKSwgcGFnZVVybCk7XG4gICAgfVxuICB9KTtcblxuICAkKCdzY3JpcHRbdHlwZT1cImFwcGxpY2F0aW9uL2xkK2pzb25cIl0nKS5lYWNoKChfaW5kZXgsIGVsZW1lbnQpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWU6IHVua25vd24gPSBKU09OLnBhcnNlKCQoZWxlbWVudCkudGV4dCgpKTtcbiAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGpzb25MZEFzc2V0VXJscyh2YWx1ZSkpIHtcbiAgICAgICAgYXBwZW5kQ2FuZGlkYXRlKGxvZ29zLCBjYW5kaWRhdGUsIHBhZ2VVcmwpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZmFsbGJhY2tJY29uID0gbmV3IFVSTChcIi9mYXZpY29uLmljb1wiLCBwYWdlVXJsKS50b1N0cmluZygpO1xuICBjb25zdCBpY29uID0gaWNvbnNbMF0gPz8gbG9nb3NbMF0gPz8gZmFsbGJhY2tJY29uO1xuICBjb25zdCBsb2dvID0gbG9nb3NbMF0gPz8gaWNvbnNbMF0gPz8gZmFsbGJhY2tJY29uO1xuICByZXR1cm4ge1xuICAgIGljb246IHsgbGlnaHQ6IGljb24gfSxcbiAgICBsb2dvOiB7IGxpZ2h0OiBsb2dvIH0sXG4gICAgZmF2aWNvbjogaWNvbixcbiAgfTtcbn1cblxuLyoqIEV4dHJhY3QgYW4gYXBwIG5hbWUgcGx1cyByZXByZXNlbnRhdGl2ZSBzY3JlZW5zaG90cy9pY29ucyBmcm9tIGEgc3RvcmUgcGFnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNjb3Zlck1vYmlsZUFwcFZpc3VhbHMoXG4gIGh0bWw6IHN0cmluZyxcbiAgcGFnZVVybDogc3RyaW5nLFxuKTogRGlzY292ZXJlZE1vYmlsZUFwcFZpc3VhbHMge1xuICBjb25zdCAkID0gbG9hZChodG1sKTtcbiAgY29uc3QgbWV0YWRhdGFJbWFnZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0cnVjdHVyZWRJbWFnZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNjcmVlbnNob3RJbWFnZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGljb25JbWFnZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IG90aGVyU3RvcmVJbWFnZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgWydtZXRhW3Byb3BlcnR5PVwib2c6aW1hZ2VcIl0nLCAnbWV0YVtuYW1lPVwidHdpdHRlcjppbWFnZVwiXSddKSB7XG4gICAgJChzZWxlY3RvcikuZWFjaCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG4gICAgICBhcHBlbmRDYW5kaWRhdGUobWV0YWRhdGFJbWFnZXMsICQoZWxlbWVudCkuYXR0cihcImNvbnRlbnRcIiksIHBhZ2VVcmwpO1xuICAgIH0pO1xuICB9XG4gICQoJ3NjcmlwdFt0eXBlPVwiYXBwbGljYXRpb24vbGQranNvblwiXScpLmVhY2goKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UoJChlbGVtZW50KS50ZXh0KCkpO1xuICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YganNvbkxkTW9iaWxlSW1hZ2VVcmxzKHZhbHVlKSkge1xuICAgICAgICBhcHBlbmRDYW5kaWRhdGUoc3RydWN0dXJlZEltYWdlcywgY2FuZGlkYXRlLCBwYWdlVXJsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0pO1xuICAkKFwiaW1nXCIpLmVhY2goKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBbXG4gICAgICAkKGVsZW1lbnQpLmF0dHIoXCJhbHRcIiksXG4gICAgICAkKGVsZW1lbnQpLmF0dHIoXCJjbGFzc1wiKSxcbiAgICAgICQoZWxlbWVudCkuYXR0cihcImFyaWEtbGFiZWxcIiksXG4gICAgXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGNvbnN0IHNvdXJjZSA9ICQoZWxlbWVudCkuYXR0cihcInNyY1wiKSA/PyAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLXNyY1wiKTtcbiAgICBjb25zdCBpc1N0b3JlSW1hZ2VIb3N0ID0gLyg/Om16c3RhdGljfGdncGh0fGdvb2dsZXVzZXJjb250ZW50KVxcLi9pLnRlc3Qoc291cmNlID8/IFwiXCIpO1xuICAgIGNvbnN0IHRhcmdldCA9IC9cXGIoPzpwaG9uZXxzY3JlZW58c2NyZWVuc2hvdHx0YWJsZXQpXFxiL2kudGVzdChkZXNjcmlwdG9yKVxuICAgICAgPyBzY3JlZW5zaG90SW1hZ2VzXG4gICAgICA6IC9cXGIoPzphcHB8aWNvbilcXGIvaS50ZXN0KGRlc2NyaXB0b3IpXG4gICAgICAgID8gaWNvbkltYWdlc1xuICAgICAgICA6IGlzU3RvcmVJbWFnZUhvc3RcbiAgICAgICAgICA/IG90aGVyU3RvcmVJbWFnZXNcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICBhcHBlbmRDYW5kaWRhdGUodGFyZ2V0LCBzb3VyY2UsIHBhZ2VVcmwpO1xuICAgICAgY29uc3Qgc3Jjc2V0ID0gKCQoZWxlbWVudCkuYXR0cihcInNyY3NldFwiKSA/PyAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLXNyY3NldFwiKSlcbiAgICAgICAgPy5zcGxpdChcIixcIilcbiAgICAgICAgLmF0KC0xKVxuICAgICAgICA/LnRyaW0oKVxuICAgICAgICAuc3BsaXQoL1xccysvKVswXTtcbiAgICAgIGFwcGVuZENhbmRpZGF0ZSh0YXJnZXQsIHNyY3NldCwgcGFnZVVybCk7XG4gICAgfVxuICB9KTtcbiAgJChcInBpY3R1cmUgc291cmNlW3NyY3NldF1cIikuZWFjaCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG4gICAgY29uc3Qgc3Jjc2V0ID0gJChlbGVtZW50KS5hdHRyKFwic3Jjc2V0XCIpPy5zcGxpdChcIixcIikuYXQoLTEpPy50cmltKCkuc3BsaXQoL1xccysvKVswXTtcbiAgICBhcHBlbmRDYW5kaWRhdGUoc2NyZWVuc2hvdEltYWdlcywgc3Jjc2V0LCBwYWdlVXJsKTtcbiAgfSk7XG4gIGNvbnN0IGltYWdlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2VlbkltYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBbXG4gICAgLi4ubWV0YWRhdGFJbWFnZXMuc2xpY2UoMCwgMSksXG4gICAgLi4uc2NyZWVuc2hvdEltYWdlcyxcbiAgICAuLi5pY29uSW1hZ2VzLFxuICAgIC4uLnN0cnVjdHVyZWRJbWFnZXMsXG4gICAgLi4ub3RoZXJTdG9yZUltYWdlcyxcbiAgXSkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gYXNzZXRVcmwoY2FuZGlkYXRlLCBwYWdlVXJsKTtcbiAgICBpZiAoIXJlc29sdmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBpZGVudGl0eSA9IG1vYmlsZUltYWdlSWRlbnRpdHkocmVzb2x2ZWQpO1xuICAgIGlmIChzZWVuSW1hZ2VzLmhhcyhpZGVudGl0eSkpIGNvbnRpbnVlO1xuICAgIHNlZW5JbWFnZXMuYWRkKGlkZW50aXR5KTtcbiAgICBpbWFnZXMucHVzaChyZXNvbHZlZCk7XG4gIH1cbiAgY29uc3QgcmF3TmFtZSA9XG4gICAgJCgnbWV0YVtwcm9wZXJ0eT1cIm9nOnRpdGxlXCJdJykuYXR0cihcImNvbnRlbnRcIikgPz8gJChcImgxXCIpLmZpcnN0KCkudGV4dCgpID8/ICQoXCJ0aXRsZVwiKS50ZXh0KCk7XG4gIGNvbnN0IGFwcE5hbWUgPVxuICAgIHJhd05hbWUucmVwbGFjZSgvXFxzKyg/Om9uIHRoZSBBcHAgU3RvcmV8LSBBcHBzIG9uIEdvb2dsZSBQbGF5KS4qJC9pLCBcIlwiKS50cmltKCkgfHxcbiAgICBuZXcgVVJMKHBhZ2VVcmwpLmhvc3RuYW1lO1xuICByZXR1cm4geyBhcHBOYW1lLCBpbWFnZVVybHM6IGltYWdlcy5zbGljZSgwLCA2KSB9O1xufVxuIl19
@@ -0,0 +1,75 @@
1
+ /**
2
+ * AppKit generator-plugin configuration and environment resolution.
3
+ *
4
+ * @module
5
+ */
6
+ import type { BasePluginConfig } from "@databricks/appkit";
7
+ /** Default ceiling for one complete generator operation. */
8
+ export declare const DEFAULT_GENERATOR_TIMEOUT_MS = 240000;
9
+ /** AppKit configuration accepted by the generator plugin. */
10
+ export interface GeneratorPluginConfig extends BasePluginConfig {
11
+ /** Model endpoint or loose model name used for structured synthesis. */
12
+ model?: string;
13
+ /** Maximum cited pages fetched per research operation. */
14
+ maxSources?: number;
15
+ /** Maximum readable characters retained from each fetched page. */
16
+ sourceMaxLength?: number;
17
+ /** Overall operation timeout in milliseconds. */
18
+ timeoutMs?: number;
19
+ /** Unity Catalog containing all generated per-user schemas. */
20
+ catalog?: string;
21
+ /** SQL warehouse used for data generation and validation. */
22
+ warehouseId?: string;
23
+ }
24
+ /** Fully resolved generator configuration. */
25
+ export interface ResolvedGeneratorConfig {
26
+ /** Optional pinned synthesis model. */
27
+ model?: string;
28
+ /** Bounded cited-page count. */
29
+ maxSources: number;
30
+ /** Character cap per fetched source. */
31
+ sourceMaxLength: number;
32
+ /** Overall operation timeout in milliseconds. */
33
+ timeoutMs: number;
34
+ /** Unity Catalog containing generated schemas, when configured. */
35
+ catalog?: string;
36
+ /** SQL warehouse used for mutations, when configured. */
37
+ warehouseId?: string;
38
+ }
39
+ /** JSON Schema published by the generator plugin manifest. */
40
+ export declare const GENERATOR_CONFIG_SCHEMA: {
41
+ type: string;
42
+ properties: {
43
+ model: {
44
+ type: string;
45
+ description: string;
46
+ };
47
+ maxSources: {
48
+ type: string;
49
+ minimum: number;
50
+ maximum: number;
51
+ description: string;
52
+ };
53
+ sourceMaxLength: {
54
+ type: string;
55
+ minimum: number;
56
+ maximum: number;
57
+ description: string;
58
+ };
59
+ timeoutMs: {
60
+ type: string;
61
+ minimum: number;
62
+ description: string;
63
+ };
64
+ catalog: {
65
+ type: string;
66
+ description: string;
67
+ };
68
+ warehouseId: {
69
+ type: string;
70
+ description: string;
71
+ };
72
+ };
73
+ };
74
+ /** Resolve explicit plugin values over environment values and defaults. */
75
+ export declare function resolveGeneratorConfig(config?: GeneratorPluginConfig): ResolvedGeneratorConfig;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * AppKit generator-plugin configuration and environment resolution.
3
+ *
4
+ * @module
5
+ */
6
+ import { configUtils } from "@dbx-tools/core";
7
+ import { stringUtils } from "@dbx-tools/shared-core";
8
+ import manifest from "./manifest.json" with { type: "json" };
9
+ import { DEFAULT_MAX_SOURCES, DEFAULT_SOURCE_MAX_LENGTH, MAX_SOURCES, MAX_SOURCE_MAX_LENGTH, } from "./research.js";
10
+ /** Default ceiling for one complete generator operation. */
11
+ export const DEFAULT_GENERATOR_TIMEOUT_MS = 240_000;
12
+ /** JSON Schema published by the generator plugin manifest. */
13
+ export const GENERATOR_CONFIG_SCHEMA = manifest.config.schema;
14
+ /** Resolve explicit plugin values over environment values and defaults. */
15
+ export function resolveGeneratorConfig(config = {}) {
16
+ const model = stringUtils.trimToNull(config.model) ??
17
+ configUtils.text("GENERATOR_MODEL", configUtils.ENV_ONLY);
18
+ const catalog = stringUtils.trimToNull(config.catalog) ??
19
+ configUtils.text("GENERATOR_CATALOG", configUtils.ENV_ONLY);
20
+ const warehouseId = stringUtils.trimToNull(config.warehouseId) ??
21
+ configUtils.text("DATABRICKS_WAREHOUSE_ID", configUtils.ENV_ONLY);
22
+ return {
23
+ ...(model ? { model } : {}),
24
+ ...(catalog ? { catalog } : {}),
25
+ ...(warehouseId ? { warehouseId } : {}),
26
+ maxSources: Math.min(configUtils.positiveInt(config.maxSources, "GENERATOR_MAX_SOURCES", DEFAULT_MAX_SOURCES, configUtils.ENV_ONLY), MAX_SOURCES),
27
+ sourceMaxLength: Math.min(configUtils.positiveInt(config.sourceMaxLength, "GENERATOR_SOURCE_MAX_LENGTH", DEFAULT_SOURCE_MAX_LENGTH, configUtils.ENV_ONLY), MAX_SOURCE_MAX_LENGTH),
28
+ timeoutMs: configUtils.positiveInt(config.timeoutMs, "GENERATOR_TIMEOUT_MS", DEFAULT_GENERATOR_TIMEOUT_MS, configUtils.ENV_ONLY),
29
+ };
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBR0gsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6QixXQUFXLEVBQ1gscUJBQXFCLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxPQUFPLENBQUM7QUFrQ3BELDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUU5RCwyRUFBMkU7QUFDM0UsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxTQUFnQyxFQUFFO0lBRWxDLE1BQU0sS0FBSyxHQUNULFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNwQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxNQUFNLE9BQU8sR0FDWCxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdEMsV0FBVyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUQsTUFBTSxXQUFXLEdBQ2YsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQzFDLFdBQVcsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BFLE9BQU87UUFDTCxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsV0FBVyxDQUFDLFdBQVcsQ0FDckIsTUFBTSxDQUFDLFVBQVUsRUFDakIsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQixXQUFXLENBQUMsUUFBUSxDQUNyQixFQUNELFdBQVcsQ0FDWjtRQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUN2QixXQUFXLENBQUMsV0FBVyxDQUNyQixNQUFNLENBQUMsZUFBZSxFQUN0Qiw2QkFBNkIsRUFDN0IseUJBQXlCLEVBQ3pCLFdBQVcsQ0FBQyxRQUFRLENBQ3JCLEVBQ0QscUJBQXFCLENBQ3RCO1FBQ0QsU0FBUyxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQ2hDLE1BQU0sQ0FBQyxTQUFTLEVBQ2hCLHNCQUFzQixFQUN0Qiw0QkFBNEIsRUFDNUIsV0FBVyxDQUFDLFFBQVEsQ0FDckI7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IGdlbmVyYXRvci1wbHVnaW4gY29uZmlndXJhdGlvbiBhbmQgZW52aXJvbm1lbnQgcmVzb2x1dGlvbi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgbWFuaWZlc3QgZnJvbSBcIi4vbWFuaWZlc3QuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NQVhfU09VUkNFUyxcbiAgREVGQVVMVF9TT1VSQ0VfTUFYX0xFTkdUSCxcbiAgTUFYX1NPVVJDRVMsXG4gIE1BWF9TT1VSQ0VfTUFYX0xFTkdUSCxcbn0gZnJvbSBcIi4vcmVzZWFyY2gudHNcIjtcblxuLyoqIERlZmF1bHQgY2VpbGluZyBmb3Igb25lIGNvbXBsZXRlIGdlbmVyYXRvciBvcGVyYXRpb24uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9HRU5FUkFUT1JfVElNRU9VVF9NUyA9IDI0MF8wMDA7XG5cbi8qKiBBcHBLaXQgY29uZmlndXJhdGlvbiBhY2NlcHRlZCBieSB0aGUgZ2VuZXJhdG9yIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdG9yUGx1Z2luQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBNb2RlbCBlbmRwb2ludCBvciBsb29zZSBtb2RlbCBuYW1lIHVzZWQgZm9yIHN0cnVjdHVyZWQgc3ludGhlc2lzLiAqL1xuICBtb2RlbD86IHN0cmluZztcbiAgLyoqIE1heGltdW0gY2l0ZWQgcGFnZXMgZmV0Y2hlZCBwZXIgcmVzZWFyY2ggb3BlcmF0aW9uLiAqL1xuICBtYXhTb3VyY2VzPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSByZWFkYWJsZSBjaGFyYWN0ZXJzIHJldGFpbmVkIGZyb20gZWFjaCBmZXRjaGVkIHBhZ2UuICovXG4gIHNvdXJjZU1heExlbmd0aD86IG51bWJlcjtcbiAgLyoqIE92ZXJhbGwgb3BlcmF0aW9uIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKiBVbml0eSBDYXRhbG9nIGNvbnRhaW5pbmcgYWxsIGdlbmVyYXRlZCBwZXItdXNlciBzY2hlbWFzLiAqL1xuICBjYXRhbG9nPzogc3RyaW5nO1xuICAvKiogU1FMIHdhcmVob3VzZSB1c2VkIGZvciBkYXRhIGdlbmVyYXRpb24gYW5kIHZhbGlkYXRpb24uICovXG4gIHdhcmVob3VzZUlkPzogc3RyaW5nO1xufVxuXG4vKiogRnVsbHkgcmVzb2x2ZWQgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkR2VuZXJhdG9yQ29uZmlnIHtcbiAgLyoqIE9wdGlvbmFsIHBpbm5lZCBzeW50aGVzaXMgbW9kZWwuICovXG4gIG1vZGVsPzogc3RyaW5nO1xuICAvKiogQm91bmRlZCBjaXRlZC1wYWdlIGNvdW50LiAqL1xuICBtYXhTb3VyY2VzOiBudW1iZXI7XG4gIC8qKiBDaGFyYWN0ZXIgY2FwIHBlciBmZXRjaGVkIHNvdXJjZS4gKi9cbiAgc291cmNlTWF4TGVuZ3RoOiBudW1iZXI7XG4gIC8qKiBPdmVyYWxsIG9wZXJhdGlvbiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgdGltZW91dE1zOiBudW1iZXI7XG4gIC8qKiBVbml0eSBDYXRhbG9nIGNvbnRhaW5pbmcgZ2VuZXJhdGVkIHNjaGVtYXMsIHdoZW4gY29uZmlndXJlZC4gKi9cbiAgY2F0YWxvZz86IHN0cmluZztcbiAgLyoqIFNRTCB3YXJlaG91c2UgdXNlZCBmb3IgbXV0YXRpb25zLCB3aGVuIGNvbmZpZ3VyZWQuICovXG4gIHdhcmVob3VzZUlkPzogc3RyaW5nO1xufVxuXG4vKiogSlNPTiBTY2hlbWEgcHVibGlzaGVkIGJ5IHRoZSBnZW5lcmF0b3IgcGx1Z2luIG1hbmlmZXN0LiAqL1xuZXhwb3J0IGNvbnN0IEdFTkVSQVRPUl9DT05GSUdfU0NIRU1BID0gbWFuaWZlc3QuY29uZmlnLnNjaGVtYTtcblxuLyoqIFJlc29sdmUgZXhwbGljaXQgcGx1Z2luIHZhbHVlcyBvdmVyIGVudmlyb25tZW50IHZhbHVlcyBhbmQgZGVmYXVsdHMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUdlbmVyYXRvckNvbmZpZyhcbiAgY29uZmlnOiBHZW5lcmF0b3JQbHVnaW5Db25maWcgPSB7fSxcbik6IFJlc29sdmVkR2VuZXJhdG9yQ29uZmlnIHtcbiAgY29uc3QgbW9kZWwgPVxuICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoY29uZmlnLm1vZGVsKSA/P1xuICAgIGNvbmZpZ1V0aWxzLnRleHQoXCJHRU5FUkFUT1JfTU9ERUxcIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpO1xuICBjb25zdCBjYXRhbG9nID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9OdWxsKGNvbmZpZy5jYXRhbG9nKSA/P1xuICAgIGNvbmZpZ1V0aWxzLnRleHQoXCJHRU5FUkFUT1JfQ0FUQUxPR1wiLCBjb25maWdVdGlscy5FTlZfT05MWSk7XG4gIGNvbnN0IHdhcmVob3VzZUlkID1cbiAgICBzdHJpbmdVdGlscy50cmltVG9OdWxsKGNvbmZpZy53YXJlaG91c2VJZCkgPz9cbiAgICBjb25maWdVdGlscy50ZXh0KFwiREFUQUJSSUNLU19XQVJFSE9VU0VfSURcIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpO1xuICByZXR1cm4ge1xuICAgIC4uLihtb2RlbCA/IHsgbW9kZWwgfSA6IHt9KSxcbiAgICAuLi4oY2F0YWxvZyA/IHsgY2F0YWxvZyB9IDoge30pLFxuICAgIC4uLih3YXJlaG91c2VJZCA/IHsgd2FyZWhvdXNlSWQgfSA6IHt9KSxcbiAgICBtYXhTb3VyY2VzOiBNYXRoLm1pbihcbiAgICAgIGNvbmZpZ1V0aWxzLnBvc2l0aXZlSW50KFxuICAgICAgICBjb25maWcubWF4U291cmNlcyxcbiAgICAgICAgXCJHRU5FUkFUT1JfTUFYX1NPVVJDRVNcIixcbiAgICAgICAgREVGQVVMVF9NQVhfU09VUkNFUyxcbiAgICAgICAgY29uZmlnVXRpbHMuRU5WX09OTFksXG4gICAgICApLFxuICAgICAgTUFYX1NPVVJDRVMsXG4gICAgKSxcbiAgICBzb3VyY2VNYXhMZW5ndGg6IE1hdGgubWluKFxuICAgICAgY29uZmlnVXRpbHMucG9zaXRpdmVJbnQoXG4gICAgICAgIGNvbmZpZy5zb3VyY2VNYXhMZW5ndGgsXG4gICAgICAgIFwiR0VORVJBVE9SX1NPVVJDRV9NQVhfTEVOR1RIXCIsXG4gICAgICAgIERFRkFVTFRfU09VUkNFX01BWF9MRU5HVEgsXG4gICAgICAgIGNvbmZpZ1V0aWxzLkVOVl9PTkxZLFxuICAgICAgKSxcbiAgICAgIE1BWF9TT1VSQ0VfTUFYX0xFTkdUSCxcbiAgICApLFxuICAgIHRpbWVvdXRNczogY29uZmlnVXRpbHMucG9zaXRpdmVJbnQoXG4gICAgICBjb25maWcudGltZW91dE1zLFxuICAgICAgXCJHRU5FUkFUT1JfVElNRU9VVF9NU1wiLFxuICAgICAgREVGQVVMVF9HRU5FUkFUT1JfVElNRU9VVF9NUyxcbiAgICAgIGNvbmZpZ1V0aWxzLkVOVl9PTkxZLFxuICAgICksXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Deterministic AI/BI dashboard assembly and OBO publication.
3
+ *
4
+ * @module
5
+ */
6
+ import type { BrandContext } from "@dbx-tools/shared-core/brand-utils";
7
+ import { type GeneratedDashboard, type GeneratedSchema, type GeneratorPlan } from "@dbx-tools/shared-generator/workflow";
8
+ /** Inputs for dashboard assembly and publication. */
9
+ export interface CreateGeneratorDashboardInput {
10
+ /** Generated schema containing the fact table. */
11
+ location: GeneratedSchema;
12
+ /** Validated data and metric plan. */
13
+ plan: GeneratorPlan;
14
+ /** Brand applied to the dashboard theme. */
15
+ brand: BrandContext;
16
+ /** SQL warehouse used by the dashboard. */
17
+ warehouseId: string;
18
+ /** Company display name. */
19
+ company: string;
20
+ /** Demo purpose. */
21
+ purpose: string;
22
+ }
23
+ /** Build one complete dashboard with automatic companion Genie enabled. */
24
+ export declare function buildGeneratorDashboard(input: CreateGeneratorDashboardInput): {
25
+ datasets: Record<string, unknown>[];
26
+ pages: Record<string, unknown>[];
27
+ uiSettings: Record<string, unknown>;
28
+ };
29
+ /** Create and publish a dashboard as the active OBO user. */
30
+ export declare function createGeneratorDashboard(input: CreateGeneratorDashboardInput, signal?: AbortSignal): Promise<GeneratedDashboard>;