@duckcodeailabs/dql-agent 1.6.30 → 1.6.32
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 +52 -6
- package/dist/agent-run-engine.d.ts.map +1 -1
- package/dist/agent-run-engine.js +159 -79
- package/dist/agent-run-engine.js.map +1 -1
- package/dist/agent-run-gates.d.ts.map +1 -1
- package/dist/agent-run-gates.js +72 -5
- package/dist/agent-run-gates.js.map +1 -1
- package/dist/agent-run-planner.d.ts.map +1 -1
- package/dist/agent-run-planner.js +13 -0
- package/dist/agent-run-planner.js.map +1 -1
- package/dist/answer-loop.d.ts +117 -8
- package/dist/answer-loop.d.ts.map +1 -1
- package/dist/answer-loop.js +1690 -1302
- package/dist/answer-loop.js.map +1 -1
- package/dist/answer-shape.d.ts +16 -0
- package/dist/answer-shape.d.ts.map +1 -0
- package/dist/answer-shape.js +85 -0
- package/dist/answer-shape.js.map +1 -0
- package/dist/cascade/budgets.d.ts +101 -0
- package/dist/cascade/budgets.d.ts.map +1 -0
- package/dist/cascade/budgets.js +184 -0
- package/dist/cascade/budgets.js.map +1 -0
- package/dist/cascade/cascade.d.ts +86 -0
- package/dist/cascade/cascade.d.ts.map +1 -0
- package/dist/cascade/cascade.js +115 -0
- package/dist/cascade/cascade.js.map +1 -0
- package/dist/cascade/route-policy.d.ts +14 -0
- package/dist/cascade/route-policy.d.ts.map +1 -0
- package/dist/cascade/route-policy.js +48 -0
- package/dist/cascade/route-policy.js.map +1 -0
- package/dist/cascade/triage.d.ts +20 -0
- package/dist/cascade/triage.d.ts.map +1 -0
- package/dist/cascade/triage.js +25 -0
- package/dist/cascade/triage.js.map +1 -0
- package/dist/conversation/rolling-summary.d.ts +13 -0
- package/dist/conversation/rolling-summary.d.ts.map +1 -0
- package/dist/conversation/rolling-summary.js +43 -0
- package/dist/conversation/rolling-summary.js.map +1 -0
- package/dist/conversation/session-store.d.ts +110 -0
- package/dist/conversation/session-store.d.ts.map +1 -0
- package/dist/conversation/session-store.js +387 -0
- package/dist/conversation/session-store.js.map +1 -0
- package/dist/conversation/snapshot.d.ts +59 -0
- package/dist/conversation/snapshot.d.ts.map +1 -0
- package/dist/conversation/snapshot.js +153 -0
- package/dist/conversation/snapshot.js.map +1 -0
- package/dist/conversation/working-state.d.ts +49 -0
- package/dist/conversation/working-state.d.ts.map +1 -0
- package/dist/conversation/working-state.js +249 -0
- package/dist/conversation/working-state.js.map +1 -0
- package/dist/embeddings/provider.d.ts +62 -0
- package/dist/embeddings/provider.d.ts.map +1 -1
- package/dist/embeddings/provider.js +98 -0
- package/dist/embeddings/provider.js.map +1 -1
- package/dist/grounding/context-ledger.d.ts +30 -0
- package/dist/grounding/context-ledger.d.ts.map +1 -0
- package/dist/grounding/context-ledger.js +54 -0
- package/dist/grounding/context-ledger.js.map +1 -0
- package/dist/grounding/regrounding.d.ts +24 -0
- package/dist/grounding/regrounding.d.ts.map +1 -0
- package/dist/grounding/regrounding.js +219 -0
- package/dist/grounding/regrounding.js.map +1 -0
- package/dist/grounding/value-index.d.ts +32 -0
- package/dist/grounding/value-index.d.ts.map +1 -0
- package/dist/grounding/value-index.js +67 -0
- package/dist/grounding/value-index.js.map +1 -0
- package/dist/index.d.ts +47 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -13
- package/dist/index.js.map +1 -1
- package/dist/intent-controller.d.ts +7 -0
- package/dist/intent-controller.d.ts.map +1 -1
- package/dist/intent-controller.js +22 -1
- package/dist/intent-controller.js.map +1 -1
- package/dist/kg/build.d.ts.map +1 -1
- package/dist/kg/build.js +44 -17
- package/dist/kg/build.js.map +1 -1
- package/dist/kg/sqlite-fts.d.ts +3 -1
- package/dist/kg/sqlite-fts.d.ts.map +1 -1
- package/dist/kg/sqlite-fts.js +16 -2
- package/dist/kg/sqlite-fts.js.map +1 -1
- package/dist/kg/types.d.ts +23 -1
- package/dist/kg/types.d.ts.map +1 -1
- package/dist/memory/fts-query.d.ts +7 -0
- package/dist/memory/fts-query.d.ts.map +1 -0
- package/dist/memory/fts-query.js +36 -0
- package/dist/memory/fts-query.js.map +1 -0
- package/dist/memory/sqlite-memory.d.ts.map +1 -1
- package/dist/memory/sqlite-memory.js +1 -30
- package/dist/memory/sqlite-memory.js.map +1 -1
- package/dist/metadata/analysis-planner.d.ts +23 -0
- package/dist/metadata/analysis-planner.d.ts.map +1 -1
- package/dist/metadata/analysis-planner.js +432 -2
- package/dist/metadata/analysis-planner.js.map +1 -1
- package/dist/metadata/block-fit.d.ts +24 -0
- package/dist/metadata/block-fit.d.ts.map +1 -0
- package/dist/metadata/block-fit.js +373 -0
- package/dist/metadata/block-fit.js.map +1 -0
- package/dist/metadata/catalog.d.ts +72 -3
- package/dist/metadata/catalog.d.ts.map +1 -1
- package/dist/metadata/catalog.js +1452 -72
- package/dist/metadata/catalog.js.map +1 -1
- package/dist/metadata/drafts.d.ts +25 -0
- package/dist/metadata/drafts.d.ts.map +1 -1
- package/dist/metadata/drafts.js +112 -2
- package/dist/metadata/drafts.js.map +1 -1
- package/dist/metadata/metric-match.d.ts +55 -6
- package/dist/metadata/metric-match.d.ts.map +1 -1
- package/dist/metadata/metric-match.js +158 -13
- package/dist/metadata/metric-match.js.map +1 -1
- package/dist/metadata/sql-context-validation.d.ts +13 -1
- package/dist/metadata/sql-context-validation.d.ts.map +1 -1
- package/dist/metadata/sql-context-validation.js +172 -19
- package/dist/metadata/sql-context-validation.js.map +1 -1
- package/dist/metadata/sql-retrieval.d.ts +3 -2
- package/dist/metadata/sql-retrieval.d.ts.map +1 -1
- package/dist/metadata/sql-retrieval.js +6 -4
- package/dist/metadata/sql-retrieval.js.map +1 -1
- package/dist/providers/claude.d.ts +2 -1
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +151 -28
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +20 -0
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/index.d.ts +3 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +2 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +156 -0
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/reasoning-effort.d.ts +46 -0
- package/dist/providers/reasoning-effort.d.ts.map +1 -0
- package/dist/providers/reasoning-effort.js +81 -0
- package/dist/providers/reasoning-effort.js.map +1 -0
- package/dist/providers/tool-output.d.ts +2 -0
- package/dist/providers/tool-output.d.ts.map +1 -0
- package/dist/providers/tool-output.js +22 -0
- package/dist/providers/tool-output.js.map +1 -0
- package/dist/providers/types.d.ts +29 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/semantic-bridge/compose.d.ts +89 -0
- package/dist/semantic-bridge/compose.d.ts.map +1 -0
- package/dist/semantic-bridge/compose.js +528 -0
- package/dist/semantic-bridge/compose.js.map +1 -0
- package/dist/semantic-bridge/member-select.d.ts +23 -0
- package/dist/semantic-bridge/member-select.d.ts.map +1 -0
- package/dist/semantic-bridge/member-select.js +106 -0
- package/dist/semantic-bridge/member-select.js.map +1 -0
- package/dist/skills/defaults.d.ts.map +1 -1
- package/dist/skills/defaults.js +5 -0
- package/dist/skills/defaults.js.map +1 -1
- package/dist/synthesize.d.ts +26 -0
- package/dist/synthesize.d.ts.map +1 -1
- package/dist/synthesize.js +72 -3
- package/dist/synthesize.js.map +1 -1
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +692 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/trust/stamp.d.ts +26 -0
- package/dist/trust/stamp.d.ts.map +1 -0
- package/dist/trust/stamp.js +33 -0
- package/dist/trust/stamp.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic conversation working state: the entities / measures / dimensions /
|
|
3
|
+
* filters "in play" across turns, plus explicit topic-relation classification
|
|
4
|
+
* (continuation | refinement | shift | return).
|
|
5
|
+
*
|
|
6
|
+
* This replaces regex guesswork with state: a topic SHIFT deterministically
|
|
7
|
+
* clears carried filters (stale-context protection), and a RETURN to a prior
|
|
8
|
+
* topic restores its filters and source block.
|
|
9
|
+
*/
|
|
10
|
+
import type { ConversationTurn } from './session-store.js';
|
|
11
|
+
export type TopicRelation = 'continuation' | 'refinement' | 'shift' | 'return';
|
|
12
|
+
export interface ConversationTopicFrame {
|
|
13
|
+
topicKey: string;
|
|
14
|
+
filters: string[];
|
|
15
|
+
sourceCertifiedBlock?: string;
|
|
16
|
+
contextPackId?: string;
|
|
17
|
+
measures: string[];
|
|
18
|
+
dimensions: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ConversationWorkingState {
|
|
21
|
+
entities: string[];
|
|
22
|
+
measures: string[];
|
|
23
|
+
dimensions: string[];
|
|
24
|
+
filters: Array<{
|
|
25
|
+
value: string;
|
|
26
|
+
sourceTurnId: string;
|
|
27
|
+
}>;
|
|
28
|
+
timeframe?: string;
|
|
29
|
+
limit?: number;
|
|
30
|
+
sourceCertifiedBlock?: string;
|
|
31
|
+
lastContextPackId?: string;
|
|
32
|
+
lastResultColumns?: string[];
|
|
33
|
+
lastResultDimensionValues?: Record<string, string[]>;
|
|
34
|
+
/** Normalized entity+measure key of the CURRENT topic, for shift detection. */
|
|
35
|
+
topicKey?: string;
|
|
36
|
+
/** Small ring of prior topics so a "return" can restore filters/block. */
|
|
37
|
+
priorTopics?: ConversationTopicFrame[];
|
|
38
|
+
}
|
|
39
|
+
export declare function emptyWorkingState(): ConversationWorkingState;
|
|
40
|
+
export declare function parseWorkingState(raw: Record<string, unknown> | undefined): ConversationWorkingState;
|
|
41
|
+
/**
|
|
42
|
+
* Fold a completed turn into the working state and classify how it relates to
|
|
43
|
+
* the ongoing topic. Pure and deterministic — safe to re-run.
|
|
44
|
+
*/
|
|
45
|
+
export declare function reduceWorkingState(prev: ConversationWorkingState, turn: ConversationTurn): {
|
|
46
|
+
state: ConversationWorkingState;
|
|
47
|
+
topicRelation: TopicRelation;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=working-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"working-state.d.ts","sourceRoot":"","sources":["../../src/conversation/working-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,yBAAyB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,sBAAsB,EAAE,CAAC;CACxC;AAgBD,wBAAgB,iBAAiB,IAAI,wBAAwB,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,wBAAwB,CAkBpG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,wBAAwB,EAC9B,IAAI,EAAE,gBAAgB,GACrB;IAAE,KAAK,EAAE,wBAAwB,CAAC;IAAC,aAAa,EAAE,aAAa,CAAA;CAAE,CA4EnE"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic conversation working state: the entities / measures / dimensions /
|
|
3
|
+
* filters "in play" across turns, plus explicit topic-relation classification
|
|
4
|
+
* (continuation | refinement | shift | return).
|
|
5
|
+
*
|
|
6
|
+
* This replaces regex guesswork with state: a topic SHIFT deterministically
|
|
7
|
+
* clears carried filters (stale-context protection), and a RETURN to a prior
|
|
8
|
+
* topic restores its filters and source block.
|
|
9
|
+
*/
|
|
10
|
+
const MAX_TERMS = 12;
|
|
11
|
+
const MAX_FILTERS = 16;
|
|
12
|
+
const MAX_PRIOR_TOPICS = 4;
|
|
13
|
+
export function emptyWorkingState() {
|
|
14
|
+
return { entities: [], measures: [], dimensions: [], filters: [] };
|
|
15
|
+
}
|
|
16
|
+
export function parseWorkingState(raw) {
|
|
17
|
+
if (!raw)
|
|
18
|
+
return emptyWorkingState();
|
|
19
|
+
return {
|
|
20
|
+
entities: stringArray(raw.entities),
|
|
21
|
+
measures: stringArray(raw.measures),
|
|
22
|
+
dimensions: stringArray(raw.dimensions),
|
|
23
|
+
filters: filterArray(raw.filters),
|
|
24
|
+
timeframe: optionalString(raw.timeframe),
|
|
25
|
+
limit: typeof raw.limit === 'number' ? raw.limit : undefined,
|
|
26
|
+
sourceCertifiedBlock: optionalString(raw.sourceCertifiedBlock),
|
|
27
|
+
lastContextPackId: optionalString(raw.lastContextPackId),
|
|
28
|
+
lastResultColumns: raw.lastResultColumns ? stringArray(raw.lastResultColumns) : undefined,
|
|
29
|
+
lastResultDimensionValues: stringRecord(raw.lastResultDimensionValues),
|
|
30
|
+
topicKey: optionalString(raw.topicKey),
|
|
31
|
+
priorTopics: Array.isArray(raw.priorTopics)
|
|
32
|
+
? raw.priorTopics.map(parseTopicFrame).filter((frame) => Boolean(frame)).slice(0, MAX_PRIOR_TOPICS)
|
|
33
|
+
: undefined,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Fold a completed turn into the working state and classify how it relates to
|
|
38
|
+
* the ongoing topic. Pure and deterministic — safe to re-run.
|
|
39
|
+
*/
|
|
40
|
+
export function reduceWorkingState(prev, turn) {
|
|
41
|
+
const shape = shapeFromTurn(turn);
|
|
42
|
+
const newKey = topicKeyFor(shape);
|
|
43
|
+
const relation = classifyTopicRelation(prev, shape, newKey);
|
|
44
|
+
if (relation === 'shift') {
|
|
45
|
+
// Stale-context protection: a new topic starts with a CLEAN filter slate.
|
|
46
|
+
// The outgoing topic is remembered so a later "return" can restore it.
|
|
47
|
+
const priorTopics = prev.topicKey
|
|
48
|
+
? [frameFromState(prev), ...(prev.priorTopics ?? [])].slice(0, MAX_PRIOR_TOPICS)
|
|
49
|
+
: prev.priorTopics;
|
|
50
|
+
return {
|
|
51
|
+
topicRelation: relation,
|
|
52
|
+
state: {
|
|
53
|
+
entities: shape.entities.slice(0, MAX_TERMS),
|
|
54
|
+
measures: shape.measures.slice(0, MAX_TERMS),
|
|
55
|
+
dimensions: shape.dimensions.slice(0, MAX_TERMS),
|
|
56
|
+
filters: shape.filters.map((value) => ({ value, sourceTurnId: turn.id })).slice(0, MAX_FILTERS),
|
|
57
|
+
timeframe: shape.timeframe,
|
|
58
|
+
limit: shape.limit,
|
|
59
|
+
sourceCertifiedBlock: turn.sourceCertifiedBlock,
|
|
60
|
+
lastContextPackId: turn.contextPackId,
|
|
61
|
+
lastResultColumns: turn.result?.columns,
|
|
62
|
+
lastResultDimensionValues: turn.result?.dimensionValues,
|
|
63
|
+
topicKey: newKey || undefined,
|
|
64
|
+
priorTopics,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (relation === 'return') {
|
|
69
|
+
const returned = (prev.priorTopics ?? []).find((frame) => overlaps(frame.topicKey, newKey) >= 0.5);
|
|
70
|
+
const remaining = (prev.priorTopics ?? []).filter((frame) => frame !== returned);
|
|
71
|
+
const currentFrame = prev.topicKey ? [frameFromState(prev)] : [];
|
|
72
|
+
return {
|
|
73
|
+
topicRelation: relation,
|
|
74
|
+
state: {
|
|
75
|
+
entities: merge(shape.entities, returned?.topicKey.split('|') ?? []),
|
|
76
|
+
measures: merge(shape.measures, returned?.measures ?? []),
|
|
77
|
+
dimensions: merge(shape.dimensions, returned?.dimensions ?? []),
|
|
78
|
+
filters: [
|
|
79
|
+
...(returned?.filters ?? []).map((value) => ({ value, sourceTurnId: turn.id })),
|
|
80
|
+
...shape.filters.map((value) => ({ value, sourceTurnId: turn.id })),
|
|
81
|
+
].slice(0, MAX_FILTERS),
|
|
82
|
+
timeframe: shape.timeframe ?? prev.timeframe,
|
|
83
|
+
limit: shape.limit ?? prev.limit,
|
|
84
|
+
sourceCertifiedBlock: turn.sourceCertifiedBlock ?? returned?.sourceCertifiedBlock,
|
|
85
|
+
lastContextPackId: turn.contextPackId ?? returned?.contextPackId,
|
|
86
|
+
lastResultColumns: turn.result?.columns ?? prev.lastResultColumns,
|
|
87
|
+
lastResultDimensionValues: turn.result?.dimensionValues ?? prev.lastResultDimensionValues,
|
|
88
|
+
topicKey: returned?.topicKey ?? newKey ?? prev.topicKey,
|
|
89
|
+
priorTopics: [...currentFrame, ...remaining].slice(0, MAX_PRIOR_TOPICS),
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// continuation / refinement: accumulate.
|
|
94
|
+
return {
|
|
95
|
+
topicRelation: relation,
|
|
96
|
+
state: {
|
|
97
|
+
entities: merge(prev.entities, shape.entities),
|
|
98
|
+
measures: merge(prev.measures, shape.measures),
|
|
99
|
+
dimensions: merge(prev.dimensions, shape.dimensions),
|
|
100
|
+
filters: mergeFilters(prev.filters, shape.filters.map((value) => ({ value, sourceTurnId: turn.id }))),
|
|
101
|
+
timeframe: shape.timeframe ?? prev.timeframe,
|
|
102
|
+
limit: shape.limit ?? prev.limit,
|
|
103
|
+
sourceCertifiedBlock: turn.sourceCertifiedBlock ?? prev.sourceCertifiedBlock,
|
|
104
|
+
lastContextPackId: turn.contextPackId ?? prev.lastContextPackId,
|
|
105
|
+
lastResultColumns: turn.result?.columns ?? prev.lastResultColumns,
|
|
106
|
+
lastResultDimensionValues: turn.result?.dimensionValues ?? prev.lastResultDimensionValues,
|
|
107
|
+
topicKey: prev.topicKey && newKey && prev.topicKey !== newKey
|
|
108
|
+
? mergeTopicKeys(prev.topicKey, newKey)
|
|
109
|
+
: prev.topicKey ?? newKey ?? undefined,
|
|
110
|
+
priorTopics: prev.priorTopics,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function classifyTopicRelation(prev, shape, newKey) {
|
|
115
|
+
if (!prev.topicKey)
|
|
116
|
+
return 'continuation';
|
|
117
|
+
if (!newKey) {
|
|
118
|
+
// No topical signal in the new turn: filters/limit-only turns narrow the
|
|
119
|
+
// current topic (refinement); a bare deictic follow-up just continues it.
|
|
120
|
+
return shape.filters.length > 0 || shape.limit !== undefined ? 'refinement' : 'continuation';
|
|
121
|
+
}
|
|
122
|
+
const overlap = overlaps(prev.topicKey, newKey);
|
|
123
|
+
if (overlap >= 0.5)
|
|
124
|
+
return 'continuation';
|
|
125
|
+
if (overlap > 0)
|
|
126
|
+
return 'refinement';
|
|
127
|
+
const returned = (prev.priorTopics ?? []).some((frame) => overlaps(frame.topicKey, newKey) >= 0.5);
|
|
128
|
+
if (returned)
|
|
129
|
+
return 'return';
|
|
130
|
+
// Zero overlap with the current topic: filters/limit-only turns are refinements;
|
|
131
|
+
// a turn with its own entities/measures is a genuine shift.
|
|
132
|
+
if (shape.entities.length === 0 && shape.measures.length === 0)
|
|
133
|
+
return 'refinement';
|
|
134
|
+
return 'shift';
|
|
135
|
+
}
|
|
136
|
+
function shapeFromTurn(turn) {
|
|
137
|
+
const contract = turn.contract ?? {};
|
|
138
|
+
const topN = contract.topN;
|
|
139
|
+
return {
|
|
140
|
+
entities: stringArray(contract.entities),
|
|
141
|
+
measures: stringArray(contract.measures),
|
|
142
|
+
dimensions: stringArray(contract.dimensions),
|
|
143
|
+
filters: stringArray(contract.filters),
|
|
144
|
+
timeframe: optionalString(contract.timeframe),
|
|
145
|
+
limit: typeof topN === 'number'
|
|
146
|
+
? topN
|
|
147
|
+
: topN && typeof topN === 'object' && typeof topN.n === 'number'
|
|
148
|
+
? topN.n
|
|
149
|
+
: undefined,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function topicKeyFor(shape) {
|
|
153
|
+
return Array.from(new Set([
|
|
154
|
+
...shape.entities.map(normalizeTerm),
|
|
155
|
+
...shape.measures.map(normalizeTerm),
|
|
156
|
+
].filter(Boolean))).sort().join('|');
|
|
157
|
+
}
|
|
158
|
+
/** Jaccard overlap of two topic keys ('|'-joined normalized term sets). */
|
|
159
|
+
function overlaps(a, b) {
|
|
160
|
+
const setA = new Set(a.split('|').filter(Boolean));
|
|
161
|
+
const setB = new Set(b.split('|').filter(Boolean));
|
|
162
|
+
if (setA.size === 0 || setB.size === 0)
|
|
163
|
+
return 0;
|
|
164
|
+
let shared = 0;
|
|
165
|
+
for (const term of setA)
|
|
166
|
+
if (setB.has(term))
|
|
167
|
+
shared += 1;
|
|
168
|
+
return shared / (setA.size + setB.size - shared);
|
|
169
|
+
}
|
|
170
|
+
function frameFromState(state) {
|
|
171
|
+
return {
|
|
172
|
+
topicKey: state.topicKey ?? '',
|
|
173
|
+
filters: state.filters.map((filter) => filter.value),
|
|
174
|
+
sourceCertifiedBlock: state.sourceCertifiedBlock,
|
|
175
|
+
contextPackId: state.lastContextPackId,
|
|
176
|
+
measures: state.measures,
|
|
177
|
+
dimensions: state.dimensions,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function parseTopicFrame(raw) {
|
|
181
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
182
|
+
return undefined;
|
|
183
|
+
const record = raw;
|
|
184
|
+
const topicKey = optionalString(record.topicKey);
|
|
185
|
+
if (!topicKey)
|
|
186
|
+
return undefined;
|
|
187
|
+
return {
|
|
188
|
+
topicKey,
|
|
189
|
+
filters: stringArray(record.filters),
|
|
190
|
+
sourceCertifiedBlock: optionalString(record.sourceCertifiedBlock),
|
|
191
|
+
contextPackId: optionalString(record.contextPackId),
|
|
192
|
+
measures: stringArray(record.measures),
|
|
193
|
+
dimensions: stringArray(record.dimensions),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function mergeTopicKeys(a, b) {
|
|
197
|
+
return Array.from(new Set([...a.split('|'), ...b.split('|')].filter(Boolean))).sort().slice(0, 8).join('|');
|
|
198
|
+
}
|
|
199
|
+
function merge(a, b) {
|
|
200
|
+
return Array.from(new Set([...a, ...b].map(normalizeTerm).filter(Boolean))).slice(0, MAX_TERMS);
|
|
201
|
+
}
|
|
202
|
+
function mergeFilters(prev, next) {
|
|
203
|
+
const seen = new Set();
|
|
204
|
+
const out = [];
|
|
205
|
+
for (const filter of [...prev, ...next]) {
|
|
206
|
+
const key = filter.value.toLowerCase();
|
|
207
|
+
if (seen.has(key))
|
|
208
|
+
continue;
|
|
209
|
+
seen.add(key);
|
|
210
|
+
out.push(filter);
|
|
211
|
+
}
|
|
212
|
+
return out.slice(0, MAX_FILTERS);
|
|
213
|
+
}
|
|
214
|
+
function normalizeTerm(value) {
|
|
215
|
+
return value.toLowerCase().replace(/[^a-z0-9_ ]+/g, '').replace(/s$/, '').trim();
|
|
216
|
+
}
|
|
217
|
+
function stringArray(value) {
|
|
218
|
+
if (!Array.isArray(value))
|
|
219
|
+
return [];
|
|
220
|
+
return value.filter((item) => typeof item === 'string' && item.trim().length > 0);
|
|
221
|
+
}
|
|
222
|
+
function filterArray(value) {
|
|
223
|
+
if (!Array.isArray(value))
|
|
224
|
+
return [];
|
|
225
|
+
return value.flatMap((item) => {
|
|
226
|
+
if (!item || typeof item !== 'object' || Array.isArray(item))
|
|
227
|
+
return [];
|
|
228
|
+
const record = item;
|
|
229
|
+
const filterValue = optionalString(record.value);
|
|
230
|
+
if (!filterValue)
|
|
231
|
+
return [];
|
|
232
|
+
return [{ value: filterValue, sourceTurnId: optionalString(record.sourceTurnId) ?? '' }];
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
function optionalString(value) {
|
|
236
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
237
|
+
}
|
|
238
|
+
function stringRecord(value) {
|
|
239
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
240
|
+
return undefined;
|
|
241
|
+
const out = {};
|
|
242
|
+
for (const [key, raw] of Object.entries(value)) {
|
|
243
|
+
const values = stringArray(raw);
|
|
244
|
+
if (values.length > 0)
|
|
245
|
+
out[key] = values;
|
|
246
|
+
}
|
|
247
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=working-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"working-state.js","sourceRoot":"","sources":["../../src/conversation/working-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,68 @@ export declare class HashedTokenEmbeddingProvider implements EmbeddingProvider {
|
|
|
36
36
|
}
|
|
37
37
|
/** The safe default provider: deterministic + offline. */
|
|
38
38
|
export declare function defaultEmbeddingProvider(): EmbeddingProvider;
|
|
39
|
+
/** Minimal fetch signature so the OpenAI provider stays dependency-free and testable. */
|
|
40
|
+
export type EmbeddingFetch = (url: string, init: {
|
|
41
|
+
method: string;
|
|
42
|
+
headers: Record<string, string>;
|
|
43
|
+
body: string;
|
|
44
|
+
signal?: AbortSignal;
|
|
45
|
+
}) => Promise<{
|
|
46
|
+
ok: boolean;
|
|
47
|
+
status: number;
|
|
48
|
+
json: () => Promise<unknown>;
|
|
49
|
+
}>;
|
|
50
|
+
export interface OpenAIEmbeddingOptions {
|
|
51
|
+
apiKey: string;
|
|
52
|
+
model?: string;
|
|
53
|
+
baseUrl?: string;
|
|
54
|
+
dimensions?: number;
|
|
55
|
+
fetchImpl?: EmbeddingFetch;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Real embeddings via an OpenAI-compatible `/embeddings` endpoint (dependency-free
|
|
59
|
+
* over fetch). Opt-in: only constructed when an API key is configured. Falls back
|
|
60
|
+
* to the hashed provider at the resolver level when unavailable, so offline and
|
|
61
|
+
* un-keyed projects keep working deterministically.
|
|
62
|
+
*/
|
|
63
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
64
|
+
readonly id: string;
|
|
65
|
+
readonly dimensions: number;
|
|
66
|
+
private readonly apiKey;
|
|
67
|
+
private readonly model;
|
|
68
|
+
private readonly baseUrl;
|
|
69
|
+
private readonly fetchImpl;
|
|
70
|
+
constructor(options: OpenAIEmbeddingOptions);
|
|
71
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Content-hash cache around any provider so repeated texts (block example
|
|
75
|
+
* questions, metric labels) are embedded once. Bounded LRU-ish by insertion order.
|
|
76
|
+
*/
|
|
77
|
+
export declare class CachingEmbeddingProvider implements EmbeddingProvider {
|
|
78
|
+
readonly id: string;
|
|
79
|
+
readonly dimensions: number;
|
|
80
|
+
private readonly inner;
|
|
81
|
+
private readonly cache;
|
|
82
|
+
private readonly maxEntries;
|
|
83
|
+
constructor(inner: EmbeddingProvider, maxEntries?: number);
|
|
84
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
85
|
+
private put;
|
|
86
|
+
}
|
|
87
|
+
export interface EmbeddingResolveOptions {
|
|
88
|
+
/** API key for an OpenAI-compatible embeddings endpoint. */
|
|
89
|
+
openaiApiKey?: string;
|
|
90
|
+
model?: string;
|
|
91
|
+
baseUrl?: string;
|
|
92
|
+
fetchImpl?: EmbeddingFetch;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Pick the best available embedding provider: a real OpenAI-compatible embedder
|
|
96
|
+
* when an API key is configured (wrapped in a content-hash cache), else the safe
|
|
97
|
+
* deterministic hashed-token provider. This is the single place config chooses an
|
|
98
|
+
* embedder, so retrieval/matching call sites just call resolveEmbeddingProvider().
|
|
99
|
+
*/
|
|
100
|
+
export declare function resolveEmbeddingProvider(options?: EmbeddingResolveOptions): EmbeddingProvider;
|
|
39
101
|
export interface HybridRankItem<T> {
|
|
40
102
|
item: T;
|
|
41
103
|
/** Text the item is embedded/searched on. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/embeddings/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CAC7C;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYjE;AAQD;;;;;;GAMG;AACH,qBAAa,4BAA6B,YAAW,iBAAiB;IACpE,QAAQ,CAAC,EAAE,qBAAqB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,SAAM;IAItB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAIjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;CAejC;AAQD,0DAA0D;AAC1D,wBAAgB,wBAAwB,IAAI,iBAAiB,CAE5D;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC;IACR,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAC1B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAiB5B"}
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/embeddings/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,6 +74,104 @@ function hashToken(token) {
|
|
|
74
74
|
export function defaultEmbeddingProvider() {
|
|
75
75
|
return new HashedTokenEmbeddingProvider();
|
|
76
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Real embeddings via an OpenAI-compatible `/embeddings` endpoint (dependency-free
|
|
79
|
+
* over fetch). Opt-in: only constructed when an API key is configured. Falls back
|
|
80
|
+
* to the hashed provider at the resolver level when unavailable, so offline and
|
|
81
|
+
* un-keyed projects keep working deterministically.
|
|
82
|
+
*/
|
|
83
|
+
export class OpenAIEmbeddingProvider {
|
|
84
|
+
id;
|
|
85
|
+
dimensions;
|
|
86
|
+
apiKey;
|
|
87
|
+
model;
|
|
88
|
+
baseUrl;
|
|
89
|
+
fetchImpl;
|
|
90
|
+
constructor(options) {
|
|
91
|
+
this.apiKey = options.apiKey;
|
|
92
|
+
this.model = options.model ?? 'text-embedding-3-small';
|
|
93
|
+
this.baseUrl = (options.baseUrl ?? 'https://api.openai.com/v1').replace(/\/$/, '');
|
|
94
|
+
this.dimensions = options.dimensions ?? 1536;
|
|
95
|
+
this.id = `openai:${this.model}`;
|
|
96
|
+
this.fetchImpl = options.fetchImpl ?? ((url, init) => fetch(url, init));
|
|
97
|
+
}
|
|
98
|
+
async embed(texts) {
|
|
99
|
+
if (texts.length === 0)
|
|
100
|
+
return [];
|
|
101
|
+
const response = await this.fetchImpl(`${this.baseUrl}/embeddings`, {
|
|
102
|
+
method: 'POST',
|
|
103
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${this.apiKey}` },
|
|
104
|
+
body: JSON.stringify({ model: this.model, input: texts }),
|
|
105
|
+
});
|
|
106
|
+
if (!response.ok)
|
|
107
|
+
throw new Error(`Embedding request failed (${response.status})`);
|
|
108
|
+
const payload = await response.json();
|
|
109
|
+
const rows = payload.data ?? [];
|
|
110
|
+
// Preserve request order via the returned index.
|
|
111
|
+
const out = new Array(texts.length).fill(null).map(() => []);
|
|
112
|
+
rows.forEach((row, i) => {
|
|
113
|
+
const index = typeof row.index === 'number' ? row.index : i;
|
|
114
|
+
out[index] = row.embedding ?? [];
|
|
115
|
+
});
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Content-hash cache around any provider so repeated texts (block example
|
|
121
|
+
* questions, metric labels) are embedded once. Bounded LRU-ish by insertion order.
|
|
122
|
+
*/
|
|
123
|
+
export class CachingEmbeddingProvider {
|
|
124
|
+
id;
|
|
125
|
+
dimensions;
|
|
126
|
+
inner;
|
|
127
|
+
cache = new Map();
|
|
128
|
+
maxEntries;
|
|
129
|
+
constructor(inner, maxEntries = 4096) {
|
|
130
|
+
this.inner = inner;
|
|
131
|
+
this.id = `cached:${inner.id}`;
|
|
132
|
+
this.dimensions = inner.dimensions;
|
|
133
|
+
this.maxEntries = maxEntries;
|
|
134
|
+
}
|
|
135
|
+
async embed(texts) {
|
|
136
|
+
const missing = [];
|
|
137
|
+
const keys = texts.map((text) => {
|
|
138
|
+
const key = createHash('sha1').update(text).digest('hex');
|
|
139
|
+
if (!this.cache.has(key))
|
|
140
|
+
missing.push({ text, key });
|
|
141
|
+
return key;
|
|
142
|
+
});
|
|
143
|
+
if (missing.length > 0) {
|
|
144
|
+
const vectors = await this.inner.embed(missing.map((entry) => entry.text));
|
|
145
|
+
missing.forEach((entry, i) => this.put(entry.key, vectors[i] ?? []));
|
|
146
|
+
}
|
|
147
|
+
return keys.map((key) => this.cache.get(key) ?? []);
|
|
148
|
+
}
|
|
149
|
+
put(key, vector) {
|
|
150
|
+
this.cache.set(key, vector);
|
|
151
|
+
if (this.cache.size > this.maxEntries) {
|
|
152
|
+
const oldest = this.cache.keys().next().value;
|
|
153
|
+
if (oldest !== undefined)
|
|
154
|
+
this.cache.delete(oldest);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Pick the best available embedding provider: a real OpenAI-compatible embedder
|
|
160
|
+
* when an API key is configured (wrapped in a content-hash cache), else the safe
|
|
161
|
+
* deterministic hashed-token provider. This is the single place config chooses an
|
|
162
|
+
* embedder, so retrieval/matching call sites just call resolveEmbeddingProvider().
|
|
163
|
+
*/
|
|
164
|
+
export function resolveEmbeddingProvider(options = {}) {
|
|
165
|
+
if (options.openaiApiKey) {
|
|
166
|
+
return new CachingEmbeddingProvider(new OpenAIEmbeddingProvider({
|
|
167
|
+
apiKey: options.openaiApiKey,
|
|
168
|
+
...(options.model ? { model: options.model } : {}),
|
|
169
|
+
...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
|
|
170
|
+
...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
return defaultEmbeddingProvider();
|
|
174
|
+
}
|
|
77
175
|
/**
|
|
78
176
|
* Blend FTS5 relevance with embedding cosine similarity. When `alpha` is 0 (the
|
|
79
177
|
* default) this is a pure pass-through of the FTS ordering — FTS5 stays the safe
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/embeddings/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWzC,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACtD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAEpC,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,4BAA4B;IAC9B,EAAE,GAAG,iBAAiB,CAAC;IACvB,UAAU,CAAS;IAE5B,YAAY,UAAU,GAAG,GAAG;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAe;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;YACnC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QACtB,CAAC;QACD,iFAAiF;QACjF,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,GAAG;YAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QAC3B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC;CACF;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;IACzD,oCAAoC;IACpC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACtF,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,4BAA4B,EAAE,CAAC;AAC5C,CAAC;AA0BD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAa,EACb,KAA0B,EAC1B,UAA6B,EAAE;IAE/B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK;aACT,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;aACvG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,wBAAwB,EAAE,CAAC;IAChE,MAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnG,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB;QACxD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtF,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/embeddings/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { LocalContextPack, MetadataAgentIntent, RuntimeSchemaTable } from '../metadata/catalog.js';
|
|
2
|
+
import { type SqlContextValidationResult } from '../metadata/sql-context-validation.js';
|
|
3
|
+
import { type GroundingValidationResult, type RelationResolution, type SchemaGrounding } from '../metadata/sql-grounding.js';
|
|
4
|
+
import { type GroundingExpansionResult } from './regrounding.js';
|
|
5
|
+
export interface ContextLedgerInput {
|
|
6
|
+
contextPack?: LocalContextPack;
|
|
7
|
+
schemaContext?: RuntimeSchemaTable[];
|
|
8
|
+
}
|
|
9
|
+
export interface ContextLedgerSqlValidationOptions {
|
|
10
|
+
question?: string;
|
|
11
|
+
intent?: MetadataAgentIntent | string;
|
|
12
|
+
filterValues?: string[];
|
|
13
|
+
trustedFilterValues?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface ContextLedgerExpansionResult {
|
|
16
|
+
ledger: ContextLedger;
|
|
17
|
+
notes: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare class ContextLedger {
|
|
20
|
+
readonly contextPack?: LocalContextPack;
|
|
21
|
+
readonly schemaContext: RuntimeSchemaTable[];
|
|
22
|
+
readonly grounding?: SchemaGrounding;
|
|
23
|
+
constructor(input?: ContextLedgerInput);
|
|
24
|
+
qualifySql(sql: string): RelationResolution;
|
|
25
|
+
validateSql(sql: string, options?: ContextLedgerSqlValidationOptions): SqlContextValidationResult;
|
|
26
|
+
validateRuntimeGrounding(sql: string): GroundingValidationResult | undefined;
|
|
27
|
+
withExpansion(expansion: GroundingExpansionResult | undefined): ContextLedgerExpansionResult;
|
|
28
|
+
}
|
|
29
|
+
export declare function createContextLedger(input?: ContextLedgerInput): ContextLedger;
|
|
30
|
+
//# sourceMappingURL=context-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-ledger.d.ts","sourceRoot":"","sources":["../../src/grounding/context-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAIL,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;gBAEzB,KAAK,GAAE,kBAAuB;IAM1C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAK3C,WAAW,CACT,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,iCAAsC,GAC9C,0BAA0B;IAO7B,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS;IAI5E,aAAa,CAAC,SAAS,EAAE,wBAAwB,GAAG,SAAS,GAAG,4BAA4B;CAU7F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,GAAE,kBAAuB,GAAG,aAAa,CAEjF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { validateSqlAgainstLocalContext, } from '../metadata/sql-context-validation.js';
|
|
2
|
+
import { buildGroundingFromRuntimeRelations, resolveRelationsInSql, validateSqlAgainstGrounding, } from '../metadata/sql-grounding.js';
|
|
3
|
+
import { applyGroundingExpansion, } from './regrounding.js';
|
|
4
|
+
export class ContextLedger {
|
|
5
|
+
contextPack;
|
|
6
|
+
schemaContext;
|
|
7
|
+
grounding;
|
|
8
|
+
constructor(input = {}) {
|
|
9
|
+
this.contextPack = input.contextPack;
|
|
10
|
+
this.schemaContext = input.schemaContext ?? [];
|
|
11
|
+
this.grounding = buildRuntimeGrounding(this.schemaContext);
|
|
12
|
+
}
|
|
13
|
+
qualifySql(sql) {
|
|
14
|
+
if (!this.grounding)
|
|
15
|
+
return { sql, rewrites: [] };
|
|
16
|
+
return resolveRelationsInSql(sql, this.grounding, { prefer: 'qualified' });
|
|
17
|
+
}
|
|
18
|
+
validateSql(sql, options = {}) {
|
|
19
|
+
return validateSqlAgainstLocalContext(sql, this.contextPack, {
|
|
20
|
+
...options,
|
|
21
|
+
runtimeSchema: this.schemaContext,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
validateRuntimeGrounding(sql) {
|
|
25
|
+
return this.grounding ? validateSqlAgainstGrounding(sql, this.grounding) : undefined;
|
|
26
|
+
}
|
|
27
|
+
withExpansion(expansion) {
|
|
28
|
+
const merged = applyGroundingExpansion(this.contextPack, this.schemaContext, expansion);
|
|
29
|
+
return {
|
|
30
|
+
ledger: new ContextLedger({
|
|
31
|
+
contextPack: merged.contextPack,
|
|
32
|
+
schemaContext: merged.schemaContext,
|
|
33
|
+
}),
|
|
34
|
+
notes: merged.notes,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function createContextLedger(input = {}) {
|
|
39
|
+
return new ContextLedger(input);
|
|
40
|
+
}
|
|
41
|
+
function buildRuntimeGrounding(schemaContext) {
|
|
42
|
+
if (schemaContext.length === 0)
|
|
43
|
+
return undefined;
|
|
44
|
+
return buildGroundingFromRuntimeRelations(schemaContext.map((table) => ({
|
|
45
|
+
relation: table.relation,
|
|
46
|
+
name: table.name,
|
|
47
|
+
columns: table.columns.map((column) => ({
|
|
48
|
+
name: column.name,
|
|
49
|
+
type: column.type,
|
|
50
|
+
description: column.description,
|
|
51
|
+
})),
|
|
52
|
+
})));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=context-ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-ledger.js","sourceRoot":"","sources":["../../src/grounding/context-ledger.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,8BAA8B,GAE/B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,kCAAkC,EAClC,qBAAqB,EACrB,2BAA2B,GAI5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,uBAAuB,GAExB,MAAM,kBAAkB,CAAC;AAmB1B,MAAM,OAAO,aAAa;IACf,WAAW,CAAoB;IAC/B,aAAa,CAAuB;IACpC,SAAS,CAAmB;IAErC,YAAY,QAA4B,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7D,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAClD,OAAO,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,WAAW,CACT,GAAW,EACX,UAA6C,EAAE;QAE/C,OAAO,8BAA8B,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE;YAC3D,GAAG,OAAO;YACV,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IAED,wBAAwB,CAAC,GAAW;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,CAAC;IAED,aAAa,CAAC,SAA+C;QAC3D,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACxF,OAAO;YACL,MAAM,EAAE,IAAI,aAAa,CAAC;gBACxB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC,CAAC;YACF,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,QAA4B,EAAE;IAChE,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,qBAAqB,CAAC,aAAmC;IAChE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO,kCAAkC,CACvC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC;KACJ,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC"}
|