@pellux/goodvibes-sdk 0.28.18 → 0.28.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/_internal/contracts/artifacts/operator-contract.json +598 -1
  2. package/dist/_internal/contracts/generated/foundation-metadata.d.ts +1 -1
  3. package/dist/_internal/contracts/generated/foundation-metadata.js +1 -1
  4. package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
  5. package/dist/_internal/contracts/generated/operator-contract.js +598 -1
  6. package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.d.ts.map +1 -1
  7. package/dist/_internal/platform/control-plane/operator-contract-schemas-knowledge.js +6 -0
  8. package/dist/_internal/platform/knowledge/home-graph/reindex.d.ts.map +1 -1
  9. package/dist/_internal/platform/knowledge/home-graph/reindex.js +4 -0
  10. package/dist/_internal/platform/knowledge/semantic/answer-fallback.d.ts.map +1 -1
  11. package/dist/_internal/platform/knowledge/semantic/answer-fallback.js +133 -1
  12. package/dist/_internal/platform/knowledge/semantic/answer-source-ranking.d.ts +1 -0
  13. package/dist/_internal/platform/knowledge/semantic/answer-source-ranking.d.ts.map +1 -1
  14. package/dist/_internal/platform/knowledge/semantic/answer-source-ranking.js +2 -2
  15. package/dist/_internal/platform/knowledge/semantic/answer.d.ts.map +1 -1
  16. package/dist/_internal/platform/knowledge/semantic/answer.js +213 -37
  17. package/dist/_internal/platform/knowledge/semantic/enrichment.d.ts.map +1 -1
  18. package/dist/_internal/platform/knowledge/semantic/enrichment.js +36 -1
  19. package/dist/_internal/platform/knowledge/semantic/fact-quality.d.ts.map +1 -1
  20. package/dist/_internal/platform/knowledge/semantic/fact-quality.js +12 -2
  21. package/dist/_internal/platform/knowledge/semantic/repair-profile.d.ts.map +1 -1
  22. package/dist/_internal/platform/knowledge/semantic/repair-profile.js +20 -12
  23. package/dist/_internal/platform/knowledge/semantic/self-improvement-promotion.d.ts.map +1 -1
  24. package/dist/_internal/platform/knowledge/semantic/self-improvement-promotion.js +82 -13
  25. package/dist/_internal/platform/knowledge/semantic/service.js +4 -2
  26. package/dist/_internal/platform/knowledge/semantic/types.d.ts +1 -0
  27. package/dist/_internal/platform/knowledge/semantic/types.d.ts.map +1 -1
  28. package/dist/_internal/platform/knowledge/types.d.ts +4 -0
  29. package/dist/_internal/platform/knowledge/types.d.ts.map +1 -1
  30. package/dist/_internal/platform/version.js +1 -1
  31. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"operator-contract-schemas-knowledge.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/control-plane/operator-contract-schemas-knowledge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator-contract-schemas-knowledge.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/control-plane/operator-contract-schemas-knowledge.ts"],"names":[],"mappings":"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"}
