@squadrules/mcp 5.0.0-beta.1 → 5.0.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 (162) hide show
  1. package/README.md +23 -20
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/config/embedding-fastembed.d.ts +9 -0
  4. package/dist/config/embedding-fastembed.d.ts.map +1 -0
  5. package/dist/config/embedding-fastembed.js +20 -0
  6. package/dist/config/embedding-fastembed.js.map +1 -0
  7. package/dist/config.d.ts +8 -4
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +10 -4
  10. package/dist/config.js.map +1 -1
  11. package/dist/embed-docs/mem/adapter-migration.md +1 -1
  12. package/dist/embed-docs/mem/bulk-insert-adapters-via-cli.md +1 -1
  13. package/dist/embed-docs/mem/challenge-type-guide.md +1 -1
  14. package/dist/embed-docs/mem/create-new-protocol.md +1 -1
  15. package/dist/embed-docs/mem/phase-critic-guide.md +1 -1
  16. package/dist/embed-docs/mem/phase-critic.md +1 -1
  17. package/dist/embed-docs/mem/protocol-linking-guide.md +1 -1
  18. package/dist/embed-docs/mem/refine-search.md +1 -1
  19. package/dist/embed-docs/mem/skill-format-guide.md +1 -1
  20. package/dist/http/http-api-snapshot.d.ts.map +1 -1
  21. package/dist/http/http-api-snapshot.js +13 -1
  22. package/dist/http/http-api-snapshot.js.map +1 -1
  23. package/dist/http/http-health-routes.d.ts.map +1 -1
  24. package/dist/http/http-health-routes.js +6 -3
  25. package/dist/http/http-health-routes.js.map +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +15 -5
  28. package/dist/index.js.map +1 -1
  29. package/dist/resources/embedded-mcp-resources.js +9 -9
  30. package/dist/resources/embedded-mcp-resources.js.map +1 -1
  31. package/dist/resources/mem-resources-boot.d.ts.map +1 -1
  32. package/dist/resources/mem-resources-boot.js +2 -28
  33. package/dist/resources/mem-resources-boot.js.map +1 -1
  34. package/dist/resources/mem-uuid-mapper.d.ts.map +1 -1
  35. package/dist/resources/mem-uuid-mapper.js +8 -23
  36. package/dist/resources/mem-uuid-mapper.js.map +1 -1
  37. package/dist/server.d.ts.map +1 -1
  38. package/dist/server.js +9 -7
  39. package/dist/server.js.map +1 -1
  40. package/dist/services/embedding/fastembed-provider.d.ts +2 -0
  41. package/dist/services/embedding/fastembed-provider.d.ts.map +1 -0
  42. package/dist/services/embedding/fastembed-provider.js +78 -0
  43. package/dist/services/embedding/fastembed-provider.js.map +1 -0
  44. package/dist/services/embedding/health.d.ts.map +1 -1
  45. package/dist/services/embedding/health.js +99 -96
  46. package/dist/services/embedding/health.js.map +1 -1
  47. package/dist/services/embedding/provider-audit.d.ts +15 -0
  48. package/dist/services/embedding/provider-audit.d.ts.map +1 -0
  49. package/dist/services/embedding/provider-audit.js +28 -0
  50. package/dist/services/embedding/provider-audit.js.map +1 -0
  51. package/dist/services/embedding/providers.d.ts +2 -1
  52. package/dist/services/embedding/providers.d.ts.map +1 -1
  53. package/dist/services/embedding/providers.js +21 -23
  54. package/dist/services/embedding/providers.js.map +1 -1
  55. package/dist/services/embedding/service.d.ts +2 -2
  56. package/dist/services/embedding/service.d.ts.map +1 -1
  57. package/dist/services/embedding/service.js +13 -16
  58. package/dist/services/embedding/service.js.map +1 -1
  59. package/dist/services/execution-trace-store.d.ts +5 -29
  60. package/dist/services/execution-trace-store.d.ts.map +1 -1
  61. package/dist/services/execution-trace-store.js +10 -2
  62. package/dist/services/execution-trace-store.js.map +1 -1
  63. package/dist/services/memory/store.d.ts +23 -0
  64. package/dist/services/memory/store.d.ts.map +1 -1
  65. package/dist/services/memory/store.js +110 -3
  66. package/dist/services/memory/store.js.map +1 -1
  67. package/dist/services/memory-store.d.ts +5 -0
  68. package/dist/services/memory-store.d.ts.map +1 -1
  69. package/dist/services/memory-store.js +5 -0
  70. package/dist/services/memory-store.js.map +1 -1
  71. package/dist/services/qdrant/service.d.ts.map +1 -1
  72. package/dist/services/qdrant/service.js +11 -2
  73. package/dist/services/qdrant/service.js.map +1 -1
  74. package/dist/services/vector-store/IExecutionTraceStore.d.ts +25 -0
  75. package/dist/services/vector-store/IExecutionTraceStore.d.ts.map +1 -0
  76. package/dist/services/vector-store/IExecutionTraceStore.js +2 -0
  77. package/dist/services/vector-store/IExecutionTraceStore.js.map +1 -0
  78. package/dist/services/vector-store/IVectorRecordStore.d.ts +58 -0
  79. package/dist/services/vector-store/IVectorRecordStore.d.ts.map +1 -0
  80. package/dist/services/vector-store/IVectorRecordStore.js +2 -0
  81. package/dist/services/vector-store/IVectorRecordStore.js.map +1 -0
  82. package/dist/services/vector-store/commit-retry.d.ts +21 -0
  83. package/dist/services/vector-store/commit-retry.d.ts.map +1 -0
  84. package/dist/services/vector-store/commit-retry.js +58 -0
  85. package/dist/services/vector-store/commit-retry.js.map +1 -0
  86. package/dist/services/vector-store/embedded-store-singleton.d.ts +12 -0
  87. package/dist/services/vector-store/embedded-store-singleton.d.ts.map +1 -0
  88. package/dist/services/vector-store/embedded-store-singleton.js +17 -0
  89. package/dist/services/vector-store/embedded-store-singleton.js.map +1 -0
  90. package/dist/services/vector-store/lancedb/LanceExecutionTraceStore.d.ts +28 -0
  91. package/dist/services/vector-store/lancedb/LanceExecutionTraceStore.d.ts.map +1 -0
  92. package/dist/services/vector-store/lancedb/LanceExecutionTraceStore.js +222 -0
  93. package/dist/services/vector-store/lancedb/LanceExecutionTraceStore.js.map +1 -0
  94. package/dist/services/vector-store/lancedb/LanceVectorRecordStore.d.ts +77 -0
  95. package/dist/services/vector-store/lancedb/LanceVectorRecordStore.d.ts.map +1 -0
  96. package/dist/services/vector-store/lancedb/LanceVectorRecordStore.js +136 -0
  97. package/dist/services/vector-store/lancedb/LanceVectorRecordStore.js.map +1 -0
  98. package/dist/services/vector-store/lancedb/lance-records-engine.d.ts +41 -0
  99. package/dist/services/vector-store/lancedb/lance-records-engine.d.ts.map +1 -0
  100. package/dist/services/vector-store/lancedb/lance-records-engine.js +102 -0
  101. package/dist/services/vector-store/lancedb/lance-records-engine.js.map +1 -0
  102. package/dist/services/vector-store/lancedb/lance-records-mutations.d.ts +22 -0
  103. package/dist/services/vector-store/lancedb/lance-records-mutations.d.ts.map +1 -0
  104. package/dist/services/vector-store/lancedb/lance-records-mutations.js +211 -0
  105. package/dist/services/vector-store/lancedb/lance-records-mutations.js.map +1 -0
  106. package/dist/services/vector-store/lancedb/lance-records-reads.d.ts +64 -0
  107. package/dist/services/vector-store/lancedb/lance-records-reads.d.ts.map +1 -0
  108. package/dist/services/vector-store/lancedb/lance-records-reads.js +237 -0
  109. package/dist/services/vector-store/lancedb/lance-records-reads.js.map +1 -0
  110. package/dist/services/vector-store/lancedb/lance-records-schema.d.ts +48 -0
  111. package/dist/services/vector-store/lancedb/lance-records-schema.d.ts.map +1 -0
  112. package/dist/services/vector-store/lancedb/lance-records-schema.js +159 -0
  113. package/dist/services/vector-store/lancedb/lance-records-schema.js.map +1 -0
  114. package/dist/services/vector-store/lancedb/lance-records-search.d.ts +30 -0
  115. package/dist/services/vector-store/lancedb/lance-records-search.d.ts.map +1 -0
  116. package/dist/services/vector-store/lancedb/lance-records-search.js +112 -0
  117. package/dist/services/vector-store/lancedb/lance-records-search.js.map +1 -0
  118. package/dist/services/vector-store/lancedb/lance-records-write-artifact.d.ts +11 -0
  119. package/dist/services/vector-store/lancedb/lance-records-write-artifact.d.ts.map +1 -0
  120. package/dist/services/vector-store/lancedb/lance-records-write-artifact.js +121 -0
  121. package/dist/services/vector-store/lancedb/lance-records-write-artifact.js.map +1 -0
  122. package/dist/services/vector-store/lancedb/lance-records-write-helpers.d.ts +52 -0
  123. package/dist/services/vector-store/lancedb/lance-records-write-helpers.d.ts.map +1 -0
  124. package/dist/services/vector-store/lancedb/lance-records-write-helpers.js +216 -0
  125. package/dist/services/vector-store/lancedb/lance-records-write-helpers.js.map +1 -0
  126. package/dist/services/vector-store/lancedb/lance-records-writes.d.ts +21 -0
  127. package/dist/services/vector-store/lancedb/lance-records-writes.d.ts.map +1 -0
  128. package/dist/services/vector-store/lancedb/lance-records-writes.js +294 -0
  129. package/dist/services/vector-store/lancedb/lance-records-writes.js.map +1 -0
  130. package/dist/services/vector-store/lancedb-connection.d.ts +12 -0
  131. package/dist/services/vector-store/lancedb-connection.d.ts.map +1 -0
  132. package/dist/services/vector-store/lancedb-connection.js +28 -0
  133. package/dist/services/vector-store/lancedb-connection.js.map +1 -0
  134. package/dist/services/vector-store/types.d.ts +85 -0
  135. package/dist/services/vector-store/types.d.ts.map +1 -0
  136. package/dist/services/vector-store/types.js +2 -0
  137. package/dist/services/vector-store/types.js.map +1 -0
  138. package/dist/tools/artifact-catalog.d.ts.map +1 -1
  139. package/dist/tools/artifact-catalog.js +6 -33
  140. package/dist/tools/artifact-catalog.js.map +1 -1
  141. package/dist/tools/search.d.ts.map +1 -1
  142. package/dist/tools/search.js +6 -20
  143. package/dist/tools/search.js.map +1 -1
  144. package/dist/tools/search_schema.d.ts +1 -1
  145. package/dist/tools/skill-export/enumerate-space-adapters.d.ts +1 -1
  146. package/dist/tools/skill-export/enumerate-space-adapters.d.ts.map +1 -1
  147. package/dist/tools/skill-export/enumerate-space-adapters.js +11 -27
  148. package/dist/tools/skill-export/enumerate-space-adapters.js.map +1 -1
  149. package/dist/tools/spaces.d.ts.map +1 -1
  150. package/dist/tools/spaces.js +2 -15
  151. package/dist/tools/spaces.js.map +1 -1
  152. package/dist/ui/assets/{AccountPage-B0ali9jz.js → AccountPage-Cbsp2hcC.js} +1 -1
  153. package/dist/ui/assets/{ProtocolEditPage-DIySo-F_.js → ProtocolEditPage-mChBe3JY.js} +1 -1
  154. package/dist/ui/assets/{RichTextEditor-uun0UIVc.js → RichTextEditor-Bj6JxHM5.js} +1 -1
  155. package/dist/ui/assets/{SkillBundlePage-DtOlpupj.js → SkillBundlePage-D1OPKJzA.js} +1 -1
  156. package/dist/ui/assets/{index-BlCipoHI.js → index-DL3-JTk4.js} +2 -2
  157. package/dist/ui/index.html +1 -1
  158. package/dist/utils/squadrules-user-dirs.d.ts +10 -0
  159. package/dist/utils/squadrules-user-dirs.d.ts.map +1 -1
  160. package/dist/utils/squadrules-user-dirs.js +12 -0
  161. package/dist/utils/squadrules-user-dirs.js.map +1 -1
  162. package/package.json +18 -11
