@debian777/kairos-mcp 3.3.0 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +2 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/bootstrap.d.ts +2 -0
  4. package/dist/bootstrap.d.ts.map +1 -0
  5. package/dist/bootstrap.js +60 -0
  6. package/dist/bootstrap.js.map +1 -0
  7. package/dist/config.d.ts +13 -0
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +18 -3
  10. package/dist/config.js.map +1 -1
  11. package/dist/embed-docs/mem/00000000-0000-0000-0000-000000002001.md +1 -1
  12. package/dist/embed-docs/mem/00000000-0000-0000-0000-000000002002.md +1 -1
  13. package/dist/http/http-api-dump.d.ts.map +1 -1
  14. package/dist/http/http-api-dump.js +1 -1
  15. package/dist/http/http-api-dump.js.map +1 -1
  16. package/dist/http/http-api-mint.d.ts.map +1 -1
  17. package/dist/http/http-api-mint.js +31 -4
  18. package/dist/http/http-api-mint.js.map +1 -1
  19. package/dist/http/http-api-next.d.ts.map +1 -1
  20. package/dist/http/http-api-next.js +2 -2
  21. package/dist/http/http-api-next.js.map +1 -1
  22. package/dist/http/http-api-snapshot.d.ts.map +1 -1
  23. package/dist/http/http-api-snapshot.js +0 -1
  24. package/dist/http/http-api-snapshot.js.map +1 -1
  25. package/dist/http/http-auth-callback.d.ts.map +1 -1
  26. package/dist/http/http-auth-callback.js +3 -2
  27. package/dist/http/http-auth-callback.js.map +1 -1
  28. package/dist/http/http-auth-middleware.d.ts +1 -0
  29. package/dist/http/http-auth-middleware.d.ts.map +1 -1
  30. package/dist/http/http-auth-middleware.js +2 -0
  31. package/dist/http/http-auth-middleware.js.map +1 -1
  32. package/dist/http/http-error-handlers.d.ts.map +1 -1
  33. package/dist/http/http-error-handlers.js +12 -1
  34. package/dist/http/http-error-handlers.js.map +1 -1
  35. package/dist/http/http-health-routes.d.ts.map +1 -1
  36. package/dist/http/http-health-routes.js +9 -6
  37. package/dist/http/http-health-routes.js.map +1 -1
  38. package/dist/http/http-mcp-handler.d.ts.map +1 -1
  39. package/dist/http/http-mcp-handler.js +44 -11
  40. package/dist/http/http-mcp-handler.js.map +1 -1
  41. package/dist/http/http-server-config.d.ts.map +1 -1
  42. package/dist/http/http-server-config.js +51 -1
  43. package/dist/http/http-server-config.js.map +1 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -10
  46. package/dist/index.js.map +1 -1
  47. package/dist/resources/docs-resources.js +1 -1
  48. package/dist/resources/docs-resources.js.map +1 -1
  49. package/dist/resources/prompt-resources.js +1 -1
  50. package/dist/resources/prompt-resources.js.map +1 -1
  51. package/dist/services/chain-utils.d.ts +0 -7
  52. package/dist/services/chain-utils.d.ts.map +1 -1
  53. package/dist/services/chain-utils.js +0 -6
  54. package/dist/services/chain-utils.js.map +1 -1
  55. package/dist/services/embedding/audit.d.ts +35 -0
  56. package/dist/services/embedding/audit.d.ts.map +1 -0
  57. package/dist/services/embedding/audit.js +146 -0
  58. package/dist/services/embedding/audit.js.map +1 -0
  59. package/dist/services/embedding/config.js +1 -1
  60. package/dist/services/embedding/config.js.map +1 -1
  61. package/dist/services/embedding/health.d.ts +5 -0
  62. package/dist/services/embedding/health.d.ts.map +1 -0
  63. package/dist/services/embedding/health.js +112 -0
  64. package/dist/services/embedding/health.js.map +1 -0
  65. package/dist/services/embedding/providers.d.ts.map +1 -1
  66. package/dist/services/embedding/providers.js +65 -1
  67. package/dist/services/embedding/providers.js.map +1 -1
  68. package/dist/services/embedding/service.d.ts +1 -0
  69. package/dist/services/embedding/service.d.ts.map +1 -1
  70. package/dist/services/embedding/service.js +94 -124
  71. package/dist/services/embedding/service.js.map +1 -1
  72. package/dist/services/memory/store-chain-default-handler.d.ts.map +1 -1
  73. package/dist/services/memory/store-chain-default-handler.js +7 -2
  74. package/dist/services/memory/store-chain-default-handler.js.map +1 -1
  75. package/dist/services/memory/store-chain-header-handler.d.ts.map +1 -1
  76. package/dist/services/memory/store-chain-header-handler.js +7 -2
  77. package/dist/services/memory/store-chain-header-handler.js.map +1 -1
  78. package/dist/services/memory/store-chain-helpers.js +1 -1
  79. package/dist/services/memory/store-chain-helpers.js.map +1 -1
  80. package/dist/services/memory/store-chain.js +1 -1
  81. package/dist/services/memory/store-chain.js.map +1 -1
  82. package/dist/services/memory/store-init.js +1 -1
  83. package/dist/services/memory/store-init.js.map +1 -1
  84. package/dist/services/memory/store-methods.js +1 -1
  85. package/dist/services/memory/store-methods.js.map +1 -1
  86. package/dist/services/memory/store.js +1 -1
  87. package/dist/services/memory/store.js.map +1 -1
  88. package/dist/services/memory-store.js +1 -1
  89. package/dist/services/memory-store.js.map +1 -1
  90. package/dist/services/metrics/anomaly-metrics.d.ts +3 -0
  91. package/dist/services/metrics/anomaly-metrics.d.ts.map +1 -0
  92. package/dist/services/metrics/anomaly-metrics.js +9 -0
  93. package/dist/services/metrics/anomaly-metrics.js.map +1 -0
  94. package/dist/services/proof-of-work-store.js +1 -1
  95. package/dist/services/proof-of-work-store.js.map +1 -1
  96. package/dist/services/qdrant/attest-propagation.d.ts.map +1 -1
  97. package/dist/services/qdrant/attest-propagation.js +5 -8
  98. package/dist/services/qdrant/attest-propagation.js.map +1 -1
  99. package/dist/services/qdrant/connection.js +1 -1
  100. package/dist/services/qdrant/connection.js.map +1 -1
  101. package/dist/services/qdrant/initialization.js +1 -1
  102. package/dist/services/qdrant/initialization.js.map +1 -1
  103. package/dist/services/qdrant/listing.js +1 -1
  104. package/dist/services/qdrant/listing.js.map +1 -1
  105. package/dist/services/qdrant/memory-retrieval.d.ts +21 -0
  106. package/dist/services/qdrant/memory-retrieval.d.ts.map +1 -1
  107. package/dist/services/qdrant/memory-retrieval.js +36 -18
  108. package/dist/services/qdrant/memory-retrieval.js.map +1 -1
  109. package/dist/services/qdrant/memory-store.js +1 -1
  110. package/dist/services/qdrant/memory-store.js.map +1 -1
  111. package/dist/services/qdrant/memory-updates.d.ts.map +1 -1
  112. package/dist/services/qdrant/memory-updates.js +35 -37
  113. package/dist/services/qdrant/memory-updates.js.map +1 -1
  114. package/dist/services/qdrant/quality.d.ts.map +1 -1
  115. package/dist/services/qdrant/quality.js +13 -27
  116. package/dist/services/qdrant/quality.js.map +1 -1
  117. package/dist/services/qdrant/resources.d.ts.map +1 -1
  118. package/dist/services/qdrant/resources.js +23 -8
  119. package/dist/services/qdrant/resources.js.map +1 -1
  120. package/dist/services/qdrant/search.js +1 -1
  121. package/dist/services/qdrant/search.js.map +1 -1
  122. package/dist/services/qdrant/service.js +1 -1
  123. package/dist/services/qdrant/service.js.map +1 -1
  124. package/dist/services/qdrant/utils.js +1 -1
  125. package/dist/services/qdrant/utils.js.map +1 -1
  126. package/dist/services/redis-cache.js +1 -1
  127. package/dist/services/redis-cache.js.map +1 -1
  128. package/dist/services/redis.d.ts +1 -0
  129. package/dist/services/redis.d.ts.map +1 -1
  130. package/dist/services/redis.js +20 -6
  131. package/dist/services/redis.js.map +1 -1
  132. package/dist/services/stats/model-stats.js +1 -1
  133. package/dist/services/stats/model-stats.js.map +1 -1
  134. package/dist/services/stats/protocol.js +1 -1
  135. package/dist/services/stats/protocol.js.map +1 -1
  136. package/dist/tools/kairos_attest.js +1 -1
  137. package/dist/tools/kairos_attest.js.map +1 -1
  138. package/dist/tools/kairos_mint.js +1 -1
  139. package/dist/tools/kairos_mint.js.map +1 -1
  140. package/dist/tools/kairos_search.d.ts.map +1 -1
  141. package/dist/tools/kairos_search.js +26 -13
  142. package/dist/tools/kairos_search.js.map +1 -1
  143. package/dist/ui/assets/{AccountPage-xcULo_Ht.js → AccountPage-kxmPtqQP.js} +1 -1
  144. package/dist/ui/assets/{ErrorAlert-Bp_BC2t_.js → ErrorAlert-ME7tEJ6X.js} +1 -1
  145. package/dist/ui/assets/{HomePage-YaKMlhFN.js → HomePage-DxiAsvs-.js} +1 -1
  146. package/dist/ui/assets/{KairosPage-DgO58pOn.js → KairosPage-BkqYs3-_.js} +1 -1
  147. package/dist/ui/assets/NotFoundPage-DyfbQ-6G.js +1 -0
  148. package/dist/ui/assets/{ProtocolDetailPage-D93cKbME.js → ProtocolDetailPage-DKaSVepL.js} +1 -1
  149. package/dist/ui/assets/{ProtocolEditPage-CCwQy6yl.js → ProtocolEditPage-D-aTavvx.js} +1 -1
  150. package/dist/ui/assets/{RenderedMarkdown-Dd_bDNwz.js → RenderedMarkdown-DjbuQlBl.js} +1 -1
  151. package/dist/ui/assets/{RunGuidedPage-CcTlI5HF.js → RunGuidedPage-BUD0MaGh.js} +1 -1
  152. package/dist/ui/assets/{RunsPage-BjSaeOq_.js → RunsPage-ctnsEF2U.js} +1 -1
  153. package/dist/ui/assets/{SkillBundlePage-D2cJwwA1.js → SkillBundlePage-CaWW5oGq.js} +1 -1
  154. package/dist/ui/assets/{index-BE1NYtLh.css → index-BAOM7Ima.css} +1 -1
  155. package/dist/ui/assets/{index-Dj9XLtnR.js → index-BrTmRWuA.js} +3 -3
  156. package/dist/ui/assets/{tiptap-BEg0BoNB.js → tiptap-kMFBDujG.js} +2 -2
  157. package/dist/ui/assets/{useProtocol-D_32bpf9.js → useProtocol-BruWpIzq.js} +1 -1
  158. package/dist/ui/assets/{useSpaces-DdE67BYD.js → useSpaces-BV6eUjY3.js} +1 -1
  159. package/dist/ui/assets/vendor-GiUVcjs7.js +33 -0
  160. package/dist/ui/index.html +4 -4
  161. package/dist/utils/qdrant-vector-management.js +1 -1
  162. package/dist/utils/qdrant-vector-management.js.map +1 -1
  163. package/dist/utils/structured-logger.d.ts +6 -1
  164. package/dist/utils/structured-logger.d.ts.map +1 -1
  165. package/dist/utils/structured-logger.js +103 -16
  166. package/dist/utils/structured-logger.js.map +1 -1
  167. package/dist/utils/tenant-context.d.ts +7 -0
  168. package/dist/utils/tenant-context.d.ts.map +1 -1
  169. package/dist/utils/tenant-context.js +20 -6
  170. package/dist/utils/tenant-context.js.map +1 -1
  171. package/package.json +10 -7
  172. package/dist/ui/assets/NotFoundPage-BnEJbefZ.js +0 -1
  173. package/dist/ui/assets/vendor-BxD5ItEO.js +0 -33
  174. package/dist/utils/logger.d.ts +0 -22
  175. package/dist/utils/logger.d.ts.map +0 -1
  176. package/dist/utils/logger.js +0 -63
  177. package/dist/utils/logger.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/services/embedding/audit.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { logger } from '../../utils/logger.js';
