@duckcodeailabs/dql-agent 1.13.2 → 1.13.4
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/dist/app-builder-orchestrator.d.ts +48 -0
- package/dist/app-builder-orchestrator.d.ts.map +1 -0
- package/dist/app-builder-orchestrator.js +496 -0
- package/dist/app-builder-orchestrator.js.map +1 -0
- package/dist/app-source-catalog.d.ts +78 -0
- package/dist/app-source-catalog.d.ts.map +1 -0
- package/dist/app-source-catalog.js +236 -0
- package/dist/app-source-catalog.js.map +1 -0
- package/dist/app-source-policy.d.ts +14 -0
- package/dist/app-source-policy.d.ts.map +1 -0
- package/dist/app-source-policy.js +38 -0
- package/dist/app-source-policy.js.map +1 -0
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -15
- package/dist/index.js.map +1 -1
- package/dist/metadata/catalog.d.ts +17 -0
- package/dist/metadata/catalog.d.ts.map +1 -1
- package/dist/metadata/catalog.js +164 -0
- package/dist/metadata/catalog.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AppBuildFrame, AppBuildRequirement, AppBuildSourcePolicy } from '@duckcodeailabs/dql-core';
|
|
2
|
+
import type { AppSourceCatalogRecord } from './app-source-catalog.js';
|
|
3
|
+
export type AppBuilderComponentRole = AppBuildRequirement['role'];
|
|
4
|
+
export type AppBuilderComponentView = 'kpi' | 'line' | 'bar' | 'table';
|
|
5
|
+
export interface AppBuilderPlannedComponent {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
sourceId: string;
|
|
9
|
+
requirementIds: string[];
|
|
10
|
+
role: AppBuilderComponentRole;
|
|
11
|
+
view: AppBuilderComponentView;
|
|
12
|
+
rationale: string;
|
|
13
|
+
}
|
|
14
|
+
export interface AppBuilderBuildBrief {
|
|
15
|
+
version: 1;
|
|
16
|
+
planningMode: 'ai' | 'deterministic_fallback';
|
|
17
|
+
frame: AppBuildFrame;
|
|
18
|
+
requirements: AppBuildRequirement[];
|
|
19
|
+
components: AppBuilderPlannedComponent[];
|
|
20
|
+
selectedSourceIds: string[];
|
|
21
|
+
candidateSourceIds: string[];
|
|
22
|
+
warnings: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface AppBuilderPlannerCompletionInput {
|
|
25
|
+
system: string;
|
|
26
|
+
user: string;
|
|
27
|
+
}
|
|
28
|
+
export type AppBuilderPlannerCompletion = (input: AppBuilderPlannerCompletionInput) => Promise<string | undefined>;
|
|
29
|
+
export interface PlanAppBuildBriefInput {
|
|
30
|
+
prompt: string;
|
|
31
|
+
candidates: AppSourceCatalogRecord[];
|
|
32
|
+
/** Exact catalog source IDs that the caller explicitly requires in the brief. */
|
|
33
|
+
requiredSourceIds: string[];
|
|
34
|
+
sourcePolicy: AppBuildSourcePolicy;
|
|
35
|
+
domain?: string;
|
|
36
|
+
audience?: string;
|
|
37
|
+
complete?: AppBuilderPlannerCompletion;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* App-specific orchestration boundary. It shares a host provider adapter but
|
|
41
|
+
* owns a structured, stateful build brief rather than invoking Ask AI's answer
|
|
42
|
+
* state machine. At most one provider call is made and it can reference only
|
|
43
|
+
* the supplied candidate IDs.
|
|
44
|
+
*
|
|
45
|
+
* Acceptance: PRD-007, AGT-026.
|
|
46
|
+
*/
|
|
47
|
+
export declare function planAppBuildBrief(input: PlanAppBuildBriefInput): Promise<AppBuilderBuildBrief>;
|
|
48
|
+
//# sourceMappingURL=app-builder-orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-builder-orchestrator.d.ts","sourceRoot":"","sources":["../src/app-builder-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAClE,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE,uBAAuB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,CAAC;IACX,YAAY,EAAE,IAAI,GAAG,wBAAwB,CAAC;IAC9C,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,UAAU,EAAE,0BAA0B,EAAE,CAAC;IACzC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,2BAA2B,GAAG,CACxC,KAAK,EAAE,gCAAgC,KACpC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEjC,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,sBAAsB,EAAE,CAAC;IACrC,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,YAAY,EAAE,oBAAoB,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,2BAA2B,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkEpG"}
|
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App-specific orchestration boundary. It shares a host provider adapter but
|
|
3
|
+
* owns a structured, stateful build brief rather than invoking Ask AI's answer
|
|
4
|
+
* state machine. At most one provider call is made and it can reference only
|
|
5
|
+
* the supplied candidate IDs.
|
|
6
|
+
*
|
|
7
|
+
* Acceptance: PRD-007, AGT-026.
|
|
8
|
+
*/
|
|
9
|
+
export async function planAppBuildBrief(input) {
|
|
10
|
+
const prompt = input.prompt.trim();
|
|
11
|
+
if (!prompt)
|
|
12
|
+
throw new Error('App build prompt is required.');
|
|
13
|
+
const requiredSourceIds = Array.from(new Set(input.requiredSourceIds.map((id) => id.trim()).filter(Boolean)));
|
|
14
|
+
if (requiredSourceIds.length > 12) {
|
|
15
|
+
throw new Error('APP_BUILD_SOURCE_LIMIT: at most 12 required App sources can be planned at once.');
|
|
16
|
+
}
|
|
17
|
+
const suppliedById = new Map(input.candidates.map((candidate) => [candidate.sourceId, candidate]));
|
|
18
|
+
const missingRequiredIds = requiredSourceIds.filter((sourceId) => !suppliedById.has(sourceId));
|
|
19
|
+
if (missingRequiredIds.length) {
|
|
20
|
+
throw new Error(`APP_BUILD_REQUIRED_SOURCE_MISSING: required sources were not supplied as candidate cards: ${missingRequiredIds.join(', ')}`);
|
|
21
|
+
}
|
|
22
|
+
const candidates = uniqueCandidates([
|
|
23
|
+
...requiredSourceIds.flatMap((sourceId) => {
|
|
24
|
+
const candidate = suppliedById.get(sourceId);
|
|
25
|
+
return candidate ? [candidate] : [];
|
|
26
|
+
}),
|
|
27
|
+
...input.candidates,
|
|
28
|
+
]).slice(0, 12);
|
|
29
|
+
if (!input.complete || candidates.length === 0) {
|
|
30
|
+
return ensureRequiredSources(deterministicBrief(input, candidates), candidates, requiredSourceIds);
|
|
31
|
+
}
|
|
32
|
+
let raw;
|
|
33
|
+
try {
|
|
34
|
+
raw = await input.complete({
|
|
35
|
+
system: appBuilderSystemPrompt(),
|
|
36
|
+
user: appBuilderUserPrompt(input, candidates),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return ensureRequiredSources(deterministicBrief(input, candidates, ['The configured App planning provider was unavailable; deterministic matching was used.']), candidates, requiredSourceIds);
|
|
41
|
+
}
|
|
42
|
+
const parsed = parsePlannerJson(raw);
|
|
43
|
+
if (!parsed) {
|
|
44
|
+
return ensureRequiredSources(deterministicBrief(input, candidates, ['The App planning provider returned an invalid build brief; deterministic matching was used.']), candidates, requiredSourceIds);
|
|
45
|
+
}
|
|
46
|
+
const allowedIds = new Set(candidates.map((candidate) => candidate.sourceId));
|
|
47
|
+
const requirements = normalizeRequirements(parsed.requirements);
|
|
48
|
+
const requirementIds = new Set(requirements.map((requirement) => requirement.id));
|
|
49
|
+
const components = normalizeComponents(parsed.components, allowedIds, requirementIds);
|
|
50
|
+
if (requirements.length === 0 || components.length === 0) {
|
|
51
|
+
return ensureRequiredSources(deterministicBrief(input, candidates, ['The App planning provider did not return grounded requirements and components; deterministic matching was used.']), candidates, requiredSourceIds);
|
|
52
|
+
}
|
|
53
|
+
const frame = normalizeFrame(parsed.frame, prompt, input.audience);
|
|
54
|
+
return ensureRequiredSources({
|
|
55
|
+
version: 1,
|
|
56
|
+
planningMode: 'ai',
|
|
57
|
+
frame,
|
|
58
|
+
requirements,
|
|
59
|
+
components,
|
|
60
|
+
selectedSourceIds: Array.from(new Set(components.map((component) => component.sourceId))),
|
|
61
|
+
candidateSourceIds: candidates.map((candidate) => candidate.sourceId),
|
|
62
|
+
warnings: [],
|
|
63
|
+
}, candidates, requiredSourceIds);
|
|
64
|
+
}
|
|
65
|
+
function ensureRequiredSources(brief, candidates, requiredSourceIds) {
|
|
66
|
+
const byId = new Map(candidates.map((candidate) => [candidate.sourceId, candidate]));
|
|
67
|
+
const warnings = [...brief.warnings];
|
|
68
|
+
const requirementsById = new Map(brief.requirements.map((requirement) => [requirement.id, requirement]));
|
|
69
|
+
const components = brief.components.map((component) => {
|
|
70
|
+
if (component.requirementIds.length === 0)
|
|
71
|
+
return component;
|
|
72
|
+
const candidate = byId.get(component.sourceId);
|
|
73
|
+
const requirementIds = component.requirementIds.filter((requirementId) => {
|
|
74
|
+
const requirement = requirementsById.get(requirementId);
|
|
75
|
+
return Boolean(candidate && requirement && candidateSatisfiesStructuredRequirement(requirement, candidate));
|
|
76
|
+
});
|
|
77
|
+
const removed = component.requirementIds.filter((requirementId) => !requirementIds.includes(requirementId));
|
|
78
|
+
if (removed.length) {
|
|
79
|
+
warnings.push(`${component.title} remains in the proposal, but unsupported requirement coverage was removed: ${removed.join(', ')}.`);
|
|
80
|
+
}
|
|
81
|
+
return requirementIds.length === component.requirementIds.length ? component : { ...component, requirementIds };
|
|
82
|
+
});
|
|
83
|
+
const componentIds = new Set(components.map((component) => component.id));
|
|
84
|
+
for (const sourceId of requiredSourceIds) {
|
|
85
|
+
if (components.some((component) => component.sourceId === sourceId))
|
|
86
|
+
continue;
|
|
87
|
+
const candidate = byId.get(sourceId);
|
|
88
|
+
if (!candidate) {
|
|
89
|
+
throw new Error(`APP_BUILD_REQUIRED_SOURCE_MISSING: required source was not retained in the bounded candidate cards: ${sourceId}`);
|
|
90
|
+
}
|
|
91
|
+
const match = brief.requirements.find((requirement) => candidateSatisfiesStructuredRequirement(requirement, candidate));
|
|
92
|
+
let componentId = `required-${candidate.sourceId.replace(/[^a-z0-9]+/gi, '-').replace(/^-|-$/g, '').toLowerCase() || 'source'}`;
|
|
93
|
+
for (let suffix = 2; componentIds.has(componentId); suffix += 1) {
|
|
94
|
+
componentId = `${componentId.replace(/-\d+$/, '')}-${suffix}`;
|
|
95
|
+
}
|
|
96
|
+
componentIds.add(componentId);
|
|
97
|
+
components.push({
|
|
98
|
+
id: componentId,
|
|
99
|
+
title: candidate.title,
|
|
100
|
+
sourceId: candidate.sourceId,
|
|
101
|
+
requirementIds: match ? [match.id] : [],
|
|
102
|
+
role: match?.role ?? inferRole(candidate, components.length),
|
|
103
|
+
view: inferView(candidate, components.length),
|
|
104
|
+
rationale: match
|
|
105
|
+
? `Explicitly required source with a structured capability match for ${match.question}.`
|
|
106
|
+
: 'Explicitly required source; no structured requirement capability match was found.',
|
|
107
|
+
});
|
|
108
|
+
if (!match) {
|
|
109
|
+
warnings.push(`${candidate.title} was explicitly added without requirement coverage because its declared measures, dimensions, and filters did not match a requirement.`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
...brief,
|
|
114
|
+
components,
|
|
115
|
+
selectedSourceIds: Array.from(new Set(components.map((component) => component.sourceId))),
|
|
116
|
+
warnings,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function candidateSatisfiesStructuredRequirement(requirement, candidate) {
|
|
120
|
+
const hasStructuredRequirement = requirement.measures.length > 0
|
|
121
|
+
|| requirement.dimensions.length > 0
|
|
122
|
+
|| requirement.filters.length > 0;
|
|
123
|
+
if (!hasStructuredRequirement) {
|
|
124
|
+
return questionEvidenceMatchesCandidate(requirement.question, candidate);
|
|
125
|
+
}
|
|
126
|
+
// Provider-declared capability fields are only trustworthy when the visible
|
|
127
|
+
// requirement question names them. This prevents an internally inconsistent
|
|
128
|
+
// requirement such as "Profit margin" + measure "revenue" from laundering a
|
|
129
|
+
// revenue source into false margin coverage.
|
|
130
|
+
if (!capabilityValuesMatch([
|
|
131
|
+
...requirement.measures,
|
|
132
|
+
...requirement.dimensions,
|
|
133
|
+
...requirement.filters,
|
|
134
|
+
], [requirement.question]))
|
|
135
|
+
return false;
|
|
136
|
+
// A declared measure is decisive: generic words in titles or descriptions
|
|
137
|
+
// can never substitute a different metric into requirement coverage.
|
|
138
|
+
if (!capabilityValuesMatch(requirement.measures, [
|
|
139
|
+
...candidate.capabilities.measures,
|
|
140
|
+
...candidate.capabilities.outputs,
|
|
141
|
+
]))
|
|
142
|
+
return false;
|
|
143
|
+
if (!capabilityValuesMatch(requirement.dimensions, candidate.capabilities.dimensions))
|
|
144
|
+
return false;
|
|
145
|
+
if (!capabilityValuesMatch(requirement.filters, candidate.capabilities.filters))
|
|
146
|
+
return false;
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
function questionEvidenceMatchesCandidate(question, candidate) {
|
|
150
|
+
const questionTokens = deterministicWords(question);
|
|
151
|
+
if (questionTokens.size === 0)
|
|
152
|
+
return false;
|
|
153
|
+
const candidateTokens = deterministicWords([
|
|
154
|
+
candidate.title,
|
|
155
|
+
candidate.description ?? '',
|
|
156
|
+
candidate.qualifiedIdentity,
|
|
157
|
+
...candidate.tags,
|
|
158
|
+
...candidate.capabilities.measures,
|
|
159
|
+
...candidate.capabilities.dimensions,
|
|
160
|
+
...candidate.capabilities.filters,
|
|
161
|
+
...candidate.capabilities.outputs,
|
|
162
|
+
].join(' '));
|
|
163
|
+
return Array.from(questionTokens).every((token) => candidateTokens.has(token));
|
|
164
|
+
}
|
|
165
|
+
function capabilityValuesMatch(requiredValues, availableValues) {
|
|
166
|
+
if (requiredValues.length === 0)
|
|
167
|
+
return true;
|
|
168
|
+
const availableTokenSets = availableValues.map((value) => deterministicWords(value));
|
|
169
|
+
return requiredValues.every((requiredValue) => {
|
|
170
|
+
const requiredTokens = deterministicWords(requiredValue);
|
|
171
|
+
return requiredTokens.size > 0 && availableTokenSets.some((availableTokens) => (Array.from(requiredTokens).every((token) => availableTokens.has(token))));
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
function uniqueCandidates(candidates) {
|
|
175
|
+
const seen = new Set();
|
|
176
|
+
return candidates.filter((candidate) => {
|
|
177
|
+
if (seen.has(candidate.sourceId))
|
|
178
|
+
return false;
|
|
179
|
+
seen.add(candidate.sourceId);
|
|
180
|
+
return true;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
function deterministicBrief(input, candidates, warnings = []) {
|
|
184
|
+
const requirementQuestions = deterministicRequirementQuestions(input.prompt);
|
|
185
|
+
const requirements = requirementQuestions.map((question, index) => ({
|
|
186
|
+
id: `requirement-${index + 1}`,
|
|
187
|
+
question,
|
|
188
|
+
role: inferRequirementRole(question, index),
|
|
189
|
+
required: true,
|
|
190
|
+
measures: [],
|
|
191
|
+
dimensions: [],
|
|
192
|
+
filters: [],
|
|
193
|
+
}));
|
|
194
|
+
const requirementIdsBySource = new Map();
|
|
195
|
+
const selected = [];
|
|
196
|
+
const addSelection = (candidate, requirementId) => {
|
|
197
|
+
if (!selected.some((item) => item.sourceId === candidate.sourceId))
|
|
198
|
+
selected.push(candidate);
|
|
199
|
+
const ids = requirementIdsBySource.get(candidate.sourceId) ?? [];
|
|
200
|
+
if (!ids.includes(requirementId))
|
|
201
|
+
ids.push(requirementId);
|
|
202
|
+
requirementIdsBySource.set(candidate.sourceId, ids);
|
|
203
|
+
};
|
|
204
|
+
if (requirements.length === 1) {
|
|
205
|
+
for (const candidate of candidates.slice(0, Math.min(3, candidates.length))) {
|
|
206
|
+
addSelection(candidate, requirements[0].id);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
const used = new Set();
|
|
211
|
+
for (const requirement of requirements) {
|
|
212
|
+
const ranked = candidates
|
|
213
|
+
.map((candidate) => ({ candidate, score: deterministicCandidateScore(requirement.question, candidate) }))
|
|
214
|
+
.filter((entry) => entry.score > 0)
|
|
215
|
+
.sort((left, right) => right.score - left.score || left.candidate.sourceId.localeCompare(right.candidate.sourceId));
|
|
216
|
+
const match = ranked.find((entry) => !used.has(entry.candidate.sourceId)) ?? ranked[0];
|
|
217
|
+
if (!match)
|
|
218
|
+
continue;
|
|
219
|
+
used.add(match.candidate.sourceId);
|
|
220
|
+
addSelection(match.candidate, requirement.id);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const components = selected.map((candidate, index) => {
|
|
224
|
+
const requirementIds = requirementIdsBySource.get(candidate.sourceId) ?? [];
|
|
225
|
+
const primaryRequirement = requirements.find((requirement) => requirementIds.includes(requirement.id));
|
|
226
|
+
return {
|
|
227
|
+
id: `component-${index + 1}`,
|
|
228
|
+
title: candidate.title,
|
|
229
|
+
sourceId: candidate.sourceId,
|
|
230
|
+
requirementIds,
|
|
231
|
+
role: primaryRequirement?.role ?? inferRole(candidate, index),
|
|
232
|
+
view: inferView(candidate, index),
|
|
233
|
+
rationale: candidate.reasons[0] ?? `Matched ${candidate.title} from the App source catalog.`,
|
|
234
|
+
};
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
version: 1,
|
|
238
|
+
planningMode: 'deterministic_fallback',
|
|
239
|
+
frame: {
|
|
240
|
+
goal: input.prompt.trim(),
|
|
241
|
+
decision: input.prompt.trim(),
|
|
242
|
+
audience: input.audience?.trim() || 'App users',
|
|
243
|
+
metrics: Array.from(new Set(selected.flatMap((candidate) => candidate.capabilities.measures))),
|
|
244
|
+
dimensions: Array.from(new Set(selected.flatMap((candidate) => candidate.capabilities.dimensions))),
|
|
245
|
+
filters: Array.from(new Set(selected.flatMap((candidate) => candidate.capabilities.filters))),
|
|
246
|
+
desiredOutput: 'Interactive analytical App',
|
|
247
|
+
},
|
|
248
|
+
requirements,
|
|
249
|
+
components,
|
|
250
|
+
selectedSourceIds: selected.map((candidate) => candidate.sourceId),
|
|
251
|
+
candidateSourceIds: candidates.map((candidate) => candidate.sourceId),
|
|
252
|
+
warnings,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const DETERMINISTIC_REQUIREMENT_STOP_WORDS = new Set([
|
|
256
|
+
'a', 'an', 'analytics', 'and', 'app', 'application', 'available', 'block',
|
|
257
|
+
'build', 'certified', 'create', 'dashboard', 'data', 'dql', 'draft', 'for',
|
|
258
|
+
'from', 'governed', 'in', 'last', 'me', 'of', 'on', 'please', 'report',
|
|
259
|
+
'source', 'table', 'the', 'to', 'using', 'view', 'warehouse', 'with',
|
|
260
|
+
]);
|
|
261
|
+
function deterministicRequirementQuestions(prompt) {
|
|
262
|
+
const trimmed = prompt.trim().replace(/[.!?]+$/, '');
|
|
263
|
+
const focusMatch = trimmed.match(/\b(?:showing|including|that shows?|that tracks?|that monitors?)\b\s+(.+)$/i);
|
|
264
|
+
const focus = (focusMatch?.[1] ?? trimmed.replace(/^(?:please\s+)?(?:build|create|make|design)\s+(?:me\s+)?/i, '')).trim();
|
|
265
|
+
const parts = focus.split(/\s*(?:,|;|\band\b)\s*/i)
|
|
266
|
+
.map((part) => part.replace(/^(?:and\s+)?/i, '').trim())
|
|
267
|
+
.filter((part) => part.length > 2);
|
|
268
|
+
if (parts.length < 2 || parts.length > 6 || parts.some((part) => deterministicWords(part).size === 0))
|
|
269
|
+
return [trimmed];
|
|
270
|
+
return Array.from(new Set(parts.map((part) => part[0].toUpperCase() + part.slice(1))));
|
|
271
|
+
}
|
|
272
|
+
function deterministicWords(value) {
|
|
273
|
+
return new Set(value.toLowerCase().split(/[^a-z0-9]+/)
|
|
274
|
+
.map((token) => token.length > 3 && token.endsWith('s') ? token.slice(0, -1) : token)
|
|
275
|
+
.filter((token) => token.length > 1 && !DETERMINISTIC_REQUIREMENT_STOP_WORDS.has(token)));
|
|
276
|
+
}
|
|
277
|
+
function deterministicCandidateScore(question, candidate) {
|
|
278
|
+
const required = deterministicWords(question);
|
|
279
|
+
const title = deterministicWords(candidate.title);
|
|
280
|
+
const evidence = deterministicWords([
|
|
281
|
+
candidate.title,
|
|
282
|
+
candidate.description ?? '',
|
|
283
|
+
candidate.qualifiedIdentity,
|
|
284
|
+
...candidate.tags,
|
|
285
|
+
...candidate.capabilities.measures,
|
|
286
|
+
...candidate.capabilities.dimensions,
|
|
287
|
+
...candidate.capabilities.filters,
|
|
288
|
+
].join(' '));
|
|
289
|
+
let score = 0;
|
|
290
|
+
for (const word of required) {
|
|
291
|
+
if (title.has(word))
|
|
292
|
+
score += 4;
|
|
293
|
+
else if (evidence.has(word))
|
|
294
|
+
score += 2;
|
|
295
|
+
}
|
|
296
|
+
return score;
|
|
297
|
+
}
|
|
298
|
+
function inferRequirementRole(question, index) {
|
|
299
|
+
const normalized = question.toLowerCase();
|
|
300
|
+
if (/trend|growth|change|week|month|quarter|year|over time/.test(normalized))
|
|
301
|
+
return 'trend';
|
|
302
|
+
if (/region|segment|category|channel|breakdown|rank|top/.test(normalized))
|
|
303
|
+
return 'breakdown';
|
|
304
|
+
if (/detail|customer|order|record|list/.test(normalized))
|
|
305
|
+
return 'detail';
|
|
306
|
+
return index === 0 ? 'kpi' : 'evidence';
|
|
307
|
+
}
|
|
308
|
+
function appBuilderSystemPrompt() {
|
|
309
|
+
return [
|
|
310
|
+
'You are the DQL App Builder planner. Produce one stateful analytical App build brief, not a prose answer.',
|
|
311
|
+
'Use only sourceId values present in the supplied candidate cards. Never invent a source, field, capability, or trust state.',
|
|
312
|
+
'Draft and review sources may be recommended, but their trust must not be upgraded.',
|
|
313
|
+
'Return JSON only with keys frame, requirements, and components.',
|
|
314
|
+
'frame: {goal, decision?, audience?, metrics[], dimensions[], grain?, timeRange?, comparison?, filters[], desiredOutput?, clarificationQuestions?}.',
|
|
315
|
+
'requirements: [{id, question, role, required, measures[], dimensions[], filters[], grain?}]. role is kpi, trend, breakdown, detail, narrative, or evidence.',
|
|
316
|
+
'components: [{id, title, sourceId, requirementIds[], role, view, rationale}]. view is kpi, line, bar, or table.',
|
|
317
|
+
'Prefer the fewest components that cover the request. Ask a clarification only when a material choice cannot be made from supplied evidence.',
|
|
318
|
+
].join('\n');
|
|
319
|
+
}
|
|
320
|
+
function appBuilderUserPrompt(input, candidates) {
|
|
321
|
+
return JSON.stringify({
|
|
322
|
+
request: input.prompt,
|
|
323
|
+
sourcePolicy: input.sourcePolicy,
|
|
324
|
+
requiredSourceIds: input.requiredSourceIds,
|
|
325
|
+
domain: input.domain,
|
|
326
|
+
audience: input.audience,
|
|
327
|
+
candidateCards: candidates.map((candidate) => ({
|
|
328
|
+
sourceId: candidate.sourceId,
|
|
329
|
+
qualifiedIdentity: candidate.qualifiedIdentity,
|
|
330
|
+
title: candidate.title,
|
|
331
|
+
description: candidate.description,
|
|
332
|
+
domain: candidate.domain,
|
|
333
|
+
lifecycle: candidate.lifecycle,
|
|
334
|
+
trust: candidate.trust,
|
|
335
|
+
eligibleForLocalPreview: candidate.eligibility.localPreview,
|
|
336
|
+
capabilities: candidate.capabilities,
|
|
337
|
+
evidence: candidate.reasons,
|
|
338
|
+
})),
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
function parsePlannerJson(raw) {
|
|
342
|
+
if (!raw?.trim())
|
|
343
|
+
return undefined;
|
|
344
|
+
const start = raw.indexOf('{');
|
|
345
|
+
const end = raw.lastIndexOf('}');
|
|
346
|
+
if (start < 0 || end <= start)
|
|
347
|
+
return undefined;
|
|
348
|
+
try {
|
|
349
|
+
const parsed = JSON.parse(raw.slice(start, end + 1));
|
|
350
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
351
|
+
? parsed
|
|
352
|
+
: undefined;
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
return undefined;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
function normalizeFrame(value, prompt, audience) {
|
|
359
|
+
const record = objectValue(value);
|
|
360
|
+
return {
|
|
361
|
+
goal: stringValue(record?.goal) ?? prompt,
|
|
362
|
+
...(stringValue(record?.decision) ? { decision: stringValue(record?.decision) } : {}),
|
|
363
|
+
audience: stringValue(record?.audience) ?? audience ?? 'App users',
|
|
364
|
+
metrics: stringArray(record?.metrics),
|
|
365
|
+
dimensions: stringArray(record?.dimensions),
|
|
366
|
+
...(stringValue(record?.grain) ? { grain: stringValue(record?.grain) } : {}),
|
|
367
|
+
...(stringValue(record?.timeRange) ? { timeRange: stringValue(record?.timeRange) } : {}),
|
|
368
|
+
...(stringValue(record?.comparison) ? { comparison: stringValue(record?.comparison) } : {}),
|
|
369
|
+
filters: stringArray(record?.filters),
|
|
370
|
+
...(stringValue(record?.desiredOutput) ? { desiredOutput: stringValue(record?.desiredOutput) } : {}),
|
|
371
|
+
...normalizeClarifications(record?.clarificationQuestions),
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
function normalizeRequirements(value) {
|
|
375
|
+
if (!Array.isArray(value))
|
|
376
|
+
return [];
|
|
377
|
+
const seen = new Set();
|
|
378
|
+
return value.slice(0, 12).flatMap((raw, index) => {
|
|
379
|
+
const record = objectValue(raw);
|
|
380
|
+
if (!record)
|
|
381
|
+
return [];
|
|
382
|
+
const id = stringValue(record.id) ?? `requirement-${index + 1}`;
|
|
383
|
+
const question = stringValue(record.question);
|
|
384
|
+
const role = appRole(record.role);
|
|
385
|
+
if (!question || !role || seen.has(id))
|
|
386
|
+
return [];
|
|
387
|
+
seen.add(id);
|
|
388
|
+
return [{
|
|
389
|
+
id,
|
|
390
|
+
question,
|
|
391
|
+
role,
|
|
392
|
+
required: record.required !== false,
|
|
393
|
+
measures: stringArray(record.measures),
|
|
394
|
+
dimensions: stringArray(record.dimensions),
|
|
395
|
+
filters: stringArray(record.filters),
|
|
396
|
+
...(stringValue(record.grain) ? { grain: stringValue(record.grain) } : {}),
|
|
397
|
+
}];
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
function normalizeComponents(value, allowedSourceIds, requirementIds) {
|
|
401
|
+
if (!Array.isArray(value))
|
|
402
|
+
return [];
|
|
403
|
+
const seen = new Set();
|
|
404
|
+
return value.slice(0, 16).flatMap((raw, index) => {
|
|
405
|
+
const record = objectValue(raw);
|
|
406
|
+
if (!record)
|
|
407
|
+
return [];
|
|
408
|
+
const sourceId = stringValue(record.sourceId);
|
|
409
|
+
const role = appRole(record.role);
|
|
410
|
+
const view = appView(record.view);
|
|
411
|
+
const id = stringValue(record.id) ?? `component-${index + 1}`;
|
|
412
|
+
if (!sourceId || !allowedSourceIds.has(sourceId) || !role || !view || seen.has(id))
|
|
413
|
+
return [];
|
|
414
|
+
seen.add(id);
|
|
415
|
+
return [{
|
|
416
|
+
id,
|
|
417
|
+
title: stringValue(record.title) ?? id,
|
|
418
|
+
sourceId,
|
|
419
|
+
requirementIds: stringArray(record.requirementIds).filter((requirementId) => requirementIds.has(requirementId)),
|
|
420
|
+
role,
|
|
421
|
+
view,
|
|
422
|
+
rationale: stringValue(record.rationale) ?? 'Selected from the bounded App source candidate set.',
|
|
423
|
+
}];
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
function normalizeClarifications(value) {
|
|
427
|
+
if (!Array.isArray(value))
|
|
428
|
+
return {};
|
|
429
|
+
const questions = value.slice(0, 3).flatMap((raw, index) => {
|
|
430
|
+
const record = objectValue(raw);
|
|
431
|
+
const question = stringValue(record?.question);
|
|
432
|
+
if (!record || !question || !Array.isArray(record.choices))
|
|
433
|
+
return [];
|
|
434
|
+
const choices = record.choices.slice(0, 5).flatMap((choiceRaw, choiceIndex) => {
|
|
435
|
+
const choice = objectValue(choiceRaw);
|
|
436
|
+
const label = stringValue(choice?.label);
|
|
437
|
+
if (!choice || !label)
|
|
438
|
+
return [];
|
|
439
|
+
return [{
|
|
440
|
+
id: stringValue(choice.id) ?? `choice-${choiceIndex + 1}`,
|
|
441
|
+
label,
|
|
442
|
+
...(stringValue(choice.description) ? { description: stringValue(choice.description) } : {}),
|
|
443
|
+
}];
|
|
444
|
+
});
|
|
445
|
+
if (choices.length < 2)
|
|
446
|
+
return [];
|
|
447
|
+
return [{
|
|
448
|
+
id: stringValue(record.id) ?? `clarification-${index + 1}`,
|
|
449
|
+
question,
|
|
450
|
+
choices,
|
|
451
|
+
required: record.required !== false,
|
|
452
|
+
...(stringValue(record.answerId) ? { answerId: stringValue(record.answerId) } : {}),
|
|
453
|
+
}];
|
|
454
|
+
});
|
|
455
|
+
return questions.length ? { clarificationQuestions: questions } : {};
|
|
456
|
+
}
|
|
457
|
+
function inferRole(candidate, index) {
|
|
458
|
+
const text = `${candidate.title} ${candidate.capabilities.chartType ?? ''}`.toLowerCase();
|
|
459
|
+
if (index === 0 && candidate.capabilities.measures.length)
|
|
460
|
+
return 'kpi';
|
|
461
|
+
if (/trend|time|date|week|month|line/.test(text))
|
|
462
|
+
return 'trend';
|
|
463
|
+
if (/region|segment|category|channel|bar|rank/.test(text))
|
|
464
|
+
return 'breakdown';
|
|
465
|
+
return 'detail';
|
|
466
|
+
}
|
|
467
|
+
function inferView(candidate, index) {
|
|
468
|
+
const allowed = candidate.capabilities.allowedVisualizations ?? [];
|
|
469
|
+
const preferred = candidate.capabilities.chartType ?? allowed[0] ?? '';
|
|
470
|
+
if (/line|area/.test(preferred))
|
|
471
|
+
return 'line';
|
|
472
|
+
if (/bar|column|rank/.test(preferred))
|
|
473
|
+
return 'bar';
|
|
474
|
+
if (index === 0 && candidate.capabilities.measures.length)
|
|
475
|
+
return 'kpi';
|
|
476
|
+
return 'table';
|
|
477
|
+
}
|
|
478
|
+
function appRole(value) {
|
|
479
|
+
return value === 'kpi' || value === 'trend' || value === 'breakdown' || value === 'detail'
|
|
480
|
+
|| value === 'narrative' || value === 'evidence' ? value : undefined;
|
|
481
|
+
}
|
|
482
|
+
function appView(value) {
|
|
483
|
+
return value === 'kpi' || value === 'line' || value === 'bar' || value === 'table' ? value : undefined;
|
|
484
|
+
}
|
|
485
|
+
function objectValue(value) {
|
|
486
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
|
|
487
|
+
}
|
|
488
|
+
function stringValue(value) {
|
|
489
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
490
|
+
}
|
|
491
|
+
function stringArray(value) {
|
|
492
|
+
return Array.isArray(value)
|
|
493
|
+
? Array.from(new Set(value.filter((item) => typeof item === 'string' && Boolean(item.trim())).map((item) => item.trim())))
|
|
494
|
+
: [];
|
|
495
|
+
}
|
|
496
|
+
//# sourceMappingURL=app-builder-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-builder-orchestrator.js","sourceRoot":"","sources":["../src/app-builder-orchestrator.ts"],"names":[],"mappings":"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"}
|