@@ -155,6 +155,7 @@ const KNOWLEDGE_JOB_RUN_SELF_IMPROVEMENT_RESULT_SCHEMA = objectSchema({
155
155
  queuedTasks: NUMBER_SCHEMA,
156
156
  requestedLimit: NUMBER_SCHEMA,
157
157
  effectiveLimit: NUMBER_SCHEMA,
158
+ coalesced: BOOLEAN_SCHEMA,
158
159
  truncated: BOOLEAN_SCHEMA,
159
160
  budgetExhausted: BOOLEAN_SCHEMA,
160
161
  taskIds: STRING_LIST_SCHEMA,
@@ -253,6 +254,10 @@ export const KNOWLEDGE_NODE_SCHEMA = objectSchema({
253
254
  status: STRING_SCHEMA,
254
255
  confidence: NUMBER_SCHEMA,
255
256
  sourceId: STRING_SCHEMA,
257
+ subject: STRING_SCHEMA,
258
+ subjectIds: STRING_LIST_SCHEMA,
259
+ targetHints: arraySchema(JSON_RECORD_SCHEMA),
260
+ linkedObjectIds: STRING_LIST_SCHEMA,
256
261
  metadata: METADATA_SCHEMA,
257
262
  createdAt: NUMBER_SCHEMA,
258
263
  updatedAt: NUMBER_SCHEMA,
@@ -356,6 +361,7 @@ export const KNOWLEDGE_REFINEMENT_RUN_OUTPUT_SCHEMA = objectSchema({
356
361
  queuedTasks: NUMBER_SCHEMA,
357
362
  requestedLimit: NUMBER_SCHEMA,
358
363
  effectiveLimit: NUMBER_SCHEMA,
364
+ coalesced: BOOLEAN_SCHEMA,
359
365
  truncated: BOOLEAN_SCHEMA,
360
366
  budgetExhausted: BOOLEAN_SCHEMA,
361
367
  taskIds: STRING_LIST_SCHEMA,
@@ -1 +1 @@
1
- {"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/home-graph/reindex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAYrE,OAAO,KAAK,EACV,uBAAuB,EACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAEV,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,eAAe,CAAC,EAAE,wBAAwB,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,CAChB,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,KACnB,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAAC;IACpD,QAAQ,CAAC,uBAAuB,EAAE,CAChC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,KAC1B,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAAC;IACjD,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAAC;CACtH;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,qBAAqB,GAC3B,sBAAsB,CAexB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,uBAAuB,EAChC,KAAK,GAAE,qBAA0B,GAChC,OAAO,CAAC,sBAAsB,CAAC,CAmEjC;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAC9E,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAAC;IAClI,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA4ClC"}
1
+ {"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/home-graph/reindex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAYrE,OAAO,KAAK,EACV,uBAAuB,EACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAEV,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,eAAe,CAAC,EAAE,wBAAwB,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,CAChB,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,KACnB,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAAC;IACpD,QAAQ,CAAC,uBAAuB,EAAE,CAChC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,KAC1B,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAAC;IACjD,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAAC;CACtH;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,qBAAqB,GAC3B,sBAAsB,CAexB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,uBAAuB,EAChC,KAAK,GAAE,qBAA0B,GAChC,OAAO,CAAC,sBAAsB,CAAC,CAmEjC;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAC9E,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAAC;IAClI,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgDlC"}
@@ -119,6 +119,10 @@ export async function reindexHomeGraphSources(input) {
119
119
  }
120
120
  const artifact = input.artifactStore.get(artifactId);
121
121
  if (!artifact) {
122
+ if (isGeneratedPageSource(source)) {
123
+ skipped += 1;
124
+ continue;
125
+ }
122
126
  failed += 1;
123
127
  failures.push({ sourceId: source.id, error: `Unknown artifact: ${artifactId}` });
124
128
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"answer-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/answer-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIvD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,SAAS,sBAAsB,EAAE,EAC3C,KAAK,EAAE,SAAS,mBAAmB,EAAE,GACpC,cAAc,CAuBhB"}
1
+ {"version":3,"file":"answer-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/answer-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIvD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,SAAS,sBAAsB,EAAE,EAC3C,KAAK,EAAE,SAAS,mBAAmB,EAAE,GACpC,cAAc,CA8BhB"}
@@ -3,10 +3,17 @@ import { clampText, normalizeWhitespace, readString } from './utils.js';
3
3
  export function renderFallbackAnswer(query, mode, evidence, facts) {
4
4
  const factLimit = mode === 'detailed' ? 12 : mode === 'concise' ? 3 : 8;
5
5
  const factPhrases = facts.slice(0, factLimit).map(renderFactPhrase).filter(Boolean);
6
+ const profile = renderFeatureProfile(query, facts, evidence);
7
+ if (profile) {
8
+ return {
9
+ synthesized: true,
10
+ text: profile,
11
+ };
12
+ }
6
13
  if (factPhrases.length > 0) {
7
14
  return {
8
15
  synthesized: true,
9
- text: `Available source-backed details include ${joinFactPhrases(factPhrases)}.`,
16
+ text: `${joinFactPhrases(factPhrases)}.`,
10
17
  };
11
18
  }
12
19
  const sourceTitles = evidence
@@ -33,6 +40,122 @@ function renderFactPhrase(fact) {
33
40
  return '';
34
41
  return isLowValueFeatureOrSpecText(cleaned) ? '' : cleaned;
35
42
  }
43
+ function renderFeatureProfile(query, facts, evidence) {
44
+ if (!/\b(feature|features|capabilit|spec|specs|specification|specifications|support|supports)\b/i.test(query))
45
+ return null;
46
+ const phrases = collectProfilePhrases(facts, evidence);
47
+ const combined = phrases.join(' ');
48
+ const details = {
49
+ display: featureProfileTerms(combined, 'display').slice(0, 8),
50
+ smart: featureProfileTerms(combined, 'smart').slice(0, 5),
51
+ connectivity: featureProfileTerms(combined, 'connectivity').slice(0, 6),
52
+ audio: featureProfileTerms(combined, 'audio').slice(0, 5),
53
+ gaming: featureProfileTerms(combined, 'gaming').slice(0, 5),
54
+ };
55
+ const sentences = [];
56
+ if (details.display.length > 0)
57
+ sentences.push(`Display: ${joinFactPhrases(details.display)}.`);
58
+ if (details.smart.length > 0)
59
+ sentences.push(`Smart TV features: ${joinFactPhrases(details.smart)}.`);
60
+ if (details.connectivity.length > 0)
61
+ sentences.push(`Connectivity and ports: ${joinFactPhrases(details.connectivity)}.`);
62
+ if (details.audio.length > 0)
63
+ sentences.push(`Audio: ${joinFactPhrases(details.audio)}.`);
64
+ if (details.gaming.length > 0)
65
+ sentences.push(`Gaming-related capabilities: ${joinFactPhrases(details.gaming)}.`);
66
+ if (sentences.length >= 2)
67
+ return sentences.join(' ');
68
+ if (sentences.length === 1 && hasSpecificFeatureProfileIntent(query))
69
+ return sentences[0] ?? null;
70
+ return null;
71
+ }
72
+ function collectProfilePhrases(facts, evidence) {
73
+ const phrases = [];
74
+ for (const fact of facts) {
75
+ const phrase = renderFactPhrase(fact);
76
+ if (phrase)
77
+ phrases.push(phrase);
78
+ }
79
+ for (const item of evidence) {
80
+ const excerpt = readEvidenceExcerpt(item);
81
+ if (excerpt)
82
+ phrases.push(excerpt);
83
+ }
84
+ return uniqueCaseInsensitive(phrases);
85
+ }
86
+ function readEvidenceExcerpt(item) {
87
+ const raw = normalizeWhitespace(item.excerpt ?? '');
88
+ if (!raw)
89
+ return '';
90
+ const cleaned = normalizeWhitespace(clampText(stripSourceAddressFragments(raw), 260));
91
+ if (isRawSourceFragment(cleaned))
92
+ return '';
93
+ return isLowValueFeatureOrSpecText(cleaned) ? '' : cleaned;
94
+ }
95
+ function featureProfileTerms(value, category) {
96
+ const termMap = {
97
+ display: [
98
+ ['86-inch class screen', /\b86(?:\.0)?\s*(?:inch|inches|in\.|")\b|\b86nano/i],
99
+ ['4K UHD resolution', /\b4k\b|\buhd\b|\b3840\s*(?:x|×)\s*2160\b/i],
100
+ ['NanoCell display technology', /\bnanocell\b/i],
101
+ ['LCD/LED display', /\blcd\b|\bled\b/i],
102
+ ['100/120 Hz refresh rate', /\b(?:100|120)\s*hz\b|\btrumotion\s*240\b/i],
103
+ ['HDR10', /\bhdr10\b/i],
104
+ ['Dolby Vision', /\bdolby vision\b/i],
105
+ ['HLG', /\bhlg\b/i],
106
+ ['Filmmaker Mode', /\bfilmmaker mode\b/i],
107
+ ],
108
+ smart: [
109
+ ['webOS smart TV platform', /\bwebos\b/i],
110
+ ['LG ThinQ AI', /\bthinq\b/i],
111
+ ['Apple AirPlay 2', /\bairplay\s*2?\b/i],
112
+ ['Apple HomeKit', /\bhomekit\b/i],
113
+ ['voice assistant support', /\bvoice\b|\balexa\b|\bgoogle assistant\b/i],
114
+ ['streaming app support', /\bapps?\b|\bstreaming\b/i],
115
+ ],
116
+ connectivity: [
117
+ ['HDMI inputs', /\bhdmi\b/i],
118
+ ['HDMI ARC/eARC', /\bearc\b|\barc\b/i],
119
+ ['USB ports', /\busb\b/i],
120
+ ['Ethernet/LAN', /\bethernet\b|\blan\b|\brj-?45\b/i],
121
+ ['Wi-Fi/wireless LAN', /\bwi-?fi\b|\bwireless lan\b/i],
122
+ ['Bluetooth', /\bbluetooth\b/i],
123
+ ['Optical audio output', /\boptical\b|\btoslink\b/i],
124
+ ['RF/antenna input', /\brf\b|\bantenna\b/i],
125
+ ['ATSC/Clear QAM tuner support', /\batsc\b|\bclear qam\b|\bqam\b|\btuner\b/i],
126
+ ['RS-232C/external control', /\brs-?232c?\b|\bexternal control\b/i],
127
+ ],
128
+ audio: [
129
+ ['speaker/audio output', /\bspeakers?\b|\b(?:10|20|40)\s*w\b|\b2(?:\.0)?\s*ch\b/i],
130
+ ['Dolby audio formats', /\bdolby atmos\b|\bdolby digital\b|\bdolby audio\b|\btruehd\b|\bpcm\b/i],
131
+ ['HDMI ARC/eARC audio', /\bearc\b|\barc\b/i],
132
+ ],
133
+ gaming: [
134
+ ['FreeSync/VRR support', /\bfreesync\b|\bvrr\b/i],
135
+ ['ALLM/low-latency support', /\ballm\b|\blow latency\b/i],
136
+ ['Game Optimizer/game mode', /\bgame optimizer\b|\bgame mode\b|\bgaming\b/i],
137
+ ['4K/120 Hz or high-bandwidth HDMI', /\bhdmi\s*2\.1\b|\b4k\s*(?:at|@)?\s*120\b|\b120\s*hz\b/i],
138
+ ],
139
+ };
140
+ return termMap[category]
141
+ .filter(([, pattern]) => pattern.test(value))
142
+ .map(([label]) => label);
143
+ }
144
+ function uniqueCaseInsensitive(values) {
145
+ const seen = new Set();
146
+ const out = [];
147
+ for (const value of values) {
148
+ const key = value.toLowerCase();
149
+ if (seen.has(key))
150
+ continue;
151
+ seen.add(key);
152
+ out.push(value);
153
+ }
154
+ return out;
155
+ }
156
+ function hasSpecificFeatureProfileIntent(query) {
157
+ return /\b(hdr|display|screen|refresh|ports?|hdmi|earc|arc|usb|ethernet|optical|rf|antenna|rs-?232c?|audio|speaker|wireless|wi-?fi|bluetooth|gaming|vrr|allm|freesync|smart|webos|tuner|atsc|qam|dolby vision|hlg)\b/i.test(query);
158
+ }
36
159
  function isRawSourceFragment(value) {
37
160
  const lower = value.toLowerCase();
38
161
  return /\bsemantic-gap-repair\b/.test(lower)
@@ -41,6 +164,15 @@ function isRawSourceFragment(value) {
41
164
  || /\b[a-z0-9-]+\.(com|net|org|io|dev|tv|ca)\/[a-z0-9/_?=&.#-]+/.test(lower)
42
165
  || /\b[a-z]{2}\/[a-z0-9/_-]+\/[a-z0-9._-]+/.test(lower);
43
166
  }
167
+ function stripSourceAddressFragments(value) {
168
+ return value
169
+ .replace(/homegraph:\/\/\S+/gi, ' ')
170
+ .replace(/https?:\/\/\S+/gi, ' ')
171
+ .replace(/\bsemantic-gap-repair\b/gi, ' ')
172
+ .replace(/\bgenerated-page\b/gi, ' ')
173
+ .replace(/\b(?:www\.)?[a-z0-9-]+\.(?:com|net|org|io|dev|tv|ca|co\.uk)(?:\/\S*)?/gi, ' ')
174
+ .replace(/\b(?:com|net|org|io|dev|tv|ca|co\.uk)\/\S+/gi, ' ');
175
+ }
44
176
  function joinFactPhrases(phrases) {
45
177
  if (phrases.length <= 1)
46
178
  return phrases[0] ?? '';
@@ -4,4 +4,5 @@ export interface AnswerSourceRankingEvidence {
4
4
  readonly source?: KnowledgeSourceRecord;
5
5
  }
6
6
  export declare function rankAnswerSources(evidence: readonly AnswerSourceRankingEvidence[], facts: readonly KnowledgeNodeRecord[]): KnowledgeSourceRecord[];
7
+ export declare function sourceAuthorityBoostForAnswer(source: KnowledgeSourceRecord): number;
7
8
  //# sourceMappingURL=answer-source-ranking.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"answer-source-ranking.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/answer-source-ranking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAG9E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;CACzC;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,2BAA2B,EAAE,EAChD,KAAK,EAAE,SAAS,mBAAmB,EAAE,GACpC,qBAAqB,EAAE,CAwBzB"}
1
+ {"version":3,"file":"answer-source-ranking.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/answer-source-ranking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAG9E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;CACzC;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,2BAA2B,EAAE,EAChD,KAAK,EAAE,SAAS,mBAAmB,EAAE,GACpC,qBAAqB,EAAE,CAwBzB;AAmBD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAMnF"}
@@ -28,14 +28,14 @@ function sourceAnswerQuality(source, evidenceScoreBySource, factCountBySource, p
28
28
  const discovery = readRecord(source.metadata.sourceDiscovery);
29
29
  const rank = typeof discovery.sourceRank === 'number' ? Math.max(0, 12 - discovery.sourceRank) : 0;
30
30
  return Math.round((evidenceScoreBySource.get(source.id) ?? 0) / 4)
31
- + sourceAuthorityBoost(source)
31
+ + sourceAuthorityBoostForAnswer(source)
32
32
  + Math.min(80, (factCountBySource.get(source.id) ?? 0) * 10)
33
33
  + Math.min(90, (promotedFactCountBySource.get(source.id) ?? 0) * 18)
34
34
  + rank * 4
35
35
  + (source.status === 'indexed' ? 12 : source.status === 'pending' ? 2 : 0)
36
36
  - (source.metadata.homeGraphGeneratedPage === true ? 90 : 0);
37
37
  }
38
- function sourceAuthorityBoost(source) {
38
+ export function sourceAuthorityBoostForAnswer(source) {
39
39
  const discovery = readRecord(source.metadata.sourceDiscovery);
40
40
  const text = `${readString(discovery.trustReason) ?? ''} ${readString(discovery.sourceDomain) ?? ''} ${source.sourceUri ?? ''} ${source.canonicalUri ?? ''}`.toLowerCase();
41
41
  if (/\bofficial-vendor-domain\b/.test(text) || /(^|[/.])(?:lg|sony|samsung|apple)\.com\b/.test(text))
@@ -1 +1 @@
1
- {"version":3,"file":"answer.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/answer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAYlD,OAAO,KAAK,EACV,4BAA4B,EAC5B,6BAA6B,EAE7B,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAiCpB,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC5C;AAyCD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,6BAA6B,CAAC,CA+FxC"}
1
+ {"version":3,"file":"answer.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/answer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAYlD,OAAO,KAAK,EACV,4BAA4B,EAC5B,6BAA6B,EAE7B,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAiCpB,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC5C;AAyCD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,6BAA6B,CAAC,CAyGxC"}
@@ -6,7 +6,7 @@ import { concreteAnswerGapSpaceId } from './answer-space.js';
6
6
  import { answerNeedsFeatureGap, cleanSynthesizedAnswer } from './answer-quality.js';
7
7
  import { clampTimeoutMs, withTimeoutOrNull } from './timeouts.js';
8
8
  import { renderFallbackAnswer } from './answer-fallback.js';
9
- import { rankAnswerSources } from './answer-source-ranking.js';
9
+ import { rankAnswerSources, sourceAuthorityBoostForAnswer } from './answer-source-ranking.js';
10
10
  import { canonicalRepairSubjectNodes } from './repair-subjects.js';
11
11
  const GENERIC_ANSWER_INTENT_TOKENS = new Set([
12
12
  'capabilities',
@@ -39,35 +39,38 @@ export async function answerKnowledgeQuery(context, input) {
39
39
  const spaceId = normalizeKnowledgeSpaceId(input.knowledgeSpaceId);
40
40
  const mode = input.mode ?? 'standard';
41
41
  const limit = Math.max(1, input.limit ?? 8);
42
- const evidence = collectAnswerEvidence(context.store, input, spaceId, limit);
42
+ let evidence = collectAnswerEvidence(context.store, input, spaceId, limit);
43
43
  if (evidence.length === 0) {
44
- const linkedObjects = input.includeLinkedObjects === false ? [] : [...input.linkedObjects ?? []];
45
- const gapSpaceId = concreteAnswerGapSpaceId(spaceId, [], [], linkedObjects);
46
- const gap = await persistAnswerGap(context.store, gapSpaceId, input.query, 'No indexed evidence matched the question.', {
47
- linkedObjects,
48
- });
49
- return {
50
- ok: true,
51
- spaceId,
52
- query: input.query,
53
- answer: {
54
- text: input.noMatchMessage ?? `No knowledge matched "${input.query}".`,
55
- mode,
56
- confidence: 0,
57
- sources: [],
58
- linkedObjects,
59
- facts: [],
60
- gaps: [gap],
61
- synthesized: false,
62
- },
63
- results: [],
64
- };
44
+ const linkedObjects = input.includeLinkedObjects === false ? [] : filterAnswerLinkedObjects(spaceId, input.query, [...(input.linkedObjects ?? [])]);
45
+ const linkedEvidence = includeOfficialLinkedEvidence(context.store, spaceId, input.query, evidence, linkedObjects, limit);
46
+ if (linkedEvidence.length > 0) {
47
+ evidence = linkedEvidence;
48
+ }
49
+ else {
50
+ const gap = shouldPersistNoMatchGap(spaceId, input.query, linkedObjects)
51
+ ? await persistAnswerGap(context.store, concreteAnswerGapSpaceId(spaceId, [], [], linkedObjects), input.query, 'No indexed evidence matched the question.', {
52
+ linkedObjects,
53
+ })
54
+ : null;
55
+ return {
56
+ ok: true,
57
+ spaceId,
58
+ query: input.query,
59
+ answer: {
60
+ text: input.noMatchMessage ?? `No knowledge matched "${input.query}".`,
61
+ mode,
62
+ confidence: 0,
63
+ sources: [],
64
+ linkedObjects,
65
+ facts: [],
66
+ gaps: gap ? [gap] : [],
67
+ synthesized: false,
68
+ },
69
+ results: [],
70
+ };
71
+ }
65
72
  }
66
- const llmAnswer = await synthesizeAnswer(context.llm ?? null, input.query, mode, evidence, input.timeoutMs);
67
- const facts = filterFactsForQuery(input.query, uniqueNodes(evidence.flatMap((item) => item.facts))).slice(0, 24);
68
- const sources = rankAnswerSources(evidence, facts)
69
- .slice(0, limit)
70
- .map(withAnswerSourceAliases);
73
+ let rawFacts = filterFactsForQuery(input.query, uniqueNodes(evidence.flatMap((item) => item.facts))).slice(0, 24);
71
74
  const inferredHomeAssistantLinkedObjects = input.includeLinkedObjects === false
72
75
  ? []
73
76
  : inferHomeAssistantLinkedObjects(context.store, spaceId, input.query);
@@ -84,6 +87,14 @@ export async function answerKnowledgeQuery(context, input) {
84
87
  .filter(isSemanticAnswerLinkedObject)
85
88
  .slice(0, 24);
86
89
  const linkedObjects = filterAnswerLinkedObjects(spaceId, input.query, rawLinkedObjects);
90
+ evidence = includeOfficialLinkedEvidence(context.store, spaceId, input.query, evidence, linkedObjects, limit);
91
+ rawFacts = filterFactsForQuery(input.query, uniqueNodes(evidence.flatMap((item) => item.facts))).slice(0, 24);
92
+ const llmAnswer = await synthesizeAnswer(context.llm ?? null, input.query, mode, evidence, input.timeoutMs);
93
+ const rankedSources = rankAnswerSources(evidence, rawFacts);
94
+ const facts = withAnswerFactContract(context.store, rawFacts, linkedObjects);
95
+ const sources = includeOfficialLinkedSources(context.store, spaceId, rankedSources, linkedObjects)
96
+ .slice(0, limit)
97
+ .map(withAnswerSourceAliases);
87
98
  const gapSpaceId = concreteAnswerGapSpaceId(spaceId, evidence, sources, linkedObjects);
88
99
  const gaps = await persistAnswerGaps(context.store, gapSpaceId, input.query, llmAnswer?.gaps ?? [], {
89
100
  sources,
@@ -105,14 +116,14 @@ export async function answerKnowledgeQuery(context, input) {
105
116
  const llmText = llmAnswer?.answer?.trim();
106
117
  const cleanedLlmText = llmText ? cleanSynthesizedAnswer(llmText, featureIntent) : undefined;
107
118
  const dropLowValueLlmAnswer = featureIntent && Boolean(cleanedLlmText) && isLowValueFeatureOrSpecText(cleanedLlmText ?? '');
108
- const fallback = !llmText || dropLowValueLlmAnswer
109
- ? renderFallbackAnswer(input.query, mode, evidence, facts)
110
- : null;
111
- const synthesizedAnswer = dropLowValueLlmAnswer ? undefined : cleanedLlmText;
112
- const text = synthesizedAnswer || cleanSynthesizedAnswer(fallback?.text || '', featureIntent);
119
+ const fallback = renderFallbackAnswer(input.query, mode, evidence, facts);
120
+ const preferFallback = shouldPreferFallbackAnswer(featureIntent, cleanedLlmText, fallback.text);
121
+ const useFallback = dropLowValueLlmAnswer || preferFallback || !cleanedLlmText;
122
+ const text = cleanSynthesizedAnswer((useFallback ? fallback.text : cleanedLlmText) || '', featureIntent);
123
+ const synthesized = useFallback ? fallback.synthesized : Boolean(cleanedLlmText);
113
124
  const confidence = input.includeConfidence === false
114
125
  ? 0
115
- : dropLowValueLlmAnswer ? 0 : answerConfidence(llmAnswer, evidence);
126
+ : dropLowValueLlmAnswer || (useFallback && !fallback.synthesized) ? 0 : answerConfidence(preferFallback ? null : llmAnswer, evidence);
116
127
  return {
117
128
  ok: true,
118
129
  spaceId,
@@ -125,11 +136,19 @@ export async function answerKnowledgeQuery(context, input) {
125
136
  linkedObjects,
126
137
  facts,
127
138
  gaps: evidenceGap ? uniqueNodes([...gaps, evidenceGap]) : gaps,
128
- synthesized: Boolean(synthesizedAnswer) || Boolean(fallback?.synthesized),
139
+ synthesized,
129
140
  },
130
141
  results: evidence.map(toSearchResult),
131
142
  };
132
143
  }
144
+ function shouldPersistNoMatchGap(spaceId, query, linkedObjects) {
145
+ if (linkedObjects.length > 0)
146
+ return true;
147
+ if (normalizeKnowledgeSpaceId(spaceId) !== 'homeassistant')
148
+ return true;
149
+ const subjectTokens = tokenizeSemanticQuery(query).filter((token) => !GENERIC_ANSWER_INTENT_TOKENS.has(token));
150
+ return subjectTokens.length > 0;
151
+ }
133
152
  function collectAnswerEvidence(store, input, spaceId, limit) {
134
153
  const tokens = expandQueryTokens(tokenizeSemanticQuery(input.query));
135
154
  if (tokens.length === 0)
@@ -142,6 +161,8 @@ function collectAnswerEvidence(store, input, spaceId, limit) {
142
161
  const sourceFacts = buildSourceFactIndex(store, spaceId);
143
162
  const linkedSourceIds = sourceIdsLinkedToNodes(store, new Set([...candidateNodeIds, ...linkedObjectIds]), spaceId);
144
163
  const broadHomeAssistantAlias = normalizeKnowledgeSpaceId(spaceId) === 'homeassistant' && !strictCandidates;
164
+ if (broadHomeAssistantAlias && subjectTokens.length === 0 && linkedObjectIds.size === 0)
165
+ return [];
145
166
  const homeAssistantScope = !strictCandidates
146
167
  ? inferHomeAssistantAnswerScope(store, spaceId, input.query, subjectTokens)
147
168
  : null;
@@ -253,6 +274,140 @@ function shouldUseEvidenceLinkedObjects(spaceId, input, inferredHomeAssistantLin
253
274
  }
254
275
  return true;
255
276
  }
277
+ function withAnswerFactContract(store, facts, linkedObjects) {
278
+ if (facts.length === 0)
279
+ return [];
280
+ const linkedObjectIds = new Set(linkedObjects.map((node) => node.id));
281
+ return facts.map((fact) => {
282
+ const source = fact.sourceId ? store.getSource(fact.sourceId) : null;
283
+ const discovery = readRecord(source?.metadata.sourceDiscovery);
284
+ const metadataLinkedIds = uniqueStrings([
285
+ ...readStringArray(fact.metadata.linkedObjectIds),
286
+ ...readStringArray(fact.metadata.subjectIds),
287
+ ...readStringArray(discovery.linkedObjectIds),
288
+ ]);
289
+ const subjectIds = metadataLinkedIds.filter((id) => linkedObjectIds.has(id));
290
+ const fallbackSubjectIds = subjectIds.length > 0
291
+ ? subjectIds
292
+ : linkedObjects.length === 1 ? [linkedObjects[0].id] : [];
293
+ const subjects = fallbackSubjectIds
294
+ .map((id) => linkedObjects.find((node) => node.id === id) ?? store.getNode(id))
295
+ .filter((node) => Boolean(node && node.status !== 'stale'));
296
+ if (subjects.length === 0)
297
+ return fact;
298
+ const targetHints = answerTargetHints(subjects);
299
+ const metadata = {
300
+ ...fact.metadata,
301
+ subject: readString(fact.metadata.subject) ?? subjects[0]?.title,
302
+ subjectIds: subjects.map((node) => node.id),
303
+ linkedObjectIds: subjects.map((node) => node.id),
304
+ targetHints,
305
+ };
306
+ return {
307
+ ...fact,
308
+ metadata,
309
+ subject: metadata.subject,
310
+ subjectIds: metadata.subjectIds,
311
+ linkedObjectIds: metadata.linkedObjectIds,
312
+ targetHints,
313
+ };
314
+ });
315
+ }
316
+ function answerTargetHints(nodes) {
317
+ return nodes.map((node) => ({
318
+ id: node.id,
319
+ kind: node.kind,
320
+ title: node.title,
321
+ ...(node.summary ? { summary: node.summary } : {}),
322
+ }));
323
+ }
324
+ function includeOfficialLinkedSources(store, spaceId, rankedSources, linkedObjects) {
325
+ if (linkedObjects.length === 0)
326
+ return rankedSources;
327
+ const linkedIds = new Set(linkedObjects.map((node) => node.id));
328
+ const linkedSourceIds = sourceIdsLinkedToNodes(store, linkedIds, spaceId);
329
+ const official = store.listSources(10_000)
330
+ .filter((source) => belongsToAnswerSpace(source, spaceId))
331
+ .filter((source) => sourceAuthorityBoostForAnswer(source) > 0)
332
+ .filter((source) => {
333
+ const discovery = readRecord(source.metadata.sourceDiscovery);
334
+ return linkedSourceIds.has(source.id)
335
+ || readStringArray(discovery.linkedObjectIds).some((id) => linkedIds.has(id));
336
+ })
337
+ .sort((left, right) => sourceAuthorityBoostForAnswer(right) - sourceAuthorityBoostForAnswer(left));
338
+ return uniqueSources([...official, ...rankedSources]);
339
+ }
340
+ function includeOfficialLinkedEvidence(store, spaceId, query, evidence, linkedObjects, limit) {
341
+ if (linkedObjects.length === 0)
342
+ return [...evidence];
343
+ const linkedIds = new Set(linkedObjects.map((node) => node.id));
344
+ const linkedSourceIds = sourceIdsLinkedToNodes(store, linkedIds, spaceId);
345
+ const tokens = expandQueryTokens(tokenizeSemanticQuery(query));
346
+ const sourceFacts = buildSourceFactIndex(store, spaceId);
347
+ const officialItems = store.listSources(10_000)
348
+ .filter((source) => belongsToAnswerSpace(source, spaceId))
349
+ .filter((source) => sourceAuthorityBoostForAnswer(source) > 0)
350
+ .filter((source) => linkedSourceIds.has(source.id) || readStringArray(readRecord(source.metadata.sourceDiscovery).linkedObjectIds).some((id) => linkedIds.has(id)))
351
+ .map((source) => {
352
+ const extraction = store.getExtractionBySourceId(source.id);
353
+ const facts = filterFactsForQuery(query, sourceFacts.get(source.id) ?? []);
354
+ const text = sourceSemanticText(source, extraction);
355
+ const scoringText = [
356
+ source.title,
357
+ source.summary,
358
+ source.description,
359
+ source.tags.join(' '),
360
+ text,
361
+ facts.map(renderFactForScoring).join(' '),
362
+ ].join('\n');
363
+ const semanticScore = scoreSemanticText(scoringText, tokens);
364
+ return {
365
+ kind: 'source',
366
+ id: source.id,
367
+ title: source.title ?? source.canonicalUri ?? source.sourceUri ?? source.id,
368
+ score: semanticScore + sourceAuthorityBoostForAnswer(source) + Math.min(80, facts.length * 10),
369
+ source,
370
+ excerpt: selectEvidenceExcerpt(query, text, facts),
371
+ facts,
372
+ };
373
+ })
374
+ .filter((item) => item.score > 0);
375
+ if (officialItems.length === 0)
376
+ return [...evidence];
377
+ return uniqueEvidenceItems([...officialItems, ...evidence]
378
+ .sort((left, right) => right.score - left.score || left.id.localeCompare(right.id)))
379
+ .slice(0, Math.max(limit, evidence.length, 1));
380
+ }
381
+ function shouldPreferFallbackAnswer(featureIntent, llmText, fallbackText) {
382
+ if (!featureIntent || !fallbackText)
383
+ return false;
384
+ if (!llmText)
385
+ return true;
386
+ const lower = llmText.toLowerCase();
387
+ if (isLowValueFeatureOrSpecText(llmText))
388
+ return true;
389
+ if (/\b(source-backed facts identify|available source-backed details include|matching sources exist|not enough source-backed facts|not enough concrete source-backed)\b/.test(lower)) {
390
+ return hasConcreteFeatureSignal(fallbackText);
391
+ }
392
+ if (/\bevidence\b/.test(lower) && featureFamilyCount(fallbackText) >= 2)
393
+ return true;
394
+ if (featureFamilyCount(llmText) < 2 && featureFamilyCount(fallbackText) >= 2)
395
+ return true;
396
+ return false;
397
+ }
398
+ function featureFamilyCount(text) {
399
+ const lower = text.toLowerCase();
400
+ return [
401
+ /\b(hdmi|earc|arc|ports?|usb|ethernet|optical|rf|antenna|rs-?232c?)\b/,
402
+ /\b(hdr|hdr10|dolby vision|hlg|filmmaker)\b/,
403
+ /\b(4k|8k|uhd|resolution|refresh|120\s*hz|100\s*hz|nanocell|display|screen)\b/,
404
+ /\b(webos|apps?|streaming|airplay|homekit|chromecast|smart tv|thinq)\b/,
405
+ /\b(wi-?fi|bluetooth|wireless lan)\b/,
406
+ /\b(audio|speakers?|dolby atmos|sound)\b/,
407
+ /\b(game|gaming|vrr|allm|freesync|g-sync)\b/,
408
+ /\b(tuner|atsc|qam|ntsc|broadcast)\b/,
409
+ ].filter((pattern) => pattern.test(lower)).length;
410
+ }
256
411
  async function synthesizeAnswer(llm, query, mode, evidence, requestedTimeoutMs) {
257
412
  if (!llm)
258
413
  return null;
@@ -546,17 +701,26 @@ function selectEvidenceExcerpt(query, text, facts) {
546
701
  const tokens = expandQueryTokens(tokenizeSemanticQuery(query));
547
702
  const intent = factIntent(tokenizeSemanticQuery(query));
548
703
  const featureIntent = Boolean(intent && hasFeatureIntent(intent));
704
+ const evidenceText = stripEvidenceRoutingFragments(text);
549
705
  const factLines = facts
550
706
  .map(renderFactForPrompt)
551
707
  .filter((line) => scoreSemanticText(line, tokens) > 0)
552
708
  .filter((line) => !featureIntent || !isLowValueFeatureOrSpecText(line))
553
709
  .slice(0, 12);
554
- const windows = evidenceWindows(text, tokens)
710
+ const windows = evidenceWindows(evidenceText, tokens)
555
711
  .filter((line) => !featureIntent || !isLowValueFeatureOrSpecText(line))
556
712
  .slice(0, 4);
557
- const fallback = featureIntent && (factLines.length > 0 || windows.length > 0) ? [] : [clampText(text, 720)];
713
+ const fallback = featureIntent && (factLines.length > 0 || windows.length > 0) ? [] : [clampText(evidenceText, 720)];
558
714
  return uniqueStrings([...factLines, ...windows, ...fallback]).join('\n');
559
715
  }
716
+ function stripEvidenceRoutingFragments(text) {
717
+ return normalizeWhitespace(text
718
+ .replace(/homegraph:\/\/\S+/gi, ' ')
719
+ .replace(/https?:\/\/\S+/gi, ' ')
720
+ .replace(/\bsemantic-gap-repair\b/gi, ' ')
721
+ .replace(/\bgenerated-page\b/gi, ' ')
722
+ .replace(/\b[a-z0-9-]+\.(?:com|net|org|io|dev|tv|ca|co\.uk)(?:\/\S*)?/gi, ' '));
723
+ }
560
724
  function evidenceWindows(text, tokens) {
561
725
  const normalized = normalizeWhitespace(text);
562
726
  const sentences = splitSentences(normalized, 420);
@@ -706,6 +870,18 @@ function uniqueSources(sources) {
706
870
  }
707
871
  return out;
708
872
  }
873
+ function uniqueEvidenceItems(items) {
874
+ const seen = new Set();
875
+ const out = [];
876
+ for (const item of items) {
877
+ const key = `${item.kind}:${item.id}`;
878
+ if (seen.has(key))
879
+ continue;
880
+ seen.add(key);
881
+ out.push(item);
882
+ }
883
+ return out;
884
+ }
709
885
  function withAnswerSourceAliases(source) {
710
886
  return {
711
887
  ...source,
@@ -1 +1 @@
1
- {"version":3,"file":"enrichment.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/enrichment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAEV,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAKV,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAkBpB,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC/C;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,kCAAkC,EAC3C,MAAM,EAAE,qBAAqB,EAC7B,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,2BAA2B,CAAC,CA+BtC"}
1
+ {"version":3,"file":"enrichment.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/knowledge/semantic/enrichment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAEV,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAKV,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAmBpB,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC/C;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,kCAAkC,EAC3C,MAAM,EAAE,qBAAqB,EAC7B,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,2BAA2B,CAAC,CA+BtC"}