@untangle-code/search 0.0.0-stage → 0.1.0

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 (140) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +433 -2
  4. package/THIRD_PARTY_LICENSES.md +29 -0
  5. package/dist/benchmark-integrity.d.ts +12 -0
  6. package/dist/benchmark-integrity.d.ts.map +1 -0
  7. package/dist/benchmark-integrity.js +10 -0
  8. package/dist/benchmark-integrity.js.map +1 -0
  9. package/dist/bm25.d.ts +46 -0
  10. package/dist/bm25.d.ts.map +1 -0
  11. package/dist/bm25.js +105 -0
  12. package/dist/bm25.js.map +1 -0
  13. package/dist/deadline.d.ts +4 -0
  14. package/dist/deadline.d.ts.map +1 -0
  15. package/dist/deadline.js +54 -0
  16. package/dist/deadline.js.map +1 -0
  17. package/dist/dedupe.d.ts +48 -0
  18. package/dist/dedupe.d.ts.map +1 -0
  19. package/dist/dedupe.js +58 -0
  20. package/dist/dedupe.js.map +1 -0
  21. package/dist/diversify.d.ts +45 -0
  22. package/dist/diversify.d.ts.map +1 -0
  23. package/dist/diversify.js +30 -0
  24. package/dist/diversify.js.map +1 -0
  25. package/dist/engine.d.ts +157 -0
  26. package/dist/engine.d.ts.map +1 -0
  27. package/dist/engine.js +1498 -0
  28. package/dist/engine.js.map +1 -0
  29. package/dist/enrichment.d.ts +16 -0
  30. package/dist/enrichment.d.ts.map +1 -0
  31. package/dist/enrichment.js +92 -0
  32. package/dist/enrichment.js.map +1 -0
  33. package/dist/filter.d.ts +86 -0
  34. package/dist/filter.d.ts.map +1 -0
  35. package/dist/filter.js +166 -0
  36. package/dist/filter.js.map +1 -0
  37. package/dist/findability.d.ts +144 -0
  38. package/dist/findability.d.ts.map +1 -0
  39. package/dist/findability.js +393 -0
  40. package/dist/findability.js.map +1 -0
  41. package/dist/format.d.ts +28 -0
  42. package/dist/format.d.ts.map +1 -0
  43. package/dist/format.js +172 -0
  44. package/dist/format.js.map +1 -0
  45. package/dist/fusion.d.ts +47 -0
  46. package/dist/fusion.d.ts.map +1 -0
  47. package/dist/fusion.js +84 -0
  48. package/dist/fusion.js.map +1 -0
  49. package/dist/glob.d.ts +50 -0
  50. package/dist/glob.d.ts.map +1 -0
  51. package/dist/glob.js +144 -0
  52. package/dist/glob.js.map +1 -0
  53. package/dist/grep.d.ts +76 -0
  54. package/dist/grep.d.ts.map +1 -0
  55. package/dist/grep.js +475 -0
  56. package/dist/grep.js.map +1 -0
  57. package/dist/index.d.ts +42 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +63 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/ledger.d.ts +45 -0
  62. package/dist/ledger.d.ts.map +1 -0
  63. package/dist/ledger.js +39 -0
  64. package/dist/ledger.js.map +1 -0
  65. package/dist/payload.d.ts +108 -0
  66. package/dist/payload.d.ts.map +1 -0
  67. package/dist/payload.js +263 -0
  68. package/dist/payload.js.map +1 -0
  69. package/dist/port.d.ts +112 -0
  70. package/dist/port.d.ts.map +1 -0
  71. package/dist/port.js +2 -0
  72. package/dist/port.js.map +1 -0
  73. package/dist/product-complexity.d.ts +89 -0
  74. package/dist/product-complexity.d.ts.map +1 -0
  75. package/dist/product-complexity.js +1367 -0
  76. package/dist/product-complexity.js.map +1 -0
  77. package/dist/regex-safety.d.ts +75 -0
  78. package/dist/regex-safety.d.ts.map +1 -0
  79. package/dist/regex-safety.js +902 -0
  80. package/dist/regex-safety.js.map +1 -0
  81. package/dist/relevance-prerequisites.d.ts +21 -0
  82. package/dist/relevance-prerequisites.d.ts.map +1 -0
  83. package/dist/relevance-prerequisites.js +47 -0
  84. package/dist/relevance-prerequisites.js.map +1 -0
  85. package/dist/relevance.d.ts +107 -0
  86. package/dist/relevance.d.ts.map +1 -0
  87. package/dist/relevance.js +199 -0
  88. package/dist/relevance.js.map +1 -0
  89. package/dist/retrieval.d.ts +46 -0
  90. package/dist/retrieval.d.ts.map +1 -0
  91. package/dist/retrieval.js +182 -0
  92. package/dist/retrieval.js.map +1 -0
  93. package/dist/scoring.d.ts +102 -0
  94. package/dist/scoring.d.ts.map +1 -0
  95. package/dist/scoring.js +175 -0
  96. package/dist/scoring.js.map +1 -0
  97. package/dist/sort.d.ts +21 -0
  98. package/dist/sort.d.ts.map +1 -0
  99. package/dist/sort.js +53 -0
  100. package/dist/sort.js.map +1 -0
  101. package/dist/symbol-match.d.ts +21 -0
  102. package/dist/symbol-match.d.ts.map +1 -0
  103. package/dist/symbol-match.js +72 -0
  104. package/dist/symbol-match.js.map +1 -0
  105. package/dist/tokenize.d.ts +41 -0
  106. package/dist/tokenize.d.ts.map +1 -0
  107. package/dist/tokenize.js +202 -0
  108. package/dist/tokenize.js.map +1 -0
  109. package/dist/types.d.ts +173 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +42 -0
  112. package/dist/types.js.map +1 -0
  113. package/package.json +61 -3
  114. package/src/benchmark-integrity.ts +25 -0
  115. package/src/bm25.ts +135 -0
  116. package/src/deadline.ts +59 -0
  117. package/src/dedupe.ts +99 -0
  118. package/src/diversify.ts +71 -0
  119. package/src/engine.ts +1957 -0
  120. package/src/enrichment.ts +115 -0
  121. package/src/filter.ts +267 -0
  122. package/src/findability.ts +580 -0
  123. package/src/format.ts +228 -0
  124. package/src/fusion.ts +121 -0
  125. package/src/glob.ts +151 -0
  126. package/src/grep.ts +618 -0
  127. package/src/index.ts +83 -0
  128. package/src/ledger.ts +72 -0
  129. package/src/payload.ts +382 -0
  130. package/src/port.ts +133 -0
  131. package/src/product-complexity.ts +2168 -0
  132. package/src/regex-safety.ts +1002 -0
  133. package/src/relevance-prerequisites.ts +83 -0
  134. package/src/relevance.ts +328 -0
  135. package/src/retrieval.ts +299 -0
  136. package/src/scoring.ts +321 -0
  137. package/src/sort.ts +86 -0
  138. package/src/symbol-match.ts +87 -0
  139. package/src/tokenize.ts +213 -0
  140. package/src/types.ts +206 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Findability als Eigenschaft je Symbol (vision.md §1d).