1
+ import { logger } from '../../utils/structured-logger.js';
2
2
  import { OPENAI_EMBEDDING_MODEL, OPENAI_API_KEY, OPENAI_API_URL, TEI_BASE_URL } from '../../config.js';
3
3
  export { OPENAI_EMBEDDING_MODEL };
4
4
  export const OPENAI_ENDPOINT = `${OPENAI_API_URL}/v1/embeddings`;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/services/embedding/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEvG,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,cAAc,gBAAgB,CAAC;AAEjE,gDAAgD;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY;IAC9C,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,gBAAgB;IAC5F,CAAC,CAAC,EAAE,CAAC;AAET,4GAA4G;AAC5G,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AAE7C,+FAA+F;AAC/F,MAAM,UAAU,6BAA6B,CAAC,GAAW;IACrD,IAAI,kBAAkB,KAAK,IAAI,IAAI,kBAAkB,KAAK,GAAG,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,cAAc,kBAAkB,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,kBAAkB,GAAG,GAAG,CAAC;AAC7B,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,6BAA6B;IACzC,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACX,2IAA2I,CAC9I,CAAC;IACN,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC9B,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB;IACjC,OAAO,6BAA6B,EAAE,CAAC;AAC3C,CAAC;AAED,IAAI,CAAC,cAAc,EAAE,CAAC;IAClB,MAAM,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;AAC9G,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/services/embedding/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEvG,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,cAAc,gBAAgB,CAAC;AAEjE,gDAAgD;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY;IAC9C,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,gBAAgB;IAC5F,CAAC,CAAC,EAAE,CAAC;AAET,4GAA4G;AAC5G,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AAE7C,+FAA+F;AAC/F,MAAM,UAAU,6BAA6B,CAAC,GAAW;IACrD,IAAI,kBAAkB,KAAK,IAAI,IAAI,kBAAkB,KAAK,GAAG,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,cAAc,kBAAkB,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,kBAAkB,GAAG,GAAG,CAAC;AAC7B,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,6BAA6B;IACzC,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACX,2IAA2I,CAC9I,CAAC;IACN,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC9B,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB;IACjC,OAAO,6BAA6B,EAAE,CAAC;AAC3C,CAAC;AAED,IAAI,CAAC,cAAc,EAAE,CAAC;IAClB,MAAM,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;AAC9G,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function runEmbeddingHealthCheck(): Promise<{
2
+ healthy: boolean;
3
+ message: string;
4
+ }>;
5
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/health.ts"],"names":[],"mappings":"AAeA,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAuG9F"}
@@ -0,0 +1,112 @@
1
+ import { logger } from '../../utils/structured-logger.js';
2
+ import { EMBEDDING_PROVIDER, OPENAI_API_KEY, TEI_BASE_URL, TEI_MODEL, TEI_API_KEY } from '../../config.js';
3
+ import { OPENAI_EMBEDDING_MODEL, TEI_EMBEDDING_ENDPOINT, setResolvedEmbeddingDimension } from './config.js';
4
+ import { postEmbeddingsOpenAI, postEmbeddingsTEI } from './providers.js';
5
+ export async function runEmbeddingHealthCheck() {
6
+ try {
7
+ const providerPref = EMBEDDING_PROVIDER;
8
+ if (providerPref === 'openai') {
9
+ if (!OPENAI_API_KEY || !OPENAI_EMBEDDING_MODEL) {
10
+ return { healthy: false, message: 'OpenAI requires OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL' };
11
+ }
12
+ try {
13
+ const res = await postEmbeddingsOpenAI('health check');
14
+ return { healthy: Array.isArray(res) && res.length > 0, message: 'openai embeddings operational' };
15
+ }
16
+ catch (err) {
17
+ const msg = err instanceof Error ? err.message : String(err);
18
+ if (msg.includes('429'))
19
+ return { healthy: true, message: 'openai is rate-limited (429) - reachable but throttled' };
20
+ if (msg.includes('401') || msg.toLowerCase().includes('authentication'))
21
+ return { healthy: false, message: 'openai authentication failed - check OPENAI_API_KEY' };
22
+ return { healthy: false, message: `openai health check failed: ${msg}` };
23
+ }
24
+ }
25
+ if (providerPref === 'tei') {
26
+ if (!TEI_BASE_URL || !TEI_MODEL) {
27
+ return { healthy: false, message: 'TEI requires TEI_BASE_URL and TEI_MODEL' };
28
+ }
29
+ try {
30
+ const res = await postEmbeddingsTEI('health check');
31
+ return { healthy: Array.isArray(res) && res.length > 0, message: 'TEI embeddings operational' };
32
+ }
33
+ catch (err) {
34
+ const msg = err instanceof Error ? err.message : String(err);
35
+ if (msg.includes('401'))
36
+ return { healthy: false, message: 'TEI authentication failed (401)' };
37
+ if (msg.includes('429'))
38
+ return { healthy: true, message: 'TEI is rate-limited (429) - reachable but throttled' };
39
+ return { healthy: false, message: `TEI health check failed: ${msg}` };
40
+ }
41
+ }
42
+ if (OPENAI_API_KEY && OPENAI_EMBEDDING_MODEL) {
43
+ try {
44
+ const res = await postEmbeddingsOpenAI('health check');
45
+ return { healthy: Array.isArray(res) && res.length > 0, message: 'openai embeddings operational' };
46
+ }
47
+ catch (err) {
48
+ const msg = err instanceof Error ? err.message : String(err);
49
+ logger.warn(`[EmbeddingService] OpenAI health check failed, trying TEI fallback: ${msg}`);
50
+ }
51
+ }
52
+ if (TEI_BASE_URL && TEI_MODEL) {
53
+ try {
54
+ const url = TEI_EMBEDDING_ENDPOINT || TEI_BASE_URL;
55
+ const payload = { model: TEI_MODEL, input: ['health check'] };
56
+ const headers = { 'Content-Type': 'application/json' };
57
+ if (TEI_API_KEY)
58
+ headers['x-api-key'] = TEI_API_KEY;
59
+ const resp = await fetch(url, {
60
+ method: 'POST',
61
+ headers,
62
+ body: JSON.stringify(payload)
63
+ });
64
+ let data = null;
65
+ try {
66
+ data = await resp.json();
67
+ }
68
+ catch (parseErr) {
69
+ logger.warn(`[EmbeddingService] TEI returned non-JSON response: ${String(parseErr)}`);
70
+ }
71
+ if (!resp.ok) {
72
+ if (resp.status === 401) {
73
+ return { healthy: false, message: 'TEI authentication failed (401)' };
74
+ }
75
+ if (resp.status === 429) {
76
+ return { healthy: true, message: 'TEI is rate-limited (429) - reachable but throttled' };
77
+ }
78
+ return { healthy: false, message: `TEI returned HTTP ${resp.status}` };
79
+ }
80
+ let embeddings = null;
81
+ if (Array.isArray(data?.embeddings)) {
82
+ embeddings = data.embeddings;
83
+ }
84
+ else if (Array.isArray(data?.data)) {
85
+ embeddings = data.data.map((d) => d?.embedding ?? d);
86
+ }
87
+ else if (Array.isArray(data?.result)) {
88
+ embeddings = data.result;
89
+ }
90
+ else if (Array.isArray(data)) {
91
+ embeddings = data;
92
+ }
93
+ if (Array.isArray(embeddings) && embeddings.length > 0 && Array.isArray(embeddings[0])) {
94
+ const dim = embeddings[0].length;
95
+ setResolvedEmbeddingDimension(dim);
96
+ return { healthy: true, message: 'TEI embeddings operational' };
97
+ }
98
+ return { healthy: false, message: 'TEI returned unexpected embedding shape or no embeddings' };
99
+ }
100
+ catch (err) {
101
+ const msg = err instanceof Error ? err.message : String(err);
102
+ return { healthy: false, message: `TEI health check error: ${msg}` };
103
+ }
104
+ }
105
+ return { healthy: false, message: 'No embedding provider configured (set OPENAI_API_KEY+OPENAI_EMBEDDING_MODEL or TEI_BASE_URL+TEI_MODEL)' };
106
+ }
107
+ catch (err) {
108
+ const msg = err instanceof Error ? err.message : String(err);
109
+ return { healthy: false, message: `Embedding health check error: ${msg}` };
110
+ }
111
+ }
112
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/services/embedding/health.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/providers.ts"],"names":[],"mappings":"AAIA,iBAAe,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAmDjF;AAED,iBAAe,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAkD9E;AAED,iBAAe,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CA2B3E;AAED,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/providers.ts"],"names":[],"mappings":"AAkCA,iBAAe,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CA0EjF;AAED,iBAAe,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAwE9E;AAED,iBAAe,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CA2B3E;AAED,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -1,10 +1,31 @@
1
- import { logger } from '../../utils/logger.js';
1
+ import { logger } from '../../utils/structured-logger.js';
2
2
  import { OPENAI_API_KEY, EMBEDDING_PROVIDER, TEI_BASE_URL, TEI_MODEL, TEI_API_KEY } from '../../config.js';