package/dist/server.js CHANGED
@@ -6,7 +6,7 @@ import { registerPromptResources } from './resources/prompt-resources.js';
6
6
  import { bootstrapEmptyResourceHandlers } from './resources/resource-bootstrap.js';
7
7
  import { qdrantService } from './services/qdrant/index.js';
8
8
  import { getBuildVersion } from './utils/build-version.js';
9
- import { LOG_LEVEL, LOG_FORMAT, TRANSPORT_TYPE, getQdrantUrl, getQdrantCollection, QDRANT_API_KEY, QDRANT_RESCORE_STRING, TEI_BASE_URL, TEI_MODEL, SQUADRULES_SEARCH_OVERFETCH_FACTOR, SQUADRULES_SEARCH_MAX_FETCH, SQUADRULES_ENABLE_GROUP_COLLAPSE } from './config.js';
9
+ import { LOG_LEVEL, LOG_FORMAT, TRANSPORT_TYPE, isQdrantConfigured, getQdrantUrl, getQdrantCollection, QDRANT_API_KEY, QDRANT_RESCORE_STRING, TEI_BASE_URL, TEI_MODEL, SQUADRULES_SEARCH_OVERFETCH_FACTOR, SQUADRULES_SEARCH_MAX_FETCH, SQUADRULES_ENABLE_GROUP_COLLAPSE } from './config.js';
10
10
  import { getEmbeddingDimension } from './services/embedding/config.js';