3
+ *
4
+ * Die These, um die es hier geht, steht woertlich in vision.md §1d:
5
+ *
6
+ * > Wenn die Suche nach „Funktion X" nicht schnell an der richtigen Stelle
7
+ * > landet, ist das ein Befund ueber den Code — nicht nur ueber die Suche.
8
+ *
9
+ * Deshalb sucht sich hier ein Symbol SELBST: einmal mit seinem Namen, einmal
10
+ * mit seiner Signatur. Was dabei herauskommt — Rang, Streuung der Treffer,
11
+ * Sprungzahl — ist die Messung. Dass die Score-Zerlegung des Abrufkerns dabei
12
+ * mitlaeuft, ist kein Zufall: ohne sie liesse sich „der richtige Treffer
13
+ * rankt niedrig" nicht von „es gibt gar keinen Treffer" unterscheiden, und das
14
+ * sind zwei VERSCHIEDENE Befunde ueber den Code.
15
+ *
16
+ * ALLES HIER IST HEURISTIK, und die Domain erzwingt das strukturell:
17
+ * `isHeuristic` ist auf `true` typisiert, die Confidence auf `heuristic`
18
+ * festgenagelt. Ein Findability-Wert kann deshalb nirgends die Stelle eines
19
+ * gemessenen Complexity-Werts einnehmen.
20
+ */
21
+ import type { Clock, FindabilityDiagnosisBasisV1, FindabilityDiagnosisV1, FindabilityDispersionV1, FindabilityHopsV1, FindabilityOutcomeV1, FindabilityRetrievalUnavailableReason, FindabilityUnavailableV1, PortCallOptions, SearchResultSetV1, SkipLedgerEntryV1 } from "@untangle-code/domain";
22
+ import type { SearchPort } from "./port.js";
23
+ /** Das Symbol, dessen Auffindbarkeit gemessen wird. */
24
+ export interface FindabilitySubject {
25
+ workspaceId: string;
26
+ repoId: string;
27
+ refId: string;
28
+ symbolId: string;
29
+ symbolName: string;
30
+ symbolFqn: string;
31
+ /** „/"-normalisierter, repo-relativer Pfad. */
32
+ filePath: string;
33
+ signature?: string;
34
+ }
35
+ /** Liefert die Sprungzahl vom Rang-1-Treffer zum Zielsymbol (Symbolgraph). */
36
+ export type HopsLookup = (input: {
37
+ fromSymbolId: string;
38
+ toSymbolId: string;
39
+ }) => FindabilityHopsV1 | undefined;
40
+ export interface FindabilityOptions {
41
+ /** Wie viele Treffer eine Sonde anfordert; Default 10. */
42
+ probeLimit?: number;
43
+ hops?: HopsLookup;
44
+ generationId: string;
45
+ /**
46
+ * Optionale Vorpruefung: ist das Symbol ueberhaupt indexiert? Fehlt sie,
47
+ * wird nicht geraten — dann bleibt nur, was die Suche selbst meldet.
48
+ * Antwortet sie `false`, entsteht ein Zustandsvermerk statt einer Messung:
49
+ * ein nicht indexiertes Symbol findet sich nicht, und das sagt nichts ueber
50
+ * seinen Code (vision.md §1d).
51
+ */
52
+ isSymbolIndexed?: (symbolId: string) => boolean;
53
+ }
54
+ /**
55
+ * Schwellen der Diagnose. Sie sind Politik, keine Naturkonstanten — deshalb
56
+ * stehen sie hier benannt und werden in jedem Beleg (`threshold`) mitgeliefert,
57
+ * damit ein Leser die Aussage nachrechnen kann.
58
+ */
59
+ export declare const FINDABILITY_THRESHOLDS: {
60
+ /** Ab diesem Rang gilt der eigene Treffer als „rankt niedrig". */
61
+ readonly weakRank: 3;
62
+ /** Ab dieser Streuung gilt die Verantwortlichkeit als zerfasert. */
63
+ readonly scatteredDispersion: 0.6;
64
+ /** Ab dieser Sprungzahl gilt der Weg als zu verflochten. */
65
+ readonly entangledHops: 2;
66
+ };
67
+ /** Benannte Formel hinter `FindabilityDispersionV1.dispersion`. */
68
+ export declare const DISPERSION_FORMULA = "(matchedFileCount - 1) / max(1, matchedHitCount - 1), clamped to [0, 1]";
69
+ /** Benannte Formel hinter `FindabilityV1.score`. */
70
+ export declare const FINDABILITY_SCORE_FORMULA = "0.5*rankScore(nameProbe) + 0.2*rankScore(signatureProbe) + 0.2*(1 - dispersion) + 0.1*hopScore, with rankScore(r) = 0 for no rank else 1/r, hopScore = 0.5 when hops are unknown else 1/(1+hops)";
71
+ /** Rangwert einer Sonde: Rang 1 → 1.0, Rang 2 → 0.5, kein Rang → 0. */
72
+ export declare function rankScore(rank: number | null): number;
73
+ /** Streuung ueber Dateien (siehe {@link DISPERSION_FORMULA}). */
74
+ export declare function computeDispersion(filePaths: readonly string[], ownFileHitCount: number): FindabilityDispersionV1;
75
+ /**
76
+ * Leitet die benannten Ursachen aus den Messwerten ab (vision.md §1d Tabelle).
77
+ *
78
+ * Nimmt bewusst KEINE losen Sonden entgegen, sondern nur einen
79
+ * {@link FindabilityDiagnosisBasisV1} — den Nachweis aus `packages/domain`,
80
+ * dass der Abruf tatsaechlich gelaufen ist. Ein Zustandsvermerk
81
+ * (`FindabilityUnavailableV1`) ist auf diesen Typ nicht zuweisbar, eine
82
+ * ausgefallene Sonde bekommt gar keinen Nachweis. Damit ist es im TYP
83
+ * unmoeglich, aus einem Werkzeugversagen eine Aussage ueber den Code zu
84
+ * machen — genau der Denkfehler, den vision.md §1d frueher offen liess.
85
+ */
86
+ export declare function diagnose(subject: FindabilitySubject, basis: FindabilityDiagnosisBasisV1): FindabilityDiagnosisV1[];
87
+ /**
88
+ * Warncodes, mit denen der Abrufkern ein AUSGEFALLENES Suchziel meldet.
89
+ *
90
+ * Diese Liste ist noetig, weil `UntangleSearchEngine` ein ausgefallenes Ziel
91
+ * NICHT wirft, sondern nach spec.md §25.2 sichtbar degradiert: das Ergebnis
92
+ * kommt mit einer Gruppe weniger — im schlimmsten Fall ganz ohne Gruppe — und
93
+ * einer Warnung zurueck. Wer nur auf `hits.length` schaut, liest dann „kein
94
+ * Treffer", und genau daraus entstuende die falsche Aussage ueber den Code.
95
+ */
96
+ export declare const FINDABILITY_RETRIEVAL_FAILURE_WARNING_CODES: readonly ["EMBEDDING_DIMENSION_MISMATCH", "EMBEDDING_UNAVAILABLE", "INDEX_INCOMPLETE", "INDEX_PROFILE_MISMATCH", "PROFILE_UNAVAILABLE", "QDRANT_SCHEMA_INCOMPATIBLE", "LANCEDB_UNAVAILABLE", "LANCEDB_SCHEMA_INCOMPATIBLE", "QDRANT_UNAVAILABLE", "SEARCH_BRANCH_UNAVAILABLE"];
97
+ /** Grund plus Begruendung fuer einen Zustandsvermerk. */
98
+ export interface FindabilityRetrievalFailureV1 {
99
+ reason: FindabilityRetrievalUnavailableReason;
100
+ detail: string;
101
+ }
102
+ /**
103
+ * Prueft ein Suchergebnis darauf, ob die Suche wirklich gelaufen ist.
104
+ *
105
+ * `undefined` heisst: sie lief. Alles andere ist ein Zustandsvermerk, kein
106
+ * Messwert. Eine Ergebnismenge ohne jede Profilgruppe zaehlt dabei als
107
+ * Ausfall — ohne Profil hat niemand gesucht, und „nichts gefunden" waere eine
108
+ * Behauptung ueber den Code, die auf keiner Beobachtung steht.
109
+ *
110
+ * DASSELBE GILT FUER EINE GRUPPE, DIE NICHT DURCHSUCHT WURDE (Befund B1 der
111
+ * Nachpruefung, Fall B). Liegt der Geltungsbereich der Sonde — Workspace,
112
+ * Repository, Ref des Symbols — vollstaendig ausserhalb der verdrahteten
113
+ * Ziele, liefert der Abrufkern trotzdem eine Gruppe: leer, mit
114
+ * `notSearchedReason` und einem Eintrag im Skip-Ledger. Wer nur `groups.length`
115
+ * zaehlt, sieht eine Gruppe und haelt die Sonde fuer gelaufen — und veroeffent-
116
+ * licht danach „no_match" und die Diagnose „undocumented" ueber ein Symbol,
117
+ * nach dem nie gesucht wurde. Deshalb zaehlen hier nur Gruppen, die
118
+ * TATSAECHLICH durchsucht wurden.
119
+ */
120
+ export declare function detectRetrievalFailure(set: SearchResultSetV1): FindabilityRetrievalFailureV1 | undefined;
121
+ /**
122
+ * Uebersetzt einen Zustandsvermerk in einen Skip-Ledger-Eintrag (E4). Ein
123
+ * ausgefallener Abruf darf nicht nur im Datensatz stehen, sondern gehoert in
124
+ * dieselbe Liste wie jede andere Auslassung.
125
+ */
126
+ export declare function findabilitySkipEntry(note: FindabilityUnavailableV1): SkipLedgerEntryV1;
127
+ /**
128
+ * Misst die Auffindbarkeit eines Symbols mit zwei Selbstsonden.
129
+ *
130
+ * Der Aufrufer stellt den Port; diese Funktion macht nichts anderes, als ihn
131
+ * zweimal zu fragen und das Ergebnis ehrlich zu verbuchen — insbesondere den
132
+ * Fall „nicht gefunden", der als Rang `null` MIT benanntem Grund im Datensatz
133
+ * steht und nicht als fehlender Wert verschwindet (E4).
134
+ *
135
+ * ZWEI ERGEBNISSE, NICHT EINS (vision.md §1d): lief die Suche, kommt eine
136
+ * `FindabilityV1`-MESSUNG zurueck. Lief sie nicht — Speicher nicht
137
+ * erreichbar, Profil fehlt, Symbol nicht indexiert —, kommt ein
138
+ * `FindabilityUnavailableV1`-ZUSTANDSVERMERK zurueck. Der traegt keinen Score
139
+ * und keine Diagnose, weil ein Werkzeugversagen kein Befund ueber den Code
140
+ * ist. Aufrufer MUESSEN die beiden Faelle unterscheiden; der Typ zwingt sie
141
+ * dazu.
142
+ */
143
+ export declare function measureFindability(port: SearchPort, subject: FindabilitySubject, clock: Clock, options: FindabilityOptions, callOptions?: PortCallOptions): Promise<FindabilityOutcomeV1>;
144
+ //# sourceMappingURL=findability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findability.d.ts","sourceRoot":"","sources":["../src/findability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EACV,KAAK,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EAEvB,iBAAiB,EACjB,oBAAoB,EAIpB,qCAAqC,EACrC,wBAAwB,EAExB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAY/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,uDAAuD;AACvD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,KAAK,iBAAiB,GAAG,SAAS,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CACjD;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;IACjC,kEAAkE;;IAElE,oEAAoE;;IAEpE,4DAA4D;;CAEpD,CAAC;AAEX,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,4EAC4C,CAAC;AAE5E,oDAAoD;AACpD,eAAO,MAAM,yBAAyB,qMAC8J,CAAC;AAErM,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAErD;AA0ED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,eAAe,EAAE,MAAM,GACtB,uBAAuB,CAMzB;AAkBD;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,2BAA2B,GACjC,sBAAsB,EAAE,CA8E1B;AAMD;;;;;;;;GAQG;AACH,eAAO,MAAM,2CAA2C,gRAW9C,CAAC;AAEX,yDAAyD;AACzD,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,qCAAqC,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,iBAAiB,GACrB,6BAA6B,GAAG,SAAS,CAwB3C;AAQD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,iBAAiB,CAYtF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,kBAAkB,EAC3B,WAAW,CAAC,EAAE,eAAe,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CA8I/B"}
@@ -0,0 +1,393 @@
1
+ import { FINDABILITY_ALGORITHM_ID, RANKER_VERSION, buildFindabilityId, buildSkipLedgerEntry, isUntangleError, makeFindabilityUnavailable, openFindabilityDiagnosisBasis, sortByCodepoints, } from "@untangle-code/domain";
2
+ /**
3
+ * Schwellen der Diagnose. Sie sind Politik, keine Naturkonstanten — deshalb
4
+ * stehen sie hier benannt und werden in jedem Beleg (`threshold`) mitgeliefert,
5
+ * damit ein Leser die Aussage nachrechnen kann.
6
+ */
7
+ export const FINDABILITY_THRESHOLDS = {
8
+ /** Ab diesem Rang gilt der eigene Treffer als „rankt niedrig". */
9
+ weakRank: 3,
10
+ /** Ab dieser Streuung gilt die Verantwortlichkeit als zerfasert. */
11
+ scatteredDispersion: 0.6,
12
+ /** Ab dieser Sprungzahl gilt der Weg als zu verflochten. */
13
+ entangledHops: 2,
14
+ };
15
+ /** Benannte Formel hinter `FindabilityDispersionV1.dispersion`. */
16
+ export const DISPERSION_FORMULA = "(matchedFileCount - 1) / max(1, matchedHitCount - 1), clamped to [0, 1]";
17
+ /** Benannte Formel hinter `FindabilityV1.score`. */
18
+ export const FINDABILITY_SCORE_FORMULA = "0.5*rankScore(nameProbe) + 0.2*rankScore(signatureProbe) + 0.2*(1 - dispersion) + 0.1*hopScore, with rankScore(r) = 0 for no rank else 1/r, hopScore = 0.5 when hops are unknown else 1/(1+hops)";
19
+ /** Rangwert einer Sonde: Rang 1 → 1.0, Rang 2 → 0.5, kein Rang → 0. */
20
+ export function rankScore(rank) {
21
+ return rank === null ? 0 : 1 / rank;
22
+ }
23
+ function heuristicConfidence(value, signals) {
24
+ return { value, basis: "heuristic", signals };
25
+ }
26
+ function evaluateProbe(kind, queryText, subject, set) {
27
+ // Alle Gruppen zusammen: eine Sonde fragt nach EINEM Symbol, und in welcher
28
+ // Profilgruppe es auftaucht, ist fuer die Auffindbarkeit unerheblich. Die
29
+ // Raenge bleiben gruppenintern korrekt, weil die Sonde den Rang des eigenen
30
+ // Treffers innerhalb SEINER Gruppe liest.
31
+ const hits = set.groups.flatMap((group) => group.hits);
32
+ const own = hits.find((hit) => hit.symbolId === subject.symbolId);
33
+ const topScore = hits[0]?.score.final;
34
+ const probe = {
35
+ kind,
36
+ queryText,
37
+ queryFingerprint: set.queryFingerprint,
38
+ rank: own === undefined ? null : own.rank,
39
+ ...(own === undefined ? { rankMissingReason: rankMissingReasonFor(set, hits.length) } : {}),
40
+ hitCount: hits.length,
41
+ ...(topScore === undefined ? {} : { topScore }),
42
+ ...(own === undefined ? {} : { selfScore: own.score.final }),
43
+ };
44
+ return {
45
+ probe,
46
+ filePaths: hits.map((hit) => hit.filePath),
47
+ hitCount: hits.length,
48
+ ownFileHitCount: hits.filter((hit) => hit.filePath === subject.filePath).length,
49
+ };
50
+ }
51
+ /**
52
+ * Warum eine Sonde keinen Rang ergab — aus der ENTSCHEIDUNG, nie aus der
53
+ * Listenlaenge.
54
+ *
55
+ * Vorher stand hier `hits.length === 0 ? "no_match" : "outside_result_limit"`.
56
+ * Beide sind Behauptungen ueber den CODE. Eine Enthaltung ist aber eine
57
+ * Aussage ueber die KALIBRIERUNG: der Abruf lief, es gab Kandidaten, und die
58
+ * Policy hielt die Evidenz fuer unzureichend. Als `no_match` veroeffentlicht
59
+ * wurde daraus „dazu gibt es nichts" — und ein Symbol, das fuer seinen eigenen
60
+ * Namen auf Rang 1 stuende, galt als unauffindbar.
61
+ */
62
+ function rankMissingReasonFor(set, hitCount) {
63
+ if (set.groups.some((group) => group.relevanceDecision?.status === "rejected")) {
64
+ return "relevance_policy_rejected";
65
+ }
66
+ // Kein Kandidat hat den Abruf ueberhaupt erreicht: dann ist „nichts
67
+ // gefunden" eine belegte Aussage und keine Vermutung.
68
+ if (set.groups.length > 0 &&
69
+ set.groups.every((group) => group.retrieval?.deduplicatedCandidateCount === 0)) {
70
+ return "no_match";
71
+ }
72
+ return hitCount === 0 ? "no_match" : "outside_result_limit";
73
+ }
74
+ /** Streuung ueber Dateien (siehe {@link DISPERSION_FORMULA}). */
75
+ export function computeDispersion(filePaths, ownFileHitCount) {
76
+ const matchedHitCount = filePaths.length;
77
+ const matchedFileCount = new Set(filePaths).size;
78
+ const raw = (matchedFileCount - 1) / Math.max(1, matchedHitCount - 1);
79
+ const dispersion = Math.min(1, Math.max(0, raw));
80
+ return { matchedFileCount, matchedHitCount, ownFileHitCount, dispersion };
81
+ }
82
+ function evidence(kind, observedValue, threshold, references, note) {
83
+ return {
84
+ kind,
85
+ observedValue,
86
+ threshold,
87
+ references,
88
+ ...(note === undefined ? {} : { note }),
89
+ };
90
+ }
91
+ /**
92
+ * Leitet die benannten Ursachen aus den Messwerten ab (vision.md §1d Tabelle).
93
+ *
94
+ * Nimmt bewusst KEINE losen Sonden entgegen, sondern nur einen
95
+ * {@link FindabilityDiagnosisBasisV1} — den Nachweis aus `packages/domain`,
96
+ * dass der Abruf tatsaechlich gelaufen ist. Ein Zustandsvermerk
97
+ * (`FindabilityUnavailableV1`) ist auf diesen Typ nicht zuweisbar, eine
98
+ * ausgefallene Sonde bekommt gar keinen Nachweis. Damit ist es im TYP
99
+ * unmoeglich, aus einem Werkzeugversagen eine Aussage ueber den Code zu
100
+ * machen — genau der Denkfehler, den vision.md §1d frueher offen liess.
101
+ */
102
+ export function diagnose(subject, basis) {
103
+ const { nameProbe, dispersion, hops } = basis;
104
+ const diagnoses = [];
105
+ // Die Fallunterscheidung folgt der Tabelle aus vision.md §1d:
106
+ // „Gar kein passender Treffer" -> das Symbol taucht in seinen eigenen
107
+ // Suchergebnissen NICHT auf -> `undocumented`;
108
+ // „Der richtige Treffer rankt niedrig" -> es taucht auf, aber weit unten
109
+ // -> `weak-naming`.
110
+ // Wichtig: „kein Rang" heisst NICHT „keine Treffer". Der dichte Zweig
111
+ // liefert fast immer irgendetwas; entscheidend ist, ob das GESUCHTE Symbol
112
+ // darunter ist.
113
+ if (nameProbe.rank === null) {
114
+ diagnoses.push({
115
+ cause: "undocumented",
116
+ confidence: heuristicConfidence(nameProbe.hitCount === 0 ? 0.6 : 0.5, [
117
+ "self_not_in_own_name_results",
118
+ ...(nameProbe.hitCount === 0 ? ["no_results_at_all"] : ["other_results_ranked_instead"]),
119
+ ]),
120
+ evidence: [
121
+ evidence("hit_count", nameProbe.hitCount, 1, [subject.symbolFqn], "searching for the symbol's own name did not return the symbol itself"),
122
+ ],
123
+ isHeuristic: true,
124
+ note: "the symbol's own name does not retrieve it; either the name carries no intent or nothing describes it",
125
+ });
126
+ }
127
+ else if (nameProbe.rank > FINDABILITY_THRESHOLDS.weakRank) {
128
+ diagnoses.push({
129
+ cause: "weak-naming",
130
+ confidence: heuristicConfidence(0.5, ["self_rank_below_threshold"]),
131
+ evidence: [
132
+ evidence("self_rank", nameProbe.rank, FINDABILITY_THRESHOLDS.weakRank, [subject.symbolFqn], "the symbol does not rank near the top for its own name"),
133
+ ],
134
+ isHeuristic: true,
135
+ });
136
+ }
137
+ if (dispersion.dispersion > FINDABILITY_THRESHOLDS.scatteredDispersion) {
138
+ diagnoses.push({
139
+ cause: "scattered-responsibility",
140
+ confidence: heuristicConfidence(0.5, ["high_file_dispersion"]),
141
+ evidence: [
142
+ evidence("matched_file_count", dispersion.matchedFileCount, FINDABILITY_THRESHOLDS.scatteredDispersion, [subject.filePath], `hits spread over ${dispersion.matchedFileCount} files (dispersion ${dispersion.dispersion.toFixed(3)})`),
143
+ ],
144
+ isHeuristic: true,
145
+ });
146
+ }
147
+ if (hops.hops !== null && hops.hops > FINDABILITY_THRESHOLDS.entangledHops) {
148
+ diagnoses.push({
149
+ cause: "high-entanglement",
150
+ confidence: heuristicConfidence(hops.pathUsesUncertainEdges ? 0.4 : 0.6, [
151
+ "hop_count_above_threshold",
152
+ ...(hops.pathUsesUncertainEdges ? ["path_uses_uncertain_edges"] : []),
153
+ ]),
154
+ evidence: [evidence("hop_count", hops.hops, FINDABILITY_THRESHOLDS.entangledHops, hops.path)],
155
+ isHeuristic: true,
156
+ });
157
+ }
158
+ return diagnoses;
159
+ }
160
+ // ---------------------------------------------------------------------------
161
+ // Lief die Suche ueberhaupt? (vision.md §1d)
162
+ // ---------------------------------------------------------------------------
163
+ /**
164
+ * Warncodes, mit denen der Abrufkern ein AUSGEFALLENES Suchziel meldet.
165
+ *
166
+ * Diese Liste ist noetig, weil `UntangleSearchEngine` ein ausgefallenes Ziel
167
+ * NICHT wirft, sondern nach spec.md §25.2 sichtbar degradiert: das Ergebnis
168
+ * kommt mit einer Gruppe weniger — im schlimmsten Fall ganz ohne Gruppe — und
169
+ * einer Warnung zurueck. Wer nur auf `hits.length` schaut, liest dann „kein
170
+ * Treffer", und genau daraus entstuende die falsche Aussage ueber den Code.
171
+ */
172
+ export const FINDABILITY_RETRIEVAL_FAILURE_WARNING_CODES = [
173
+ "EMBEDDING_DIMENSION_MISMATCH",
174
+ "EMBEDDING_UNAVAILABLE",
175
+ "INDEX_INCOMPLETE",
176
+ "INDEX_PROFILE_MISMATCH",
177
+ "PROFILE_UNAVAILABLE",
178
+ "QDRANT_SCHEMA_INCOMPATIBLE",
179
+ "LANCEDB_UNAVAILABLE",
180
+ "LANCEDB_SCHEMA_INCOMPATIBLE",
181
+ "QDRANT_UNAVAILABLE",
182
+ "SEARCH_BRANCH_UNAVAILABLE",
183
+ ];
184
+ function reasonForCode(code) {
185
+ if (code === "INDEX_PROFILE_MISMATCH")
186
+ return "search_profile_missing";
187
+ if (code === "INDEX_INCOMPLETE")
188
+ return "symbol_not_indexed";
189
+ return "search_unavailable";
190
+ }
191
+ /**
192
+ * Prueft ein Suchergebnis darauf, ob die Suche wirklich gelaufen ist.
193
+ *
194
+ * `undefined` heisst: sie lief. Alles andere ist ein Zustandsvermerk, kein
195
+ * Messwert. Eine Ergebnismenge ohne jede Profilgruppe zaehlt dabei als
196
+ * Ausfall — ohne Profil hat niemand gesucht, und „nichts gefunden" waere eine
197
+ * Behauptung ueber den Code, die auf keiner Beobachtung steht.
198
+ *
199
+ * DASSELBE GILT FUER EINE GRUPPE, DIE NICHT DURCHSUCHT WURDE (Befund B1 der
200
+ * Nachpruefung, Fall B). Liegt der Geltungsbereich der Sonde — Workspace,
201
+ * Repository, Ref des Symbols — vollstaendig ausserhalb der verdrahteten
202
+ * Ziele, liefert der Abrufkern trotzdem eine Gruppe: leer, mit
203
+ * `notSearchedReason` und einem Eintrag im Skip-Ledger. Wer nur `groups.length`
204
+ * zaehlt, sieht eine Gruppe und haelt die Sonde fuer gelaufen — und veroeffent-
205
+ * licht danach „no_match" und die Diagnose „undocumented" ueber ein Symbol,
206
+ * nach dem nie gesucht wurde. Deshalb zaehlen hier nur Gruppen, die
207
+ * TATSAECHLICH durchsucht wurden.
208
+ */
209
+ export function detectRetrievalFailure(set) {
210
+ const codes = new Set(FINDABILITY_RETRIEVAL_FAILURE_WARNING_CODES);
211
+ const failed = set.warnings.find((warning) => codes.has(warning.code));
212
+ if (failed !== undefined) {
213
+ return { reason: reasonForCode(failed.code), detail: `${failed.code}: ${failed.message}` };
214
+ }
215
+ if (set.groups.length === 0) {
216
+ return {
217
+ reason: "search_profile_missing",
218
+ detail: "the probe came back without a single profile group; no embedding profile answered, so nothing was actually searched",
219
+ };
220
+ }
221
+ const searched = set.groups.filter((group) => group.notSearchedReason === undefined);
222
+ if (searched.length === 0) {
223
+ const reasons = sortByCodepoints(set.groups.map((group) => group.notSearchedReason)).join("; ");
224
+ return {
225
+ reason: "probe_not_executed",
226
+ detail: `not one of the ${set.groups.length} profile group(s) was actually searched, so the probe observed nothing: ${reasons}`,
227
+ };
228
+ }
229
+ return undefined;
230
+ }
231
+ function failureForError(error) {
232
+ const message = error instanceof Error ? error.message : String(error);
233
+ const code = isUntangleError(error) ? error.code : "SEARCH_FAILED";
234
+ return { reason: reasonForCode(code), detail: `${code}: ${message}` };
235
+ }
236
+ /**
237
+ * Uebersetzt einen Zustandsvermerk in einen Skip-Ledger-Eintrag (E4). Ein
238
+ * ausgefallener Abruf darf nicht nur im Datensatz stehen, sondern gehoert in
239
+ * dieselbe Liste wie jede andere Auslassung.
240
+ */
241
+ export function findabilitySkipEntry(note) {
242
+ return buildSkipLedgerEntry({
243
+ stage: "findability",
244
+ subjectKind: "symbol",
245
+ subjectId: note.symbolId,
246
+ path: note.filePath,
247
+ repoId: note.repoId,
248
+ refId: note.refId,
249
+ reason: note.reason === "symbol_not_indexed" ? "missing_index_entry" : "provider_unavailable",
250
+ detail: `findability not measured for "${note.symbolFqn}" (${note.reason}): ${note.detail}`,
251
+ recoverable: true,
252
+ });
253
+ }
254
+ /**
255
+ * Misst die Auffindbarkeit eines Symbols mit zwei Selbstsonden.
256
+ *
257
+ * Der Aufrufer stellt den Port; diese Funktion macht nichts anderes, als ihn
258
+ * zweimal zu fragen und das Ergebnis ehrlich zu verbuchen — insbesondere den
259
+ * Fall „nicht gefunden", der als Rang `null` MIT benanntem Grund im Datensatz
260
+ * steht und nicht als fehlender Wert verschwindet (E4).
261
+ *
262
+ * ZWEI ERGEBNISSE, NICHT EINS (vision.md §1d): lief die Suche, kommt eine
263
+ * `FindabilityV1`-MESSUNG zurueck. Lief sie nicht — Speicher nicht
264
+ * erreichbar, Profil fehlt, Symbol nicht indexiert —, kommt ein
265
+ * `FindabilityUnavailableV1`-ZUSTANDSVERMERK zurueck. Der traegt keinen Score
266
+ * und keine Diagnose, weil ein Werkzeugversagen kein Befund ueber den Code
267
+ * ist. Aufrufer MUESSEN die beiden Faelle unterscheiden; der Typ zwingt sie
268
+ * dazu.
269
+ */
270
+ export async function measureFindability(port, subject, clock, options, callOptions) {
271
+ const limit = options.probeLimit ?? 10;
272
+ const baseRequest = {
273
+ workspaceId: subject.workspaceId,
274
+ repositories: [subject.repoId],
275
+ refs: [subject.refId],
276
+ limit,
277
+ // Ausdruecklich gepinnt: eine veroeffentlichte Kennzahl darf nicht von
278
+ // einer ungepinnten Vorgabe abhaengen. Zoege der Default eines Tages nach
279
+ // `evidence`, bekaemen abgelehnte Sonden still einen Rang.
280
+ abstention: "strict",
281
+ };
282
+ const note = (failure, probeKinds) => makeFindabilityUnavailable({
283
+ workspaceId: subject.workspaceId,
284
+ repoId: subject.repoId,
285
+ refId: subject.refId,
286
+ symbolId: subject.symbolId,
287
+ symbolFqn: subject.symbolFqn,
288
+ filePath: subject.filePath,
289
+ reason: failure.reason,
290
+ detail: failure.detail,
291
+ probeKinds,
292
+ observedAt: clock.nowIso(),
293
+ generationId: options.generationId,
294
+ });
295
+ const bothProbes = ["self-name", "self-signature"];
296
+ if (options.isSymbolIndexed !== undefined && !options.isSymbolIndexed(subject.symbolId)) {
297
+ return note({
298
+ reason: "symbol_not_indexed",
299
+ detail: `symbol "${subject.symbolFqn}" is not in the index, so no probe could reach it`,
300
+ }, bothProbes);
301
+ }
302
+ let nameSet;
303
+ try {
304
+ nameSet = await port.search({ ...baseRequest, query: subject.symbolName }, callOptions);
305
+ }
306
+ catch (error) {
307
+ return note(failureForError(error), bothProbes);
308
+ }
309
+ const nameFailure = detectRetrievalFailure(nameSet);
310
+ if (nameFailure !== undefined)
311
+ return note(nameFailure, bothProbes);
312
+ const nameOutcome = evaluateProbe("self-name", subject.symbolName, subject, nameSet);
313
+ const signatureText = subject.signature ?? subject.symbolFqn;
314
+ let signatureSet;
315
+ try {
316
+ signatureSet = await port.search({ ...baseRequest, query: signatureText }, callOptions);
317
+ }
318
+ catch (error) {
319
+ return note(failureForError(error), ["self-signature"]);
320
+ }
321
+ const signatureFailure = detectRetrievalFailure(signatureSet);
322
+ if (signatureFailure !== undefined)
323
+ return note(signatureFailure, ["self-signature"]);
324
+ const signatureOutcome = evaluateProbe("self-signature", signatureText, subject, signatureSet);
325
+ const dispersion = computeDispersion([...nameOutcome.filePaths, ...signatureOutcome.filePaths], nameOutcome.ownFileHitCount + signatureOutcome.ownFileHitCount);
326
+ const topHit = nameSet.groups.flatMap((group) => group.hits)[0];
327
+ const hops = options.hops === undefined || topHit?.symbolId === undefined
328
+ ? {
329
+ hops: null,
330
+ hopsMissingReason: options.hops === undefined
331
+ ? "no_symbol_graph_lookup_wired"
332
+ : "top_hit_carries_no_symbol_id",
333
+ path: [],
334
+ pathUsesUncertainEdges: false,
335
+ }
336
+ : (options.hops({ fromSymbolId: topHit.symbolId, toSymbolId: subject.symbolId }) ?? {
337
+ hops: null,
338
+ hopsMissingReason: "no_path_in_symbol_graph",
339
+ path: [],
340
+ pathUsesUncertainEdges: false,
341
+ });
342
+ const hopScore = hops.hops === null ? 0.5 : 1 / (1 + hops.hops);
343
+ const score = 0.5 * rankScore(nameOutcome.probe.rank) +
344
+ 0.2 * rankScore(signatureOutcome.probe.rank) +
345
+ 0.2 * (1 - dispersion.dispersion) +
346
+ 0.1 * hopScore;
347
+ const signals = [
348
+ "self_name_probe",
349
+ "self_signature_probe",
350
+ "file_dispersion",
351
+ hops.hops === null ? "hops_unknown" : "hop_count",
352
+ ];
353
+ // Letzte Instanz vor der Diagnose: der Nachweis aus `packages/domain`. Er
354
+ // bleibt aus, sobald eine Sonde ein Werkzeugversagen meldet — dann gibt es
355
+ // schlicht nichts, woraus sich eine Diagnose bilden LIESSE.
356
+ const basis = openFindabilityDiagnosisBasis({
357
+ nameProbe: nameOutcome.probe,
358
+ signatureProbe: signatureOutcome.probe,
359
+ dispersion,
360
+ hops,
361
+ });
362
+ return {
363
+ schemaVersion: 1,
364
+ findabilityId: buildFindabilityId({
365
+ workspaceId: subject.workspaceId,
366
+ symbolId: subject.symbolId,
367
+ algorithm: FINDABILITY_ALGORITHM_ID,
368
+ rankerVersion: RANKER_VERSION,
369
+ }),
370
+ workspaceId: subject.workspaceId,
371
+ repoId: subject.repoId,
372
+ refId: subject.refId,
373
+ symbolId: subject.symbolId,
374
+ symbolFqn: subject.symbolFqn,
375
+ filePath: subject.filePath,
376
+ algorithm: FINDABILITY_ALGORITHM_ID,
377
+ rankerVersion: RANKER_VERSION,
378
+ score: Math.min(1, Math.max(0, score)),
379
+ isHeuristic: true,
380
+ nameProbe: nameOutcome.probe,
381
+ signatureProbe: signatureOutcome.probe,
382
+ dispersion,
383
+ dispersionFormula: DISPERSION_FORMULA,
384
+ hops,
385
+ // Die Gesamt-Confidence sinkt, wenn ein Bestandteil fehlt: eine Messung
386
+ // ohne Sprungzahl ist weniger belastbar als eine mit.
387
+ confidence: heuristicConfidence(hops.hops === null ? 0.5 : 0.7, signals),
388
+ diagnoses: basis === undefined ? [] : diagnose(subject, basis),
389
+ measuredAt: clock.nowIso(),
390
+ generationId: options.generationId,
391
+ };
392
+ }
393
+ //# sourceMappingURL=findability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findability.js","sourceRoot":"","sources":["../src/findability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Ausgabeformate (Nutzerwunsch A4: „Text, JSON, JSONL").
3
+ *
4
+ * Drei Formate, drei Zwecke:
5
+ *
6
+ * - `text` — fuer Menschen im Terminal. Eine Zeile Kopf je Treffer, darunter
7
+ * die Score-Zerlegung in Klartext. Die Zerlegung ist hier KEIN Debug-Anhang,
8
+ * sondern der eigentliche Mehrwert: sie beantwortet „warum steht das oben?".
9
+ * - `json` — ein Dokument, vollstaendig, mit Ledger und Warnungen. Fuer
10
+ * Werkzeuge, die das Ganze wollen.
11
+ * - `jsonl` — eine Zeile je Treffer, streambar. Fuer Agents und Pipes.
12
+ * Die erste Zeile ist ein Kopfsatz mit Anfrage-Fingerabdruck, Warnungen und
13
+ * Ledger — sonst wuerde beim Streamen genau die Information verloren gehen,
14
+ * die E4 sichtbar machen soll.
15
+ *
16
+ * Alle drei sind deterministisch: gleiche Ergebnismenge, gleiche Bytes.
17
+ */
18
+ import type { SearchGraphRelationsV1, SearchHitV1, SearchResultSetV1 } from "@untangle-code/domain";
19
+ import type { GrepResultSetV1, OutputFormat } from "./types.js";
20
+ /** Kompakte, aber vollstaendige Textdarstellung einer begrenzten Graphfacette. */
21
+ export declare function formatSearchGraphRelationsAsText(label: "context" | "linked", value: SearchGraphRelationsV1): string[];
22
+ /** Eine Trefferzeile plus Score-Zerlegung im Textformat. */
23
+ export declare function formatHitAsText(hit: SearchHitV1): string;
24
+ /** Formatiert eine ganze Ergebnismenge. */
25
+ export declare function formatSearchResultSet(set: SearchResultSetV1, format: OutputFormat): string;
26
+ /** Formatiert grep-Treffer. */
27
+ export declare function formatGrepResultSet(set: GrepResultSetV1, format: OutputFormat): string;
28
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAEV,sBAAsB,EACtB,WAAW,EACX,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAahE,kFAAkF;AAClF,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,SAAS,GAAG,QAAQ,EAC3B,KAAK,EAAE,sBAAsB,GAC5B,MAAM,EAAE,CAgBV;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CA0CxD;AAED,2CAA2C;AAC3C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CA0E1F;AAED,+BAA+B;AAC/B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CA6CtF"}