@pellux/goodvibes-sdk 0.28.14 → 0.28.16
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/_internal/contracts/artifacts/operator-contract.json +19 -1
- package/dist/_internal/contracts/generated/foundation-metadata.d.ts +1 -1
- package/dist/_internal/contracts/generated/foundation-metadata.js +1 -1
- package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
- package/dist/_internal/contracts/generated/operator-contract.js +19 -1
- package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.d.ts.map +1 -1
- package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.js +1 -0
- package/dist/_internal/platform/knowledge/home-graph/generated-pages.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/home-graph/generated-pages.js +13 -4
- package/dist/_internal/platform/knowledge/home-graph/service.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/home-graph/service.js +48 -46
- package/dist/_internal/platform/knowledge/semantic/answer-fallback.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/semantic/answer-fallback.js +18 -4
- package/dist/_internal/platform/knowledge/semantic/answer.js +3 -0
- package/dist/_internal/platform/knowledge/semantic/gap-repair.js +11 -4
- package/dist/_internal/platform/knowledge/semantic/self-improvement-promotion.d.ts +11 -0
- package/dist/_internal/platform/knowledge/semantic/self-improvement-promotion.d.ts.map +1 -0
- package/dist/_internal/platform/knowledge/semantic/self-improvement-promotion.js +256 -0
- package/dist/_internal/platform/knowledge/semantic/self-improvement-tasks.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/semantic/self-improvement-tasks.js +9 -1
- package/dist/_internal/platform/knowledge/semantic/self-improvement.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/semantic/self-improvement.js +13 -46
- package/dist/_internal/platform/knowledge/semantic/service.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/semantic/service.js +55 -10
- package/dist/_internal/platform/knowledge/store-refinement.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/store-refinement.js +8 -0
- package/dist/_internal/platform/knowledge/store-schema.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/store-schema.js +6 -1
- package/dist/_internal/platform/knowledge/store.d.ts +1 -0
- package/dist/_internal/platform/knowledge/store.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/store.js +1 -0
- package/dist/_internal/platform/knowledge/types.d.ts +2 -0
- package/dist/_internal/platform/knowledge/types.d.ts.map +1 -1
- package/dist/_internal/platform/state/sqlite-store.d.ts +3 -0
- package/dist/_internal/platform/state/sqlite-store.d.ts.map +1 -1
- package/dist/_internal/platform/state/sqlite-store.js +19 -0
- package/dist/_internal/platform/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { yieldEvery, yieldToEventLoop } from '../cooperative.js';
|
|
2
|
+
import { getKnowledgeSpaceId } from '../spaces.js';
|
|
3
|
+
import { hasConcreteFeatureSignal, isLowValueFeatureOrSpecText } from './fact-quality.js';
|
|
4
|
+
import { updateRefinementTask } from './self-improvement-tasks.js';
|
|
5
|
+
import { withTimeout } from './timeouts.js';
|
|
6
|
+
import { clampText, normalizeWhitespace, readRecord, readString, semanticHash, semanticMetadata, semanticSlug, sourceSemanticText, splitSentences, uniqueStrings, } from './utils.js';
|
|
7
|
+
export async function promoteRepairSources(context, spaceId, gap, sourceIds, task, deadlineAt) {
|
|
8
|
+
if (context.enrichSource) {
|
|
9
|
+
for (const [index, sourceId] of sourceIds.entries()) {
|
|
10
|
+
await yieldEvery(index, 2);
|
|
11
|
+
const remainingMs = Math.max(0, deadlineAt - Date.now());
|
|
12
|
+
if (remainingMs < 1_000)
|
|
13
|
+
break;
|
|
14
|
+
await withTimeout(context.enrichSource(sourceId, { knowledgeSpaceId: spaceId, force: true }), Math.min(remainingMs, 20_000), 'Semantic repair source enrichment exceeded its run budget.');
|
|
15
|
+
await yieldToEventLoop();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const promotedFactCount = await promoteRepairEvidenceFacts(context.store, spaceId, gap, sourceIds);
|
|
19
|
+
await linkPromotedFactsToRepairSubjects(context.store, spaceId, gap, sourceIds);
|
|
20
|
+
const usableFactCount = promotedFactCount > 0
|
|
21
|
+
? promotedFactCount
|
|
22
|
+
: countUsableRepairFacts(context.store, spaceId, sourceIds);
|
|
23
|
+
await updateRefinementTask(context.store, context.store.getRefinementTask(task.id) ?? task, 'verified', 'Accepted repair sources were semantically enriched.', {
|
|
24
|
+
promotedSourceIds: sourceIds,
|
|
25
|
+
promotedFactCount: usableFactCount,
|
|
26
|
+
});
|
|
27
|
+
return usableFactCount;
|
|
28
|
+
}
|
|
29
|
+
async function promoteRepairEvidenceFacts(store, spaceId, gap, sourceIds) {
|
|
30
|
+
const subjects = linkedRepairSubjects(store, spaceId, gap);
|
|
31
|
+
if (subjects.length === 0)
|
|
32
|
+
return 0;
|
|
33
|
+
let promoted = 0;
|
|
34
|
+
for (const sourceId of sourceIds) {
|
|
35
|
+
const source = store.getSource(sourceId);
|
|
36
|
+
if (!source)
|
|
37
|
+
continue;
|
|
38
|
+
const extraction = store.getExtractionBySourceId(source.id);
|
|
39
|
+
const authority = sourceAuthority(source);
|
|
40
|
+
const sentences = selectRepairFactSentences({
|
|
41
|
+
query: gap.title,
|
|
42
|
+
source,
|
|
43
|
+
text: sourceSemanticText(source, extraction),
|
|
44
|
+
});
|
|
45
|
+
for (const [index, sentence] of sentences.entries()) {
|
|
46
|
+
const classification = classifyRepairFact(sentence);
|
|
47
|
+
const fact = await store.upsertNode({
|
|
48
|
+
id: `sem-fact-${semanticHash(spaceId, source.id, gap.id, classification.title, sentence)}`,
|
|
49
|
+
kind: 'fact',
|
|
50
|
+
slug: semanticSlug(`${spaceId}-${classification.title}-${source.id}-${index}`),
|
|
51
|
+
title: classification.title,
|
|
52
|
+
summary: sentence,
|
|
53
|
+
aliases: classification.aliases,
|
|
54
|
+
status: 'active',
|
|
55
|
+
confidence: authority === 'official-vendor' ? 88 : 76,
|
|
56
|
+
sourceId: source.id,
|
|
57
|
+
metadata: semanticMetadata(spaceId, {
|
|
58
|
+
semanticKind: 'fact',
|
|
59
|
+
factKind: classification.kind,
|
|
60
|
+
value: classification.value,
|
|
61
|
+
evidence: sentence,
|
|
62
|
+
labels: classification.labels,
|
|
63
|
+
sourceId: source.id,
|
|
64
|
+
gapId: gap.id,
|
|
65
|
+
linkedObjectIds: subjects.map((subject) => subject.id),
|
|
66
|
+
extractor: 'repair-promotion',
|
|
67
|
+
sourceAuthority: authority,
|
|
68
|
+
sourceDiscovery: readRecord(source.metadata.sourceDiscovery),
|
|
69
|
+
}),
|
|
70
|
+
});
|
|
71
|
+
await store.upsertEdge({
|
|
72
|
+
fromKind: 'source',
|
|
73
|
+
fromId: source.id,
|
|
74
|
+
toKind: 'node',
|
|
75
|
+
toId: fact.id,
|
|
76
|
+
relation: 'supports_fact',
|
|
77
|
+
weight: authority === 'official-vendor' ? 0.95 : 0.84,
|
|
78
|
+
metadata: semanticMetadata(spaceId, {
|
|
79
|
+
linkedBy: 'semantic-gap-repair',
|
|
80
|
+
gapId: gap.id,
|
|
81
|
+
}),
|
|
82
|
+
});
|
|
83
|
+
for (const subject of subjects) {
|
|
84
|
+
await store.upsertEdge({
|
|
85
|
+
fromKind: 'node',
|
|
86
|
+
fromId: fact.id,
|
|
87
|
+
toKind: 'node',
|
|
88
|
+
toId: subject.id,
|
|
89
|
+
relation: 'describes',
|
|
90
|
+
weight: authority === 'official-vendor' ? 0.94 : 0.82,
|
|
91
|
+
metadata: semanticMetadata(spaceId, {
|
|
92
|
+
linkedBy: 'semantic-gap-repair',
|
|
93
|
+
repairedAt: Date.now(),
|
|
94
|
+
sourceId: source.id,
|
|
95
|
+
gapId: gap.id,
|
|
96
|
+
}),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
promoted += 1;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return promoted;
|
|
103
|
+
}
|
|
104
|
+
async function linkPromotedFactsToRepairSubjects(store, spaceId, gap, sourceIds) {
|
|
105
|
+
const linkedObjectIds = readStringArray(gap.metadata.linkedObjectIds).filter((nodeId) => Boolean(store.getNode(nodeId)));
|
|
106
|
+
if (linkedObjectIds.length === 0)
|
|
107
|
+
return;
|
|
108
|
+
const edges = store.listEdges();
|
|
109
|
+
const nodesById = new Map(store.listNodes(10_000).filter((node) => getKnowledgeSpaceId(node) === spaceId).map((node) => [node.id, node]));
|
|
110
|
+
for (const sourceId of sourceIds) {
|
|
111
|
+
for (const fact of factsForSource(sourceId, edges, nodesById)) {
|
|
112
|
+
for (const objectId of linkedObjectIds) {
|
|
113
|
+
await store.upsertEdge({
|
|
114
|
+
fromKind: 'node',
|
|
115
|
+
fromId: fact.id,
|
|
116
|
+
toKind: 'node',
|
|
117
|
+
toId: objectId,
|
|
118
|
+
relation: 'describes',
|
|
119
|
+
weight: 0.82,
|
|
120
|
+
metadata: semanticMetadata(spaceId, {
|
|
121
|
+
linkedBy: 'semantic-gap-repair',
|
|
122
|
+
repairedAt: Date.now(),
|
|
123
|
+
sourceId,
|
|
124
|
+
}),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function selectRepairFactSentences(input) {
|
|
131
|
+
const wanted = repairIntentPatterns(input.query);
|
|
132
|
+
const sourceText = normalizeWhitespace(input.text);
|
|
133
|
+
const candidates = splitSentences(sourceText, 360)
|
|
134
|
+
.map((sentence) => normalizeWhitespace(sentence))
|
|
135
|
+
.filter((sentence) => sentence.length >= 24 && sentence.length <= 360)
|
|
136
|
+
.filter((sentence) => !sentence.trim().endsWith('?'))
|
|
137
|
+
.filter((sentence) => hasConcreteFeatureSignal(sentence))
|
|
138
|
+
.filter((sentence) => !isLowValueFeatureOrSpecText(sentence));
|
|
139
|
+
const scored = candidates.map((sentence) => ({
|
|
140
|
+
sentence,
|
|
141
|
+
score: repairSentenceScore(sentence, wanted, input.source),
|
|
142
|
+
})).filter((entry) => entry.score > 0);
|
|
143
|
+
return uniqueStrings(scored
|
|
144
|
+
.sort((left, right) => right.score - left.score || left.sentence.localeCompare(right.sentence))
|
|
145
|
+
.map((entry) => entry.sentence))
|
|
146
|
+
.slice(0, 14);
|
|
147
|
+
}
|
|
148
|
+
function repairSentenceScore(sentence, wanted, source) {
|
|
149
|
+
const lower = sentence.toLowerCase();
|
|
150
|
+
let score = sourceAuthority(source) === 'official-vendor' ? 12 : 0;
|
|
151
|
+
if (wanted.some((pattern) => pattern.test(lower)))
|
|
152
|
+
score += 20;
|
|
153
|
+
if (hasConcreteFeatureSignal(lower))
|
|
154
|
+
score += 8;
|
|
155
|
+
if (/\b(hdmi|usb|ethernet|wi-?fi|bluetooth|hdr|dolby|resolution|refresh|120\s*hz|speaker|tuner|atsc|qam|webos|airplay|homekit|freesync|vrr|allm|earc|arc)\b/.test(lower)) {
|
|
156
|
+
score += 12;
|
|
157
|
+
}
|
|
158
|
+
if (/\b(specifications?|features?|connectivity|ports?|display|audio|network|smart tv|gaming)\b/.test(lower))
|
|
159
|
+
score += 6;
|
|
160
|
+
if (/^\s*\d+\s/.test(lower) || /\b(question|answer|faq|click|price|review|manual\.nz)\b/.test(lower))
|
|
161
|
+
score -= 20;
|
|
162
|
+
return score;
|
|
163
|
+
}
|
|
164
|
+
function classifyRepairFact(sentence) {
|
|
165
|
+
const lower = sentence.toLowerCase();
|
|
166
|
+
if (/\b(resolution|4k|8k|uhd|display|screen|nanocell|lcd|oled|qled|refresh|hz|hdr|dolby vision|hlg)\b/.test(lower)) {
|
|
167
|
+
return { kind: 'specification', title: 'Display and picture specifications', labels: ['display', 'picture'], aliases: ['display', 'picture'] };
|
|
168
|
+
}
|
|
169
|
+
if (/\b(hdmi|usb|ethernet|optical|rf|antenna|rs-?232|composite|component|earc|arc|ports?|input|output)\b/.test(lower)) {
|
|
170
|
+
return { kind: 'specification', title: 'Input and output ports', labels: ['ports', 'connectivity'], aliases: ['ports', 'inputs', 'outputs'] };
|
|
171
|
+
}
|
|
172
|
+
if (/\b(wi-?fi|bluetooth|wireless|airplay|homekit|miracast|chromecast|ethernet)\b/.test(lower)) {
|
|
173
|
+
return { kind: 'capability', title: 'Network and wireless capabilities', labels: ['network', 'wireless'], aliases: ['network', 'wireless'] };
|
|
174
|
+
}
|
|
175
|
+
if (/\b(speaker|audio|dolby atmos|dolby audio|sound|watts?|channels?)\b/.test(lower)) {
|
|
176
|
+
return { kind: 'specification', title: 'Audio capabilities', labels: ['audio'], aliases: ['audio', 'speakers'] };
|
|
177
|
+
}
|
|
178
|
+
if (/\b(game|gaming|vrr|allm|freesync|g-?sync|low latency)\b/.test(lower)) {
|
|
179
|
+
return { kind: 'feature', title: 'Gaming features', labels: ['gaming'], aliases: ['gaming'] };
|
|
180
|
+
}
|
|
181
|
+
if (/\b(webos|smart tv|apps?|voice assistant|alexa|google assistant|streaming)\b/.test(lower)) {
|
|
182
|
+
return { kind: 'feature', title: 'Smart TV features', labels: ['smart-tv'], aliases: ['smart tv', 'apps'] };
|
|
183
|
+
}
|
|
184
|
+
if (/\b(tuner|atsc|ntsc|qam|broadcast|clear qam)\b/.test(lower)) {
|
|
185
|
+
return { kind: 'specification', title: 'Tuner support', labels: ['tuner'], aliases: ['tuner', 'broadcast'] };
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
kind: 'feature',
|
|
189
|
+
title: clampText(sentence, 80),
|
|
190
|
+
labels: ['source-backed'],
|
|
191
|
+
aliases: [],
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function repairIntentPatterns(query) {
|
|
195
|
+
const lower = query.toLowerCase();
|
|
196
|
+
const patterns = [];
|
|
197
|
+
if (/\b(port|ports|input|output|hdmi|usb|optical|rf|antenna|rs-?232|composite|component|i\/o)\b/.test(lower))
|
|
198
|
+
patterns.push(/\b(hdmi|usb|optical|rf|antenna|ethernet|rs-?232|composite|component|earc|arc|ports?|input|output)\b/);
|
|
199
|
+
if (/\b(bluetooth|wifi|wi-fi|wireless|network)\b/.test(lower))
|
|
200
|
+
patterns.push(/\b(bluetooth|wi-?fi|wireless|network|ethernet|airplay|homekit)\b/);
|
|
201
|
+
if (/\b(refresh|hz|hdr|dolby|vision|gaming|vrr|allm|freesync)\b/.test(lower))
|
|
202
|
+
patterns.push(/\b(refresh|hz|hdr|hdr10|dolby vision|hlg|game|vrr|allm|freesync|120\s*hz|100\s*hz)\b/);
|
|
203
|
+
if (/\b(display|screen|resolution|panel|nanocell|lcd|oled)\b/.test(lower))
|
|
204
|
+
patterns.push(/\b(display|screen|resolution|4k|uhd|nanocell|lcd|oled|panel)\b/);
|
|
205
|
+
if (patterns.length === 0)
|
|
206
|
+
patterns.push(/\b(hdmi|usb|hdr|dolby|resolution|refresh|wi-?fi|bluetooth|speaker|audio|webos|smart tv|tuner|gaming|ports?)\b/);
|
|
207
|
+
return patterns;
|
|
208
|
+
}
|
|
209
|
+
function linkedRepairSubjects(store, spaceId, gap) {
|
|
210
|
+
return uniqueById(readStringArray(gap.metadata.linkedObjectIds)
|
|
211
|
+
.map((id) => store.getNode(id))
|
|
212
|
+
.filter((node) => Boolean(node))
|
|
213
|
+
.filter((node) => getKnowledgeSpaceId(node) === spaceId && node.status !== 'stale'));
|
|
214
|
+
}
|
|
215
|
+
function factsForSource(sourceId, edges, nodesById) {
|
|
216
|
+
return uniqueById(edges
|
|
217
|
+
.filter((edge) => edge.fromKind === 'source' && edge.fromId === sourceId && edge.toKind === 'node')
|
|
218
|
+
.map((edge) => nodesById.get(edge.toId))
|
|
219
|
+
.filter((node) => Boolean(node))
|
|
220
|
+
.filter((node) => node.kind === 'fact' && node.status !== 'stale'));
|
|
221
|
+
}
|
|
222
|
+
function sourceAuthority(source) {
|
|
223
|
+
const discovery = readRecord(source.metadata.sourceDiscovery);
|
|
224
|
+
const trust = `${readString(discovery.trustReason) ?? ''} ${readString(discovery.sourceDomain) ?? ''} ${source.sourceUri ?? ''} ${source.canonicalUri ?? ''}`.toLowerCase();
|
|
225
|
+
if (/\bofficial-vendor-domain\b/.test(trust) || /(^|[/.])lg\.com\b|(^|[/.])sony\.com\b|(^|[/.])samsung\.com\b|(^|[/.])apple\.com\b/.test(trust)) {
|
|
226
|
+
return 'official-vendor';
|
|
227
|
+
}
|
|
228
|
+
if (/\bmanufacturer-domain\b/.test(trust))
|
|
229
|
+
return 'vendor';
|
|
230
|
+
return 'secondary';
|
|
231
|
+
}
|
|
232
|
+
function countUsableRepairFacts(store, spaceId, sourceIds) {
|
|
233
|
+
const sources = new Set(sourceIds);
|
|
234
|
+
return store.listNodes(10_000)
|
|
235
|
+
.filter((node) => node.kind === 'fact' && node.status !== 'stale')
|
|
236
|
+
.filter((node) => getKnowledgeSpaceId(node) === spaceId)
|
|
237
|
+
.filter((node) => node.sourceId && sources.has(node.sourceId))
|
|
238
|
+
.filter((node) => ['feature', 'capability', 'specification', 'compatibility', 'configuration'].includes(readString(node.metadata.factKind) ?? ''))
|
|
239
|
+
.length;
|
|
240
|
+
}
|
|
241
|
+
function uniqueById(items) {
|
|
242
|
+
const seen = new Set();
|
|
243
|
+
const result = [];
|
|
244
|
+
for (const item of items) {
|
|
245
|
+
if (!item || seen.has(item.id))
|
|
246
|
+
continue;
|
|
247
|
+
seen.add(item.id);
|
|
248
|
+
result.push(item);
|
|
249
|
+
}
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
function readStringArray(value) {
|
|
253
|
+
if (!Array.isArray(value))
|
|
254
|
+
return [];
|
|
255
|
+
return uniqueStrings(value.map((entry) => typeof entry === 'string' ? entry : undefined));
|
|
256
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-improvement-tasks.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/self-improvement-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC5B,8BAA8B,EAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,QAAQ,CAAC,aAAa,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACxD;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,8BAA8B,EACvC,KAAK,EAAE,4BAA4B,EACnC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,6BAA6B,CAAC,CAiCxC;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,6BAA6B,EACnC,KAAK,EAAE,4BAA4B,EACnC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,6BAA6B,CAAC,
|
|
1
|
+
{"version":3,"file":"self-improvement-tasks.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/self-improvement-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC5B,8BAA8B,EAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,QAAQ,CAAC,aAAa,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACxD;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,8BAA8B,EACvC,KAAK,EAAE,4BAA4B,EACnC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,6BAA6B,CAAC,CAiCxC;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,6BAA6B,EACnC,KAAK,EAAE,4BAA4B,EACnC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,6BAA6B,CAAC,CAwBxC"}
|
|
@@ -34,6 +34,7 @@ export async function upsertRefinementTaskForGap(store, spaceId, context, trigge
|
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
export async function updateRefinementTask(store, task, state, message, data = {}) {
|
|
37
|
+
const nextRepairAttemptAt = readNumber(data.nextRepairAttemptAt) ?? task.nextRepairAttemptAt;
|
|
37
38
|
return store.upsertRefinementTask({
|
|
38
39
|
id: task.id,
|
|
39
40
|
spaceId: task.spaceId,
|
|
@@ -49,8 +50,12 @@ export async function updateRefinementTask(store, task, state, message, data = {
|
|
|
49
50
|
budget: task.budget,
|
|
50
51
|
attemptCount: state === 'searching' ? task.attemptCount + 1 : task.attemptCount,
|
|
51
52
|
...(state === 'blocked' || state === 'failed' ? { blockedReason: message } : {}),
|
|
53
|
+
...(typeof nextRepairAttemptAt === 'number' ? { nextRepairAttemptAt } : {}),
|
|
52
54
|
appendTrace: [trace(state, message, data)],
|
|
53
|
-
metadata:
|
|
55
|
+
metadata: {
|
|
56
|
+
...task.metadata,
|
|
57
|
+
...(typeof nextRepairAttemptAt === 'number' ? { nextRepairAttemptAt } : {}),
|
|
58
|
+
},
|
|
54
59
|
});
|
|
55
60
|
}
|
|
56
61
|
function trace(state, message, data = {}) {
|
|
@@ -77,3 +82,6 @@ function subjectTitle(subject) {
|
|
|
77
82
|
subject.title,
|
|
78
83
|
].filter(Boolean).join(' ');
|
|
79
84
|
}
|
|
85
|
+
function readNumber(value) {
|
|
86
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
87
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-improvement.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/self-improvement.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"self-improvement.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/self-improvement.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,OAAO,KAAK,EACV,4BAA4B,EAC5B,iCAAiC,EACjC,kCAAkC,EACnC,MAAM,YAAY,CAAC;AAapB,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3I;AAUD,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,kBAAkB,EAC3B,KAAK,GAAE,iCAAsC,GAC5C,OAAO,CAAC,kCAAkC,CAAC,CA8N7C"}
|
|
@@ -5,6 +5,7 @@ import { recoverNoRepairerTasks, recoverStaleActiveTasks } from './self-improvem
|
|
|
5
5
|
import { readRecord, readString, semanticHash, semanticMetadata, semanticSlug, sourceKnowledgeSpace, uniqueStrings } from './utils.js';
|
|
6
6
|
import { withTimeout } from './timeouts.js';
|
|
7
7
|
import { updateRefinementTask, upsertRefinementTaskForGap } from './self-improvement-tasks.js';
|
|
8
|
+
import { promoteRepairSources } from './self-improvement-promotion.js';
|
|
8
9
|
const RETRY_DELAY_MS = 6 * 60 * 60 * 1000;
|
|
9
10
|
const DEFAULT_REFINEMENT_LIMIT = 12;
|
|
10
11
|
const MAX_REFINEMENT_LIMIT = 24;
|
|
@@ -144,7 +145,7 @@ export async function runKnowledgeSemanticSelfImprovement(context, input = {}) {
|
|
|
144
145
|
ingestedSources += result?.ingestedSourceIds.length ?? 0;
|
|
145
146
|
ingestedSourceIds.push(...(result?.ingestedSourceIds ?? []));
|
|
146
147
|
const acceptedSourceIds = uniqueStrings([...(result?.acceptedSourceIds ?? []), ...(result?.ingestedSourceIds ?? [])]);
|
|
147
|
-
|
|
148
|
+
let promotedFactCount = 0;
|
|
148
149
|
task = await updateRefinementTask(context.store, task, 'evaluating', result?.reason ?? 'Source discovery completed.', {
|
|
149
150
|
query: result?.query ?? gap.title,
|
|
150
151
|
sourceAssessments: result?.sourceAssessments ?? [],
|
|
@@ -157,23 +158,27 @@ export async function runKnowledgeSemanticSelfImprovement(context, input = {}) {
|
|
|
157
158
|
}
|
|
158
159
|
linkedRepairs += await linkRepairSources(context.store, spaceId, gap, acceptedSourceIds, result?.query ?? gap.title);
|
|
159
160
|
if (acceptedSourceIds.length > 0) {
|
|
160
|
-
await promoteRepairSources(context, spaceId, gap, acceptedSourceIds, task, startedAt + maxRunMs);
|
|
161
|
+
promotedFactCount = await promoteRepairSources(context, spaceId, gap, acceptedSourceIds, task, startedAt + maxRunMs);
|
|
161
162
|
}
|
|
163
|
+
const evidenceSufficient = result?.evidenceSufficient !== false && acceptedSourceIds.length > 0 && promotedFactCount > 0;
|
|
162
164
|
await markGapRepairAttempt(context.store, gap, spaceId, {
|
|
163
165
|
status: evidenceSufficient ? 'repaired' : acceptedSourceIds.length ? 'deferred' : 'searched_no_sources',
|
|
164
166
|
reason: result?.reason,
|
|
165
167
|
query: result?.query,
|
|
166
168
|
});
|
|
167
169
|
if (evidenceSufficient) {
|
|
170
|
+
closedGaps += 1;
|
|
168
171
|
await updateRefinementTask(context.store, task, 'closed', 'Repair sources were accepted and linked to the gap.', {
|
|
169
172
|
acceptedSourceIds,
|
|
170
173
|
ingestedSourceIds: result?.ingestedSourceIds ?? [],
|
|
174
|
+
promotedFactCount,
|
|
171
175
|
});
|
|
172
176
|
}
|
|
173
177
|
else if (acceptedSourceIds.length) {
|
|
174
178
|
blockedGaps += 1;
|
|
175
179
|
await updateRefinementTask(context.store, task, 'blocked', result?.reason ?? 'Accepted source evidence was linked, but the gap still needs corroboration.', {
|
|
176
180
|
acceptedSourceIds,
|
|
181
|
+
promotedFactCount,
|
|
177
182
|
retryable: true,
|
|
178
183
|
nextRepairAttemptAt: Date.now() + RETRY_DELAY_MS,
|
|
179
184
|
});
|
|
@@ -411,8 +416,8 @@ function classifyGap(context, force) {
|
|
|
411
416
|
return { action: 'skip', reason: 'Gap already has linked repair sources.', status: 'repaired' };
|
|
412
417
|
if (!force && nextAttemptAt && nextAttemptAt > Date.now())
|
|
413
418
|
return { action: 'skip', reason: 'Gap repair retry window has not elapsed.', status: 'retry_wait', markAttempt: true };
|
|
414
|
-
if (hasRepairEdge(context))
|
|
415
|
-
return { action: 'skip', reason: 'Gap already has
|
|
419
|
+
if (!force && hasRepairEdge(context) && hasRepairFactEvidence(context))
|
|
420
|
+
return { action: 'skip', reason: 'Gap already has promoted repair facts.', status: 'already_repaired' };
|
|
416
421
|
if (isNotApplicableGap(context))
|
|
417
422
|
return { action: 'suppress', reason: 'The gap is not applicable to the linked subject.' };
|
|
418
423
|
if (!hasConcreteSubject(context)) {
|
|
@@ -426,6 +431,10 @@ function classifyGap(context, force) {
|
|
|
426
431
|
function hasRepairEdge(context) {
|
|
427
432
|
return context.repairSourceIds.length > 0;
|
|
428
433
|
}
|
|
434
|
+
function hasRepairFactEvidence(context) {
|
|
435
|
+
const repairSourceIds = new Set(context.repairSourceIds);
|
|
436
|
+
return context.facts.some((fact) => fact.sourceId && repairSourceIds.has(fact.sourceId) && readString(fact.metadata.extractor) === 'repair-promotion');
|
|
437
|
+
}
|
|
429
438
|
function isNotApplicableGap(context) {
|
|
430
439
|
const text = `${context.gap.title} ${context.gap.summary ?? ''}`.toLowerCase();
|
|
431
440
|
if (text.includes('battery')) {
|
|
@@ -529,48 +538,6 @@ async function linkRepairSources(store, spaceId, gap, sourceIds, query) {
|
|
|
529
538
|
}
|
|
530
539
|
return linked;
|
|
531
540
|
}
|
|
532
|
-
async function promoteRepairSources(context, spaceId, gap, sourceIds, task, deadlineAt) {
|
|
533
|
-
if (!context.enrichSource)
|
|
534
|
-
return;
|
|
535
|
-
for (const [index, sourceId] of sourceIds.entries()) {
|
|
536
|
-
await yieldEvery(index, 2);
|
|
537
|
-
const remainingMs = Math.max(0, deadlineAt - Date.now());
|
|
538
|
-
if (remainingMs < 1_000)
|
|
539
|
-
break;
|
|
540
|
-
await withTimeout(context.enrichSource(sourceId, { knowledgeSpaceId: spaceId, force: true }), Math.min(remainingMs, 20_000), 'Semantic repair source enrichment exceeded its run budget.');
|
|
541
|
-
await yieldToEventLoop();
|
|
542
|
-
}
|
|
543
|
-
await linkPromotedFactsToRepairSubjects(context.store, spaceId, gap, sourceIds);
|
|
544
|
-
await updateRefinementTask(context.store, context.store.getRefinementTask(task.id) ?? task, 'verified', 'Accepted repair sources were semantically enriched.', {
|
|
545
|
-
promotedSourceIds: sourceIds,
|
|
546
|
-
});
|
|
547
|
-
}
|
|
548
|
-
async function linkPromotedFactsToRepairSubjects(store, spaceId, gap, sourceIds) {
|
|
549
|
-
const linkedObjectIds = readStringArray(gap.metadata.linkedObjectIds).filter((nodeId) => Boolean(store.getNode(nodeId)));
|
|
550
|
-
if (linkedObjectIds.length === 0)
|
|
551
|
-
return;
|
|
552
|
-
const edges = store.listEdges();
|
|
553
|
-
const nodesById = new Map(store.listNodes(10_000).filter((node) => getKnowledgeSpaceId(node) === spaceId).map((node) => [node.id, node]));
|
|
554
|
-
for (const sourceId of sourceIds) {
|
|
555
|
-
for (const fact of factsForSource(sourceId, edges, nodesById)) {
|
|
556
|
-
for (const objectId of linkedObjectIds) {
|
|
557
|
-
await store.upsertEdge({
|
|
558
|
-
fromKind: 'node',
|
|
559
|
-
fromId: fact.id,
|
|
560
|
-
toKind: 'node',
|
|
561
|
-
toId: objectId,
|
|
562
|
-
relation: 'describes',
|
|
563
|
-
weight: 0.82,
|
|
564
|
-
metadata: semanticMetadata(spaceId, {
|
|
565
|
-
linkedBy: 'semantic-gap-repair',
|
|
566
|
-
repairedAt: Date.now(),
|
|
567
|
-
sourceId,
|
|
568
|
-
}),
|
|
569
|
-
});
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
541
|
function isBudgetError(message) {
|
|
575
542
|
return /\b(timeout|timed out|budget|deadline|exceeded)\b/i.test(message);
|
|
576
543
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAKzD,OAAO,KAAK,EACV,4BAA4B,EAC5B,6BAA6B,EAC7B,iCAAiC,EACjC,4BAA4B,EAC5B,oBAAoB,EACpB,iCAAiC,EACjC,kCAAkC,EACnC,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CACzC;AAED,qBAAa,wBAAwB;IAKjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,wBAAwB,CAA4D;gBAGzE,KAAK,EAAE,cAAc,EAC9B,OAAO,GAAE,+BAAoC;IAGvD,cAAc,CAAC,WAAW,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAO5E,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3E,OAAO,CAAC,iCAAiC,GAAG,IAAI,CAAC;IAO9C,aAAa,CACjB,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,KAAK,GAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GACpG,OAAO,CAAC,SAAS,iCAAiC,EAAE,CAAC;IAYlD,OAAO,CAAC,KAAK,GAAE;QACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC/B,GAAG,OAAO,CAAC;QACf,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,SAAS;YAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAClF,QAAQ,CAAC,eAAe,EAAE,kCAAkC,CAAC;KAC9D,CAAC;IAyDI,MAAM,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAKzD,OAAO,KAAK,EACV,4BAA4B,EAC5B,6BAA6B,EAC7B,iCAAiC,EACjC,4BAA4B,EAC5B,oBAAoB,EACpB,iCAAiC,EACjC,kCAAkC,EACnC,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CACzC;AAED,qBAAa,wBAAwB;IAKjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,wBAAwB,CAA4D;gBAGzE,KAAK,EAAE,cAAc,EAC9B,OAAO,GAAE,+BAAoC;IAGvD,cAAc,CAAC,WAAW,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAO5E,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3E,OAAO,CAAC,iCAAiC,GAAG,IAAI,CAAC;IAO9C,aAAa,CACjB,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,KAAK,GAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GACpG,OAAO,CAAC,SAAS,iCAAiC,EAAE,CAAC;IAYlD,OAAO,CAAC,KAAK,GAAE;QACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC/B,GAAG,OAAO,CAAC;QACf,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,SAAS;YAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAClF,QAAQ,CAAC,eAAe,EAAE,kCAAkC,CAAC;KAC9D,CAAC;IAyDI,MAAM,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,6BAA6B,CAAC;IA2CnF,gBAAgB,CAAC,KAAK,EAAE;QAC5B,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAAC;QAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,kCAAkC,CAAC;IAa/C,OAAO,CAAC,+BAA+B;IAYvC,OAAO,CAAC,8BAA8B;IAOhC,WAAW,CAAC,KAAK,GAAE,iCAAsC,GAAG,OAAO,CAAC,kCAAkC,CAAC;YAe/F,sBAAsB;IAiCpC,OAAO,CAAC,cAAc;CAOvB"}
|
|
@@ -101,11 +101,26 @@ export class KnowledgeSemanticService {
|
|
|
101
101
|
}
|
|
102
102
|
async answer(input) {
|
|
103
103
|
await this.store.init();
|
|
104
|
-
|
|
104
|
+
let answer = await answerKnowledgeQuery({ store: this.store, llm: this.options.llm }, input);
|
|
105
105
|
if (input.autoRepairGaps === false)
|
|
106
106
|
return answer;
|
|
107
107
|
if (this.options.gapRepairer && answer.answer.gaps.length > 0) {
|
|
108
108
|
const repairSpaceId = answerRepairSpaceId(answer);
|
|
109
|
+
const foregroundBudgetMs = foregroundAnswerRepairBudget(input, answer);
|
|
110
|
+
const foregroundTaskIds = [];
|
|
111
|
+
if (foregroundBudgetMs > 0) {
|
|
112
|
+
const repaired = await this.repairAnswerGaps({
|
|
113
|
+
answer,
|
|
114
|
+
maxRunMs: foregroundBudgetMs,
|
|
115
|
+
limit: Math.min(5, answer.answer.gaps.length),
|
|
116
|
+
});
|
|
117
|
+
foregroundTaskIds.push(...repaired.taskIds);
|
|
118
|
+
if (repaired.closedGaps > 0 || repaired.linkedRepairs > 0) {
|
|
119
|
+
answer = withRefinementTaskIds(await answerKnowledgeQuery({ store: this.store, llm: this.options.llm }, input), foregroundTaskIds);
|
|
120
|
+
if (answer.answer.gaps.length === 0 || answerHasUsableEvidence(answer))
|
|
121
|
+
return answer;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
109
124
|
const refinement = await this.selfImprove({
|
|
110
125
|
knowledgeSpaceId: repairSpaceId,
|
|
111
126
|
gapIds: answer.answer.gaps.map((gap) => gap.id),
|
|
@@ -115,17 +130,12 @@ export class KnowledgeSemanticService {
|
|
|
115
130
|
});
|
|
116
131
|
this.runAnswerRefinementInBackground(repairSpaceId, answer.answer.gaps.map((gap) => gap.id));
|
|
117
132
|
const taskIds = uniqueStrings([
|
|
133
|
+
...foregroundTaskIds,
|
|
118
134
|
...refinement.taskIds,
|
|
119
135
|
...this.taskIdsForGaps(repairSpaceId, answer.answer.gaps.map((gap) => gap.id)),
|
|
120
136
|
]);
|
|
121
137
|
if (taskIds.length > 0) {
|
|
122
|
-
return
|
|
123
|
-
...answer,
|
|
124
|
-
answer: {
|
|
125
|
-
...answer.answer,
|
|
126
|
-
refinementTaskIds: taskIds,
|
|
127
|
-
},
|
|
128
|
-
};
|
|
138
|
+
return withRefinementTaskIds(answer, taskIds);
|
|
129
139
|
}
|
|
130
140
|
}
|
|
131
141
|
return answer;
|
|
@@ -166,7 +176,7 @@ export class KnowledgeSemanticService {
|
|
|
166
176
|
await this.store.init();
|
|
167
177
|
if (input.deferRepair !== true) {
|
|
168
178
|
if (this.activeSelfImprovementRun && !input.gapIds?.length)
|
|
169
|
-
return activeSelfImproveResult();
|
|
179
|
+
return activeSelfImproveResult(input);
|
|
170
180
|
const run = this.runSelfImproveUnlocked(input);
|
|
171
181
|
if (!input.gapIds?.length)
|
|
172
182
|
this.activeSelfImprovementRun = run;
|
|
@@ -239,10 +249,45 @@ function answerRepairSpaceId(answer) {
|
|
|
239
249
|
}
|
|
240
250
|
return answer.spaceId;
|
|
241
251
|
}
|
|
242
|
-
function
|
|
252
|
+
function foregroundAnswerRepairBudget(input, answer) {
|
|
253
|
+
if (!answerNeedsForegroundRepair(input, answer))
|
|
254
|
+
return 0;
|
|
255
|
+
const requested = typeof input.timeoutMs === 'number' && Number.isFinite(input.timeoutMs)
|
|
256
|
+
? input.timeoutMs
|
|
257
|
+
: 45_000;
|
|
258
|
+
if (requested < 15_000)
|
|
259
|
+
return 0;
|
|
260
|
+
return Math.max(5_000, Math.min(35_000, requested - 5_000));
|
|
261
|
+
}
|
|
262
|
+
function answerNeedsForegroundRepair(input, answer) {
|
|
263
|
+
const repairSpaceId = answerRepairSpaceId(answer);
|
|
264
|
+
const homeAssistantScoped = repairSpaceId === 'homeassistant' || repairSpaceId.startsWith('homeassistant:');
|
|
265
|
+
if (!input.strictCandidates && !homeAssistantScoped)
|
|
266
|
+
return false;
|
|
267
|
+
return answer.answer.facts.length === 0 || answer.answer.sources.length === 0 || answer.answer.confidence < 50;
|
|
268
|
+
}
|
|
269
|
+
function answerHasUsableEvidence(answer) {
|
|
270
|
+
return answer.answer.facts.length > 0 && answer.answer.sources.length > 0 && answer.answer.confidence >= 50;
|
|
271
|
+
}
|
|
272
|
+
function withRefinementTaskIds(answer, taskIds) {
|
|
273
|
+
const ids = uniqueStrings([...(answer.answer.refinementTaskIds ?? []), ...taskIds]);
|
|
274
|
+
if (ids.length === 0)
|
|
275
|
+
return answer;
|
|
276
|
+
return {
|
|
277
|
+
...answer,
|
|
278
|
+
answer: {
|
|
279
|
+
...answer.answer,
|
|
280
|
+
refinementTaskIds: ids,
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function activeSelfImproveResult(input) {
|
|
285
|
+
const requestedLimit = Math.max(1, input.limit ?? 1);
|
|
243
286
|
return {
|
|
244
287
|
...emptySelfImproveResult(),
|
|
245
288
|
skippedGaps: 1,
|
|
289
|
+
requestedLimit,
|
|
290
|
+
effectiveLimit: requestedLimit,
|
|
246
291
|
truncated: true,
|
|
247
292
|
budgetExhausted: true,
|
|
248
293
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-refinement.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/store-refinement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,KAAK,EACV,6BAA6B,EAC7B,kCAAkC,EACnC,MAAM,YAAY,CAAC;AAEpB,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,WAAW,EACnB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,6BAA6B,CAAC,EAC3D,KAAK,EAAE,kCAAkC,EACzC,QAAQ,EAAE,MAAM,MAAM,GACrB,OAAO,CAAC,6BAA6B,CAAC,
|
|
1
|
+
{"version":3,"file":"store-refinement.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/store-refinement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,KAAK,EACV,6BAA6B,EAC7B,kCAAkC,EACnC,MAAM,YAAY,CAAC;AAEpB,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,WAAW,EACnB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,6BAA6B,CAAC,EAC3D,KAAK,EAAE,kCAAkC,EACzC,QAAQ,EAAE,MAAM,MAAM,GACrB,OAAO,CAAC,6BAA6B,CAAC,CAwExC"}
|
|
@@ -9,6 +9,9 @@ export async function upsertKnowledgeRefinementTask(sqlite, refinementTasks, inp
|
|
|
9
9
|
const _gapId = stableText(input.gapId);
|
|
10
10
|
const _issueId = stableText(input.issueId);
|
|
11
11
|
const _blockedReason = stableText(input.blockedReason);
|
|
12
|
+
const nextRepairAttemptAt = readNumber(input.nextRepairAttemptAt)
|
|
13
|
+
?? readNumber(input.metadata?.nextRepairAttemptAt)
|
|
14
|
+
?? existing?.nextRepairAttemptAt;
|
|
12
15
|
const replacementTrace = input.trace ? [...input.trace] : existing?.trace ?? [];
|
|
13
16
|
const trace = [...replacementTrace, ...(input.appendTrace ?? [])].slice(-80);
|
|
14
17
|
const record = {
|
|
@@ -29,10 +32,12 @@ export async function upsertKnowledgeRefinementTask(sqlite, refinementTasks, inp
|
|
|
29
32
|
},
|
|
30
33
|
attemptCount: Math.max(0, Math.trunc(input.attemptCount ?? existing?.attemptCount ?? 0)),
|
|
31
34
|
...(_blockedReason !== null ? { blockedReason: _blockedReason } : existing?.blockedReason && input.state === existing.state ? { blockedReason: existing.blockedReason } : {}),
|
|
35
|
+
...(typeof nextRepairAttemptAt === 'number' ? { nextRepairAttemptAt } : {}),
|
|
32
36
|
trace,
|
|
33
37
|
metadata: {
|
|
34
38
|
...(existing?.metadata ?? {}),
|
|
35
39
|
...(input.metadata ?? {}),
|
|
40
|
+
...(typeof nextRepairAttemptAt === 'number' ? { nextRepairAttemptAt } : {}),
|
|
36
41
|
},
|
|
37
42
|
createdAt: existing?.createdAt ?? now,
|
|
38
43
|
updatedAt: now,
|
|
@@ -67,3 +72,6 @@ export async function upsertKnowledgeRefinementTask(sqlite, refinementTasks, inp
|
|
|
67
72
|
await sqlite.save();
|
|
68
73
|
return record;
|
|
69
74
|
}
|
|
75
|
+
function readNumber(value) {
|
|
76
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
77
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-schema.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/store-schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qCAAqC,EACrC,kCAAkC,EAClC,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EAOrB,6BAA6B,EAQ7B,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,yCAAyC,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAInE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,EACjD,KAAK,EAAE,yBAAyB,GAC/B,oBAAoB,CAAC,QAAQ,CAAC,CAOhC;AAED,wBAAgB,IAAI,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAWpE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAOhE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CA4MjE;AAED,wBAAgB,4BAA4B,IAAI,SAAS,MAAM,EAAE,CAShE;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAMD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,CAuBxF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAgBpF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAcpF;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,oBAAoB,CActF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,yBAAyB,CAmBhG;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,CAgBxF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,6BAA6B,
|
|
1
|
+
{"version":3,"file":"store-schema.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/store-schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qCAAqC,EACrC,kCAAkC,EAClC,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EAOrB,6BAA6B,EAQ7B,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,yCAAyC,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAInE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,EACjD,KAAK,EAAE,yBAAyB,GAC/B,oBAAoB,CAAC,QAAQ,CAAC,CAOhC;AAED,wBAAgB,IAAI,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAWpE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAOhE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CA4MjE;AAED,wBAAgB,4BAA4B,IAAI,SAAS,MAAM,EAAE,CAShE;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAMD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,CAuBxF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAgBpF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAcpF;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,oBAAoB,CActF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,yBAAyB,CAmBhG;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,CAgBxF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,6BAA6B,CA2BxG;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,oBAAoB,CAatF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,qCAAqC,CAoB3G;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,kCAAkC,CAarG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,uBAAuB,CAc5F"}
|
|
@@ -378,6 +378,10 @@ export function mapJobRunRow(columns, values) {
|
|
|
378
378
|
}
|
|
379
379
|
export function mapRefinementTaskRow(columns, values) {
|
|
380
380
|
const row = rowObject(columns, values);
|
|
381
|
+
const metadata = parseJsonValue(row.metadata, {});
|
|
382
|
+
const nextRepairAttemptAt = typeof metadata.nextRepairAttemptAt === 'number' && Number.isFinite(metadata.nextRepairAttemptAt)
|
|
383
|
+
? metadata.nextRepairAttemptAt
|
|
384
|
+
: undefined;
|
|
381
385
|
return {
|
|
382
386
|
id: String(row.id),
|
|
383
387
|
spaceId: String(row.space_id),
|
|
@@ -393,8 +397,9 @@ export function mapRefinementTaskRow(columns, values) {
|
|
|
393
397
|
budget: parseJsonValue(row.budget, {}),
|
|
394
398
|
attemptCount: Number(row.attempt_count),
|
|
395
399
|
...(stableText(row.blocked_reason) ? { blockedReason: String(row.blocked_reason) } : {}),
|
|
400
|
+
...(typeof nextRepairAttemptAt === 'number' ? { nextRepairAttemptAt } : {}),
|
|
396
401
|
trace: parseJsonValue(row.trace, []),
|
|
397
|
-
metadata
|
|
402
|
+
metadata,
|
|
398
403
|
createdAt: Number(row.created_at),
|
|
399
404
|
updatedAt: Number(row.updated_at),
|
|
400
405
|
};
|
|
@@ -23,6 +23,7 @@ export declare class KnowledgeStore {
|
|
|
23
23
|
private asReadView;
|
|
24
24
|
init(): Promise<void>;
|
|
25
25
|
status(): KnowledgeStatus;
|
|
26
|
+
batch<T>(operation: () => Promise<T>): Promise<T>;
|
|
26
27
|
listSources(limit?: number): KnowledgeSourceRecord[];
|
|
27
28
|
listNodes(limit?: number): KnowledgeNodeRecord[];
|
|
28
29
|
listEdges(): KnowledgeEdgeRecord[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qCAAqC,EACrC,0CAA0C,EAC1C,kCAAkC,EAClC,uCAAuC,EACvC,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,8BAA8B,EAC9B,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,0BAA0B,EAC1B,6BAA6B,EAC7B,6BAA6B,EAC7B,kCAAkC,EAClC,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,0BAA0B,EAC1B,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAOpB,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEtF,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,yBAAyB,CAAC;AAsCjC,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;IAC5E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IACpE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoD;IACpF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2C;IACxE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA4D;IACpG,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAyD;IAC9F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8C;gBAE5D,MAAM,EAAE,oBAAoB;IAMxC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,CAAC,UAAU;IAIZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,MAAM,IAAI,eAAe;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/knowledge/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,7 @@ export class KnowledgeStore {
|
|
|
53
53
|
status() {
|
|
54
54
|
return getKnowledgeStoreStatus(this.asReadView());
|
|
55
55
|
}
|
|
56
|
+
async batch(operation) { await this.init(); return this.sqlite.batch(operation); }
|
|
56
57
|
listSources(limit = 100) {
|
|
57
58
|
return listKnowledgeSources(this.asReadView(), limit);
|
|
58
59
|
}
|