3
3
  import { OPENAI_EMBEDDING_MODEL, OPENAI_ENDPOINT, TEI_EMBEDDING_ENDPOINT, setResolvedEmbeddingDimension } from './config.js';
4
+ import { getRequestIdFromStorage, getTenantId } from '../../utils/tenant-context.js';
5
+ import { structuredLogger } from '../../utils/structured-logger.js';
6
+ function auditProviderCall(payload) {
7
+ structuredLogger.info({
8
+ category: 'audit.embedding',
9
+ stage: 'provider',
10
+ provider: payload.provider,
11
+ model: payload.model,
12
+ tenant_id: getTenantId(),
13
+ request_id: getRequestIdFromStorage(),
14
+ status: payload.status,
15
+ input_count: payload.inputCount,
16
+ input_char_length: payload.inputCharLength,
17
+ output_dimension: payload.outputDimension,
18
+ latency_ms: payload.latencyMs,
19
+ ...(payload.httpStatus !== undefined && { http_status: payload.httpStatus }),
20
+ ...(payload.errorMessage && { error_message: payload.errorMessage })
21
+ }, `Embedding provider ${payload.provider} ${payload.status}`);
22
+ }
4
23
  async function postEmbeddingsOpenAI(input) {
5
24
  if (!OPENAI_API_KEY || !OPENAI_EMBEDDING_MODEL)
6
25
  throw new Error('OpenAI requires OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL to be configured');
7
26
  const inputArray = Array.isArray(input) ? input : [input];
27
+ const startedAt = Date.now();
28
+ const inputCharLength = inputArray.reduce((sum, value) => sum + value.length, 0);
8
29
  const body = {
9
30
  model: OPENAI_EMBEDDING_MODEL,
10
31
  input: inputArray,
@@ -24,6 +45,17 @@ async function postEmbeddingsOpenAI(input) {
24
45
  });
25
46
  if (!res.ok) {
26
47
  const errMsg = data?.error?.message || data?.message || `OpenAI embeddings HTTP ${res.status}`;
48
+ auditProviderCall({
49
+ provider: 'openai',
50
+ model: OPENAI_EMBEDDING_MODEL,
51
+ status: 'error',
52
+ inputCount: inputArray.length,
53
+ inputCharLength,
54
+ outputDimension: 0,
55
+ latencyMs: Date.now() - startedAt,
56
+ httpStatus: res.status,
57
+ errorMessage: errMsg
58
+ });
27
59
  if (res.status === 401) {
28
60
  throw new Error(`OpenAI authentication failed (401). Check OPENAI_API_KEY: ${errMsg}`);
29
61
  }
@@ -46,6 +78,16 @@ async function postEmbeddingsOpenAI(input) {
46
78
  setResolvedEmbeddingDimension(dim);
47
79
  }
48
80
  const dim = embeddings.length > 0 && embeddings[0] ? embeddings[0].length : 0;
81
+ auditProviderCall({
82
+ provider: 'openai',
83
+ model: OPENAI_EMBEDDING_MODEL,
84
+ status: 'success',
85
+ inputCount: inputArray.length,
86
+ inputCharLength,
87
+ outputDimension: dim,
88
+ latencyMs: Date.now() - startedAt,
89
+ httpStatus: res.status
90
+ });
49
91
  logger.debug(`[EmbeddingService] Received ${embeddings.length} embeddings (dim=${dim}) [provider=openai]`);
50
92
  return embeddings;
51
93
  }
@@ -53,6 +95,8 @@ async function postEmbeddingsTEI(input) {
53
95
  if (!TEI_BASE_URL || !TEI_MODEL)
54
96
  throw new Error('TEI requires TEI_BASE_URL and TEI_MODEL to be configured');
55
97
  const inputArray = Array.isArray(input) ? input : [input];
98
+ const startedAt = Date.now();
99
+ const inputCharLength = inputArray.reduce((sum, value) => sum + value.length, 0);
56
100
  const body = { input: inputArray, model: TEI_MODEL };
57
101
  const headers = { 'Content-Type': 'application/json' };
58
102
  if (TEI_API_KEY)
@@ -68,6 +112,16 @@ async function postEmbeddingsTEI(input) {
68
112
  throw new Error(`TEI embeddings returned non-JSON response (HTTP ${res.status})`);
69
113
  });
70
114
  if (!res.ok) {
115
+ auditProviderCall({
116
+ provider: 'tei',
117
+ model: TEI_MODEL,
118
+ status: 'error',
119
+ inputCount: inputArray.length,
120
+ inputCharLength,
121
+ outputDimension: 0,
122
+ latencyMs: Date.now() - startedAt,
123
+ httpStatus: res.status
124
+ });
71
125
  if (res.status === 401) {
72
126
  throw new Error('TEI authentication failed (401)');
73
127
  }
@@ -96,6 +150,16 @@ async function postEmbeddingsTEI(input) {
96
150
  }
97
151
  const dim = embeddings[0].length;
98
152
  setResolvedEmbeddingDimension(dim);
153
+ auditProviderCall({
154
+ provider: 'tei',
155
+ model: TEI_MODEL,
156
+ status: 'success',
157
+ inputCount: inputArray.length,
158
+ inputCharLength,
159
+ outputDimension: dim,
160
+ latencyMs: Date.now() - startedAt,
161
+ httpStatus: res.status
162
+ });
99
163
  logger.debug(`[EmbeddingService] Received ${embeddings.length} embeddings (dim=${dim}) [provider=tei]`);
100
164
  return embeddings;
101
165
  }
@@ -1 +1 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/services/embedding/providers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/services/embedding/providers.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ import type { EmbeddingResult, BatchEmbeddingResult } from './types.js';
15
15
  export type { EmbeddingResult, BatchEmbeddingResult } from './types.js';
16
16
  export declare class EmbeddingService {
17
17
  private get embeddingDimension();
18
+ private getModelName;
18
19
  generateEmbedding(text: string): Promise<EmbeddingResult>;
19
20
  generateBatchEmbeddings(texts: string[]): Promise<BatchEmbeddingResult>;
20
21
  calculateCosineSimilarity(embedding1: number[] | undefined, embedding2: number[] | undefined): number;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAWxE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,gBAAgB;IACzB,OAAO,KAAK,kBAAkB,GAE7B;IAEK,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA6CzD,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAyD7E,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM;IAa/F,uBAAuB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAa7D,YAAY,IAAI,MAAM;IAKhB,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAgHnE,WAAW,IAAI,QAAQ,GAAG,KAAK,GAAG,OAAO;IASzC,SAAS;;;;;;;;CAiBZ;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAEvD,uGAAuG;AACvG,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG/D"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAiBxE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,gBAAgB;IACzB,OAAO,KAAK,kBAAkB,GAE7B;IAED,OAAO,CAAC,YAAY;IAId,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAkFzD,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA8F7E,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM;IAa/F,uBAAuB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAa7D,YAAY,IAAI,MAAM;IAKhB,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAInE,WAAW,IAAI,QAAQ,GAAG,KAAK,GAAG,OAAO;IASzC,SAAS;;;;;;;;CAiBZ;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAEvD,uGAAuG;AACvG,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG/D"}
@@ -11,28 +11,49 @@
11
11
  * - If OPENAI_API_KEY is set, OpenAI is used.
12
12
  * - Otherwise, TEI_BASE_URL + TEI_MODEL will be used if configured.
13
13
  */
14
- import { logger } from '../../utils/logger.js';
15
- import { EMBEDDING_PROVIDER, OPENAI_API_KEY, TEI_BASE_URL, TEI_MODEL, TEI_API_KEY } from '../../config.js';
16
- import { OPENAI_EMBEDDING_MODEL, TEI_EMBEDDING_ENDPOINT, getResolvedEmbeddingDimension, setResolvedEmbeddingDimension } from './config.js';
17
- import { postEmbeddings, postEmbeddingsOpenAI, postEmbeddingsTEI } from './providers.js';
14
+ import { logger } from '../../utils/structured-logger.js';
15
+ import { EMBEDDING_PROVIDER, OPENAI_API_KEY, TEI_BASE_URL, TEI_MODEL } from '../../config.js';
16
+ import { OPENAI_EMBEDDING_MODEL, getResolvedEmbeddingDimension } from './config.js';
17
+ import { postEmbeddings } from './providers.js';
18
18
  import { embeddingRequests, embeddingDuration, embeddingErrors, embeddingVectorSize, embeddingBatchSize } from '../metrics/embedding-metrics.js';
19
- import { getTenantId } from '../../utils/tenant-context.js';
19
+ import { getRequestIdFromStorage, getTenantId } from '../../utils/tenant-context.js';
20
+ import { detectEmbeddingAnomalies, logEmbeddingAuditError, logEmbeddingAuditSuccess } from './audit.js';
21
+ import { runEmbeddingHealthCheck } from './health.js';
20
22
  export class EmbeddingService {
21
23
  get embeddingDimension() {
22
24
  return getResolvedEmbeddingDimension();
23
25
  }
26
+ getModelName(provider) {
27
+ return provider === 'tei' ? TEI_MODEL : OPENAI_EMBEDDING_MODEL;
28
+ }
24
29
  async generateEmbedding(text) {
25
30
  const tenantId = getTenantId();
31
+ const requestId = getRequestIdFromStorage();
26
32
  const provider = this.getProvider();
33
+ const model = this.getModelName(provider);
27
34
  const timer = embeddingDuration.startTimer({ provider, tenant_id: tenantId });
35
+ const startedAt = Date.now();
36
+ const normalizedText = text?.trim() || '';
37
+ const inputCharLength = normalizedText.length;
28
38
  try {
29
- if (!text || text.trim().length === 0)
39
+ if (!normalizedText)
30
40
  throw new Error('Text cannot be empty for embedding generation');
31
- const vectors = await postEmbeddings(text.trim());
41
+ const vectors = await postEmbeddings(normalizedText);
32
42
  const embedding = vectors?.[0];
33
43
  if (!Array.isArray(embedding))
34
44
  throw new Error('OpenAI returned no embedding');
35
- if (embedding.length !== this.embeddingDimension)
45
+ const latencyMs = Date.now() - startedAt;
46
+ const anomaly = detectEmbeddingAnomalies({
47
+ tenantId,
48
+ requestId,
49
+ provider,
50
+ model,
51
+ latencyMs,
52
+ expectedDimension: this.embeddingDimension,
53
+ actualDimension: embedding.length,
54
+ sampleEmbedding: embedding
55
+ });
56
+ if (anomaly.hasCritical)
36
57
  throw new Error(`Embedding dimension mismatch: got ${embedding.length}, expected ${this.embeddingDimension}`);
37
58
  embeddingRequests.inc({
38
59
  provider,
@@ -42,6 +63,16 @@ export class EmbeddingService {
42
63
  // Track vector size (assuming float32, 4 bytes per float)
43
64
  const vectorSize = embedding.length * 4;
44
65
  embeddingVectorSize.observe({ provider, tenant_id: tenantId }, vectorSize);
66
+ logEmbeddingAuditSuccess({
67
+ tenantId,
68
+ requestId,
69
+ provider,
70
+ model,
71
+ inputCount: 1,
72
+ inputCharLength,
73
+ outputDimension: embedding.length,
74
+ latencyMs
75
+ });
45
76
  timer({ provider, tenant_id: tenantId });
46
77
  return {
47
78
  embedding,
@@ -60,27 +91,56 @@ export class EmbeddingService {
60
91
  status: 'error',
61
92
  tenant_id: tenantId
62
93
  });
94
+ logEmbeddingAuditError({
95
+ tenantId,
96
+ requestId,
97
+ provider,
98
+ model,
99
+ inputCount: 1,
100
+ inputCharLength,
101
+ outputDimension: 0,
102
+ latencyMs: Date.now() - startedAt,
103
+ errorMessage: error instanceof Error ? error.message : String(error)
104
+ });
63
105
  timer({ provider, tenant_id: tenantId });
64
106
  throw error;
65
107
  }
66
108
  }
67
109
  async generateBatchEmbeddings(texts) {
68
110
  const tenantId = getTenantId();
111
+ const requestId = getRequestIdFromStorage();
69
112
  const provider = this.getProvider();
113
+ const model = this.getModelName(provider);
70
114
  const timer = embeddingDuration.startTimer({ provider, tenant_id: tenantId });
115
+ const startedAt = Date.now();
116
+ let inputCount = 0;
117
+ let inputCharLength = 0;
71
118
  try {
72
119
  const valid = texts.filter(t => t && t.trim().length > 0);
73
120
  if (valid.length === 0)
74
121
  throw new Error('No valid texts provided for batch embedding');
122
+ inputCount = valid.length;
123
+ inputCharLength = valid.reduce((sum, value) => sum + value.trim().length, 0);
75
124
  // Track batch size
76
125
  embeddingBatchSize.observe({ tenant_id: tenantId }, valid.length);
77
126
  const vectors = await postEmbeddings(valid);
78
- // Validate each vector length
127
+ const outputDimension = Array.isArray(vectors[0]) ? vectors[0].length : 0;
128
+ const latencyMs = Date.now() - startedAt;
79
129
  const wrongDim = vectors.some(v => !Array.isArray(v) || v.length !== this.embeddingDimension);
80
- if (wrongDim) {
130
+ if (wrongDim)
81
131
  logger.error('[EmbeddingService] One or more embeddings returned with unexpected dimension');
82
- throw new Error('One or more embeddings have unexpected dimension from OpenAI');
83
- }
132
+ const anomaly = detectEmbeddingAnomalies({
133
+ tenantId,
134
+ requestId,
135
+ provider,
136
+ model,
137
+ latencyMs,
138
+ expectedDimension: this.embeddingDimension,
139
+ actualDimension: wrongDim ? -1 : outputDimension,
140
+ sampleEmbedding: Array.isArray(vectors[0]) ? vectors[0] : []
141
+ });
142
+ if (wrongDim || anomaly.hasCritical)
143
+ throw new Error('One or more embeddings have unexpected dimension from provider');
84
144
  embeddingRequests.inc({
85
145
  provider,
86
146
  status: 'success',
@@ -93,6 +153,16 @@ export class EmbeddingService {
93
153
  embeddingVectorSize.observe({ provider, tenant_id: tenantId }, vectorSize);
94
154
  }
95
155
  }
156
+ logEmbeddingAuditSuccess({
157
+ tenantId,
158
+ requestId,
159
+ provider,
160
+ model,
161
+ inputCount,
162
+ inputCharLength,
163
+ outputDimension,
164
+ latencyMs
165
+ });
96
166
  timer({ provider, tenant_id: tenantId });
97
167
  return {
98
168
  embeddings: vectors,
@@ -111,6 +181,17 @@ export class EmbeddingService {
111
181
  status: 'error',
112
182
  tenant_id: tenantId
113
183
  });
184
+ logEmbeddingAuditError({
185
+ tenantId,
186
+ requestId,
187
+ provider,
188
+ model,
189
+ inputCount,
190
+ inputCharLength,
191
+ outputDimension: 0,
192
+ latencyMs: Date.now() - startedAt,
193
+ errorMessage: error instanceof Error ? error.message : String(error)
194
+ });
114
195
  timer({ provider, tenant_id: tenantId });
115
196
  throw error;
116
197
  }
@@ -147,118 +228,7 @@ export class EmbeddingService {
147
228
  return 0;
148
229
  }
149
230
  async healthCheck() {
150
- try {
151
- const providerPref = EMBEDDING_PROVIDER;
152
- if (providerPref === 'openai') {
153
- // Explicit OpenAI only - enforce duo
154
- if (!OPENAI_API_KEY || !OPENAI_EMBEDDING_MODEL) {
155
- return { healthy: false, message: 'OpenAI requires OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL' };
156
- }
157
- try {
158
- const res = await postEmbeddingsOpenAI('health check');
159
- return { healthy: Array.isArray(res) && res.length > 0, message: 'openai embeddings operational' };
160
- }
161
- catch (err) {
162
- const msg = err instanceof Error ? err.message : String(err);
163
- if (msg.includes('429'))
164
- return { healthy: true, message: 'openai is rate-limited (429) - reachable but throttled' };
165
- if (msg.includes('401') || msg.toLowerCase().includes('authentication'))
166
- return { healthy: false, message: 'openai authentication failed - check OPENAI_API_KEY' };
167
- return { healthy: false, message: `openai health check failed: ${msg}` };
168
- }
169
- }
170
- if (providerPref === 'tei') {
171
- // Explicit TEI only - enforce duo
172
- if (!TEI_BASE_URL || !TEI_MODEL) {
173
- return { healthy: false, message: 'TEI requires TEI_BASE_URL and TEI_MODEL' };
174
- }
175
- try {
176
- const res = await postEmbeddingsTEI('health check');
177
- return { healthy: Array.isArray(res) && res.length > 0, message: 'TEI embeddings operational' };
178
- }
179
- catch (err) {
180
- const msg = err instanceof Error ? err.message : String(err);
181
- if (msg.includes('401'))
182
- return { healthy: false, message: 'TEI authentication failed (401)' };
183
- if (msg.includes('429'))
184
- return { healthy: true, message: 'TEI is rate-limited (429) - reachable but throttled' };
185
- return { healthy: false, message: `TEI health check failed: ${msg}` };
186
- }
187
- }
188
- // Auto mode: prefer OpenAI if both OPENAI vars are present, otherwise TEI
189
- if (OPENAI_API_KEY && OPENAI_EMBEDDING_MODEL) {
190
- try {
191
- const res = await postEmbeddingsOpenAI('health check');
192
- return { healthy: Array.isArray(res) && res.length > 0, message: 'openai embeddings operational' };
193
- }
194
- catch (err) {
195
- const msg = err instanceof Error ? err.message : String(err);
196
- logger.warn(`[EmbeddingService] OpenAI health check failed, trying TEI fallback: ${msg}`);
197
- }
198
- }
199
- if (TEI_BASE_URL && TEI_MODEL) {
200
- try {
201
- const url = TEI_EMBEDDING_ENDPOINT || TEI_BASE_URL;
202
- const payload = { model: TEI_MODEL, input: ['health check'] };
203
- const headers = { 'Content-Type': 'application/json' };
204
- if (TEI_API_KEY)
205
- headers['x-api-key'] = TEI_API_KEY;
206
- const resp = await fetch(url, {
207
- method: 'POST',
208
- headers,
209
- body: JSON.stringify(payload)
210
- });
211
- let data = null;
212
- try {
213
- data = await resp.json();
214
- }
215
- catch (parseErr) {
216
- logger.warn(`[EmbeddingService] TEI returned non-JSON response: ${String(parseErr)}`);
217
- }
218
- if (!resp.ok) {
219
- if (resp.status === 401) {
220
- return { healthy: false, message: 'TEI authentication failed (401)' };
221
- }
222
- if (resp.status === 429) {
223
- return { healthy: true, message: 'TEI is rate-limited (429) - reachable but throttled' };
224
- }
225
- return { healthy: false, message: `TEI returned HTTP ${resp.status}` };
226
- }
227
- // Accept several TEI response shapes:
228
- // - { embeddings: [ [..], ... ] }
229
- // - { data: [ { embedding: [...] }, ... ] }
230
- // - { result: [ ... ] } (some servers)
231
- let embeddings = null;
232
- if (Array.isArray(data?.embeddings)) {
233
- embeddings = data.embeddings;
234
- }
235
- else if (Array.isArray(data?.data)) {
236
- embeddings = data.data.map((d) => d?.embedding ?? d);
237
- }
238
- else if (Array.isArray(data?.result)) {
239
- embeddings = data.result;
240
- }
241
- else if (Array.isArray(data)) {
242
- embeddings = data;
243
- }
244
- if (Array.isArray(embeddings) && embeddings.length > 0 && Array.isArray(embeddings[0])) {
245
- const dim = embeddings[0].length;
246
- setResolvedEmbeddingDimension(dim);
247
- return { healthy: true, message: 'TEI embeddings operational' };
248
- }
249
- return { healthy: false, message: 'TEI returned unexpected embedding shape or no embeddings' };
250
- }
251
- catch (err) {
252
- const msg = err instanceof Error ? err.message : String(err);
253
- return { healthy: false, message: `TEI health check error: ${msg}` };
254
- }
255
- }
256
- return { healthy: false, message: 'No embedding provider configured (set OPENAI_API_KEY+OPENAI_EMBEDDING_MODEL or TEI_BASE_URL+TEI_MODEL)' };
257
- }
258
- catch (err) {
259
- const msg = err instanceof Error ? err.message : String(err);
260
- return { healthy: false, message: `Embedding health check error: ${msg}` };
261
- }
231
+ return runEmbeddingHealthCheck();
262
232
  }
263
233
  getProvider() {
264
234
  const pref = EMBEDDING_PROVIDER;