@duckcodeailabs/dql-agent 1.6.33 → 1.6.34

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 (144) hide show
  1. package/dist/agent-run-engine.d.ts +26 -8
  2. package/dist/agent-run-engine.d.ts.map +1 -1
  3. package/dist/agent-run-engine.js +46 -7
  4. package/dist/agent-run-engine.js.map +1 -1
  5. package/dist/agent-run-gates.d.ts.map +1 -1
  6. package/dist/agent-run-gates.js +15 -3
  7. package/dist/agent-run-gates.js.map +1 -1
  8. package/dist/agent-run-planner.d.ts.map +1 -1
  9. package/dist/agent-run-planner.js +14 -3
  10. package/dist/agent-run-planner.js.map +1 -1
  11. package/dist/agentic/answer-contract.d.ts +37 -0
  12. package/dist/agentic/answer-contract.d.ts.map +1 -0
  13. package/dist/agentic/answer-contract.js +47 -0
  14. package/dist/agentic/answer-contract.js.map +1 -0
  15. package/dist/agentic/tool-loop.d.ts +48 -0
  16. package/dist/agentic/tool-loop.d.ts.map +1 -0
  17. package/dist/agentic/tool-loop.js +181 -0
  18. package/dist/agentic/tool-loop.js.map +1 -0
  19. package/dist/agentic/toolset.d.ts +40 -0
  20. package/dist/agentic/toolset.d.ts.map +1 -0
  21. package/dist/agentic/toolset.js +265 -0
  22. package/dist/agentic/toolset.js.map +1 -0
  23. package/dist/answer-loop.d.ts +25 -2
  24. package/dist/answer-loop.d.ts.map +1 -1
  25. package/dist/answer-loop.js +368 -72
  26. package/dist/answer-loop.js.map +1 -1
  27. package/dist/cascade/budgets.d.ts +20 -2
  28. package/dist/cascade/budgets.d.ts.map +1 -1
  29. package/dist/cascade/budgets.js +76 -43
  30. package/dist/cascade/budgets.js.map +1 -1
  31. package/dist/cascade/route-policy.d.ts +1 -1
  32. package/dist/cascade/route-policy.d.ts.map +1 -1
  33. package/dist/cascade/route-policy.js +1 -0
  34. package/dist/cascade/route-policy.js.map +1 -1
  35. package/dist/embeddings/provider.d.ts +67 -4
  36. package/dist/embeddings/provider.d.ts.map +1 -1
  37. package/dist/embeddings/provider.js +167 -6
  38. package/dist/embeddings/provider.js.map +1 -1
  39. package/dist/hints/correction-eval.d.ts +30 -0
  40. package/dist/hints/correction-eval.d.ts.map +1 -0
  41. package/dist/hints/correction-eval.js +63 -0
  42. package/dist/hints/correction-eval.js.map +1 -0
  43. package/dist/hints/staleness.d.ts +30 -0
  44. package/dist/hints/staleness.d.ts.map +1 -0
  45. package/dist/hints/staleness.js +38 -0
  46. package/dist/hints/staleness.js.map +1 -0
  47. package/dist/hints/store.d.ts.map +1 -1
  48. package/dist/hints/store.js +3 -32
  49. package/dist/hints/store.js.map +1 -1
  50. package/dist/index.d.ts +39 -6
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +143 -7
  53. package/dist/index.js.map +1 -1
  54. package/dist/intent-controller.d.ts.map +1 -1
  55. package/dist/intent-controller.js +15 -3
  56. package/dist/intent-controller.js.map +1 -1
  57. package/dist/kg/sqlite-fts.d.ts +13 -0
  58. package/dist/kg/sqlite-fts.d.ts.map +1 -1
  59. package/dist/kg/sqlite-fts.js +75 -47
  60. package/dist/kg/sqlite-fts.js.map +1 -1
  61. package/dist/memory/fts-query.d.ts +37 -4
  62. package/dist/memory/fts-query.d.ts.map +1 -1
  63. package/dist/memory/fts-query.js +53 -12
  64. package/dist/memory/fts-query.js.map +1 -1
  65. package/dist/metadata/analysis-planner.js +45 -10
  66. package/dist/metadata/analysis-planner.js.map +1 -1
  67. package/dist/metadata/block-adapt.d.ts +37 -0
  68. package/dist/metadata/block-adapt.d.ts.map +1 -0
  69. package/dist/metadata/block-adapt.js +89 -0
  70. package/dist/metadata/block-adapt.js.map +1 -0
  71. package/dist/metadata/catalog.d.ts +39 -0
  72. package/dist/metadata/catalog.d.ts.map +1 -1
  73. package/dist/metadata/catalog.js +361 -41
  74. package/dist/metadata/catalog.js.map +1 -1
  75. package/dist/metadata/example-match.d.ts +30 -0
  76. package/dist/metadata/example-match.d.ts.map +1 -0
  77. package/dist/metadata/example-match.js +69 -0
  78. package/dist/metadata/example-match.js.map +1 -0
  79. package/dist/metadata/grain-ledger.d.ts +51 -0
  80. package/dist/metadata/grain-ledger.d.ts.map +1 -0
  81. package/dist/metadata/grain-ledger.js +174 -0
  82. package/dist/metadata/grain-ledger.js.map +1 -0
  83. package/dist/metadata/metric-match.d.ts +21 -1
  84. package/dist/metadata/metric-match.d.ts.map +1 -1
  85. package/dist/metadata/metric-match.js +157 -21
  86. package/dist/metadata/metric-match.js.map +1 -1
  87. package/dist/metadata/sql-grounding.d.ts +4 -2
  88. package/dist/metadata/sql-grounding.d.ts.map +1 -1
  89. package/dist/metadata/sql-grounding.js +4 -2
  90. package/dist/metadata/sql-grounding.js.map +1 -1
  91. package/dist/metadata/sql-retrieval.d.ts +3 -2
  92. package/dist/metadata/sql-retrieval.d.ts.map +1 -1
  93. package/dist/metadata/sql-retrieval.js +23 -5
  94. package/dist/metadata/sql-retrieval.js.map +1 -1
  95. package/dist/propose/build-from-prompt.d.ts.map +1 -1
  96. package/dist/propose/build-from-prompt.js +10 -4
  97. package/dist/propose/build-from-prompt.js.map +1 -1
  98. package/dist/propose/failure-analysis.d.ts +48 -0
  99. package/dist/propose/failure-analysis.d.ts.map +1 -0
  100. package/dist/propose/failure-analysis.js +71 -0
  101. package/dist/propose/failure-analysis.js.map +1 -0
  102. package/dist/propose/join-mining.d.ts +18 -0
  103. package/dist/propose/join-mining.d.ts.map +1 -0
  104. package/dist/propose/join-mining.js +74 -0
  105. package/dist/propose/join-mining.js.map +1 -0
  106. package/dist/providers/claude.d.ts.map +1 -1
  107. package/dist/providers/claude.js +36 -1
  108. package/dist/providers/claude.js.map +1 -1
  109. package/dist/providers/index.d.ts +2 -2
  110. package/dist/providers/index.d.ts.map +1 -1
  111. package/dist/providers/index.js +1 -1
  112. package/dist/providers/index.js.map +1 -1
  113. package/dist/providers/openai.d.ts.map +1 -1
  114. package/dist/providers/openai.js +34 -1
  115. package/dist/providers/openai.js.map +1 -1
  116. package/dist/providers/reasoning-effort.d.ts +27 -0
  117. package/dist/providers/reasoning-effort.d.ts.map +1 -1
  118. package/dist/providers/reasoning-effort.js +32 -0
  119. package/dist/providers/reasoning-effort.js.map +1 -1
  120. package/dist/providers/types.d.ts +2 -1
  121. package/dist/providers/types.d.ts.map +1 -1
  122. package/dist/research-loop.d.ts.map +1 -1
  123. package/dist/research-loop.js +9 -2
  124. package/dist/research-loop.js.map +1 -1
  125. package/dist/semantic-bridge/compose.d.ts.map +1 -1
  126. package/dist/semantic-bridge/compose.js +147 -20
  127. package/dist/semantic-bridge/compose.js.map +1 -1
  128. package/dist/skills/bootstrap.d.ts +57 -0
  129. package/dist/skills/bootstrap.d.ts.map +1 -0
  130. package/dist/skills/bootstrap.js +260 -0
  131. package/dist/skills/bootstrap.js.map +1 -0
  132. package/dist/skills/defaults.d.ts +2 -2
  133. package/dist/skills/defaults.js +2 -2
  134. package/dist/skills/domain-skills.d.ts +24 -0
  135. package/dist/skills/domain-skills.d.ts.map +1 -0
  136. package/dist/skills/domain-skills.js +76 -0
  137. package/dist/skills/domain-skills.js.map +1 -0
  138. package/dist/skills/loader.d.ts +46 -8
  139. package/dist/skills/loader.d.ts.map +1 -1
  140. package/dist/skills/loader.js +186 -41
  141. package/dist/skills/loader.js.map +1 -1
  142. package/dist/tools/registry.js +12 -12
  143. package/dist/tools/registry.js.map +1 -1
  144. package/package.json +4 -4
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Evidence-first domain/skill bootstrap. It deliberately drafts from the
3
+ * compiled repository instead of asking a model to invent a taxonomy. A UI or
4
+ * provider can enrich the prose later, but every candidate carries the exact
5
+ * metrics, blocks, and terms that caused it to exist.
6
+ */
7
+ import type { DQLManifest } from '@duckcodeailabs/dql-core';
8
+ import type { DomainInput } from '@duckcodeailabs/dql-core';
9
+ import type { WriteSkillInput } from './loader.js';
10
+ export interface DomainBootstrapCandidate {
11
+ id: string;
12
+ kind: 'domain' | 'skill';
13
+ action: 'create' | 'update' | 'unchanged' | 'needs_attention';
14
+ confidence: number;
15
+ evidence: string[];
16
+ /** Local-only notes from the optional AI enrichment pass. */
17
+ notes?: string[];
18
+ domain?: DomainInput;
19
+ skill?: WriteSkillInput;
20
+ }
21
+ export interface DomainSkillBootstrapAiDraft {
22
+ id: string;
23
+ description?: string;
24
+ boundedContext?: string;
25
+ businessOutcome?: string;
26
+ inScope?: string[];
27
+ outOfScope?: string[];
28
+ primaryTerms?: string[];
29
+ tags?: string[];
30
+ triggers?: string[];
31
+ exclusions?: string[];
32
+ clarifyWhen?: string[];
33
+ examples?: string[];
34
+ body?: string;
35
+ }
36
+ export interface DomainSkillBootstrapEnrichment {
37
+ candidates: DomainBootstrapCandidate[];
38
+ applied: string[];
39
+ rejected: string[];
40
+ }
41
+ /** Build reviewable candidates without writing tracked files. */
42
+ export declare function draftDomainSkillBootstrap(manifest: DQLManifest): DomainBootstrapCandidate[];
43
+ /**
44
+ * A bounded, evidence-only prompt for enriching repository drafts. The model is
45
+ * never asked to discover metrics, joins, or new taxonomy: it may only improve
46
+ * prose and operational guidance for the candidate IDs supplied here.
47
+ */
48
+ export declare function buildDomainSkillBootstrapPrompt(manifest: DQLManifest, candidates: DomainBootstrapCandidate[]): {
49
+ system: string;
50
+ user: string;
51
+ };
52
+ /**
53
+ * Apply only safe, textual AI improvements. This deliberately rejects model
54
+ * attempts to add governed-object references or unknown candidate IDs.
55
+ */
56
+ export declare function mergeDomainSkillBootstrapEnrichment(candidates: DomainBootstrapCandidate[], response: string): DomainSkillBootstrapEnrichment;
57
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/skills/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,iBAAiB,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,8BAA8B;IAC7C,UAAU,EAAE,wBAAwB,EAAE,CAAC;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD,iEAAiE;AACjE,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,WAAW,GAAG,wBAAwB,EAAE,CAgF3F;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,wBAAwB,EAAE,GACrC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsDlC;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,wBAAwB,EAAE,EACtC,QAAQ,EAAE,MAAM,GACf,8BAA8B,CAsDhC"}
@@ -0,0 +1,260 @@
1
+ import { buildDomainReferenceSkills } from './domain-skills.js';
2
+ function slug(value) {
3
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'domain';
4
+ }
5
+ /** Build reviewable candidates without writing tracked files. */
6
+ export function draftDomainSkillBootstrap(manifest) {
7
+ const candidates = [];
8
+ const declared = Object.values(manifest.domains ?? {});
9
+ const declaredNames = new Set(declared.map((domain) => domain.name.toLowerCase()));
10
+ const inferred = new Set();
11
+ for (const block of Object.values(manifest.blocks ?? {}))
12
+ if (block.domain)
13
+ inferred.add(block.domain);
14
+ for (const metric of Object.values(manifest.metrics ?? {}))
15
+ if (metric.domain)
16
+ inferred.add(metric.domain);
17
+ for (const term of Object.values(manifest.terms ?? {}))
18
+ if (term.domain)
19
+ inferred.add(term.domain);
20
+ for (const domain of declared) {
21
+ const metricCount = Object.values(manifest.metrics ?? {}).filter((metric) => metric.domain === domain.name).length;
22
+ const blockCount = Object.values(manifest.blocks ?? {}).filter((block) => block.domain === domain.name).length;
23
+ const termCount = Object.values(manifest.terms ?? {}).filter((term) => term.domain === domain.name).length;
24
+ candidates.push({
25
+ id: `domain:${slug(domain.name)}`,
26
+ kind: 'domain',
27
+ action: 'unchanged',
28
+ confidence: 1,
29
+ evidence: [`Declared in ${domain.filePath}`, `${metricCount} metrics`, `${blockCount} blocks`, `${termCount} terms`],
30
+ domain: {
31
+ name: domain.name,
32
+ parent: domain.parent,
33
+ owner: domain.owner,
34
+ businessOwner: domain.businessOwner,
35
+ boundedContext: domain.boundedContext,
36
+ sourceSystems: domain.sourceSystems,
37
+ primaryTerms: domain.primaryTerms,
38
+ tags: domain.tags,
39
+ businessOutcome: domain.businessOutcome,
40
+ description: domain.description,
41
+ reviewCadence: domain.reviewCadence,
42
+ inScope: domain.inScope,
43
+ outOfScope: domain.outOfScope,
44
+ dbtGroups: domain.dbtGroups,
45
+ dbtPaths: domain.dbtPaths,
46
+ dbtTags: domain.dbtTags,
47
+ semanticDomains: domain.semanticDomains,
48
+ semanticTags: domain.semanticTags,
49
+ sourcePath: domain.filePath,
50
+ },
51
+ });
52
+ }
53
+ for (const name of inferred) {
54
+ if (declaredNames.has(name.toLowerCase()))
55
+ continue;
56
+ const metricCount = Object.values(manifest.metrics ?? {}).filter((metric) => metric.domain === name).length;
57
+ const blockCount = Object.values(manifest.blocks ?? {}).filter((block) => block.domain === name).length;
58
+ const termCount = Object.values(manifest.terms ?? {}).filter((term) => term.domain === name).length;
59
+ candidates.push({
60
+ id: `domain:${slug(name)}`,
61
+ kind: 'domain',
62
+ action: 'create',
63
+ confidence: metricCount + blockCount + termCount >= 3 ? 0.9 : 0.55,
64
+ evidence: ['Inferred from governed artifacts', `${metricCount} metrics`, `${blockCount} blocks`, `${termCount} terms`],
65
+ domain: {
66
+ name,
67
+ boundedContext: `Governed analytics for ${name}. Review the generated scope before use.`,
68
+ reviewCadence: 'quarterly',
69
+ },
70
+ });
71
+ }
72
+ for (const skill of buildDomainReferenceSkills({ ...manifest, domains: Object.fromEntries(candidates.filter((candidate) => candidate.kind === 'domain' && candidate.domain).map((candidate) => [candidate.domain.name, {
73
+ name: candidate.domain.name,
74
+ filePath: candidate.domain.sourcePath ?? `domains/${slug(candidate.domain.name)}/domain.dql`,
75
+ ...candidate.domain,
76
+ }])) })) {
77
+ candidates.push({
78
+ id: `skill:${skill.id}`,
79
+ kind: 'skill',
80
+ action: 'create',
81
+ confidence: 0.85,
82
+ evidence: [`Derived from domain ${skill.domain}`, `${skill.preferredMetrics?.length ?? 0} metrics`, `${skill.preferredBlocks?.length ?? 0} certified blocks`],
83
+ skill: { ...skill, kind: 'domain_reference', status: 'draft', domains: skill.domain ? [skill.domain] : [] },
84
+ });
85
+ }
86
+ return candidates.sort((a, b) => a.kind.localeCompare(b.kind) || b.confidence - a.confidence || a.id.localeCompare(b.id));
87
+ }
88
+ /**
89
+ * A bounded, evidence-only prompt for enriching repository drafts. The model is
90
+ * never asked to discover metrics, joins, or new taxonomy: it may only improve
91
+ * prose and operational guidance for the candidate IDs supplied here.
92
+ */
93
+ export function buildDomainSkillBootstrapPrompt(manifest, candidates) {
94
+ const metricIndex = Object.values(manifest.metrics ?? {});
95
+ const blockIndex = Object.values(manifest.blocks ?? {});
96
+ const termIndex = Object.values(manifest.terms ?? {});
97
+ const items = candidates.map((candidate) => {
98
+ const domainName = candidate.domain?.name ?? candidate.skill?.domain ?? candidate.skill?.domains?.[0];
99
+ const metrics = metricIndex.filter((metric) => metric.domain === domainName).slice(0, 24)
100
+ .map((metric) => ({ id: metric.name, label: metric.label, description: truncate(metric.description, 180) }));
101
+ const blocks = blockIndex.filter((block) => block.domain === domainName).slice(0, 16)
102
+ .map((block) => ({ id: block.name, status: block.status, description: truncate(block.description, 180) }));
103
+ const terms = termIndex.filter((term) => term.domain === domainName).slice(0, 24)
104
+ .map((term) => ({ name: term.name, synonyms: (term.synonyms ?? []).slice(0, 8), caveats: (term.caveats ?? []).slice(0, 5) }));
105
+ return {
106
+ id: candidate.id,
107
+ kind: candidate.kind,
108
+ action: candidate.action,
109
+ domain: candidate.domain ? {
110
+ name: candidate.domain.name,
111
+ parent: candidate.domain.parent,
112
+ description: candidate.domain.description,
113
+ boundedContext: candidate.domain.boundedContext,
114
+ businessOutcome: candidate.domain.businessOutcome,
115
+ primaryTerms: candidate.domain.primaryTerms,
116
+ tags: candidate.domain.tags,
117
+ inScope: candidate.domain.inScope,
118
+ outOfScope: candidate.domain.outOfScope,
119
+ } : undefined,
120
+ skill: candidate.skill ? {
121
+ id: candidate.skill.id,
122
+ domain: candidate.skill.domain,
123
+ domains: candidate.skill.domains,
124
+ description: candidate.skill.description,
125
+ preferredMetrics: candidate.skill.preferredMetrics,
126
+ preferredBlocks: candidate.skill.preferredBlocks,
127
+ } : undefined,
128
+ evidence: candidate.evidence,
129
+ governedArtifacts: { metrics, blocks, terms },
130
+ };
131
+ });
132
+ return {
133
+ system: [
134
+ 'You enrich governed analytics domain and skill drafts from repository evidence.',
135
+ 'Return JSON only. Do not use markdown fences.',
136
+ 'Never invent or rename domains, metrics, dimensions, blocks, models, joins, filters, owners, or source systems.',
137
+ 'Do not create candidate IDs. Return only IDs supplied by the user.',
138
+ 'If repository evidence is insufficient, add a concise clarification rule instead of assuming a business definition.',
139
+ 'For domains, improve only business description, bounded context, outcome, in/out scope, primary terms, and tags.',
140
+ 'For skills, improve only description, triggers, exclusions, clarification rules, examples, and a concise Markdown body.',
141
+ 'Skill bodies must use exactly these sections when useful: Purpose, Governed reuse, Vocabulary, Guardrails, Clarify.',
142
+ 'Treat listed metrics and certified blocks as references, not proof of an unstated calculation. Keep every field concise.',
143
+ 'Output shape: {"drafts":[{"id":"...","description":"...","boundedContext":"...","businessOutcome":"...","inScope":["..."],"outOfScope":["..."],"primaryTerms":["..."],"tags":["..."],"triggers":["..."],"exclusions":["..."],"clarifyWhen":["..."],"examples":["..."],"body":"..."}]}. Omit fields you cannot ground.',
144
+ ].join('\n'),
145
+ user: JSON.stringify({ candidates: items }, null, 2),
146
+ };
147
+ }
148
+ /**
149
+ * Apply only safe, textual AI improvements. This deliberately rejects model
150
+ * attempts to add governed-object references or unknown candidate IDs.
151
+ */
152
+ export function mergeDomainSkillBootstrapEnrichment(candidates, response) {
153
+ const parsed = parseBootstrapResponse(response);
154
+ const byId = new Map(candidates.map((candidate) => [candidate.id, candidate]));
155
+ const applied = [];
156
+ const rejected = [];
157
+ const next = candidates.map((candidate) => ({ ...candidate }));
158
+ const nextById = new Map(next.map((candidate) => [candidate.id, candidate]));
159
+ for (const draft of parsed) {
160
+ const original = byId.get(draft.id);
161
+ const candidate = nextById.get(draft.id);
162
+ if (!original || !candidate) {
163
+ rejected.push(`Ignored unknown candidate ${draft.id || '(missing id)'}.`);
164
+ continue;
165
+ }
166
+ if (candidate.kind === 'domain' && candidate.domain) {
167
+ const domain = { ...candidate.domain };
168
+ const allowedTerms = new Set((original.domain?.primaryTerms ?? []).map(normalize));
169
+ const safeTerms = filterKnown(draft.primaryTerms, allowedTerms);
170
+ if ((draft.primaryTerms?.length ?? 0) !== safeTerms.length)
171
+ rejected.push(`Ignored ungrounded primary terms for ${draft.id}.`);
172
+ let changed = false;
173
+ changed = assignText(domain, 'description', draft.description) || changed;
174
+ changed = assignText(domain, 'boundedContext', draft.boundedContext) || changed;
175
+ changed = assignText(domain, 'businessOutcome', draft.businessOutcome) || changed;
176
+ changed = assignStrings(domain, 'inScope', draft.inScope) || changed;
177
+ changed = assignStrings(domain, 'outOfScope', draft.outOfScope) || changed;
178
+ changed = assignStrings(domain, 'tags', draft.tags) || changed;
179
+ if (safeTerms.length)
180
+ changed = assignStrings(domain, 'primaryTerms', safeTerms) || changed;
181
+ candidate.domain = domain;
182
+ if (changed) {
183
+ candidate.action = candidate.action === 'unchanged' ? 'update' : candidate.action;
184
+ candidate.notes = [...(candidate.notes ?? []), 'AI enrichment was constrained to repository evidence.'];
185
+ applied.push(draft.id);
186
+ }
187
+ continue;
188
+ }
189
+ if (candidate.kind === 'skill' && candidate.skill) {
190
+ const skill = { ...candidate.skill };
191
+ let changed = false;
192
+ changed = assignText(skill, 'description', draft.description) || changed;
193
+ changed = assignStrings(skill, 'triggers', draft.triggers) || changed;
194
+ changed = assignStrings(skill, 'exclusions', draft.exclusions) || changed;
195
+ changed = assignStrings(skill, 'clarifyWhen', draft.clarifyWhen) || changed;
196
+ changed = assignStrings(skill, 'examples', draft.examples) || changed;
197
+ changed = assignText(skill, 'body', draft.body, 8000) || changed;
198
+ candidate.skill = skill;
199
+ if (changed) {
200
+ candidate.action = candidate.action === 'unchanged' ? 'update' : candidate.action;
201
+ candidate.notes = [...(candidate.notes ?? []), 'AI enrichment was constrained to repository evidence.'];
202
+ applied.push(draft.id);
203
+ }
204
+ }
205
+ }
206
+ return { candidates: next, applied, rejected };
207
+ }
208
+ function parseBootstrapResponse(response) {
209
+ const match = response.match(/\{[\s\S]*\}/);
210
+ if (!match)
211
+ return [];
212
+ try {
213
+ const value = JSON.parse(match[0]);
214
+ if (!Array.isArray(value.drafts))
215
+ return [];
216
+ return value.drafts.flatMap((entry) => {
217
+ if (!entry || typeof entry !== 'object' || typeof entry.id !== 'string')
218
+ return [];
219
+ const raw = entry;
220
+ return [{
221
+ id: raw.id,
222
+ description: safeText(raw.description), boundedContext: safeText(raw.boundedContext), businessOutcome: safeText(raw.businessOutcome),
223
+ inScope: safeList(raw.inScope), outOfScope: safeList(raw.outOfScope), primaryTerms: safeList(raw.primaryTerms), tags: safeList(raw.tags),
224
+ triggers: safeList(raw.triggers), exclusions: safeList(raw.exclusions), clarifyWhen: safeList(raw.clarifyWhen), examples: safeList(raw.examples), body: safeText(raw.body, 8000),
225
+ }];
226
+ });
227
+ }
228
+ catch {
229
+ return [];
230
+ }
231
+ }
232
+ function safeText(value, max = 500) {
233
+ return typeof value === 'string' && value.trim() ? value.trim().slice(0, max) : undefined;
234
+ }
235
+ function safeList(value) {
236
+ if (!Array.isArray(value))
237
+ return undefined;
238
+ const values = value.filter((item) => typeof item === 'string').map((item) => item.trim().slice(0, 240)).filter(Boolean).slice(0, 20);
239
+ return values.length ? values : undefined;
240
+ }
241
+ function normalize(value) { return value.trim().toLowerCase(); }
242
+ function filterKnown(values, allowed) {
243
+ return (values ?? []).filter((value) => allowed.has(normalize(value)));
244
+ }
245
+ function truncate(value, max) { return value?.trim().slice(0, max); }
246
+ function assignText(target, key, value, max = 500) {
247
+ const record = target;
248
+ if (!value || value.length > max || record[key] === value)
249
+ return false;
250
+ record[key] = value;
251
+ return true;
252
+ }
253
+ function assignStrings(target, key, value) {
254
+ const record = target;
255
+ if (!value?.length || JSON.stringify(record[key] ?? []) === JSON.stringify(value))
256
+ return false;
257
+ record[key] = value;
258
+ return true;
259
+ }
260
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/skills/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Default starter Skills (spec 16) — `seedDefaultSkills` writes three EDITABLE
3
- * starters into `.dql/skills/`, idempotently (it NEVER clobbers a file the user
3
+ * starters into `skills/`, idempotently (it NEVER clobbers a file the user
4
4
  * has edited). The starters are:
5
5
  *
6
6
  * (a) Metrics glossary — pre-filled from the semantic layer (MetricFlow
@@ -29,7 +29,7 @@ export interface SeedDefaultSkillsResult {
29
29
  skipped: string[];
30
30
  }
31
31
  /**
32
- * Seed the editable starter skills into `.dql/skills/`. Idempotent: a starter is
32
+ * Seed the editable starter skills into `skills/`. Idempotent: a starter is
33
33
  * written only when its file does not already exist, so user edits are never
34
34
  * clobbered.
35
35
  */
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Default starter Skills (spec 16) — `seedDefaultSkills` writes three EDITABLE
3
- * starters into `.dql/skills/`, idempotently (it NEVER clobbers a file the user
3
+ * starters into `skills/`, idempotently (it NEVER clobbers a file the user
4
4
  * has edited). The starters are:
5
5
  *
6
6
  * (a) Metrics glossary — pre-filled from the semantic layer (MetricFlow
@@ -162,7 +162,7 @@ function blockAuthoringSkill() {
162
162
  };
163
163
  }
164
164
  /**
165
- * Seed the editable starter skills into `.dql/skills/`. Idempotent: a starter is
165
+ * Seed the editable starter skills into `skills/`. Idempotent: a starter is
166
166
  * written only when its file does not already exist, so user edits are never
167
167
  * clobbered.
168
168
  */
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Domain skill packs (W4.5).
3
+ *
4
+ * Anthropic's 21%→95% accuracy jump came from curated per-domain reference docs
5
+ * ("skills") that tell the agent the preferred metrics, canonical joins, and
6
+ * gotchas for each domain. This auto-drafts one reference skill per domain from
7
+ * the governed manifest — preferred certified metrics, certified blocks, glossary
8
+ * terms + their caveats — as an editable STARTER. A human curates it (the file is
9
+ * never clobbered on re-seed); it is injected only when retrieval routes to that
10
+ * domain. Distills what the manifest already knows into the shape the agent reads.
11
+ */
12
+ import type { DQLManifest } from '@duckcodeailabs/dql-core';
13
+ import { type Skill, type WriteSkillInput } from './loader.js';
14
+ /** Build one editable reference skill per domain from the governed manifest. Pure. */
15
+ export declare function buildDomainReferenceSkills(manifest: DQLManifest): WriteSkillInput[];
16
+ /**
17
+ * Seed per-domain reference skills into `skills/`. Idempotent: a domain skill
18
+ * is written only when its file does not already exist, so curator edits are kept.
19
+ */
20
+ export declare function seedDomainSkills(projectRoot: string, manifest: DQLManifest): {
21
+ created: Skill[];
22
+ skipped: string[];
23
+ };
24
+ //# sourceMappingURL=domain-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-skills.d.ts","sourceRoot":"","sources":["../../src/skills/domain-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAyB,KAAK,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAMtF,sFAAsF;AACtF,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,WAAW,GAAG,eAAe,EAAE,CAsDnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG;IAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAWpH"}
@@ -0,0 +1,76 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { skillPath, writeSkill } from './loader.js';
3
+ function slug(name) {
4
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'domain';
5
+ }
6
+ /** Build one editable reference skill per domain from the governed manifest. Pure. */
7
+ export function buildDomainReferenceSkills(manifest) {
8
+ const domains = Object.values(manifest.domains ?? {});
9
+ const blocks = Object.values(manifest.blocks ?? {});
10
+ const allMetrics = Object.values(manifest.metrics ?? {});
11
+ const allTerms = Object.values(manifest.terms ?? {});
12
+ const skills = [];
13
+ for (const domain of domains) {
14
+ const name = domain.name;
15
+ if (!name)
16
+ continue;
17
+ const metrics = allMetrics.filter((metric) => metric.domain === name);
18
+ const certifiedBlocks = blocks.filter((block) => block.domain === name && String(block.status ?? '').toLowerCase() === 'certified');
19
+ const terms = allTerms.filter((term) => term.domain === name);
20
+ const body = [
21
+ `# ${name} domain reference`,
22
+ '',
23
+ `Curated guidance for answering questions in the **${name}** domain. Prefer the`,
24
+ 'certified metrics and blocks below over ad-hoc SQL, and heed the caveats.',
25
+ '',
26
+ ];
27
+ body.push('## Preferred metrics');
28
+ body.push(metrics.length
29
+ ? metrics.map((m) => `- **${(m.label && m.label.trim()) || m.name}** (\`${m.name}\`)${m.description ? ` — ${m.description}` : ''}`).join('\n')
30
+ : '_No certified metrics in this domain yet._');
31
+ body.push('', '## Certified blocks');
32
+ body.push(certifiedBlocks.length
33
+ ? certifiedBlocks.map((b) => `- \`${b.name}\`${b.description ? ` — ${b.description}` : ''}`).join('\n')
34
+ : '_No certified blocks in this domain yet._');
35
+ const caveats = terms.flatMap((term) => (term.caveats ?? []).map((caveat) => `- ${term.name}: ${caveat}`));
36
+ if (caveats.length) {
37
+ body.push('', '## Gotchas', 'Domain caveats a senior analyst would warn about:', ...caveats);
38
+ }
39
+ body.push('', '_Auto-drafted from the manifest (W4.5). Edit to curate; it will not be overwritten on re-seed._');
40
+ const vocabulary = {};
41
+ for (const term of terms) {
42
+ vocabulary[term.name] = `term:${term.name}`;
43
+ for (const synonym of term.synonyms ?? [])
44
+ vocabulary[synonym] = `term:${term.name}`;
45
+ }
46
+ skills.push({
47
+ id: `domain-${slug(name)}`,
48
+ scope: 'project',
49
+ domain: name,
50
+ description: `Reference for the ${name} domain: preferred metrics, certified blocks, and gotchas.`,
51
+ preferredMetrics: metrics.map((m) => m.name),
52
+ preferredBlocks: certifiedBlocks.map((b) => b.name),
53
+ vocabulary,
54
+ body: body.join('\n'),
55
+ isStarter: true,
56
+ });
57
+ }
58
+ return skills;
59
+ }
60
+ /**
61
+ * Seed per-domain reference skills into `skills/`. Idempotent: a domain skill
62
+ * is written only when its file does not already exist, so curator edits are kept.
63
+ */
64
+ export function seedDomainSkills(projectRoot, manifest) {
65
+ const created = [];
66
+ const skipped = [];
67
+ for (const skill of buildDomainReferenceSkills(manifest)) {
68
+ if (existsSync(skillPath(projectRoot, skill.id))) {
69
+ skipped.push(skill.id);
70
+ continue;
71
+ }
72
+ created.push(writeSkill(projectRoot, skill));
73
+ }
74
+ return { created, skipped };
75
+ }
76
+ //# sourceMappingURL=domain-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-skills.js","sourceRoot":"","sources":["../../src/skills/domain-skills.ts"],"names":[],"mappings":"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"}
@@ -27,9 +27,21 @@ export interface Skill {
27
27
  user?: string;
28
28
  /** Optional domain this skill belongs to (spec 17, part B). */
29
29
  domain?: string;
30
+ /** Domain paths for cross-domain skills. `domain` remains backward compatible. */
31
+ domains?: string[];
32
+ kind?: 'domain_reference' | 'metric_policy' | 'glossary' | 'analysis_pattern' | 'sql_policy' | 'custom';
33
+ status?: 'draft' | 'active' | 'deprecated';
34
+ owner?: string;
35
+ triggers?: string[];
36
+ exclusions?: string[];
30
37
  description?: string;
31
38
  preferredMetrics: string[];
32
39
  preferredBlocks: string[];
40
+ preferredDimensions?: string[];
41
+ requiredFilters?: string[];
42
+ clarifyWhen?: string[];
43
+ examples?: string[];
44
+ sourceRefs?: string[];
33
45
  vocabulary: Record<string, string>;
34
46
  /** Markdown body (everything after the closing `---`). */
35
47
  body: string;
@@ -45,16 +57,20 @@ export interface SkillLoadResult {
45
57
  }>;
46
58
  }
47
59
  /**
48
- * Walk `<projectRoot>/.dql/skills/**` and return every parsed Skill.
60
+ * Walk the visible, Git-owned `skills/**` tree. The historical
61
+ * `.dql/skills/**` tree remains read-compatible during migration, but a skill
62
+ * with the same id in `skills/` wins so projects can move incrementally.
49
63
  * Misformed files are reported in `errors`; valid Skills still come back.
50
64
  */
51
65
  export declare function loadSkills(projectRoot: string): SkillLoadResult;
52
66
  /** Public for tests. */
53
67
  export declare function parseSkill(raw: string, path: string): Skill | null;
54
- /** Skills directory for a project. */
68
+ /** Visible Git-owned skills directory for new and upgraded OSS projects. */
55
69
  export declare function skillsDir(projectRoot: string): string;
70
+ /** Historical local-state location, retained only as a read/migration source. */
71
+ export declare function legacySkillsDir(projectRoot: string): string;
56
72
  /** Resolve the `.skill.md` path a skill should be written to. */
57
- export declare function skillPath(projectRoot: string, id: string): string;
73
+ export declare function skillPath(projectRoot: string, id: string, domains?: string[]): string;
58
74
  /**
59
75
  * Render a Skill back to the EXACT `.skill.md` format `parseSkill` consumes, so
60
76
  * `parseSkill(renderSkill(s))` round-trips. Only emits keys that have content.
@@ -65,22 +81,38 @@ export interface WriteSkillInput {
65
81
  scope: 'project' | 'personal';
66
82
  user?: string;
67
83
  domain?: string;
84
+ domains?: string[];
85
+ kind?: Skill['kind'];
86
+ status?: Skill['status'];
87
+ owner?: string;
88
+ triggers?: string[];
89
+ exclusions?: string[];
68
90
  description?: string;
69
91
  preferredMetrics?: string[];
70
92
  preferredBlocks?: string[];
93
+ preferredDimensions?: string[];
94
+ requiredFilters?: string[];
95
+ clarifyWhen?: string[];
96
+ examples?: string[];
97
+ sourceRefs?: string[];
71
98
  vocabulary?: Record<string, string>;
72
99
  body?: string;
73
100
  isStarter?: boolean;
74
101
  }
75
- /**
76
- * Write a skill to `.dql/skills/<id>.skill.md` (overwriting if present). Returns
77
- * the persisted Skill as re-read from disk so callers see the canonical form.
78
- */
102
+ /** Write a skill to `skills/<id>.skill.md`, the shared source location. */
79
103
  export declare function writeSkill(projectRoot: string, input: WriteSkillInput): Skill;
80
104
  /** Alias for `writeSkill` — create-or-update by id. */
81
105
  export declare function upsertSkill(projectRoot: string, input: WriteSkillInput): Skill;
82
- /** Delete `.dql/skills/<id>.skill.md`. Returns true when a file was removed. */
106
+ /** Delete a skill from its actual source path. Returns true when a file was removed. */
83
107
  export declare function deleteSkill(projectRoot: string, id: string): boolean;
108
+ /**
109
+ * Explicit one-way OSS layout upgrade. Moves legacy skills into the visible
110
+ * source tree without overwriting a skill already migrated by a teammate.
111
+ */
112
+ export declare function migrateLegacySkills(projectRoot: string): {
113
+ moved: string[];
114
+ skipped: string[];
115
+ };
84
116
  /**
85
117
  * Compose Skills into a single system-prompt fragment for the agent.
86
118
  * Filtered by user when a persona is active.
@@ -88,6 +120,10 @@ export declare function deleteSkill(projectRoot: string, id: string): boolean;
88
120
  export declare function buildSkillsPrompt(skills: Skill[], userId: string | null): string;
89
121
  export declare function activeSkills(skills: Skill[], userId: string | null): Skill[];
90
122
  export declare function buildSkillBlockHints(skills: Skill[], userId: string | null): string[];
123
+ /** Metric ids a selected skill may prefer, including vocabulary aliases. */
124
+ export declare function buildSkillMetricHints(skills: Skill[], userId: string | null): string[];
125
+ /** Add governed metric aliases to retrieval text without changing the user request. */
126
+ export declare function expandQuestionWithSkillVocabulary(question: string, skills: Skill[], userId: string | null): string;
91
127
  export interface SelectRelevantSkillsOptions {
92
128
  /** Active user — gates personal skills (only this user's are eligible). */
93
129
  userId?: string | null;
@@ -99,6 +135,8 @@ export interface SelectRelevantSkillsOptions {
99
135
  * kept when they are in-scope for the active user.
100
136
  */
101
137
  pinnedIds?: string[];
138
+ /** Domains inferred from the retrieved metadata context for this question. */
139
+ domains?: string[];
102
140
  }
103
141
  /**
104
142
  * Rank in-scope skills by topic/vocabulary match to `question` and return the
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}