@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
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* a few verbatim recent turns + how the new question relates to the topic.
|
|
5
5
|
*/
|
|
6
6
|
import { parseWorkingState, reduceWorkingState, } from './working-state.js';
|
|
7
|
-
import { updateRollingSummary } from './rolling-summary.js';
|
|
7
|
+
import { renderStructuredConversationSummary, updateRollingSummary, updateStructuredConversationSummary, } from './rolling-summary.js';
|
|
8
8
|
import { buildAnalysisQuestionPlan } from '../metadata/analysis-planner.js';
|
|
9
|
-
import { hybridRank } from '../embeddings/provider.js';
|
|
9
|
+
import { envEmbeddingProvider, hybridRank } from '../embeddings/provider.js';
|
|
10
10
|
const RECENT_TURNS = 4;
|
|
11
11
|
/**
|
|
12
12
|
* Build the snapshot for a new question. When the question starts a genuinely
|
|
@@ -26,12 +26,22 @@ export function buildConversationSnapshot(store, threadId, options = {}) {
|
|
|
26
26
|
workingState = { ...workingState, filters: [] };
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
const latest = recent[recent.length - 1];
|
|
29
30
|
return {
|
|
31
|
+
version: 1,
|
|
30
32
|
threadId,
|
|
33
|
+
surface: thread.surface,
|
|
31
34
|
rollingSummary: thread.rollingSummary,
|
|
35
|
+
structuredSummary: thread.structuredSummary,
|
|
32
36
|
workingState: hasWorkingState(workingState) ? workingState : undefined,
|
|
33
37
|
recentTurns: recent.map(snapshotTurn),
|
|
34
38
|
topicRelation,
|
|
39
|
+
pendingClarification: latest && (latest.route === 'clarify' || latest.runStatus === 'needs_clarification')
|
|
40
|
+
? {
|
|
41
|
+
sourceTurnId: latest.id,
|
|
42
|
+
question: latest.answerSummary ?? latest.answerText ?? latest.question,
|
|
43
|
+
}
|
|
44
|
+
: undefined,
|
|
35
45
|
};
|
|
36
46
|
}
|
|
37
47
|
/**
|
|
@@ -53,9 +63,16 @@ export function advanceThreadState(store, threadId, turn) {
|
|
|
53
63
|
const rollingSummary = compactable.length > 0
|
|
54
64
|
? updateRollingSummary({ previousSummary: thread.rollingSummary, compactedTurns: compactable })
|
|
55
65
|
: thread.rollingSummary;
|
|
66
|
+
const structuredSummary = compactable.length > 0
|
|
67
|
+
? updateStructuredConversationSummary({
|
|
68
|
+
previousSummary: thread.structuredSummary,
|
|
69
|
+
compactedTurns: compactable,
|
|
70
|
+
})
|
|
71
|
+
: thread.structuredSummary;
|
|
56
72
|
store.updateThreadState(threadId, {
|
|
57
73
|
workingState: state,
|
|
58
74
|
rollingSummary,
|
|
75
|
+
...(structuredSummary ? { structuredSummary } : {}),
|
|
59
76
|
summaryTurnSeq: compactable.length > 0
|
|
60
77
|
? compactable[compactable.length - 1].seq
|
|
61
78
|
: thread.summaryTurnSeq,
|
|
@@ -67,9 +84,10 @@ export function advanceThreadState(store, threadId, turn) {
|
|
|
67
84
|
}
|
|
68
85
|
/**
|
|
69
86
|
* Semantic recall over the thread's OLDER turns ("what did we discuss about X?").
|
|
70
|
-
* FTS candidates re-ranked with the
|
|
71
|
-
* (
|
|
72
|
-
* window are excluded; returns at most
|
|
87
|
+
* FTS candidates are re-ranked with the configured project embedding provider
|
|
88
|
+
* (and the deterministic local fallback when no provider is configured).
|
|
89
|
+
* Turns already in the recent verbatim window are excluded; returns at most
|
|
90
|
+
* `limit` hits. Never throws.
|
|
73
91
|
*/
|
|
74
92
|
export async function recallRelevantTurns(store, threadId, question, options = {}) {
|
|
75
93
|
try {
|
|
@@ -83,13 +101,86 @@ export async function recallRelevantTurns(store, threadId, question, options = {
|
|
|
83
101
|
// FTS returns rank-ordered rows; convert position to a [0,1] score.
|
|
84
102
|
ftsScore: 1 - index / candidates.length,
|
|
85
103
|
text: `${turn.question} ${turn.answerSummary ?? ''}`,
|
|
86
|
-
})), { alpha: 0.4 });
|
|
104
|
+
})), { alpha: 0.4, provider: envEmbeddingProvider() });
|
|
87
105
|
return ranked.slice(0, options.limit ?? 3).map((entry) => snapshotTurn(entry.item));
|
|
88
106
|
}
|
|
89
107
|
catch {
|
|
90
108
|
return [];
|
|
91
109
|
}
|
|
92
110
|
}
|
|
111
|
+
/** Read the canonical server envelope while accepting the original key during upgrades. */
|
|
112
|
+
export function conversationEnvelopeFromContext(context) {
|
|
113
|
+
if (!context)
|
|
114
|
+
return undefined;
|
|
115
|
+
const raw = context.conversationEnvelope ?? context.serverSnapshot;
|
|
116
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
117
|
+
return undefined;
|
|
118
|
+
const envelope = raw;
|
|
119
|
+
if (typeof envelope.threadId !== 'string' || !Array.isArray(envelope.recentTurns))
|
|
120
|
+
return undefined;
|
|
121
|
+
return {
|
|
122
|
+
...envelope,
|
|
123
|
+
version: 1,
|
|
124
|
+
surface: typeof envelope.surface === 'string' ? envelope.surface : 'agent',
|
|
125
|
+
threadId: envelope.threadId,
|
|
126
|
+
recentTurns: envelope.recentTurns,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* One bounded history projection for routing, meaning resolution, planning and
|
|
131
|
+
* execution fallbacks. Review/blocked state is explicit so prose cannot silently
|
|
132
|
+
* become trusted analytical context.
|
|
133
|
+
*/
|
|
134
|
+
export function conversationHistoryFromContext(context, limit = 6) {
|
|
135
|
+
const envelope = conversationEnvelopeFromContext(context);
|
|
136
|
+
if (!envelope)
|
|
137
|
+
return [];
|
|
138
|
+
return envelope.recentTurns.slice(-Math.max(1, limit)).flatMap((turn) => {
|
|
139
|
+
const answer = turn.answerSummary?.trim();
|
|
140
|
+
return [
|
|
141
|
+
{ role: 'user', text: turn.question },
|
|
142
|
+
...(answer
|
|
143
|
+
? [{
|
|
144
|
+
role: 'assistant',
|
|
145
|
+
text: `[${conversationTurnContextState(turn)}] ${answer}`,
|
|
146
|
+
}]
|
|
147
|
+
: []),
|
|
148
|
+
];
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/** Compact non-prose context shared by every orchestration stage. */
|
|
152
|
+
export function renderConversationEnvelopeForPrompt(context) {
|
|
153
|
+
const envelope = conversationEnvelopeFromContext(context);
|
|
154
|
+
if (!envelope)
|
|
155
|
+
return undefined;
|
|
156
|
+
const state = envelope.workingState
|
|
157
|
+
? parseWorkingState(envelope.workingState)
|
|
158
|
+
: undefined;
|
|
159
|
+
const summary = renderStructuredConversationSummary(envelope.structuredSummary)
|
|
160
|
+
?? envelope.rollingSummary;
|
|
161
|
+
const stateLines = state
|
|
162
|
+
? [
|
|
163
|
+
state.topicKey ? `active topic: ${state.topicKey}` : '',
|
|
164
|
+
state.entities.length ? `entities: ${state.entities.join(', ')}` : '',
|
|
165
|
+
state.measures.length ? `measures: ${state.measures.join(', ')}` : '',
|
|
166
|
+
state.dimensions.length ? `dimensions: ${state.dimensions.join(', ')}` : '',
|
|
167
|
+
state.filters.length ? `filters: ${state.filters.map((filter) => filter.value).join(', ')}` : '',
|
|
168
|
+
state.timeframe ? `timeframe: ${state.timeframe}` : '',
|
|
169
|
+
state.limit !== undefined ? `limit: ${state.limit}` : '',
|
|
170
|
+
].filter(Boolean)
|
|
171
|
+
: [];
|
|
172
|
+
const lines = [
|
|
173
|
+
`thread: ${envelope.threadId}`,
|
|
174
|
+
`surface: ${envelope.surface}`,
|
|
175
|
+
envelope.topicRelation ? `new-turn relation: ${envelope.topicRelation}` : '',
|
|
176
|
+
...stateLines,
|
|
177
|
+
envelope.pendingClarification
|
|
178
|
+
? `pending clarification: ${envelope.pendingClarification.question}`
|
|
179
|
+
: '',
|
|
180
|
+
summary ? `older trusted-state summary:\n${summary}` : '',
|
|
181
|
+
].filter(Boolean);
|
|
182
|
+
return lines.length > 0 ? lines.join('\n') : undefined;
|
|
183
|
+
}
|
|
93
184
|
/** Classify the NEW question against the current topic key (same Jaccard rule as the reducer). */
|
|
94
185
|
function classifyQuestionRelation(state, question) {
|
|
95
186
|
const plan = buildAnalysisQuestionPlan(question);
|
|
@@ -130,6 +221,9 @@ function snapshotTurn(turn) {
|
|
|
130
221
|
question: turn.question,
|
|
131
222
|
answerSummary: turn.answerSummary,
|
|
132
223
|
route: turn.route,
|
|
224
|
+
trustLabel: turn.trustLabel,
|
|
225
|
+
runStatus: turn.runStatus,
|
|
226
|
+
stopReason: turn.stopReason,
|
|
133
227
|
sourceCertifiedBlock: turn.sourceCertifiedBlock,
|
|
134
228
|
contextPackId: turn.contextPackId,
|
|
135
229
|
knowledgeLens: turn.knowledgeLens,
|
|
@@ -141,6 +235,21 @@ function snapshotTurn(turn) {
|
|
|
141
235
|
cascade: turn.cascade,
|
|
142
236
|
};
|
|
143
237
|
}
|
|
238
|
+
export function conversationTurnContextState(turn) {
|
|
239
|
+
if (turn.runStatus === 'blocked' || turn.trustLabel === 'blocked' || turn.route === 'blocked') {
|
|
240
|
+
return 'blocked';
|
|
241
|
+
}
|
|
242
|
+
if (turn.runStatus === 'needs_clarification' || turn.route === 'clarify') {
|
|
243
|
+
return 'unresolved';
|
|
244
|
+
}
|
|
245
|
+
if (turn.runStatus === 'needs_review' || turn.trustLabel === 'review_required') {
|
|
246
|
+
return 'provisional';
|
|
247
|
+
}
|
|
248
|
+
if (turn.trustLabel === 'certified' || turn.trustLabel === 'governed' || turn.trustLabel === 'grounded') {
|
|
249
|
+
return 'confirmed';
|
|
250
|
+
}
|
|
251
|
+
return 'context';
|
|
252
|
+
}
|
|
144
253
|
function hasWorkingState(state) {
|
|
145
254
|
return state.entities.length > 0
|
|
146
255
|
|| state.measures.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/conversation/snapshot.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/conversation/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"correction-eval.d.ts","sourceRoot":"","sources":["../../src/hints/correction-eval.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"correction-eval.d.ts","sourceRoot":"","sources":["../../src/hints/correction-eval.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACtC;AAED,eAAO,MAAM,8BAA8B,4CAA4C,CAAC;AAExF;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,kBAAkB,CAU5H;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAoBlG;AAED,yDAAyD;AACzD,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEpI"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Corrections become regression eval cases (W4.3).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* project's `agent-evals/corrections.agent-evals.yml`, which `dql agent eval` reads.
|
|
9
|
-
* This is the Anthropic pattern — a stakeholder correction turns into a durable test.
|
|
4
|
+
* Explicit utility for turning a reviewed correction into an agent-eval case.
|
|
5
|
+
* Correction capture does not call this automatically: writing a regression
|
|
6
|
+
* source is a separate authoring action. The generated assertion only checks
|
|
7
|
+
* referenced relations and is not semantic proof for hint approval.
|
|
10
8
|
*/
|
|
11
9
|
import { analyzeSqlReferences } from '@duckcodeailabs/dql-core';
|
|
12
10
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"correction-eval.js","sourceRoot":"","sources":["../../src/hints/correction-eval.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"correction-eval.js","sourceRoot":"","sources":["../../src/hints/correction-eval.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAQ3B,MAAM,CAAC,MAAM,8BAA8B,GAAG,yCAAyC,CAAC;AAExF;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAgE;IACtG,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;SAC7F,MAAM,CAAC,OAAO,CAAC;SACf,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACf,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,eAAe,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;QAChE,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;KACjE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB,EAAE,QAA4B;IACxF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,8BAA8B,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAiD,CAAC;YACrG,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IAClG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,yEAAyE;UACpF,qFAAqF;UACrF,2EAA2E,CAAC;IAChF,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,KAAgE;IAC1H,OAAO,wBAAwB,CAAC,WAAW,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { HintDependency, HintScope } from './types.js';
|
|
2
|
+
export interface HintDependencyObject {
|
|
3
|
+
objectKey: string;
|
|
4
|
+
objectType: string;
|
|
5
|
+
name: string;
|
|
6
|
+
fullName?: string;
|
|
7
|
+
domain?: string;
|
|
8
|
+
sourcePath?: string;
|
|
9
|
+
status?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
payload?: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface HintDependencyRelation {
|
|
14
|
+
relation: string;
|
|
15
|
+
name: string;
|
|
16
|
+
objectKey?: string;
|
|
17
|
+
source: string;
|
|
18
|
+
columns: Array<{
|
|
19
|
+
name: string;
|
|
20
|
+
type?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
}>;
|
|
23
|
+
columnCompleteness?: 'complete' | 'partial';
|
|
24
|
+
}
|
|
25
|
+
export interface CollectedHintDependencies {
|
|
26
|
+
dependencies: HintDependency[];
|
|
27
|
+
referencedRelations: string[];
|
|
28
|
+
unknownRelations: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface HintFreshnessAssessment {
|
|
31
|
+
snapshotCurrent: boolean;
|
|
32
|
+
dependenciesCurrent: boolean;
|
|
33
|
+
staleDependencies: HintDependency[];
|
|
34
|
+
/**
|
|
35
|
+
* Dependency-bearing hints are scoped: an unrelated project snapshot change
|
|
36
|
+
* does not invalidate them when every recorded dependency still matches.
|
|
37
|
+
* Legacy hints without dependency evidence fall back to the project snapshot.
|
|
38
|
+
*/
|
|
39
|
+
current: boolean;
|
|
40
|
+
}
|
|
41
|
+
/** Content-address the governed relation/object inputs used by a hint. */
|
|
42
|
+
export declare function collectHintDependencies(input: {
|
|
43
|
+
sql?: string;
|
|
44
|
+
scope: HintScope;
|
|
45
|
+
objects: HintDependencyObject[];
|
|
46
|
+
relations: HintDependencyRelation[];
|
|
47
|
+
/** Conservative fingerprint when a scoped object is not in the bounded pack. */
|
|
48
|
+
fallbackFingerprint?: string;
|
|
49
|
+
}): CollectedHintDependencies;
|
|
50
|
+
/** Build the current dependency lookup used by retrieval-time drift gates. */
|
|
51
|
+
export declare function currentHintDependencyFingerprints(input: {
|
|
52
|
+
objects: HintDependencyObject[];
|
|
53
|
+
relations: HintDependencyRelation[];
|
|
54
|
+
}): Map<string, string>;
|
|
55
|
+
export declare function staleHintDependencies(dependencies: HintDependency[] | undefined, current: ReadonlyMap<string, string> | undefined): HintDependency[];
|
|
56
|
+
/** Apply the same fail-closed freshness rule at review, inspection, and retrieval. */
|
|
57
|
+
export declare function assessHintFreshness(input: {
|
|
58
|
+
dependencies?: HintDependency[];
|
|
59
|
+
snapshotId?: string;
|
|
60
|
+
currentDependencies?: ReadonlyMap<string, string>;
|
|
61
|
+
currentSnapshotId?: string | null;
|
|
62
|
+
}): HintFreshnessAssessment;
|
|
63
|
+
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/hints/dependencies.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAsB,SAAS,EAAE,MAAM,YAAY,CAAC;AAEhF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,kBAAkB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,cAAc,EAAE,CAAC;IACpC;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,0EAA0E;AAC1E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,yBAAyB,CAiD5B;AAED,8EAA8E;AAC9E,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,SAAS,EAAE,sBAAsB,EAAE,CAAC;CACrC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBtB;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,GAAG,SAAS,EAC1C,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC/C,cAAc,EAAE,CAGlB;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC,GAAG,uBAAuB,CAmB1B"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { analyzeSqlReferences } from '@duckcodeailabs/dql-core';
|
|
3
|
+
/** Content-address the governed relation/object inputs used by a hint. */
|
|
4
|
+
export function collectHintDependencies(input) {
|
|
5
|
+
const dependencies = new Map();
|
|
6
|
+
const analysis = input.sql?.trim() ? analyzeSqlReferences(input.sql) : null;
|
|
7
|
+
const referencedRelations = analysis?.tables ?? [];
|
|
8
|
+
const unknownRelations = [];
|
|
9
|
+
for (const referenced of referencedRelations) {
|
|
10
|
+
const relation = findRelation(input.relations, referenced);
|
|
11
|
+
if (!relation) {
|
|
12
|
+
unknownRelations.push(referenced);
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const dependency = relationDependency(relation);
|
|
16
|
+
dependencies.set(dependency.id, dependency);
|
|
17
|
+
if (relation.objectKey) {
|
|
18
|
+
const object = input.objects.find((candidate) => candidate.objectKey === relation.objectKey);
|
|
19
|
+
if (object) {
|
|
20
|
+
const objectDep = objectDependency(object);
|
|
21
|
+
dependencies.set(objectDep.id, objectDep);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
for (const [scopeField, kind, objectTypes] of SCOPE_OBJECTS) {
|
|
26
|
+
const name = input.scope[scopeField];
|
|
27
|
+
if (!name)
|
|
28
|
+
continue;
|
|
29
|
+
const object = input.objects.find((candidate) => objectTypes.includes(candidate.objectType.toLowerCase())
|
|
30
|
+
&& objectNames(candidate).some((candidateName) => eq(candidateName, name)));
|
|
31
|
+
const dependency = object
|
|
32
|
+
? objectDependency(object, kind)
|
|
33
|
+
: input.fallbackFingerprint
|
|
34
|
+
? {
|
|
35
|
+
id: `scope:${kind}:${normalizeScopeName(name)}`,
|
|
36
|
+
kind,
|
|
37
|
+
name,
|
|
38
|
+
fingerprint: input.fallbackFingerprint,
|
|
39
|
+
}
|
|
40
|
+
: undefined;
|
|
41
|
+
if (!dependency)
|
|
42
|
+
continue;
|
|
43
|
+
dependencies.set(dependency.id, dependency);
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
dependencies: [...dependencies.values()].sort((left, right) => left.id.localeCompare(right.id)),
|
|
47
|
+
referencedRelations,
|
|
48
|
+
unknownRelations,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Build the current dependency lookup used by retrieval-time drift gates. */
|
|
52
|
+
export function currentHintDependencyFingerprints(input) {
|
|
53
|
+
const current = new Map();
|
|
54
|
+
for (const relation of input.relations) {
|
|
55
|
+
const dependency = relationDependency(relation);
|
|
56
|
+
current.set(dependency.id, dependency.fingerprint);
|
|
57
|
+
}
|
|
58
|
+
for (const object of input.objects) {
|
|
59
|
+
const dependency = objectDependency(object);
|
|
60
|
+
current.set(dependency.id, dependency.fingerprint);
|
|
61
|
+
const inferredKind = hintKindForObjectType(object.objectType);
|
|
62
|
+
if (inferredKind) {
|
|
63
|
+
const scoped = objectDependency(object, inferredKind);
|
|
64
|
+
current.set(scoped.id, scoped.fingerprint);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return current;
|
|
68
|
+
}
|
|
69
|
+
export function staleHintDependencies(dependencies, current) {
|
|
70
|
+
if (!dependencies?.length || !current)
|
|
71
|
+
return [];
|
|
72
|
+
return dependencies.filter((dependency) => current.get(dependency.id) !== dependency.fingerprint);
|
|
73
|
+
}
|
|
74
|
+
/** Apply the same fail-closed freshness rule at review, inspection, and retrieval. */
|
|
75
|
+
export function assessHintFreshness(input) {
|
|
76
|
+
const dependencies = input.dependencies ?? [];
|
|
77
|
+
const staleDependencies = dependencies.length > 0
|
|
78
|
+
? staleHintDependencies(dependencies, input.currentDependencies ?? new Map())
|
|
79
|
+
: [];
|
|
80
|
+
const snapshotCurrent = Boolean(input.snapshotId)
|
|
81
|
+
&& Boolean(input.currentSnapshotId)
|
|
82
|
+
&& input.snapshotId === input.currentSnapshotId
|
|
83
|
+
&& !input.currentSnapshotId.startsWith('unverified:');
|
|
84
|
+
const dependenciesCurrent = dependencies.length > 0 && staleDependencies.length === 0;
|
|
85
|
+
// v1/v2 approved hints predate snapshot/dependency provenance. Preserve their
|
|
86
|
+
// historical retrieval behavior; v3 lifecycle approval cannot create these.
|
|
87
|
+
const legacyUnversioned = dependencies.length === 0 && !input.snapshotId;
|
|
88
|
+
return {
|
|
89
|
+
snapshotCurrent,
|
|
90
|
+
dependenciesCurrent,
|
|
91
|
+
staleDependencies,
|
|
92
|
+
current: dependencies.length > 0 ? dependenciesCurrent : snapshotCurrent || legacyUnversioned,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function relationDependency(relation) {
|
|
96
|
+
const name = normalizeRelation(relation.relation);
|
|
97
|
+
return {
|
|
98
|
+
id: `relation:${name}`,
|
|
99
|
+
kind: 'relation',
|
|
100
|
+
name: relation.relation,
|
|
101
|
+
fingerprint: fingerprint({
|
|
102
|
+
relation: name,
|
|
103
|
+
objectKey: relation.objectKey,
|
|
104
|
+
source: relation.source,
|
|
105
|
+
columnCompleteness: relation.columnCompleteness,
|
|
106
|
+
columns: relation.columns
|
|
107
|
+
.map((column) => ({
|
|
108
|
+
name: column.name.toLowerCase(),
|
|
109
|
+
type: column.type?.toLowerCase(),
|
|
110
|
+
description: column.description,
|
|
111
|
+
}))
|
|
112
|
+
.sort((left, right) => left.name.localeCompare(right.name)),
|
|
113
|
+
}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function objectDependency(object, kind = hintKindForObjectType(object.objectType) ?? 'semantic') {
|
|
117
|
+
return {
|
|
118
|
+
id: `${kind}:${object.objectKey}`,
|
|
119
|
+
kind,
|
|
120
|
+
name: object.fullName ?? object.name,
|
|
121
|
+
fingerprint: fingerprint({
|
|
122
|
+
objectKey: object.objectKey,
|
|
123
|
+
objectType: object.objectType,
|
|
124
|
+
name: object.name,
|
|
125
|
+
fullName: object.fullName,
|
|
126
|
+
domain: object.domain,
|
|
127
|
+
status: object.status,
|
|
128
|
+
description: object.description,
|
|
129
|
+
sourcePath: object.sourcePath,
|
|
130
|
+
payload: object.payload,
|
|
131
|
+
}),
|
|
132
|
+
sourcePath: object.sourcePath,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function findRelation(relations, referenced) {
|
|
136
|
+
const keys = relationKeys(referenced);
|
|
137
|
+
return relations.find((relation) => [...relationKeys(relation.relation)].some((key) => keys.has(key))
|
|
138
|
+
|| [...relationKeys(relation.name)].some((key) => keys.has(key)));
|
|
139
|
+
}
|
|
140
|
+
function relationKeys(value) {
|
|
141
|
+
const normalized = normalizeRelation(value);
|
|
142
|
+
const parts = normalized.split('.');
|
|
143
|
+
return new Set([normalized, parts.at(-1) ?? normalized]);
|
|
144
|
+
}
|
|
145
|
+
function normalizeRelation(value) {
|
|
146
|
+
return value.replace(/["`\[\]]/g, '').trim().toLowerCase();
|
|
147
|
+
}
|
|
148
|
+
function objectNames(object) {
|
|
149
|
+
return [object.name, object.fullName, object.objectKey]
|
|
150
|
+
.filter((value) => Boolean(value));
|
|
151
|
+
}
|
|
152
|
+
function eq(left, right) {
|
|
153
|
+
return normalizeScopeName(left) === normalizeScopeName(right);
|
|
154
|
+
}
|
|
155
|
+
function normalizeScopeName(value) {
|
|
156
|
+
return value.trim().toLowerCase().replace(/^(block|metric|term|dbt_model|dbt_source|domain):/, '');
|
|
157
|
+
}
|
|
158
|
+
function hintKindForObjectType(objectType) {
|
|
159
|
+
const normalized = objectType.toLowerCase();
|
|
160
|
+
if (normalized === 'dbt_model' || normalized === 'dbt_source')
|
|
161
|
+
return 'dbt_model';
|
|
162
|
+
if (normalized.includes('metric'))
|
|
163
|
+
return 'metric';
|
|
164
|
+
if (normalized === 'domain' || normalized === 'domain_capsule')
|
|
165
|
+
return 'domain';
|
|
166
|
+
if (normalized === 'term' || normalized === 'dql_term')
|
|
167
|
+
return 'term';
|
|
168
|
+
if (normalized === 'block' || normalized === 'dql_block')
|
|
169
|
+
return 'block';
|
|
170
|
+
if (normalized.includes('semantic') || normalized === 'business_view')
|
|
171
|
+
return 'semantic';
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
const SCOPE_OBJECTS = [
|
|
175
|
+
['metric', 'metric', ['metric', 'semantic_metric']],
|
|
176
|
+
['dbtModel', 'dbt_model', ['dbt_model', 'dbt_source']],
|
|
177
|
+
['domain', 'domain', ['domain', 'domain_capsule']],
|
|
178
|
+
['term', 'term', ['term', 'dql_term']],
|
|
179
|
+
['block', 'block', ['block', 'dql_block']],
|
|
180
|
+
];
|
|
181
|
+
function fingerprint(value) {
|
|
182
|
+
return createHash('sha256').update(stableStringify(value)).digest('hex');
|
|
183
|
+
}
|
|
184
|
+
function stableStringify(value) {
|
|
185
|
+
if (Array.isArray(value))
|
|
186
|
+
return `[${value.map(stableStringify).join(',')}]`;
|
|
187
|
+
if (value && typeof value === 'object') {
|
|
188
|
+
return `{${Object.entries(value)
|
|
189
|
+
.filter(([, item]) => item !== undefined)
|
|
190
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
191
|
+
.map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`)
|
|
192
|
+
.join(',')}}`;
|
|
193
|
+
}
|
|
194
|
+
return JSON.stringify(value);
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/hints/dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Files (the source of truth, consistent with DQL):
|
|
5
5
|
* - `.dql/traces/<id>.trace.json` — correction traces
|
|
6
|
-
* - `.dql/hints/<id>.hint.yaml` — candidate / approved / rejected hints
|
|
6
|
+
* - `.dql/hints/<id>.hint.yaml` — candidate / approved / rejected / retired hints
|
|
7
7
|
* - `.dql/evaluations/<id>.hint-evaluation.yaml` — required evaluation results
|
|
8
8
|
* - `.dql/reviews/<id>.review.yaml` — human review decisions
|
|
9
9
|
*
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* flips status, writes the review, and reindexes SQLite
|
|
17
17
|
* Approved-only is enforced at retrieval; nothing here auto-applies a hint.
|
|
18
18
|
*/
|
|
19
|
-
import type { CorrectionTrace, Hint, HintEvaluation, HintEvaluationCheck, HintReview, HintScope } from './types.js';
|
|
19
|
+
import type { CorrectionTrace, Hint, HintEvaluation, HintEvaluationCheck, HintDependency, HintLifecycleFailure, HintReview, HintScope } from './types.js';
|
|
20
20
|
export declare function tracesDir(projectRoot: string): string;
|
|
21
21
|
export declare function hintsDir(projectRoot: string): string;
|
|
22
22
|
export declare function evaluationsDir(projectRoot: string): string;
|
|
@@ -38,6 +38,10 @@ export interface RecordCorrectionTraceInput {
|
|
|
38
38
|
snapshotId?: string;
|
|
39
39
|
/** Stable evaluation name that must pass before approval. Required by v3. */
|
|
40
40
|
requiredEvaluation?: string;
|
|
41
|
+
/** Exact governed inputs used to validate the correction. */
|
|
42
|
+
dependencies?: HintDependency[];
|
|
43
|
+
/** Fail-closed validation problems retained with the candidate. */
|
|
44
|
+
lifecycleErrors?: HintLifecycleFailure[];
|
|
41
45
|
/** Override the derived candidate hint's title. */
|
|
42
46
|
hintTitle?: string;
|
|
43
47
|
/** Override the derived candidate hint's guidance (defaults to the correction). */
|
|
@@ -49,6 +53,8 @@ export interface RecordCorrectionTraceResult {
|
|
|
49
53
|
trace: CorrectionTrace;
|
|
50
54
|
hint: Hint;
|
|
51
55
|
}
|
|
56
|
+
export declare function correctionTraceFilePath(projectRoot: string, traceId: string): string;
|
|
57
|
+
export declare function getCorrectionTraceFromGit(projectRoot: string, traceId: string): CorrectionTrace | null;
|
|
52
58
|
/**
|
|
53
59
|
* Record a Tier-2 correction as a Git trace + a derived **candidate** hint.
|
|
54
60
|
* The hint is NOT usable until reviewed/approved.
|
|
@@ -94,12 +100,59 @@ export interface ReviewHintResult {
|
|
|
94
100
|
hint: Hint;
|
|
95
101
|
review: HintReview;
|
|
96
102
|
}
|
|
103
|
+
export interface UpdateHintCandidateInput {
|
|
104
|
+
hintId: string;
|
|
105
|
+
title?: string;
|
|
106
|
+
guidance?: string;
|
|
107
|
+
correctedSql?: string;
|
|
108
|
+
scope?: HintScope;
|
|
109
|
+
snapshotId: string;
|
|
110
|
+
dependencies: HintDependency[];
|
|
111
|
+
lifecycleErrors: HintLifecycleFailure[];
|
|
112
|
+
}
|
|
113
|
+
export declare function updateHintCandidate(projectRoot: string, input: UpdateHintCandidateInput): Hint;
|
|
97
114
|
/**
|
|
98
115
|
* Approve or reject a candidate hint. Writes the review record, flips the hint
|
|
99
116
|
* file's status, and reindexes SQLite. Approval is the ONLY path that makes a
|
|
100
117
|
* hint usable in normal retrieval.
|
|
101
118
|
*/
|
|
102
119
|
export declare function reviewHint(projectRoot: string, input: ReviewHintInput): ReviewHintResult | null;
|
|
120
|
+
export declare function retireHint(projectRoot: string, input: {
|
|
121
|
+
hintId: string;
|
|
122
|
+
reviewer: string;
|
|
123
|
+
note?: string;
|
|
124
|
+
}): ReviewHintResult;
|
|
125
|
+
export declare function reopenHint(projectRoot: string, input: {
|
|
126
|
+
hintId: string;
|
|
127
|
+
reviewer: string;
|
|
128
|
+
note?: string;
|
|
129
|
+
snapshotId: string;
|
|
130
|
+
dependencies: HintDependency[];
|
|
131
|
+
lifecycleErrors: HintLifecycleFailure[];
|
|
132
|
+
}): ReviewHintResult;
|
|
133
|
+
export declare function supersedeHint(projectRoot: string, input: {
|
|
134
|
+
hintId: string;
|
|
135
|
+
targetHintId: string;
|
|
136
|
+
reviewer: string;
|
|
137
|
+
note?: string;
|
|
138
|
+
}): ReviewHintResult;
|
|
139
|
+
export interface EnsureHintIndexFreshResult {
|
|
140
|
+
hintCount: number;
|
|
141
|
+
fingerprint: string;
|
|
142
|
+
rebuilt: boolean;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Content-address the Git-authoritative hint files together with the SQLite
|
|
146
|
+
* projection version. File names and bytes are stable across clones; absolute
|
|
147
|
+
* paths and filesystem timestamps are intentionally excluded.
|
|
148
|
+
*/
|
|
149
|
+
export declare function hintIndexProjectionFingerprint(projectRoot: string): string;
|
|
103
150
|
/** Rebuild the SQLite hint index from the Git-authoritative files. */
|
|
104
151
|
export declare function reindexHints(projectRoot: string, indexPath?: string): number;
|
|
152
|
+
/**
|
|
153
|
+
* Bootstrap or refresh the local hint projection only when Git data or the
|
|
154
|
+
* projection schema changed. Safe to call whenever an OSS project is opened.
|
|
155
|
+
*/
|
|
156
|
+
export declare function ensureHintIndexFresh(projectRoot: string, indexPath?: string): EnsureHintIndexFreshResult;
|
|
157
|
+
export declare function requiresEvaluatedApproval(projectRoot: string): boolean;
|
|
105
158
|
//# sourceMappingURL=git-store.d.ts.map
|