@duckcodeailabs/dql-agent 1.11.10 → 1.12.1
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/agent-run-engine.d.ts.map +1 -1
- package/dist/agent-run-engine.js +7 -3
- package/dist/agent-run-engine.js.map +1 -1
- package/dist/answer-loop.d.ts +25 -1
- package/dist/answer-loop.d.ts.map +1 -1
- package/dist/answer-loop.js +141 -17
- package/dist/answer-loop.js.map +1 -1
- package/dist/conversation/rolling-summary.d.ts +23 -0
- package/dist/conversation/rolling-summary.d.ts.map +1 -1
- package/dist/conversation/rolling-summary.js +64 -0
- package/dist/conversation/rolling-summary.js.map +1 -1
- package/dist/conversation/session-store.d.ts +18 -2
- package/dist/conversation/session-store.d.ts.map +1 -1
- package/dist/conversation/session-store.js +65 -8
- package/dist/conversation/session-store.js.map +1 -1
- package/dist/conversation/snapshot.d.ts +37 -4
- package/dist/conversation/snapshot.d.ts.map +1 -1
- package/dist/conversation/snapshot.js +115 -6
- package/dist/conversation/snapshot.js.map +1 -1
- package/dist/hints/correction-eval.d.ts.map +1 -1
- package/dist/hints/correction-eval.js +4 -6
- package/dist/hints/correction-eval.js.map +1 -1
- package/dist/hints/dependencies.d.ts +63 -0
- package/dist/hints/dependencies.d.ts.map +1 -0
- package/dist/hints/dependencies.js +196 -0
- package/dist/hints/dependencies.js.map +1 -0
- package/dist/hints/git-store.d.ts +55 -2
- package/dist/hints/git-store.d.ts.map +1 -1
- package/dist/hints/git-store.js +246 -11
- package/dist/hints/git-store.js.map +1 -1
- package/dist/hints/graph.d.ts +17 -0
- package/dist/hints/graph.d.ts.map +1 -0
- package/dist/hints/graph.js +222 -0
- package/dist/hints/graph.js.map +1 -0
- package/dist/hints/lifecycle.d.ts +107 -0
- package/dist/hints/lifecycle.d.ts.map +1 -0
- package/dist/hints/lifecycle.js +415 -0
- package/dist/hints/lifecycle.js.map +1 -0
- package/dist/hints/retrieval.d.ts +13 -1
- package/dist/hints/retrieval.d.ts.map +1 -1
- package/dist/hints/retrieval.js +74 -11
- package/dist/hints/retrieval.js.map +1 -1
- package/dist/hints/store.d.ts +9 -2
- package/dist/hints/store.d.ts.map +1 -1
- package/dist/hints/store.js +155 -15
- package/dist/hints/store.js.map +1 -1
- package/dist/hints/types.d.ts +63 -3
- package/dist/hints/types.d.ts.map +1 -1
- package/dist/hints/types.js +1 -1
- package/dist/hints/types.js.map +1 -1
- package/dist/index.d.ts +17 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -6
- package/dist/index.js.map +1 -1
- package/dist/intent-controller.d.ts.map +1 -1
- package/dist/intent-controller.js +24 -3
- package/dist/intent-controller.js.map +1 -1
- package/dist/metadata/catalog.d.ts +32 -0
- package/dist/metadata/catalog.d.ts.map +1 -1
- package/dist/metadata/catalog.js +86 -4
- package/dist/metadata/catalog.js.map +1 -1
- package/dist/metadata/sql-context-validation.d.ts.map +1 -1
- package/dist/metadata/sql-context-validation.js +16 -0
- package/dist/metadata/sql-context-validation.js.map +1 -1
- package/dist/metadata/sql-grounding.d.ts +7 -0
- package/dist/metadata/sql-grounding.d.ts.map +1 -1
- package/dist/metadata/sql-grounding.js +26 -1
- package/dist/metadata/sql-grounding.js.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +32 -9
- package/dist/router.js.map +1 -1
- package/dist/skills/loader.js +1 -1
- package/dist/skills/loader.js.map +1 -1
- package/dist/tools/registry.js +5 -5
- package/dist/tools/registry.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { analyzeSqlReferences } from '@duckcodeailabs/dql-core';
|
|
2
|
+
const HIGH_SIGNAL_EDGE_KINDS = new Set([
|
|
3
|
+
'belongs_to_domain',
|
|
4
|
+
'refines_metric',
|
|
5
|
+
'uses_dbt_model',
|
|
6
|
+
'refines_term',
|
|
7
|
+
'relates_to_block',
|
|
8
|
+
]);
|
|
9
|
+
/**
|
|
10
|
+
* Materialize a hint's typed graph connections from governed scope,
|
|
11
|
+
* dependencies, lifecycle provenance, and parsed corrected SQL.
|
|
12
|
+
*/
|
|
13
|
+
export function buildHintGraphEdges(hint) {
|
|
14
|
+
const edges = new Map();
|
|
15
|
+
const add = (edge) => {
|
|
16
|
+
edges.set(`${edge.kind}\0${edge.targetId}`, edge);
|
|
17
|
+
};
|
|
18
|
+
for (const edge of scopeEdges(hint.id, hint.scope))
|
|
19
|
+
add(edge);
|
|
20
|
+
for (const dependency of hint.dependencies ?? []) {
|
|
21
|
+
add({
|
|
22
|
+
hintId: hint.id,
|
|
23
|
+
kind: dependencyEdgeKind(dependency.kind),
|
|
24
|
+
targetId: normalizeTargetId(dependency.id),
|
|
25
|
+
targetKind: dependency.kind,
|
|
26
|
+
targetName: dependency.name,
|
|
27
|
+
fingerprint: dependency.fingerprint,
|
|
28
|
+
source: 'dependency',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (hint.correctedSql?.trim()) {
|
|
32
|
+
const analysis = analyzeSqlReferences(hint.correctedSql, hint.scope.dialect);
|
|
33
|
+
const internalRelations = new Set([...analysis.ctes, ...analysis.derivedRelations].map(normalizeRelation));
|
|
34
|
+
for (const relation of analysis.tables) {
|
|
35
|
+
const normalizedRelation = normalizeRelation(relation);
|
|
36
|
+
add({
|
|
37
|
+
hintId: hint.id,
|
|
38
|
+
kind: 'uses_relation',
|
|
39
|
+
targetId: `relation:${normalizedRelation}`,
|
|
40
|
+
targetKind: 'relation',
|
|
41
|
+
targetName: relation,
|
|
42
|
+
source: 'corrected_sql',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
for (const column of analysis.columns) {
|
|
46
|
+
if (!column.relation || column.outputAliasReference)
|
|
47
|
+
continue;
|
|
48
|
+
const normalizedRelation = normalizeRelation(column.relation);
|
|
49
|
+
if (internalRelations.has(normalizedRelation))
|
|
50
|
+
continue;
|
|
51
|
+
const normalizedColumn = normalizeName(column.column);
|
|
52
|
+
add({
|
|
53
|
+
hintId: hint.id,
|
|
54
|
+
kind: 'uses_column',
|
|
55
|
+
targetId: `column:${normalizedRelation}.${normalizedColumn}`,
|
|
56
|
+
targetKind: 'column',
|
|
57
|
+
targetName: `${column.relation}.${column.column}`,
|
|
58
|
+
source: 'corrected_sql',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (hint.traceId) {
|
|
63
|
+
add({
|
|
64
|
+
hintId: hint.id,
|
|
65
|
+
kind: 'derived_from',
|
|
66
|
+
targetId: `trace:${normalizeName(hint.traceId)}`,
|
|
67
|
+
targetKind: 'trace',
|
|
68
|
+
targetName: hint.traceId,
|
|
69
|
+
source: 'lifecycle',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (hint.evaluationId) {
|
|
73
|
+
add({
|
|
74
|
+
hintId: hint.id,
|
|
75
|
+
kind: 'validated_by',
|
|
76
|
+
targetId: `evaluation:${normalizeName(hint.evaluationId)}`,
|
|
77
|
+
targetKind: 'evaluation',
|
|
78
|
+
targetName: hint.evaluationId,
|
|
79
|
+
source: 'lifecycle',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (hint.supersedes) {
|
|
83
|
+
add({
|
|
84
|
+
hintId: hint.id,
|
|
85
|
+
kind: 'supersedes',
|
|
86
|
+
targetId: `hint:${normalizeName(hint.supersedes)}`,
|
|
87
|
+
targetKind: 'hint',
|
|
88
|
+
targetName: hint.supersedes,
|
|
89
|
+
source: 'lifecycle',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return [...edges.values()].sort((left, right) => left.kind.localeCompare(right.kind) || left.targetId.localeCompare(right.targetId));
|
|
93
|
+
}
|
|
94
|
+
/** Graph targets resolved for a new question. */
|
|
95
|
+
export function questionHintGraphTargetIds(scope) {
|
|
96
|
+
const targets = new Set();
|
|
97
|
+
for (const edge of scopeEdges('__question__', scope))
|
|
98
|
+
targets.add(edge.targetId);
|
|
99
|
+
for (const relation of scope.relations ?? []) {
|
|
100
|
+
targets.add(`relation:${normalizeRelation(relation)}`);
|
|
101
|
+
}
|
|
102
|
+
for (const column of scope.columns ?? []) {
|
|
103
|
+
const normalized = normalizeQualifiedColumn(column);
|
|
104
|
+
if (normalized)
|
|
105
|
+
targets.add(`column:${normalized}`);
|
|
106
|
+
}
|
|
107
|
+
return targets;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* High-signal targets may recall a hint even when wording differs. Relation and
|
|
111
|
+
* column edges deliberately only rank/explain a recalled hint: schema overlap
|
|
112
|
+
* alone is too broad to make a correction applicable.
|
|
113
|
+
*/
|
|
114
|
+
export function highSignalHintGraphTargetIds(scope) {
|
|
115
|
+
const targets = new Set();
|
|
116
|
+
for (const edge of scopeEdges('__question__', scope)) {
|
|
117
|
+
if (HIGH_SIGNAL_EDGE_KINDS.has(edge.kind))
|
|
118
|
+
targets.add(edge.targetId);
|
|
119
|
+
}
|
|
120
|
+
return targets;
|
|
121
|
+
}
|
|
122
|
+
export function describeHintGraphOverlap(edges, targets) {
|
|
123
|
+
const matched = edges.filter((edge) => targets.has(edge.targetId));
|
|
124
|
+
if (matched.length === 0)
|
|
125
|
+
return undefined;
|
|
126
|
+
const grouped = new Map();
|
|
127
|
+
for (const edge of matched) {
|
|
128
|
+
const values = grouped.get(edge.targetKind) ?? [];
|
|
129
|
+
if (!values.includes(edge.targetName))
|
|
130
|
+
values.push(edge.targetName);
|
|
131
|
+
grouped.set(edge.targetKind, values);
|
|
132
|
+
}
|
|
133
|
+
return [...grouped.entries()]
|
|
134
|
+
.map(([kind, names]) => `${kind}=${names.slice(0, 4).join(', ')}`)
|
|
135
|
+
.join('; ');
|
|
136
|
+
}
|
|
137
|
+
export function hintGraphOverlapScore(edges, targets) {
|
|
138
|
+
let score = 0;
|
|
139
|
+
for (const edge of edges) {
|
|
140
|
+
if (!targets.has(edge.targetId))
|
|
141
|
+
continue;
|
|
142
|
+
score += edgeWeight(edge.kind);
|
|
143
|
+
}
|
|
144
|
+
return Math.min(score, 0.85);
|
|
145
|
+
}
|
|
146
|
+
function scopeEdges(hintId, scope) {
|
|
147
|
+
const edges = [];
|
|
148
|
+
const add = (kind, targetKind, value) => {
|
|
149
|
+
if (!value?.trim())
|
|
150
|
+
return;
|
|
151
|
+
edges.push({
|
|
152
|
+
hintId,
|
|
153
|
+
kind,
|
|
154
|
+
targetId: `${targetKind}:${normalizeName(value)}`,
|
|
155
|
+
targetKind,
|
|
156
|
+
targetName: value,
|
|
157
|
+
source: 'scope',
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
add('belongs_to_domain', 'domain', scope.domain);
|
|
161
|
+
add('refines_metric', 'metric', scope.metric);
|
|
162
|
+
add('uses_dbt_model', 'dbt_model', scope.dbtModel);
|
|
163
|
+
add('refines_term', 'term', scope.term);
|
|
164
|
+
add('relates_to_block', 'block', scope.block);
|
|
165
|
+
add('uses_dialect', 'dialect', scope.dialect);
|
|
166
|
+
if ('metrics' in scope) {
|
|
167
|
+
for (const metric of scope.metrics ?? [])
|
|
168
|
+
add('refines_metric', 'metric', metric);
|
|
169
|
+
for (const model of scope.dbtModels ?? [])
|
|
170
|
+
add('uses_dbt_model', 'dbt_model', model);
|
|
171
|
+
}
|
|
172
|
+
return edges;
|
|
173
|
+
}
|
|
174
|
+
function dependencyEdgeKind(kind) {
|
|
175
|
+
if (kind === 'domain')
|
|
176
|
+
return 'belongs_to_domain';
|
|
177
|
+
if (kind === 'metric')
|
|
178
|
+
return 'refines_metric';
|
|
179
|
+
if (kind === 'dbt_model')
|
|
180
|
+
return 'uses_dbt_model';
|
|
181
|
+
if (kind === 'relation')
|
|
182
|
+
return 'uses_relation';
|
|
183
|
+
if (kind === 'term')
|
|
184
|
+
return 'refines_term';
|
|
185
|
+
if (kind === 'block')
|
|
186
|
+
return 'relates_to_block';
|
|
187
|
+
return 'depends_on';
|
|
188
|
+
}
|
|
189
|
+
function edgeWeight(kind) {
|
|
190
|
+
if (kind === 'refines_metric' || kind === 'relates_to_block')
|
|
191
|
+
return 0.3;
|
|
192
|
+
if (kind === 'belongs_to_domain' || kind === 'uses_dbt_model' || kind === 'refines_term')
|
|
193
|
+
return 0.22;
|
|
194
|
+
if (kind === 'uses_relation')
|
|
195
|
+
return 0.12;
|
|
196
|
+
if (kind === 'uses_column')
|
|
197
|
+
return 0.06;
|
|
198
|
+
if (kind === 'uses_dialect')
|
|
199
|
+
return 0.03;
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
function normalizeTargetId(value) {
|
|
203
|
+
const [kind, ...rest] = value.split(':');
|
|
204
|
+
return rest.length > 0
|
|
205
|
+
? `${normalizeName(kind)}:${normalizeName(rest.join(':'))}`
|
|
206
|
+
: normalizeName(value);
|
|
207
|
+
}
|
|
208
|
+
function normalizeQualifiedColumn(value) {
|
|
209
|
+
const normalized = value.replace(/["`\[\]]/g, '').trim().toLowerCase();
|
|
210
|
+
const parts = normalized.split('.').filter(Boolean);
|
|
211
|
+
if (parts.length < 2)
|
|
212
|
+
return undefined;
|
|
213
|
+
const column = parts.pop();
|
|
214
|
+
return `${parts.join('.')}.${column}`;
|
|
215
|
+
}
|
|
216
|
+
function normalizeRelation(value) {
|
|
217
|
+
return value.replace(/["`\[\]]/g, '').trim().toLowerCase();
|
|
218
|
+
}
|
|
219
|
+
function normalizeName(value) {
|
|
220
|
+
return value.trim().toLowerCase();
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/hints/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { type RecordCorrectionTraceInput, type RecordCorrectionTraceResult, type ReviewHintResult } from './git-store.js';
|
|
2
|
+
import type { HintDependency, HintEvaluation, HintEvaluationCheck, HintScope, Hint, CorrectionTrace } from './types.js';
|
|
3
|
+
export interface GovernedHintContext {
|
|
4
|
+
snapshotId: string;
|
|
5
|
+
dependencies: HintDependency[];
|
|
6
|
+
checks: HintEvaluationCheck[];
|
|
7
|
+
evidence: string[];
|
|
8
|
+
}
|
|
9
|
+
export type ResolveGovernedHintContext = (input: {
|
|
10
|
+
projectRoot: string;
|
|
11
|
+
question: string;
|
|
12
|
+
correctedSql?: string;
|
|
13
|
+
scope: HintScope;
|
|
14
|
+
snapshotId?: string;
|
|
15
|
+
}) => Promise<GovernedHintContext>;
|
|
16
|
+
export interface GovernedHintExecutionResult {
|
|
17
|
+
columns: unknown[];
|
|
18
|
+
rows: unknown[];
|
|
19
|
+
rowCount: number;
|
|
20
|
+
sql?: string;
|
|
21
|
+
executionReceipt?: unknown;
|
|
22
|
+
}
|
|
23
|
+
export type ExecuteGovernedHintSql = (sql: string, options: {
|
|
24
|
+
rowLimit: number;
|
|
25
|
+
question: string;
|
|
26
|
+
}) => Promise<GovernedHintExecutionResult>;
|
|
27
|
+
export interface RecordGovernedCorrectionInput extends Omit<RecordCorrectionTraceInput, 'failedRoute' | 'evidence' | 'snapshotId' | 'requiredEvaluation' | 'dependencies' | 'lifecycleErrors'> {
|
|
28
|
+
failedRoute?: string;
|
|
29
|
+
evidence?: string[];
|
|
30
|
+
snapshotId?: string;
|
|
31
|
+
requiredEvaluation?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ReviewGovernedHintInput {
|
|
34
|
+
hintId: string;
|
|
35
|
+
decision: 'approved' | 'rejected';
|
|
36
|
+
reviewer: string;
|
|
37
|
+
note?: string;
|
|
38
|
+
snapshotId?: string;
|
|
39
|
+
rowLimit?: number;
|
|
40
|
+
executeSql?: ExecuteGovernedHintSql;
|
|
41
|
+
resolveContext?: ResolveGovernedHintContext;
|
|
42
|
+
}
|
|
43
|
+
export interface ReviewGovernedHintResult extends ReviewHintResult {
|
|
44
|
+
evaluation?: HintEvaluation;
|
|
45
|
+
}
|
|
46
|
+
export interface GovernedHintInspection {
|
|
47
|
+
hint: Hint;
|
|
48
|
+
trace?: CorrectionTrace;
|
|
49
|
+
evaluation?: HintEvaluation;
|
|
50
|
+
currentSnapshotId: string;
|
|
51
|
+
snapshotCurrent: boolean;
|
|
52
|
+
dependenciesCurrent: boolean;
|
|
53
|
+
driftedDependencies: HintDependency[];
|
|
54
|
+
checks: HintEvaluationCheck[];
|
|
55
|
+
state: 'current' | 'stale' | 'invalid' | 'unverified';
|
|
56
|
+
}
|
|
57
|
+
export interface EditGovernedHintCandidateInput {
|
|
58
|
+
hintId: string;
|
|
59
|
+
title?: string;
|
|
60
|
+
guidance?: string;
|
|
61
|
+
correctedSql?: string;
|
|
62
|
+
scope?: HintScope;
|
|
63
|
+
snapshotId?: string;
|
|
64
|
+
resolveContext?: ResolveGovernedHintContext;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Shared correction capture path for the notebook API, CLI runtime, and MCP.
|
|
68
|
+
* Capture remains permissive: unsafe or unresolved corrections are retained as
|
|
69
|
+
* candidates with lifecycle errors, but can never pass approval.
|
|
70
|
+
*/
|
|
71
|
+
export declare function recordGovernedCorrection(projectRoot: string, input: RecordGovernedCorrectionInput, resolveContext?: ResolveGovernedHintContext): Promise<RecordCorrectionTraceResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Do not let a SQL-only correction silently become the reusable lesson. Older
|
|
74
|
+
* clients may omit `hintGuidance`, so preserve a human-written correction when
|
|
75
|
+
* one exists and otherwise derive a conservative, reviewable instruction.
|
|
76
|
+
*/
|
|
77
|
+
export declare function deriveCorrectionGuidance(input: Pick<RecordGovernedCorrectionInput, 'question' | 'scope' | 'correction' | 'correctedSql' | 'hintGuidance'>): string;
|
|
78
|
+
/**
|
|
79
|
+
* Shared fail-closed review path. A v3 approval always creates a fresh
|
|
80
|
+
* evaluation artifact, so a failed attempt remains reviewable and retryable.
|
|
81
|
+
*/
|
|
82
|
+
export declare function reviewGovernedHint(projectRoot: string, input: ReviewGovernedHintInput): Promise<ReviewGovernedHintResult | null>;
|
|
83
|
+
/** CTX-005 / API-003: read-only live inspection used by review surfaces and lifecycle decisions. */
|
|
84
|
+
export declare function inspectGovernedHint(projectRoot: string, input: {
|
|
85
|
+
hintId: string;
|
|
86
|
+
snapshotId?: string;
|
|
87
|
+
resolveContext?: ResolveGovernedHintContext;
|
|
88
|
+
}): Promise<GovernedHintInspection | null>;
|
|
89
|
+
/** CTX-005 / E2E-001: explicit edit revalidates provenance and clears prior evaluation state. */
|
|
90
|
+
export declare function editGovernedHintCandidate(projectRoot: string, input: EditGovernedHintCandidateInput): Promise<Hint | null>;
|
|
91
|
+
/** CTX-005: reopen an applied/retired hint as a non-retrievable candidate against current context. */
|
|
92
|
+
export declare function reopenGovernedHint(projectRoot: string, input: {
|
|
93
|
+
hintId: string;
|
|
94
|
+
reviewer: string;
|
|
95
|
+
note?: string;
|
|
96
|
+
snapshotId?: string;
|
|
97
|
+
resolveContext?: ResolveGovernedHintContext;
|
|
98
|
+
}): Promise<ReviewHintResult | null>;
|
|
99
|
+
/** Resolve current SQL authorization and content-addressed dependencies. */
|
|
100
|
+
export declare function resolveGovernedHintContext(input: {
|
|
101
|
+
projectRoot: string;
|
|
102
|
+
question: string;
|
|
103
|
+
correctedSql?: string;
|
|
104
|
+
scope: HintScope;
|
|
105
|
+
snapshotId?: string;
|
|
106
|
+
}): Promise<GovernedHintContext>;
|
|
107
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/hints/lifecycle.ts"],"names":[],"mappings":"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"}
|