11
11
  // removed: debug tools (kb_version, kb_cache_stats)
12
12
  import { registerDeleteTool } from './tools/delete.js';
@@ -78,12 +78,14 @@ export function createServer(memoryStore) {
78
78
  transport: {
79
79
  type: TRANSPORT_TYPE,
80
80
  },
81
- qdrant: {
82
- url: getQdrantUrl(),
83
- collection: getQdrantCollection(),
84
- apiKey: mask(QDRANT_API_KEY),
85
- rescore: QDRANT_RESCORE_STRING,
86
- },
81
+ qdrant: isQdrantConfigured
82
+ ? {
83
+ url: getQdrantUrl(),
84
+ collection: getQdrantCollection(),
85
+ apiKey: mask(QDRANT_API_KEY),
86
+ rescore: QDRANT_RESCORE_STRING,
87
+ }
88
+ : { backend: 'embedded-lancedb' },
87
89
  tei: {
88
90
  url: TEI_BASE_URL,
89
91
  model: TEI_MODEL,
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,EAAE,SAAS,EAAE,kCAAkC,EAAE,2BAA2B,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAC9R,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,oDAAoD;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iCAAiC,EAAE,MAAM,+CAA+C,CAAC;AAClG,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,SAAS,6BAA6B,CAAC,MAAiB;IACtD,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACnE,KAAK,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACzD,YAAY,EAAE,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC;YACtD,GAAG,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC,CAAC;KACJ,CAAC,CAAC,CAAC;AACN,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,YAAY,CAAC,WAA8B;IACvD,MAAM,MAAM,GAAG,IAAI,SAAS,CACxB;QACI,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,eAAe,EAAE;KAC7B,EACD;QACI,YAAY,EAAE;YACV,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,EAAE;YACX,GAAG,iCAAiC;SACjB;KAC1B,CACJ,CAAC;IAEF,kCAAkC;IAClC,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7D,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAC5D,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1D,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IACzD,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3D,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAEpC,qBAAqB;IACrB,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvC,wDAAwD;IACxD,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,iDAAiD;IACjD,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAEhC,2CAA2C;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG;QACX,GAAG,EAAE;YACD,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,UAAU;SACrB;QACD,SAAS,EAAE;YACP,IAAI,EAAE,cAAc;SACvB;QACD,MAAM,EAAE,kBAAkB;YACtB,CAAC,CAAC;gBACE,GAAG,EAAE,YAAY,EAAE;gBACnB,UAAU,EAAE,mBAAmB,EAAE;gBACjC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC;gBAC5B,OAAO,EAAE,qBAAqB;aACjC;YACD,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE;QACrC,GAAG,EAAE;YACD,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,qBAAqB,EAAE;SACnC;QACD,MAAM,EAAE;YACJ,SAAS,EAAE,kCAAkC;YAC7C,QAAQ,EAAE,2BAA2B;YACrC,aAAa,EAAE,gCAAgC;SAClD;KACJ,CAAC;IACF,gBAAgB,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnE,gBAAgB,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function postEmbeddingsFastEmbed(input: string[] | string): Promise<number[][]>;
2
+ //# sourceMappingURL=fastembed-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastembed-provider.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/fastembed-provider.ts"],"names":[],"mappings":"AAuCA,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAwC3F"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Local fastembed embedding provider (issue #11) — the zero-dependency default.
3
+ *
4
+ * Produces embeddings in-process via ONNX (no API key, no inference service), so
5
+ * simple mode and `npx @squadrules/mcp serve` run fully self-contained. Model
6
+ * weights are fetched on first use by fastembed's own downloader into
7
+ * FASTEMBED_CACHE_DIR (a shared per-user dir). The SDK is imported lazily so the
8
+ * ONNX/tokenizers native bindings load only when fastembed is actually selected
9
+ * (mirroring the embedded LanceDB precedent).
10
+ */
11
+ import { logger } from '../../utils/structured-logger.js';
12
+ import { FASTEMBED_MODEL, FASTEMBED_CACHE_DIR } from '../../config.js';
13
+ import { setResolvedEmbeddingDimension } from './config.js';
14
+ import { auditProviderCall } from './provider-audit.js';
15
+ let fastEmbedModelPromise = null;
16
+ /**
17
+ * Initialise fastembed once, downloading the model on first use into
18
+ * FASTEMBED_CACHE_DIR. A failed init clears the memo so a transient first-run
19
+ * error (e.g. a network hiccup during download) can be retried on the next call.
20
+ */
21
+ async function getFastEmbedModel() {
22
+ if (fastEmbedModelPromise)
23
+ return fastEmbedModelPromise;
24
+ fastEmbedModelPromise = (async () => {
25
+ const fastembed = await import('fastembed');
26
+ return await fastembed.FlagEmbedding.init({
27
+ model: FASTEMBED_MODEL,
28
+ cacheDir: FASTEMBED_CACHE_DIR,
29
+ });
30
+ })().catch((err) => {
31
+ fastEmbedModelPromise = null;
32
+ throw err;
33
+ });
34
+ return fastEmbedModelPromise;
35
+ }
36
+ export async function postEmbeddingsFastEmbed(input) {
37
+ const inputArray = Array.isArray(input) ? input : [input];
38
+ const inputCharLength = inputArray.reduce((sum, value) => sum + value.length, 0);
39
+ const startedAt = Date.now();
40
+ try {
41
+ const model = await getFastEmbedModel();
42
+ const embeddings = [];
43
+ for await (const batch of model.embed(inputArray)) {
44
+ embeddings.push(...batch);
45
+ }
46
+ if (embeddings.length === 0 || !Array.isArray(embeddings[0])) {
47
+ throw new Error('fastembed returned no embeddings');
48
+ }
49
+ const dim = embeddings[0].length;
50
+ setResolvedEmbeddingDimension(dim);
51
+ auditProviderCall({
52
+ provider: 'fastembed',
53
+ model: FASTEMBED_MODEL,
54
+ status: 'success',
55
+ inputCount: inputArray.length,
56
+ inputCharLength,
57
+ outputDimension: dim,
58
+ latencyMs: Date.now() - startedAt
59
+ });
60
+ logger.debug(`[EmbeddingService] Received ${embeddings.length} embeddings (dim=${dim}) [provider=fastembed]`);
61
+ return embeddings;
62
+ }
63
+ catch (err) {
64
+ const errMsg = err instanceof Error ? err.message : String(err);
65
+ auditProviderCall({
66
+ provider: 'fastembed',
67
+ model: FASTEMBED_MODEL,
68
+ status: 'error',
69
+ inputCount: inputArray.length,
70
+ inputCharLength,
71
+ outputDimension: 0,
72
+ latencyMs: Date.now() - startedAt,
73
+ errorMessage: errMsg
74
+ });
75
+ throw err;
76
+ }
77
+ }
78
+ //# sourceMappingURL=fastembed-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastembed-provider.js","sourceRoot":"","sources":["../../../src/services/embedding/fastembed-provider.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/health.ts"],"names":[],"mappings":"AAuFA,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA6B9F"}
@@ -1,108 +1,111 @@
1
1
  import { logger } from '../../utils/structured-logger.js';
2
2
  import { EMBEDDING_PROVIDER, OPENAI_API_KEY, TEI_BASE_URL, TEI_MODEL, TEI_API_KEY } from '../../config.js';
3
3
  import { OPENAI_EMBEDDING_MODEL, TEI_EMBEDDING_ENDPOINT, setResolvedEmbeddingDimension } from './config.js';
4
- import { postEmbeddingsOpenAI, postEmbeddingsTEI } from './providers.js';
5
- export async function runEmbeddingHealthCheck() {
4
+ import { postEmbeddingsOpenAI, postEmbeddingsFastEmbed } from './providers.js';
5
+ async function openaiHealth() {
6
+ if (!OPENAI_API_KEY || !OPENAI_EMBEDDING_MODEL) {
7
+ return { healthy: false, message: 'OpenAI requires OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL' };
8
+ }
6
9
  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
- }
10
+ const res = await postEmbeddingsOpenAI('health check');
11
+ return { healthy: Array.isArray(res) && res.length > 0, message: 'openai embeddings operational' };
12
+ }
13
+ catch (err) {
14
+ const msg = err instanceof Error ? err.message : String(err);
15
+ if (msg.includes('429'))
16
+ return { healthy: true, message: 'openai is rate-limited (429) - reachable but throttled' };
17
+ if (msg.includes('401') || msg.toLowerCase().includes('authentication'))
18
+ return { healthy: false, message: 'openai authentication failed - check OPENAI_API_KEY' };
19
+ return { healthy: false, message: `openai health check failed: ${msg}` };
20
+ }
21
+ }
22
+ async function teiHealth() {
23
+ if (!TEI_BASE_URL || !TEI_MODEL) {
24
+ return { healthy: false, message: 'TEI requires TEI_BASE_URL and TEI_MODEL' };
25
+ }
26
+ try {
27
+ const url = TEI_EMBEDDING_ENDPOINT || TEI_BASE_URL;
28
+ const payload = { model: TEI_MODEL, input: ['health check'] };
29
+ const headers = { 'Content-Type': 'application/json' };
30
+ if (TEI_API_KEY)
31
+ headers['x-api-key'] = TEI_API_KEY;
32
+ const resp = await fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) });
33
+ let data = null;
34
+ try {
35
+ data = await resp.json();
24
36
  }
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
- }
37
+ catch (parseErr) {
38
+ logger.warn(`[EmbeddingService] TEI returned non-JSON response: ${String(parseErr)}`);
41
39
  }
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
- }
40
+ if (!resp.ok) {
41
+ if (resp.status === 401)
42
+ return { healthy: false, message: 'TEI authentication failed (401)' };
43
+ if (resp.status === 429)
44
+ return { healthy: true, message: 'TEI is rate-limited (429) - reachable but throttled' };
45
+ return { healthy: false, message: `TEI returned HTTP ${resp.status}` };
51
46
  }
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}` };
47
+ let embeddings = null;
48
+ if (Array.isArray(data?.embeddings)) {
49
+ embeddings = data.embeddings;
50
+ }
51
+ else if (Array.isArray(data?.data)) {
52
+ embeddings = data.data.map((d) => d?.embedding ?? d);
53
+ }
54
+ else if (Array.isArray(data?.result)) {
55
+ embeddings = data.result;
56
+ }
57
+ else if (Array.isArray(data)) {
58
+ embeddings = data;
59
+ }
60
+ if (Array.isArray(embeddings) && embeddings.length > 0 && Array.isArray(embeddings[0])) {
61
+ setResolvedEmbeddingDimension(embeddings[0].length);
62
+ return { healthy: true, message: 'TEI embeddings operational' };
63
+ }
64
+ return { healthy: false, message: 'TEI returned unexpected embedding shape or no embeddings' };
65
+ }
66
+ catch (err) {
67
+ const msg = err instanceof Error ? err.message : String(err);
68
+ return { healthy: false, message: `TEI health check error: ${msg}` };
69
+ }
70
+ }
71
+ async function fastEmbedHealth() {
72
+ try {
73
+ const res = await postEmbeddingsFastEmbed('health check');
74
+ return { healthy: Array.isArray(res) && res.length > 0, message: 'local fastembed operational' };
75
+ }
76
+ catch (err) {
77
+ const msg = err instanceof Error ? err.message : String(err);
78
+ return { healthy: false, message: `fastembed health check failed: ${msg}` };
79
+ }
80
+ }
81
+ export async function runEmbeddingHealthCheck() {
82
+ try {
83
+ const providerPref = EMBEDDING_PROVIDER;
84
+ // Explicit preference wins, mirroring postEmbeddings() selection.
85
+ if (providerPref === 'openai')
86
+ return await openaiHealth();
87
+ if (providerPref === 'tei')
88
+ return await teiHealth();
89
+ if (providerPref === 'fastembed')
90
+ return await fastEmbedHealth();
91
+ // Auto: prefer configured external providers; a configured-but-failing OpenAI
92
+ // is reported as-is (never masked by the fastembed fallback) to stay consistent
93
+ // with the runtime path, which does not silently fall back once OpenAI is set.
94
+ if (OPENAI_API_KEY && OPENAI_EMBEDDING_MODEL) {
95
+ const result = await openaiHealth();
96
+ if (result.healthy)
97
+ return result;
98
+ if (TEI_BASE_URL && TEI_MODEL) {
99
+ const tei = await teiHealth();
100
+ if (tei.healthy)
101
+ return tei;
103
102
  }
103
+ return result;
104
104
  }
105
- return { healthy: false, message: 'No embedding provider configured (set OPENAI_API_KEY+OPENAI_EMBEDDING_MODEL or TEI_BASE_URL+TEI_MODEL)' };
105
+ if (TEI_BASE_URL && TEI_MODEL)
106
+ return await teiHealth();
107
+ // No external provider configured -> local fastembed is the default.
108
+ return await fastEmbedHealth();
106
109
  }
107
110
  catch (err) {
108
111
  const msg = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/services/embedding/health.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/services/embedding/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type EmbeddingProviderName = 'openai' | 'tei' | 'fastembed';
2
+ export type AuditPayload = {
3
+ provider: EmbeddingProviderName;
4
+ model: string;
5
+ status: 'success' | 'error';
6
+ inputCount: number;
7
+ inputCharLength: number;
8
+ outputDimension: number;
9
+ latencyMs: number;
10
+ httpStatus?: number;
11
+ errorMessage?: string;
12
+ };
13
+ /** Emit one structured audit line describing a single embedding provider call. */
14
+ export declare function auditProviderCall(payload: AuditPayload): void;
15
+ //# sourceMappingURL=provider-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-audit.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/provider-audit.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,KAAK,GAAG,WAAW,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG;IACvB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAgB7D"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Structured audit logging shared by every embedding provider backend.
3
+ *
4
+ * Extracted from `providers.ts` so the HTTP (OpenAI/TEI) and local (fastembed)
5
+ * providers can emit an identical `audit.embedding` record without a circular
6
+ * import, and to keep each provider file under the ESLint max-lines budget.
7
+ */
8
+ import { structuredLogger } from '../../utils/structured-logger.js';
9
+ import { getRequestIdFromStorage, getTenantId } from '../../utils/tenant-context.js';
10
+ /** Emit one structured audit line describing a single embedding provider call. */
11
+ export function auditProviderCall(payload) {
12
+ structuredLogger.info({
13
+ category: 'audit.embedding',
14
+ stage: 'provider',
15
+ provider: payload.provider,
16
+ model: payload.model,
17
+ tenant_id: getTenantId(),
18
+ request_id: getRequestIdFromStorage(),
19
+ status: payload.status,
20
+ input_count: payload.inputCount,
21
+ input_char_length: payload.inputCharLength,
22
+ output_dimension: payload.outputDimension,
23
+ latency_ms: payload.latencyMs,
24
+ ...(payload.httpStatus !== undefined && { http_status: payload.httpStatus }),
25
+ ...(payload.errorMessage && { error_message: payload.errorMessage })
26
+ }, `Embedding provider ${payload.provider} ${payload.status}`);
27
+ }
28
+ //# sourceMappingURL=provider-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-audit.js","sourceRoot":"","sources":["../../../src/services/embedding/provider-audit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAgBrF,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,OAAqB;IACnD,gBAAgB,CAAC,IAAI,CAAC;QAClB,QAAQ,EAAE,iBAAiB;QAC3B,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,WAAW,EAAE;QACxB,UAAU,EAAE,uBAAuB,EAAE;QACrC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,UAAU;QAC/B,iBAAiB,EAAE,OAAO,CAAC,eAAe;QAC1C,gBAAgB,EAAE,OAAO,CAAC,eAAe;QACzC,UAAU,EAAE,OAAO,CAAC,SAAS;QAC7B,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5E,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;KACvE,EAAE,sBAAsB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACnE,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { postEmbeddingsFastEmbed } from './fastembed-provider.js';
1
2
  /** Typed error for provider rate limiting (429 exhausted or insufficient_quota). */
2
3
  export declare class EmbeddingRateLimitError extends Error {
3
4
  readonly provider: 'openai' | 'tei';
@@ -20,5 +21,5 @@ export declare function computeDeadline(): number;
20
21
  declare function postEmbeddingsOpenAI(input: string[] | string): Promise<number[][]>;
21
22
  declare function postEmbeddingsTEI(input: string[] | string): Promise<number[][]>;
22
23
  declare function postEmbeddings(input: string[] | string): Promise<number[][]>;
23
- export { postEmbeddings, postEmbeddingsOpenAI, postEmbeddingsTEI };
24
+ export { postEmbeddings, postEmbeddingsOpenAI, postEmbeddingsTEI, postEmbeddingsFastEmbed };
24
25
  //# sourceMappingURL=providers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/providers.ts"],"names":[],"mappings":"AAeA,oFAAoF;AACpF,qBAAa,uBAAwB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;gBACtB,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAO7F;AACD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAiBjE;AACD,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAIjG;AACD,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAQzF;AACD,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAI5D;AACD,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAmC;AAC9F,kDAAkD;AAClD,wBAAgB,eAAe,IAAI,MAAM,CAAmD;AAqC5F,iBAAe,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAkGjF;AACD,iBAAe,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CA2F9E;AACD,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":"AAIA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAWlE,oFAAoF;AACpF,qBAAa,uBAAwB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;gBACtB,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAO7F;AACD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAiBjE;AACD,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAIjG;AACD,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAQzF;AACD,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAI5D;AACD,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAmC;AAC9F,kDAAkD;AAClD,wBAAgB,eAAe,IAAI,MAAM,CAAmD;AAmB5F,iBAAe,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAkGjF;AACD,iBAAe,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CA2F9E;AACD,iBAAe,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAkC3E;AAUD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { logger } from '../../utils/structured-logger.js';
2
2
  import { OPENAI_API_KEY, EMBEDDING_PROVIDER, TEI_BASE_URL, TEI_MODEL, TEI_API_KEY, EMBEDDING_MAX_RETRIES, EMBEDDING_RETRY_BASE_DELAY_MS, EMBEDDING_RETRY_MAX_DELAY_MS, EMBEDDING_RETRY_AFTER_CAP_MS, EMBEDDING_RETRY_BUDGET_MS } 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';
4
+ import { auditProviderCall } from './provider-audit.js';
5
+ import { postEmbeddingsFastEmbed } from './fastembed-provider.js';
6
6
  function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); }
7
7
  const RETRIABLE_NETWORK_TOKENS = ['fetch failed', 'timed out', 'econnreset', 'econnrefused', 'enotfound', 'eai_again'];
8
8
  function isRetriableNetworkError(error) {
@@ -90,23 +90,6 @@ async function fetchWithRetries(url, init, provider, deadline) {
90
90
  }
91
91
  throw lastError instanceof Error ? lastError : new Error(String(lastError));
92
92
  }
93
- function auditProviderCall(payload) {
94
- structuredLogger.info({
95
- category: 'audit.embedding',
96
- stage: 'provider',
97
- provider: payload.provider,
98
- model: payload.model,
99
- tenant_id: getTenantId(),
100
- request_id: getRequestIdFromStorage(),
101
- status: payload.status,
102
- input_count: payload.inputCount,
103
- input_char_length: payload.inputCharLength,
104
- output_dimension: payload.outputDimension,
105
- latency_ms: payload.latencyMs,
106
- ...(payload.httpStatus !== undefined && { http_status: payload.httpStatus }),
107
- ...(payload.errorMessage && { error_message: payload.errorMessage })
108
- }, `Embedding provider ${payload.provider} ${payload.status}`);
109
- }
110
93
  async function postEmbeddingsOpenAI(input) {
111
94
  if (!OPENAI_API_KEY || !OPENAI_EMBEDDING_MODEL)
112
95
  throw new Error('OpenAI requires OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL to be configured');
@@ -298,7 +281,7 @@ async function postEmbeddingsTEI(input) {
298
281
  }
299
282
  async function postEmbeddings(input) {
300
283
  // Choose provider based on explicit ENV override or auto-discovery
301
- const providerPref = EMBEDDING_PROVIDER; // 'auto' | 'openai' | 'tei'
284
+ const providerPref = EMBEDDING_PROVIDER; // 'auto' | 'openai' | 'tei' | 'fastembed'
302
285
  if (providerPref === 'openai') {
303
286
  if (!OPENAI_API_KEY || !OPENAI_EMBEDDING_MODEL)
304
287
  throw new Error('OpenAI requires OPENAI_API_KEY and OPENAI_EMBEDDING_MODEL to be configured');
@@ -307,9 +290,14 @@ async function postEmbeddings(input) {
307
290
  if (providerPref === 'tei') {
308
291
  if (!TEI_BASE_URL || !TEI_MODEL)
309
292
  throw new Error('TEI requires TEI_BASE_URL and TEI_MODEL to be configured');
293
+ warnTeiDeprecated();
310
294
  return await postEmbeddingsTEI(input);
311
295
  }
312
- // Auto detection: prefer OpenAI if both OPENAI vars present, otherwise TEI
296
+ if (providerPref === 'fastembed') {
297
+ return await postEmbeddingsFastEmbed(input);
298
+ }
299
+ // Auto detection: prefer OpenAI if both OPENAI vars present, otherwise TEI,
300
+ // otherwise fall back to the local fastembed default (no key, no service).
313
301
  if (OPENAI_API_KEY && OPENAI_EMBEDDING_MODEL) {
314
302
  try {
315
303
  return await postEmbeddingsOpenAI(input);
@@ -317,15 +305,25 @@ async function postEmbeddings(input) {
317
305
  catch (err) {
318
306
  logger.warn('[EmbeddingService] OpenAI failed, attempting TEI fallback: ' + (err instanceof Error ? err.message : String(err)));
319
307
  if (TEI_BASE_URL && TEI_MODEL) {
308
+ warnTeiDeprecated();
320
309
  return await postEmbeddingsTEI(input);
321
310
  }
322
311
  throw err;
323
312
  }
324
313
  }
325
314
  if (TEI_BASE_URL && TEI_MODEL) {
315
+ warnTeiDeprecated();
326
316
  return await postEmbeddingsTEI(input);
327
317
  }
328
- throw new Error('No embedding provider configured (OPENAI_API_KEY+OPENAI_EMBEDDING_MODEL or TEI_BASE_URL+TEI_MODEL required)');
318
+ return await postEmbeddingsFastEmbed(input);
319
+ }
320
+ /** One-time (per process) TEI soft-deprecation notice. Removal is a later breaking change. */
321
+ let teiDeprecationWarned = false;
322
+ function warnTeiDeprecated() {
323
+ if (teiDeprecationWarned)
324
+ return;
325
+ teiDeprecationWarned = true;
326
+ logger.warn('[EmbeddingService] TEI provider is deprecated (issue #11) and will be removed in a future release. OpenAI/Ollama or the local fastembed default are the supported alternatives.');
329
327
  }
330
- export { postEmbeddings, postEmbeddingsOpenAI, postEmbeddingsTEI };
328
+ export { postEmbeddings, postEmbeddingsOpenAI, postEmbeddingsTEI, postEmbeddingsFastEmbed };
331
329
  //# sourceMappingURL=providers.js.map