@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,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>;
|