agentic-qe 3.15.16 → 3.15.17

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 (415) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +78 -0
  3. package/assets/skills/skills-manifest.json +1 -1
  4. package/dist/cli/bundle.js +6 -6
  5. package/dist/cli/chunks/adapter-OMILP6KH.js +2 -0
  6. package/dist/cli/chunks/{agent-booster-wasm-45NWEKVS.js → agent-booster-wasm-6BUOFQZA.js} +2 -2
  7. package/dist/cli/chunks/{agent-handler-LVHMYFEF.js → agent-handler-HPDK3JI3.js} +2 -2
  8. package/dist/cli/chunks/{agent-memory-branch-YDWOJFEQ.js → agent-memory-branch-5QKUTWK5.js} +2 -2
  9. package/dist/cli/chunks/aqe-learning-engine-OXH5CCOS.js +2 -0
  10. package/dist/cli/chunks/{arena-CZKHXDDS.js → arena-7OKPMNHD.js} +2 -2
  11. package/dist/cli/chunks/{arena-ELDZH3CZ.js → arena-HZ35LESR.js} +4 -4
  12. package/dist/cli/chunks/{audit-5MT4T47Z.js → audit-XI575SVK.js} +3 -3
  13. package/dist/cli/chunks/base-MAK2BLTG.js +2 -0
  14. package/dist/cli/chunks/{better-sqlite3-6TGYPC2B.js → better-sqlite3-YO5X7ZJS.js} +2 -2
  15. package/dist/cli/chunks/{brain-handler-HQWZFO52.js → brain-handler-GCQZFZGQ.js} +3 -3
  16. package/dist/cli/chunks/{branch-enumerator-WVILM4SO.js → branch-enumerator-N6G44UU2.js} +2 -2
  17. package/dist/cli/chunks/{browser-RX5ALU3H.js → browser-EVKPTLOI.js} +2 -2
  18. package/dist/cli/chunks/browser-workflow-IR3VF2TL.js +2 -0
  19. package/dist/cli/chunks/{chunk-F742SZAX.js → chunk-2EQK7B5L.js} +2 -2
  20. package/dist/cli/chunks/{chunk-5NNNEWLS.js → chunk-2PCEMDIX.js} +67 -65
  21. package/dist/cli/chunks/{chunk-FBDVGRSC.js → chunk-2UUZCQSD.js} +7 -7
  22. package/dist/cli/chunks/{chunk-AG2EWGXS.js → chunk-2YWYW7NU.js} +2 -2
  23. package/dist/cli/chunks/{chunk-4LQFBY5L.js → chunk-45223KK6.js} +3 -3
  24. package/dist/cli/chunks/chunk-4EJLHNER.js +12 -0
  25. package/dist/cli/chunks/{chunk-KQYJ4VQ5.js → chunk-4L6WX5KC.js} +1 -1
  26. package/dist/cli/chunks/{chunk-KVF4NXGQ.js → chunk-4NKZU2JZ.js} +2 -2
  27. package/dist/cli/chunks/{chunk-YRAX7SFJ.js → chunk-4UKTIQDT.js} +2 -2
  28. package/dist/cli/chunks/{chunk-YTHTQPWR.js → chunk-4YM45Z5B.js} +1 -1
  29. package/dist/cli/chunks/{chunk-XIIQ5QTT.js → chunk-5FSPELOG.js} +2 -2
  30. package/dist/cli/chunks/{chunk-LKTTUHLF.js → chunk-5WATBVU6.js} +2 -2
  31. package/dist/cli/chunks/{chunk-SR52XP5F.js → chunk-5WYZVSL2.js} +1 -1
  32. package/dist/cli/chunks/{chunk-GQ6TUIKY.js → chunk-6LSZCEW2.js} +1 -1
  33. package/dist/cli/chunks/{chunk-NDJ7P2EP.js → chunk-6V6BD6PH.js} +1 -1
  34. package/dist/cli/chunks/{chunk-63GMRQ25.js → chunk-74MDUIAZ.js} +1 -1
  35. package/dist/cli/chunks/{chunk-4D4DENG6.js → chunk-776K4ZLE.js} +2 -2
  36. package/dist/cli/chunks/{chunk-ZJH5MU2I.js → chunk-7BSOO3CY.js} +2 -2
  37. package/dist/cli/chunks/{chunk-IOQ6ZQ5W.js → chunk-7SNSI4VY.js} +1 -1
  38. package/dist/cli/chunks/{chunk-LRSX2FJM.js → chunk-A4BVDYIL.js} +1 -1
  39. package/dist/cli/chunks/{chunk-SASBO5Y5.js → chunk-AGCS5GSO.js} +2 -2
  40. package/dist/cli/chunks/{chunk-GAHNO6JJ.js → chunk-AVHYJ3XP.js} +2 -2
  41. package/dist/cli/chunks/{chunk-CGGUM2YJ.js → chunk-BE7ZHM34.js} +2 -2
  42. package/dist/cli/chunks/{chunk-7TE5ONQQ.js → chunk-BHQ2DLJU.js} +1 -1
  43. package/dist/cli/chunks/{chunk-IESR7TNB.js → chunk-BKHEQIRZ.js} +2 -2
  44. package/dist/cli/chunks/{chunk-J4ELZNLY.js → chunk-BSIWI4ES.js} +2 -2
  45. package/dist/cli/chunks/{chunk-NVEWF4JV.js → chunk-C7QLLMYI.js} +1 -1
  46. package/dist/cli/chunks/{chunk-V5NHZV7S.js → chunk-CMN7PU2H.js} +2 -2
  47. package/dist/cli/chunks/{chunk-PPUZWYUG.js → chunk-COTQ44YO.js} +2 -2
  48. package/dist/cli/chunks/{chunk-5V3TI2LG.js → chunk-CQER6IJ5.js} +1 -1
  49. package/dist/cli/chunks/{chunk-SI6DPU5D.js → chunk-CVPXHDQU.js} +1 -1
  50. package/dist/cli/chunks/{chunk-6ZBXSOX6.js → chunk-CVYPMGUM.js} +2 -2
  51. package/dist/cli/chunks/{chunk-DXD6K2ZP.js → chunk-CXCMATZ6.js} +2 -2
  52. package/dist/cli/chunks/{chunk-PF7RBAYL.js → chunk-D75GLKEL.js} +2 -2
  53. package/dist/cli/chunks/chunk-DCDSN67A.js +2 -0
  54. package/dist/cli/chunks/{chunk-MAFQV4U4.js → chunk-DHKSPOUQ.js} +2 -2
  55. package/dist/cli/chunks/{chunk-RJIEG3NA.js → chunk-DJDVD6RM.js} +2 -2
  56. package/dist/cli/chunks/{chunk-GFWHUQSF.js → chunk-DNVRTJKB.js} +2 -2
  57. package/dist/cli/chunks/{chunk-G5RHFBAY.js → chunk-DS5IFRY6.js} +2 -2
  58. package/dist/cli/chunks/{chunk-BEKDKVQT.js → chunk-E7XIMOKW.js} +2 -2
  59. package/dist/cli/chunks/{chunk-5JZRZI4S.js → chunk-ECKHDHR2.js} +2 -2
  60. package/dist/cli/chunks/chunk-EPVPXHL7.js +2 -0
  61. package/dist/cli/chunks/{chunk-HVRRLYX6.js → chunk-ERYADKMZ.js} +2 -2
  62. package/dist/cli/chunks/{chunk-SUDMM5SO.js → chunk-EUWG2JG4.js} +2 -2
  63. package/dist/cli/chunks/{chunk-VSIKHWZ4.js → chunk-FAQ24UHB.js} +3 -3
  64. package/dist/cli/chunks/{chunk-YNMJEDN5.js → chunk-FBBPRVNF.js} +2 -2
  65. package/dist/cli/chunks/{chunk-72XSEQMW.js → chunk-FBSBXCZS.js} +2 -2
  66. package/dist/cli/chunks/{chunk-J7I6PABJ.js → chunk-G2X3OLMN.js} +2 -2
  67. package/dist/cli/chunks/{chunk-YU2BDRSD.js → chunk-GG7PMTHD.js} +1 -1
  68. package/dist/cli/chunks/{chunk-HLUXXCHF.js → chunk-GN6OE3JT.js} +1 -1
  69. package/dist/cli/chunks/{chunk-AGRV5B3T.js → chunk-GPPTRKEM.js} +2 -2
  70. package/dist/cli/chunks/{chunk-ZQ2XW3IP.js → chunk-H2LHWZRE.js} +2 -2
  71. package/dist/cli/chunks/{chunk-6DPYNAOK.js → chunk-HAQJFUAQ.js} +2 -2
  72. package/dist/cli/chunks/{chunk-SSUAAX3F.js → chunk-HD6W6PHV.js} +2 -2
  73. package/dist/cli/chunks/{chunk-L2DWPVNJ.js → chunk-HFZD5KLR.js} +1 -1
  74. package/dist/cli/chunks/{chunk-QVDCVD5D.js → chunk-HRUHHHVR.js} +2 -2
  75. package/dist/cli/chunks/{chunk-PINSJCM3.js → chunk-HVT7RMGV.js} +1 -1
  76. package/dist/cli/chunks/chunk-HWQPMUSN.js +2 -0
  77. package/dist/cli/chunks/{chunk-4NFQLP6R.js → chunk-HZ5O7G2P.js} +1 -1
  78. package/dist/cli/chunks/{chunk-C6D5AHBO.js → chunk-IHQGNDMX.js} +2 -2
  79. package/dist/cli/chunks/{chunk-QQWBWEJS.js → chunk-IJSROBM6.js} +3 -3
  80. package/dist/cli/chunks/{chunk-OCV2XEWQ.js → chunk-IJZFJPHS.js} +2 -2
  81. package/dist/cli/chunks/{chunk-N7HL5PHH.js → chunk-IKB3M7OF.js} +1 -1
  82. package/dist/cli/chunks/{chunk-24OX5TQJ.js → chunk-INI3Q4CN.js} +1 -1
  83. package/dist/cli/chunks/{chunk-SJ6Y4725.js → chunk-IOWEBPXJ.js} +2 -2
  84. package/dist/cli/chunks/{chunk-VXFLJNCA.js → chunk-IQL6XRF5.js} +2 -2
  85. package/dist/cli/chunks/{chunk-WP4RETKG.js → chunk-IRHXGCQR.js} +2 -2
  86. package/dist/cli/chunks/{chunk-63ZKI4PX.js → chunk-J3QFJI2Y.js} +2 -2
  87. package/dist/cli/chunks/{chunk-UHEOGZLX.js → chunk-J6QRNQJF.js} +5 -5
  88. package/dist/cli/chunks/{chunk-KNSRL6NO.js → chunk-J7Q5TXFZ.js} +2 -2
  89. package/dist/cli/chunks/{chunk-L6QSTQME.js → chunk-JHKKIJT2.js} +2 -2
  90. package/dist/cli/chunks/{chunk-VMDFFTCK.js → chunk-JI33PMPZ.js} +1 -1
  91. package/dist/cli/chunks/{chunk-E3D4GPLP.js → chunk-JRIJM4LE.js} +3 -3
  92. package/dist/cli/chunks/{chunk-XIQW7EFL.js → chunk-JVWZAE2H.js} +2 -2
  93. package/dist/cli/chunks/{chunk-YPBSUGMI.js → chunk-K7WAI662.js} +1 -1
  94. package/dist/cli/chunks/{chunk-RV74I3YO.js → chunk-KB34MTFZ.js} +2 -2
  95. package/dist/cli/chunks/{chunk-MI5MFHRA.js → chunk-KPIPVSIP.js} +2 -2
  96. package/dist/cli/chunks/{chunk-Y4PFUMOU.js → chunk-KR2TAAF6.js} +1 -1
  97. package/dist/cli/chunks/{chunk-W5HQUIML.js → chunk-KT2QCXO6.js} +2 -2
  98. package/dist/cli/chunks/{chunk-SSYAQZXA.js → chunk-KTORRIX3.js} +2 -2
  99. package/dist/cli/chunks/{chunk-CRPIYUTJ.js → chunk-LCWEQRZI.js} +2 -2
  100. package/dist/cli/chunks/{chunk-NO3IV5Q5.js → chunk-LG5PPJT7.js} +1 -1
  101. package/dist/cli/chunks/{chunk-5VZL4UVN.js → chunk-LIF6UWHV.js} +2 -2
  102. package/dist/cli/chunks/{chunk-32BPDLRZ.js → chunk-LN7NKE3N.js} +2 -2
  103. package/dist/cli/chunks/{chunk-ZB3LEFYG.js → chunk-LOLSZG5J.js} +2 -2
  104. package/dist/cli/chunks/{chunk-6XXZDV2C.js → chunk-LOMT4UC2.js} +2 -2
  105. package/dist/cli/chunks/{chunk-JDIYMZCQ.js → chunk-LRKLATSH.js} +2 -2
  106. package/dist/cli/chunks/{chunk-5SPCGMBB.js → chunk-LRY6UIRI.js} +2 -2
  107. package/dist/cli/chunks/{chunk-5PBLPQ5T.js → chunk-LV7UIK4Q.js} +2 -2
  108. package/dist/cli/chunks/{chunk-FDDC72IA.js → chunk-M2YI5YUR.js} +2 -2
  109. package/dist/cli/chunks/{chunk-D6COXLYE.js → chunk-MCXW3DKE.js} +2 -2
  110. package/dist/cli/chunks/{chunk-J442IZLE.js → chunk-MGZ6XZHU.js} +1 -1
  111. package/dist/cli/chunks/{chunk-TIUKLYAI.js → chunk-MLMD3I75.js} +1 -1
  112. package/dist/cli/chunks/{chunk-PHT5N7SC.js → chunk-MVVVGQJ6.js} +2 -2
  113. package/dist/cli/chunks/{chunk-525CFDUE.js → chunk-ND72UDVH.js} +2 -2
  114. package/dist/cli/chunks/{chunk-XWUWX7BV.js → chunk-NE3LRUNC.js} +4 -4
  115. package/dist/cli/chunks/{chunk-DTMAS2GB.js → chunk-NKUHMA4T.js} +2 -2
  116. package/dist/cli/chunks/{chunk-QPEOLAAS.js → chunk-NQFDJ6BT.js} +1 -1
  117. package/dist/cli/chunks/{chunk-MO55CVMT.js → chunk-NZJVDOUN.js} +14 -14
  118. package/dist/cli/chunks/{chunk-NZU4ACBZ.js → chunk-O7VJ3VKD.js} +2 -2
  119. package/dist/cli/chunks/{chunk-32GN3JKR.js → chunk-OJIUIEI4.js} +1 -1
  120. package/dist/cli/chunks/{chunk-UNGBRZDK.js → chunk-OO2M2QUV.js} +3 -3
  121. package/dist/cli/chunks/{chunk-CJSHWQXP.js → chunk-ORQ2YBRR.js} +2 -2
  122. package/dist/cli/chunks/chunk-OWIQR6N2.js +4 -0
  123. package/dist/cli/chunks/{chunk-NAEWCFQT.js → chunk-OWIZBZLN.js} +2 -2
  124. package/dist/cli/chunks/{chunk-24QHCVX6.js → chunk-P3D7SEHW.js} +1 -1
  125. package/dist/cli/chunks/{chunk-YLMNVLDK.js → chunk-P4OB6WDJ.js} +1 -1
  126. package/dist/cli/chunks/{chunk-PEQDY4BO.js → chunk-PCL5JRKN.js} +2 -2
  127. package/dist/cli/chunks/{chunk-IUBJVHNB.js → chunk-PIWGKGWP.js} +2 -2
  128. package/dist/cli/chunks/{chunk-GJYHWYXR.js → chunk-PK34KJH7.js} +2 -2
  129. package/dist/cli/chunks/{chunk-5B5QPCNU.js → chunk-POPSZDI2.js} +4 -4
  130. package/dist/cli/chunks/{chunk-HCH4Y6XX.js → chunk-Q6F3DYZN.js} +2 -2
  131. package/dist/cli/chunks/{chunk-SHKOCGNK.js → chunk-QJSSUBO3.js} +2 -2
  132. package/dist/cli/chunks/{chunk-DVYHMDFR.js → chunk-QN7HP2UW.js} +421 -418
  133. package/dist/cli/chunks/{chunk-ZFL436FN.js → chunk-QSQNXBD2.js} +2 -2
  134. package/dist/cli/chunks/{chunk-TVGI32MB.js → chunk-QTQDX4TZ.js} +3 -3
  135. package/dist/cli/chunks/{chunk-EK7OLYOZ.js → chunk-R3KBOQ3O.js} +2 -2
  136. package/dist/cli/chunks/{chunk-LE4QJREF.js → chunk-REY52O7J.js} +1 -1
  137. package/dist/cli/chunks/{chunk-LQLPB2T6.js → chunk-RKCN4B26.js} +2 -2
  138. package/dist/cli/chunks/{chunk-ZR2TKVXQ.js → chunk-S3DT5TPR.js} +2 -2
  139. package/dist/cli/chunks/{chunk-6ICX3FEG.js → chunk-S3TBOKAZ.js} +22 -22
  140. package/dist/cli/chunks/{chunk-JHQCRRJI.js → chunk-SAEECT23.js} +2 -2
  141. package/dist/cli/chunks/{chunk-VWPM27GU.js → chunk-SAZ4PJBR.js} +2 -2
  142. package/dist/cli/chunks/{chunk-KPRCB5LT.js → chunk-SFITYZLV.js} +2 -2
  143. package/dist/cli/chunks/{chunk-5LAVKGLH.js → chunk-SRBCBVSI.js} +2 -2
  144. package/dist/cli/chunks/{chunk-O5W3FIO6.js → chunk-SUAZ5Z47.js} +2 -2
  145. package/dist/cli/chunks/{chunk-KU2AUFGX.js → chunk-TDZ6N43D.js} +2 -2
  146. package/dist/cli/chunks/{chunk-YAPLJR7K.js → chunk-TIVKDIF7.js} +2 -2
  147. package/dist/cli/chunks/{chunk-U2A7NHZA.js → chunk-TM75GAXG.js} +2 -2
  148. package/dist/cli/chunks/{chunk-A5GBXCP5.js → chunk-TWBZONKT.js} +2 -2
  149. package/dist/cli/chunks/{chunk-I7MQIM2U.js → chunk-U4S74IIZ.js} +1 -1
  150. package/dist/cli/chunks/{chunk-3HD7E6HN.js → chunk-U5SMBJ6F.js} +2 -2
  151. package/dist/cli/chunks/{chunk-JQ3DYUMS.js → chunk-UHJVZEQA.js} +2 -2
  152. package/dist/cli/chunks/{chunk-C5FP5GW3.js → chunk-UOVCTK5L.js} +2 -2
  153. package/dist/cli/chunks/{chunk-HJ6ZGVTB.js → chunk-VDEKVIP5.js} +2 -2
  154. package/dist/cli/chunks/{chunk-KXCLACFG.js → chunk-VITV7AEC.js} +2 -2
  155. package/dist/cli/chunks/{chunk-P3EYRILV.js → chunk-VKREKVFI.js} +2 -2
  156. package/dist/cli/chunks/{chunk-2H4XH6FT.js → chunk-VLTDW7XJ.js} +2 -2
  157. package/dist/cli/chunks/{chunk-MD43XRX5.js → chunk-VQFV2IPV.js} +1 -1
  158. package/dist/cli/chunks/{chunk-67Z5R7RJ.js → chunk-VYPVU3JF.js} +2 -2
  159. package/dist/cli/chunks/{chunk-SDLWKRVL.js → chunk-WAOEQA3W.js} +2 -2
  160. package/dist/cli/chunks/{chunk-IOYG4VFL.js → chunk-WBDWHHKP.js} +2 -2
  161. package/dist/cli/chunks/{chunk-ASEOFRIG.js → chunk-WX4PO65Q.js} +2 -2
  162. package/dist/cli/chunks/chunk-X2DWHGCC.js +6 -0
  163. package/dist/cli/chunks/{chunk-CEYSYSK5.js → chunk-X5QD76IU.js} +2 -2
  164. package/dist/cli/chunks/{chunk-GSKMOPL7.js → chunk-XBTGEYED.js} +2 -2
  165. package/dist/cli/chunks/{chunk-FL64OUBA.js → chunk-XEMCHGAJ.js} +2 -2
  166. package/dist/cli/chunks/{chunk-2YZ4G6NW.js → chunk-XEYFZLIT.js} +1 -1
  167. package/dist/cli/chunks/{chunk-EA4YQVKS.js → chunk-XFTX3KLE.js} +1 -1
  168. package/dist/cli/chunks/{chunk-HGWXF45W.js → chunk-XPTCQKVE.js} +1 -1
  169. package/dist/cli/chunks/{chunk-CAKMOVZ6.js → chunk-YAJOBZE5.js} +2 -2
  170. package/dist/cli/chunks/{chunk-NQXXI77K.js → chunk-YCVLKU6H.js} +2 -2
  171. package/dist/cli/chunks/{chunk-AR67RJPY.js → chunk-YD2C6EPN.js} +2 -2
  172. package/dist/cli/chunks/{chunk-S75SOOZL.js → chunk-YKRLUTK7.js} +2 -2
  173. package/dist/cli/chunks/{chunk-IOKYCMTJ.js → chunk-YMUY3TES.js} +2 -2
  174. package/dist/cli/chunks/{chunk-5QO3R3TU.js → chunk-YR5QBUHZ.js} +2 -2
  175. package/dist/cli/chunks/{chunk-AJMJNQMP.js → chunk-Z7SKUC6P.js} +1 -1
  176. package/dist/cli/chunks/{chunk-KITOPKRG.js → chunk-ZAQMRFBB.js} +2 -2
  177. package/dist/cli/chunks/{chunk-AAMLQ2LF.js → chunk-ZC3KDNJW.js} +3 -3
  178. package/dist/cli/chunks/{chunk-VJCIEHEF.js → chunk-ZGV7L4MW.js} +1 -1
  179. package/dist/cli/chunks/{chunk-BY5OF7OH.js → chunk-ZN35XSKF.js} +2 -2
  180. package/dist/cli/chunks/{chunk-KKU2QGSJ.js → chunk-ZNXM6WVL.js} +2 -2
  181. package/dist/cli/chunks/{chunk-FLNAW7C4.js → chunk-ZP5AWQRO.js} +2 -2
  182. package/dist/cli/chunks/{chunk-IHRXZZQM.js → chunk-ZTP3DQ5M.js} +1 -1
  183. package/dist/cli/chunks/{chunk-OAEE6JWQ.js → chunk-ZVMSSCTH.js} +2 -2
  184. package/dist/cli/chunks/{chunk-M7WJCTG3.js → chunk-ZWUF27P4.js} +2 -2
  185. package/dist/cli/chunks/{ci-MFUR4CWV.js → ci-3RTTTS2D.js} +2 -2
  186. package/dist/cli/chunks/{ci-config-PNDLQ6XV.js → ci-config-XRUR3I4K.js} +2 -2
  187. package/dist/cli/chunks/{ci-output-PFZ4M7NC.js → ci-output-E5IAMU2U.js} +2 -2
  188. package/dist/cli/chunks/{circuit-breaker-5HH6NLZN.js → circuit-breaker-SHR2P44P.js} +2 -2
  189. package/dist/cli/chunks/{claude-flow-setup-QCKYLGLC.js → claude-flow-setup-ZDDILFMF.js} +2 -2
  190. package/dist/cli/chunks/client-NO5FOWT4.js +2 -0
  191. package/dist/cli/chunks/{cline-installer-EASVPFXR.js → cline-installer-BGYVUM6G.js} +2 -2
  192. package/dist/cli/chunks/{code-UJXDVYRK.js → code-PJ4MC3MC.js} +3 -3
  193. package/dist/cli/chunks/{code-index-extractor-BZJ3UDP4.js → code-index-extractor-IW2P22YG.js} +2 -2
  194. package/dist/cli/chunks/{codex-installer-XSQZUVOZ.js → codex-installer-A7WZ6OGL.js} +2 -2
  195. package/dist/cli/chunks/{completions-OWOOJFI2.js → completions-KS23WD5J.js} +2 -2
  196. package/dist/cli/chunks/{complexity-analyzer-KP5TOHDT.js → complexity-analyzer-Q7GLSR2E.js} +2 -2
  197. package/dist/cli/chunks/{continuedev-installer-IFKQXLHM.js → continuedev-installer-SK55BFW2.js} +2 -2
  198. package/dist/cli/chunks/copilot-installer-3N5J3WTM.js +3 -0
  199. package/dist/cli/chunks/core-handlers-JNAZPXE2.js +2 -0
  200. package/dist/cli/chunks/{cost-tracker-MMDDNKZB.js → cost-tracker-NENVSO4A.js} +2 -2
  201. package/dist/cli/chunks/{coverage-LUH2B7NT.js → coverage-5L7UQWDH.js} +3 -3
  202. package/dist/cli/chunks/cross-domain-router-HEBM767Z.js +2 -0
  203. package/dist/cli/chunks/{cursor-installer-4YLM5GWM.js → cursor-installer-XXBO2ZE6.js} +2 -2
  204. package/dist/cli/chunks/{daemon-MZKVM4CJ.js → daemon-CDCQU3LR.js} +3 -3
  205. package/dist/cli/chunks/{daemon-CAVZ7OFV.js → daemon-JEBJGEUK.js} +4 -4
  206. package/dist/cli/chunks/{dag-attention-scheduler-X4CYW665.js → dag-attention-scheduler-HOMMF7FA.js} +2 -2
  207. package/dist/cli/chunks/{detect-7BM2XINO.js → detect-FXCOUG6X.js} +2 -2
  208. package/dist/cli/chunks/{dist-node-Y5APLEYB.js → dist-node-GXQ7FMTY.js} +2 -2
  209. package/dist/cli/chunks/{domain-handler-X3ZRJNAH.js → domain-handler-TI3JBAPC.js} +2 -2
  210. package/dist/cli/chunks/{domain-plugins-2UW5KQJB.js → domain-plugins-R7LTUM32.js} +2 -2
  211. package/dist/cli/chunks/{domain-transfer-35W4CIBV.js → domain-transfer-LBIAFHIQ.js} +2 -2
  212. package/dist/cli/chunks/dream-GQDCEJMS.js +2 -0
  213. package/dist/cli/chunks/embed-and-insert-pattern-33KLHDD5.js +3 -0
  214. package/dist/cli/chunks/{embedding-space-SBM2MZD2.js → embedding-space-HHLWTBF5.js} +2 -2
  215. package/dist/cli/chunks/{eval-4QA2SROK.js → eval-KDOZMAXJ.js} +2 -2
  216. package/dist/cli/chunks/{experience-capture-middleware-Z6BF6KYM.js → experience-capture-middleware-X45PECQN.js} +3 -3
  217. package/dist/cli/chunks/{fast-paths-FIORX6GN.js → fast-paths-462V6UUB.js} +2 -2
  218. package/dist/cli/chunks/{feature-flags-ZOO7LMIC.js → feature-flags-G66OT3AS.js} +2 -2
  219. package/dist/cli/chunks/{feature-flags-6LYI2T4G.js → feature-flags-NIRQ4YDM.js} +2 -2
  220. package/dist/cli/chunks/file-discovery-33USPLB5.js +2 -0
  221. package/dist/cli/chunks/{fleet-7WF53H4F.js → fleet-PXWGB7CU.js} +3 -3
  222. package/dist/cli/chunks/{gnn-wrapper-KJ6B7BRM.js → gnn-wrapper-7MUW3M5M.js} +2 -2
  223. package/dist/cli/chunks/{heartbeat-handler-DEKKMOVW.js → heartbeat-handler-5237PB35.js} +4 -4
  224. package/dist/cli/chunks/heartbeat-scheduler-LIXLC5IH.js +2 -0
  225. package/dist/cli/chunks/hnsw-adapter-62D5UH27.js +2 -0
  226. package/dist/cli/chunks/hnsw-index-GSGUMQQC.js +2 -0
  227. package/dist/cli/chunks/{hnsw-legacy-bridge-L27WS27N.js → hnsw-legacy-bridge-OSQPW7JP.js} +2 -2
  228. package/dist/cli/chunks/{hnswlib-node-4YOQC6L4.js → hnswlib-node-GX6WG2GB.js} +2 -2
  229. package/dist/cli/chunks/{hooks-TAOKV4EJ.js → hooks-GUWHL7VC.js} +10 -10
  230. package/dist/cli/chunks/hybrid-backend-FRWP4BOY.js +2 -0
  231. package/dist/cli/chunks/{hypergraph-engine-BODRJLHL.js → hypergraph-engine-SRWLLCU3.js} +2 -2
  232. package/dist/cli/chunks/{hypergraph-handler-RKMYJNTU.js → hypergraph-handler-AVOPRHHO.js} +3 -3
  233. package/dist/cli/chunks/impact-analyzer-7KF3AQXV.js +2 -0
  234. package/dist/cli/chunks/{init-guard-MXHSLSB2.js → init-guard-P4N6EVZS.js} +2 -2
  235. package/dist/cli/chunks/{init-handler-HUE57IFW.js → init-handler-LRGWOJMD.js} +6 -6
  236. package/dist/cli/chunks/init-wizard-XWWAXY25.js +2 -0
  237. package/dist/cli/chunks/kernel-ZEJPNDBW.js +2 -0
  238. package/dist/cli/chunks/{kilocode-installer-S333IKYQ.js → kilocode-installer-7R2EPOQ6.js} +2 -2
  239. package/dist/cli/chunks/{kiro-installer-WM5DLQWC.js → kiro-installer-QNM7DPOB.js} +2 -2
  240. package/dist/cli/chunks/knowledge-graph-RRZQS7KY.js +2 -0
  241. package/dist/cli/chunks/{learning-LNHMQLH5.js → learning-7OIZBPXZ.js} +3 -3
  242. package/dist/cli/chunks/{llm-router-EWFXYZZR.js → llm-router-SIDXES23.js} +4 -4
  243. package/dist/cli/chunks/llm-router-service-3OSW67LC.js +2 -0
  244. package/dist/cli/chunks/{load-FGYGWVDK.js → load-EI2E2C3S.js} +2 -2
  245. package/dist/cli/chunks/load-test-7TRIH2WJ.js +2 -0
  246. package/dist/cli/chunks/{mcp-2FHNAAOM.js → mcp-IOE5WOCS.js} +2 -2
  247. package/dist/cli/chunks/{memory-DZMQ73AB.js → memory-DLYGJAP7.js} +5 -5
  248. package/dist/cli/chunks/memory-backend-G7ZW6Q2B.js +2 -0
  249. package/dist/cli/chunks/memory-handlers-TPF3KCO5.js +2 -0
  250. package/dist/cli/chunks/{multi-model-executor-6F2UAEUW.js → multi-model-executor-WHH4YCHM.js} +2 -2
  251. package/dist/cli/chunks/{opencode-installer-XY3BGOTZ.js → opencode-installer-63FDZAMS.js} +2 -2
  252. package/dist/cli/chunks/{orchestrator-B4CNKUOS.js → orchestrator-3LA776KK.js} +5 -5
  253. package/dist/cli/chunks/pattern-null-store-OU3ZC3NR.js +2 -0
  254. package/dist/cli/chunks/{pattern-usage-recorder-R4GUFNMD.js → pattern-usage-recorder-NW54QUGI.js} +2 -2
  255. package/dist/cli/chunks/{pipeline-FG5RKVRO.js → pipeline-P3TYX6J6.js} +2 -2
  256. package/dist/cli/chunks/{platform-3BT4KEVJ.js → platform-FNA2WLI6.js} +2 -2
  257. package/dist/cli/chunks/{plugin-WI4RIN7O.js → plugin-NJS7BC2S.js} +2 -2
  258. package/dist/cli/chunks/{prime-radiant-advanced-wasm-7ECDNQFS.js → prime-radiant-advanced-wasm-NIAVL2OT.js} +2 -2
  259. package/dist/cli/chunks/project-root-GMOFJEKD.js +2 -0
  260. package/dist/cli/chunks/protocol-executor-AD345XRO.js +2 -0
  261. package/dist/cli/chunks/{protocol-handler-WNODKPGW.js → protocol-handler-JU5C4JHY.js} +2 -2
  262. package/dist/cli/chunks/{prove-5RHAEPYZ.js → prove-35VOSLYP.js} +2 -2
  263. package/dist/cli/chunks/qe-reasoning-bank-NLTP26RC.js +2 -0
  264. package/dist/cli/chunks/{quality-WPHR7BGQ.js → quality-ET74X7HN.js} +2 -2
  265. package/dist/cli/chunks/{quality-gate-4RKTEZMX.js → quality-gate-FEDQISNB.js} +3 -3
  266. package/dist/cli/chunks/queen-coordinator-2TB4FWS6.js +2 -0
  267. package/dist/cli/chunks/real-embeddings-II6CXTCI.js +2 -0
  268. package/dist/cli/chunks/{ref-validation-TPAWHOHH.js → ref-validation-DTBPYCEB.js} +2 -2
  269. package/dist/cli/chunks/{roocode-installer-7AVHFNDI.js → roocode-installer-LYQEMR4J.js} +2 -2
  270. package/dist/cli/chunks/router-PLM3MWME.js +2 -0
  271. package/dist/cli/chunks/routing-feedback-I7VOX2HU.js +2 -0
  272. package/dist/cli/chunks/{routing-handler-YKEDVJSH.js → routing-handler-DJOJFPII.js} +2 -2
  273. package/dist/cli/chunks/{ruvector-commands-JUAMM354.js → ruvector-commands-VXYGJDPW.js} +2 -2
  274. package/dist/cli/chunks/rvf-dual-writer-GQZHFWO2.js +2 -0
  275. package/dist/cli/chunks/rvf-migration-adapter-3TVKBCAM.js +2 -0
  276. package/dist/cli/chunks/rvf-migration-coordinator-XUHKLMT6.js +2 -0
  277. package/dist/cli/chunks/rvf-native-adapter-5GUTYOWS.js +2 -0
  278. package/dist/cli/chunks/{rvf-store-integrity-VJDUIRTX.js → rvf-store-integrity-GA2ZYOEG.js} +2 -2
  279. package/dist/cli/chunks/safe-db-RZPQGLGQ.js +2 -0
  280. package/dist/cli/chunks/schedule-G7JMQDUX.js +2 -0
  281. package/dist/cli/chunks/scheduler-4SEGPCKD.js +2 -0
  282. package/dist/cli/chunks/{security-ORDN3RD2.js → security-MM6YOECX.js} +3 -3
  283. package/dist/cli/chunks/{shared-rvf-adapter-CF4BCIO7.js → shared-rvf-adapter-6AHPA3V5.js} +2 -2
  284. package/dist/cli/chunks/{shared-rvf-dual-writer-C32UBR6D.js → shared-rvf-dual-writer-EYAVY2GZ.js} +2 -2
  285. package/dist/cli/chunks/sqlite-persistence-IVE4SQXR.js +2 -0
  286. package/dist/cli/chunks/{standalone-memory-OXRJYZXN.js → standalone-memory-A3PLB4CZ.js} +2 -2
  287. package/dist/cli/chunks/{status-handler-BCX5D4HY.js → status-handler-OSSFAP4Z.js} +2 -2
  288. package/dist/cli/chunks/{structural-health-LFG7RUU6.js → structural-health-PGY5XUNO.js} +2 -2
  289. package/dist/cli/chunks/{sync-YJEE2K2L.js → sync-CWEHYGNN.js} +2 -2
  290. package/dist/cli/chunks/sync-PM6D7EQF.js +2 -0
  291. package/dist/cli/chunks/{task-handler-6LXKPTXJ.js → task-handler-LHMQ75W4.js} +2 -2
  292. package/dist/cli/chunks/{task-handlers-CILP36I7.js → task-handlers-S2TX5FTR.js} +3 -3
  293. package/dist/cli/chunks/test-4EGZZ6NJ.js +34 -0
  294. package/dist/cli/chunks/test-runner-process-72YACW6M.js +2 -0
  295. package/dist/cli/chunks/{test-scheduling-ISI2O4Q5.js → test-scheduling-YJQHH3XE.js} +3 -3
  296. package/dist/cli/chunks/{token-bootstrap-VUELSBOS.js → token-bootstrap-DJNETMVW.js} +2 -2
  297. package/dist/cli/chunks/{token-usage-XOC5KG7S.js → token-usage-WPNOJR6H.js} +2 -2
  298. package/dist/cli/chunks/{transformers-LSLQAARK.js → transformers-4MRPXCPU.js} +2 -2
  299. package/dist/cli/chunks/tree-sitter-wasm-parser-UVWSDXFR.js +2 -0
  300. package/dist/cli/chunks/{types-5BLCGLCR.js → types-6P5FB4EB.js} +2 -2
  301. package/dist/cli/chunks/unified-memory-2VMGSGQL.js +2 -0
  302. package/dist/cli/chunks/unified-memory-hnsw-3KULVD3N.js +2 -0
  303. package/dist/cli/chunks/unified-persistence-QCSLU2SV.js +2 -0
  304. package/dist/cli/chunks/{upgrade-RQJYLK3J.js → upgrade-4ICTN63Y.js} +2 -2
  305. package/dist/cli/chunks/{validate-QBHWXXCK.js → validate-HQF5GZ7L.js} +2 -2
  306. package/dist/cli/chunks/{validate-swarm-IKXBKFB5.js → validate-swarm-45JYG7VW.js} +2 -2
  307. package/dist/cli/chunks/visual-security-ZYP2KPH7.js +2 -0
  308. package/dist/cli/chunks/{web-tree-sitter-ZF6FIE5R.js → web-tree-sitter-UOTWZLNH.js} +2 -2
  309. package/dist/cli/chunks/{windsurf-installer-HQGDZT5D.js → windsurf-installer-WDWSBXGN.js} +2 -2
  310. package/dist/cli/chunks/witness-chain-5QRT7EMX.js +2 -0
  311. package/dist/cli/chunks/{witness-chain-DCHCAMSQ.js → witness-chain-DOYMNPC7.js} +2 -2
  312. package/dist/cli/chunks/{witness-chain-repair-PUX2NFDL.js → witness-chain-repair-CUF2AFQB.js} +2 -2
  313. package/dist/cli/chunks/{witness-chain-verifier-PX2OQ6XT.js → witness-chain-verifier-JB42X62J.js} +2 -2
  314. package/dist/cli/chunks/{witness-key-manager-RXYQNFJB.js → witness-key-manager-LXXO6L2G.js} +2 -2
  315. package/dist/cli/chunks/{workflow-FBKCA4H6.js → workflow-6ARK47NF.js} +4 -4
  316. package/dist/cli/chunks/workflow-orchestrator-RYDDWIXN.js +2 -0
  317. package/dist/cli/chunks/{wrappers-TWSKBTWD.js → wrappers-CYQBOMPL.js} +2 -2
  318. package/dist/cli/commands/test.js +26 -4
  319. package/dist/coordination/handlers/test-execution-handlers.js +64 -20
  320. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -3
  321. package/dist/domains/code-intelligence/services/semantic-analyzer.js +39 -25
  322. package/dist/domains/code-intelligence/services/text-relevance.d.ts +32 -0
  323. package/dist/domains/code-intelligence/services/text-relevance.js +63 -0
  324. package/dist/domains/test-execution/coordinator.d.ts +3 -1
  325. package/dist/domains/test-execution/coordinator.js +13 -4
  326. package/dist/domains/test-execution/interfaces.d.ts +5 -0
  327. package/dist/domains/test-execution/plugin.js +2 -0
  328. package/dist/domains/test-execution/services/flaky-detector.d.ts +9 -1
  329. package/dist/domains/test-execution/services/flaky-detector.js +26 -8
  330. package/dist/domains/test-execution/services/retry-handler.d.ts +7 -1
  331. package/dist/domains/test-execution/services/retry-handler.js +44 -5
  332. package/dist/domains/test-execution/services/runner-test-cases.d.ts +2 -0
  333. package/dist/domains/test-execution/services/runner-test-cases.js +7 -3
  334. package/dist/domains/test-execution/services/test-executor.d.ts +5 -1
  335. package/dist/domains/test-execution/services/test-executor.js +79 -15
  336. package/dist/init/copilot-installer.d.ts +6 -0
  337. package/dist/init/copilot-installer.js +37 -17
  338. package/dist/init/platform-config-generator.d.ts +10 -0
  339. package/dist/init/platform-config-generator.js +26 -1
  340. package/dist/kernel/unified-memory.d.ts +8 -0
  341. package/dist/kernel/unified-memory.js +13 -0
  342. package/dist/learning/embedder-endpoint-client.d.ts +45 -0
  343. package/dist/learning/embedder-endpoint-client.js +98 -3
  344. package/dist/learning/embedding-space-registry.d.ts +75 -0
  345. package/dist/learning/embedding-space-registry.js +142 -0
  346. package/dist/learning/real-embeddings.d.ts +3 -0
  347. package/dist/learning/real-embeddings.js +49 -11
  348. package/dist/mcp/bundle.js +564 -555
  349. package/dist/mcp/protocol-server.js +1 -1
  350. package/dist/shared/embeddings/index.d.ts +2 -2
  351. package/dist/shared/embeddings/index.js +1 -1
  352. package/dist/shared/embeddings/nomic-embedder.d.ts +8 -2
  353. package/dist/shared/embeddings/nomic-embedder.js +19 -11
  354. package/dist/shared/embeddings/ollama-client.d.ts +28 -2
  355. package/dist/shared/embeddings/ollama-client.js +84 -22
  356. package/dist/shared/embeddings/types.d.ts +15 -0
  357. package/dist/shared/embeddings/types.js +4 -0
  358. package/dist/shared/pytest-junit-report.d.ts +93 -0
  359. package/dist/shared/pytest-junit-report.js +241 -0
  360. package/dist/shared/test-runner-project.d.ts +51 -1
  361. package/dist/shared/test-runner-project.js +140 -25
  362. package/package.json +1 -1
  363. package/dist/cli/chunks/adapter-6CQ2PIP5.js +0 -2
  364. package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +0 -2
  365. package/dist/cli/chunks/base-SMCMMVGP.js +0 -2
  366. package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +0 -2
  367. package/dist/cli/chunks/chunk-EGYE5UPQ.js +0 -2
  368. package/dist/cli/chunks/chunk-KL7OKSU2.js +0 -4
  369. package/dist/cli/chunks/chunk-M4FRQ4TE.js +0 -12
  370. package/dist/cli/chunks/chunk-UE5ZOZR2.js +0 -2
  371. package/dist/cli/chunks/client-MHQRTZM4.js +0 -2
  372. package/dist/cli/chunks/copilot-installer-IGJ6KGQY.js +0 -3
  373. package/dist/cli/chunks/core-handlers-UAK3LLJE.js +0 -2
  374. package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +0 -2
  375. package/dist/cli/chunks/dream-EJY24JN6.js +0 -2
  376. package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +0 -3
  377. package/dist/cli/chunks/file-discovery-UZSFSS4V.js +0 -2
  378. package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +0 -2
  379. package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +0 -2
  380. package/dist/cli/chunks/hnsw-index-POCPMVJH.js +0 -2
  381. package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +0 -2
  382. package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +0 -2
  383. package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +0 -2
  384. package/dist/cli/chunks/kernel-CCDWT7KS.js +0 -2
  385. package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +0 -2
  386. package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +0 -2
  387. package/dist/cli/chunks/load-test-UNZUWY3F.js +0 -2
  388. package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +0 -2
  389. package/dist/cli/chunks/memory-handlers-MP426XRJ.js +0 -2
  390. package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +0 -2
  391. package/dist/cli/chunks/project-root-BEANNYWU.js +0 -2
  392. package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +0 -2
  393. package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +0 -2
  394. package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +0 -2
  395. package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +0 -2
  396. package/dist/cli/chunks/router-EP34O3KB.js +0 -2
  397. package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +0 -2
  398. package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +0 -2
  399. package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +0 -2
  400. package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +0 -2
  401. package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +0 -2
  402. package/dist/cli/chunks/safe-db-TCAU4FUT.js +0 -2
  403. package/dist/cli/chunks/schedule-NB5KV435.js +0 -2
  404. package/dist/cli/chunks/scheduler-JKXGKVK6.js +0 -2
  405. package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +0 -2
  406. package/dist/cli/chunks/sync-OSF7C2NL.js +0 -2
  407. package/dist/cli/chunks/test-SD457QJ6.js +0 -34
  408. package/dist/cli/chunks/test-runner-process-VKD65QQU.js +0 -2
  409. package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +0 -2
  410. package/dist/cli/chunks/unified-memory-GI76TXFV.js +0 -2
  411. package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +0 -2
  412. package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +0 -2
  413. package/dist/cli/chunks/visual-security-GZ2MOKWB.js +0 -2
  414. package/dist/cli/chunks/witness-chain-P3XXXA62.js +0 -2
  415. package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +0 -2
@@ -15,6 +15,8 @@
15
15
  * - Bearer auth from env only; URL userinfo stripped + warned on construct.
16
16
  * - Probe + identity fingerprint required before `embed()`; breaker recovery
17
17
  * invalidates identity so re-probe runs against a fresh endpoint.
18
+ * - The first identity is bound for the client's lifetime: a re-probe that
19
+ * finds another model is refused, never adopted (#1282).
18
20
  * - True TCP connect timeout via socket-level setTimeout (not req.setTimeout).
19
21
  * - TLS knobs (ca / cert / key / rejectUnauthorized / servername) for self-hosted.
20
22
  */
@@ -22,7 +24,8 @@ import * as http from 'node:http';
22
24
  import * as https from 'node:https';
23
25
  import { createHash } from 'node:crypto';
24
26
  import { URL } from 'node:url';
25
- import { normalize as l2Normalize } from '../shared/utils/vector-math.js';
27
+ import { cosineSimilarity, normalize as l2Normalize } from '../shared/utils/vector-math.js';
28
+ import { EMBEDDING_ROUND_TRIP_MIN_COSINE } from './embedding-space.js';
26
29
  const DEFAULT_OPTIONS = {
27
30
  model: 'Xenova/all-MiniLM-L6-v2',
28
31
  expectedDim: 384,
@@ -31,7 +34,9 @@ const DEFAULT_OPTIONS = {
31
34
  failureThreshold: 3,
32
35
  failureWindowMs: 60_000,
33
36
  };
34
- const CANARY_TEXT = 'AQE embedder endpoint identity canary v1';
37
+ /** The text every probe embeds; its vector is the endpoint's identity evidence. */
38
+ export const ENDPOINT_IDENTITY_CANARY = 'AQE embedder endpoint identity canary v1';
39
+ const CANARY_TEXT = ENDPOINT_IDENTITY_CANARY;
35
40
  const EMBEDDINGS_PATH = '/v1/embeddings';
36
41
  /**
37
42
  * Strip user:password@ from a URL for safe logging.
@@ -97,6 +102,25 @@ export class EmbedderEndpointTimeoutError extends Error {
97
102
  this.name = 'EmbedderEndpointTimeoutError';
98
103
  }
99
104
  }
105
+ /**
106
+ * #1282: a probe found a different endpoint identity than the one the client
107
+ * bound to. Vectors from the new identity are not comparable with stored ones,
108
+ * so the client refuses to embed until the endpoint serves the bound identity
109
+ * again or the process restarts.
110
+ */
111
+ export class EmbedderEndpointIdentityChangedError extends Error {
112
+ bound;
113
+ current;
114
+ constructor(bound, current) {
115
+ super(`[EmbedderEndpointClient] endpoint identity changed since this process bound to it ` +
116
+ `(fingerprint ${bound.fingerprint} -> ${current.fingerprint}, ` +
117
+ `dim ${bound.dim} -> ${current.dim}) at ${current.endpoint}; ` +
118
+ `restart to use the new embedding space`);
119
+ this.bound = bound;
120
+ this.current = current;
121
+ this.name = 'EmbedderEndpointIdentityChangedError';
122
+ }
123
+ }
100
124
  /**
101
125
  * Circuit breaker state.
102
126
  *
@@ -160,6 +184,9 @@ class CircuitBreaker {
160
184
  return { open: this.isOpen(), failures: this.failures.length, trippedAt: this.trippedAt };
161
185
  }
162
186
  }
187
+ function sameIdentity(a, b) {
188
+ return a.fingerprint === b.fingerprint && a.dim === b.dim;
189
+ }
163
190
  /**
164
191
  * OpenAI-compatible embeddings client with keep-alive, circuit breaker, and identity probe.
165
192
  */
@@ -169,6 +196,15 @@ export class EmbedderEndpointClient {
169
196
  breaker;
170
197
  opts;
171
198
  cachedIdentity = null;
199
+ /**
200
+ * #1282: the first identity a probe found. Every embedding this client
201
+ * returns belongs to it; later probes must find it again.
202
+ */
203
+ boundIdentity = null;
204
+ /** #1282: the canary vector behind `boundIdentity`. */
205
+ boundCanary = null;
206
+ /** #1282: set while the endpoint serves an identity other than the bound one. */
207
+ identityChange = null;
172
208
  /** True while a probe is in flight — prevents the embed() lazy-probe race. */
173
209
  probeInFlight = null;
174
210
  /**
@@ -260,6 +296,9 @@ export class EmbedderEndpointClient {
260
296
  if (texts.length === 0)
261
297
  return [];
262
298
  if (this.breaker.isOpen()) {
299
+ // #1282: say why the breaker is open when the cause is a changed model.
300
+ if (this.identityChange)
301
+ throw this.identityChange;
263
302
  throw new Error(`[EmbedderEndpointClient] circuit breaker open for ${this.parsed.safeUrl} — fast-failing`);
264
303
  }
265
304
  // Identity gate: every embed call must have a verified identity behind it.
@@ -328,17 +367,73 @@ export class EmbedderEndpointClient {
328
367
  buf.writeInt16LE(q, i * 2);
329
368
  }
330
369
  const fingerprint = createHash('sha256').update(buf).digest('hex').slice(0, 16);
331
- this.cachedIdentity = {
370
+ const identity = {
332
371
  dim: vec.length,
333
372
  fingerprint,
334
373
  endpoint: this.parsed.safeUrl,
335
374
  };
375
+ if (this.boundIdentity && this.boundCanary) {
376
+ if (!this.isBoundModel(identity, vec))
377
+ this.refuseIdentityChange(identity);
378
+ }
379
+ else {
380
+ this.boundIdentity = identity;
381
+ this.boundCanary = vec;
382
+ }
383
+ this.identityChange = null;
384
+ // The bound identity stays the one callers see, also when fp noise moved
385
+ // the hash: the embedding space did not change.
386
+ this.cachedIdentity = this.boundIdentity;
336
387
  this.trialPending = false;
337
388
  return this.cachedIdentity;
338
389
  }
390
+ /**
391
+ * #1282: true when a re-probe found the bound model. The int16 fingerprint
392
+ * flips on noise of about 3e-5 per component, which the same model restarted
393
+ * on other hardware or kernels can produce, so a changed hash alone is not a
394
+ * changed model: the canary must also have moved below the ADR-097
395
+ * round-trip cosine.
396
+ */
397
+ isBoundModel(identity, canary) {
398
+ const bound = this.boundIdentity;
399
+ if (identity.dim !== bound.dim)
400
+ return false;
401
+ if (identity.fingerprint === bound.fingerprint)
402
+ return true;
403
+ return (cosineSimilarity(this.boundCanary, canary) >= EMBEDDING_ROUND_TRIP_MIN_COSINE);
404
+ }
405
+ /**
406
+ * #1282: the endpoint answers, but as a different model than the one this
407
+ * client bound to (an endpoint restarted with another model of the same
408
+ * dimension, typically seen when the breaker recovers). Treat it as down:
409
+ * open the breaker so every caller fast-fails with this error, and retry
410
+ * as a half-open trial after each window, in case the bound model returns.
411
+ * Reported once per new identity.
412
+ */
413
+ refuseIdentityChange(current) {
414
+ const bound = this.boundIdentity;
415
+ const previous = this.identityChange;
416
+ const change = new EmbedderEndpointIdentityChangedError(bound, current);
417
+ this.identityChange = change;
418
+ this.cachedIdentity = null;
419
+ this.trialPending = true;
420
+ this.breaker.trip();
421
+ if (!previous || !sameIdentity(previous.current, current)) {
422
+ console.warn(`${change.message}. Embedding requests are refused.`);
423
+ }
424
+ throw change;
425
+ }
339
426
  getCachedIdentity() {
340
427
  return this.cachedIdentity;
341
428
  }
429
+ /** #1282: the identity every vector from this client belongs to. */
430
+ getBoundIdentity() {
431
+ return this.boundIdentity;
432
+ }
433
+ /** #1298: the canary vector behind the bound identity (ENDPOINT_IDENTITY_CANARY). */
434
+ getBoundCanary() {
435
+ return this.boundCanary;
436
+ }
342
437
  getBreakerState() {
343
438
  return this.breaker.getState();
344
439
  }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Embedding-space registry (#1298).
3
+ *
4
+ * A space id is a hash of the runtime configuration plus an exact fingerprint
5
+ * of a canary vector, rounded to int16 (steps of about 3e-5). The same model
6
+ * restarted on other hardware or kernels can move the canary by more than
7
+ * that, which would mint a new space id for vectors that are still
8
+ * comparable. So each space minted here also stores its canary vector, as the
9
+ * space's reference. At the next start, a runtime with the same configuration
10
+ * whose canary is within EMBEDDING_ROUND_TRIP_MIN_COSINE of a reference is
11
+ * that space: it keeps the stored identity and id instead of minting one.
12
+ *
13
+ * Entries live in memory.db kv_store (namespace _system) and are only ever
14
+ * added: a reference is never updated, so slow drift cannot walk a space
15
+ * away, and no stored id, vector or manifest is ever rewritten. Without a
16
+ * database, or when it cannot be read, derivation is what it was before.
17
+ */
18
+ import { type EmbeddingSpaceIdentity } from './embedding-space.js';
19
+ /** The raw memory.db connection the registry reads and writes. */
20
+ export interface EmbeddingSpaceRegistryDb {
21
+ prepare(sql: string): {
22
+ all(...params: unknown[]): unknown[];
23
+ run(...params: unknown[]): unknown;
24
+ };
25
+ }
26
+ /** A space and the canary vector it was minted with. */
27
+ export interface RegisteredEmbeddingSpace {
28
+ identity: EmbeddingSpaceIdentity;
29
+ /** The text the canary vector embeds; only like canaries are compared. */
30
+ canaryText: string;
31
+ canary: number[];
32
+ }
33
+ export type EmbeddingSpaceResolution =
34
+ /** A registered space with the same fingerprint. */
35
+ 'matched-exact'
36
+ /** A registered space whose canary is within the round-trip cosine. */
37
+ | 'matched-cosine'
38
+ /** No registered space matched: the derived space was registered. */
39
+ | 'registered'
40
+ /** No usable registry: the derived space is used as before. */
41
+ | 'unavailable';
42
+ export interface ResolvedEmbeddingSpace {
43
+ identity: EmbeddingSpaceIdentity;
44
+ resolution: EmbeddingSpaceResolution;
45
+ /** Same-configuration spaces that did not match (for the drift warning). */
46
+ otherSpaces: number;
47
+ /** Settles when the registration write has run (or failed, logged). */
48
+ registration: Promise<void>;
49
+ }
50
+ /** Same configuration: everything but the runtime fingerprint. */
51
+ export declare function sameEmbeddingSpaceConfig(a: EmbeddingSpaceIdentity, b: EmbeddingSpaceIdentity): boolean;
52
+ /**
53
+ * The registered space a runtime belongs to, or null. Candidates share the
54
+ * runtime's configuration and canary text; an equal fingerprint wins, then
55
+ * the highest canary cosine at or above the round-trip threshold.
56
+ */
57
+ export declare function matchRegisteredSpace(derived: EmbeddingSpaceIdentity, canaryText: string, canary: readonly number[], entries: readonly RegisteredEmbeddingSpace[]): {
58
+ entry: RegisteredEmbeddingSpace;
59
+ exact: boolean;
60
+ } | null;
61
+ /** Read every registered space. Malformed entries are skipped. Throws on a DB error. */
62
+ export declare function loadRegisteredSpaces(db: EmbeddingSpaceRegistryDb): RegisteredEmbeddingSpace[];
63
+ /**
64
+ * Add a space to the registry. Never replaces an entry. The write goes
65
+ * through the connection's write queue (#1283) when it has one, so a locked
66
+ * memory.db does not block the event loop.
67
+ */
68
+ export declare function registerEmbeddingSpace(db: EmbeddingSpaceRegistryDb, space: RegisteredEmbeddingSpace): Promise<void>;
69
+ /**
70
+ * Choose the space for a freshly derived runtime identity: a registered space
71
+ * it matches, or the derived space, which is then registered. Never throws:
72
+ * when the registry cannot be read the derived space is used, as before.
73
+ */
74
+ export declare function resolveEmbeddingSpace(db: EmbeddingSpaceRegistryDb | null, derived: EmbeddingSpaceIdentity, canaryText: string, canary: readonly number[]): ResolvedEmbeddingSpace;
75
+ //# sourceMappingURL=embedding-space-registry.d.ts.map
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Embedding-space registry (#1298).
3
+ *
4
+ * A space id is a hash of the runtime configuration plus an exact fingerprint
5
+ * of a canary vector, rounded to int16 (steps of about 3e-5). The same model
6
+ * restarted on other hardware or kernels can move the canary by more than
7
+ * that, which would mint a new space id for vectors that are still
8
+ * comparable. So each space minted here also stores its canary vector, as the
9
+ * space's reference. At the next start, a runtime with the same configuration
10
+ * whose canary is within EMBEDDING_ROUND_TRIP_MIN_COSINE of a reference is
11
+ * that space: it keeps the stored identity and id instead of minting one.
12
+ *
13
+ * Entries live in memory.db kv_store (namespace _system) and are only ever
14
+ * added: a reference is never updated, so slow drift cannot walk a space
15
+ * away, and no stored id, vector or manifest is ever rewritten. Without a
16
+ * database, or when it cannot be read, derivation is what it was before.
17
+ */
18
+ import { cosineSimilarity } from '../shared/utils/vector-math.js';
19
+ import { writeWhenUnlockedOn } from '../shared/sqlite-write-queue.js';
20
+ import { toErrorMessage } from '../shared/error-utils.js';
21
+ import { EMBEDDING_ROUND_TRIP_MIN_COSINE, } from './embedding-space.js';
22
+ const NAMESPACE = '_system';
23
+ const KEY_PREFIX = 'embedding_space:';
24
+ /** Same configuration: everything but the runtime fingerprint. */
25
+ export function sameEmbeddingSpaceConfig(a, b) {
26
+ return (a.provider === b.provider &&
27
+ a.model === b.model &&
28
+ a.dimensions === b.dimensions &&
29
+ (a.pooling ?? null) === (b.pooling ?? null) &&
30
+ a.normalized === b.normalized &&
31
+ (a.preprocessingVersion ?? null) === (b.preprocessingVersion ?? null) &&
32
+ (a.implementation ?? null) === (b.implementation ?? null));
33
+ }
34
+ /**
35
+ * The registered space a runtime belongs to, or null. Candidates share the
36
+ * runtime's configuration and canary text; an equal fingerprint wins, then
37
+ * the highest canary cosine at or above the round-trip threshold.
38
+ */
39
+ export function matchRegisteredSpace(derived, canaryText, canary, entries) {
40
+ const candidates = entries.filter((entry) => entry.canaryText === canaryText &&
41
+ entry.canary.length === canary.length &&
42
+ sameEmbeddingSpaceConfig(entry.identity, derived));
43
+ const exact = candidates.find((entry) => entry.identity.runtimeFingerprint === derived.runtimeFingerprint);
44
+ if (exact)
45
+ return { entry: exact, exact: true };
46
+ let best = null;
47
+ for (const entry of candidates) {
48
+ const cosine = cosineSimilarity(entry.canary, canary);
49
+ if (cosine >= EMBEDDING_ROUND_TRIP_MIN_COSINE && (!best || cosine > best.cosine)) {
50
+ best = { entry, cosine };
51
+ }
52
+ }
53
+ return best ? { entry: best.entry, exact: false } : null;
54
+ }
55
+ /** Read every registered space. Malformed entries are skipped. Throws on a DB error. */
56
+ export function loadRegisteredSpaces(db) {
57
+ const rows = db
58
+ .prepare('SELECT value FROM kv_store WHERE namespace = ? AND key LIKE ?')
59
+ .all(NAMESPACE, `${KEY_PREFIX}%`);
60
+ const entries = [];
61
+ for (const row of rows) {
62
+ const entry = parseEntry(row.value);
63
+ if (entry)
64
+ entries.push(entry);
65
+ }
66
+ return entries;
67
+ }
68
+ function parseEntry(value) {
69
+ let parsed;
70
+ try {
71
+ parsed = JSON.parse(value);
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ const { identity, canaryText, canary } = parsed;
77
+ if (parsed.version !== 1 ||
78
+ !identity ||
79
+ typeof identity.spaceId !== 'string' ||
80
+ typeof identity.runtimeFingerprint !== 'string' ||
81
+ typeof identity.dimensions !== 'number' ||
82
+ typeof canaryText !== 'string' ||
83
+ !Array.isArray(canary) ||
84
+ canary.length !== identity.dimensions ||
85
+ !canary.every((x) => typeof x === 'number' && Number.isFinite(x))) {
86
+ return null;
87
+ }
88
+ return { identity, canaryText, canary };
89
+ }
90
+ /**
91
+ * Add a space to the registry. Never replaces an entry. The write goes
92
+ * through the connection's write queue (#1283) when it has one, so a locked
93
+ * memory.db does not block the event loop.
94
+ */
95
+ export function registerEmbeddingSpace(db, space) {
96
+ const entry = { version: 1, createdAt: Date.now(), ...space };
97
+ return writeWhenUnlockedOn(db, () => {
98
+ db.prepare('INSERT OR IGNORE INTO kv_store (key, namespace, value) VALUES (?, ?, ?)').run(KEY_PREFIX + space.identity.spaceId, NAMESPACE, JSON.stringify(entry));
99
+ });
100
+ }
101
+ /**
102
+ * Choose the space for a freshly derived runtime identity: a registered space
103
+ * it matches, or the derived space, which is then registered. Never throws:
104
+ * when the registry cannot be read the derived space is used, as before.
105
+ */
106
+ export function resolveEmbeddingSpace(db, derived, canaryText, canary) {
107
+ const unavailable = () => ({
108
+ identity: derived,
109
+ resolution: 'unavailable',
110
+ otherSpaces: 0,
111
+ registration: Promise.resolve(),
112
+ });
113
+ if (!db)
114
+ return unavailable();
115
+ let entries;
116
+ try {
117
+ entries = loadRegisteredSpaces(db);
118
+ }
119
+ catch (error) {
120
+ console.warn(`[EmbeddingSpaceRegistry] could not read registered embedding spaces ` +
121
+ `(${toErrorMessage(error)}); using the derived space id`);
122
+ return unavailable();
123
+ }
124
+ const match = matchRegisteredSpace(derived, canaryText, canary, entries);
125
+ if (match) {
126
+ return {
127
+ identity: match.entry.identity,
128
+ resolution: match.exact ? 'matched-exact' : 'matched-cosine',
129
+ otherSpaces: 0,
130
+ registration: Promise.resolve(),
131
+ };
132
+ }
133
+ const otherSpaces = entries.filter((entry) => entry.canaryText === canaryText && sameEmbeddingSpaceConfig(entry.identity, derived)).length;
134
+ const registration = Promise.resolve()
135
+ .then(() => registerEmbeddingSpace(db, { identity: derived, canaryText, canary: [...canary] }))
136
+ .catch((error) => {
137
+ console.warn(`[EmbeddingSpaceRegistry] could not register embedding space ${derived.spaceId.slice(0, 12)} ` +
138
+ `(${toErrorMessage(error)}); it is registered at a later start`);
139
+ });
140
+ return { identity: derived, resolution: 'registered', otherSpaces, registration };
141
+ }
142
+ //# sourceMappingURL=embedding-space-registry.js.map
@@ -40,6 +40,7 @@ export interface EmbeddingConfig {
40
40
  endpointToken?: string;
41
41
  }
42
42
  export declare const DEFAULT_EMBEDDING_CONFIG: EmbeddingConfig;
43
+ export declare function __spaceRegistrationSettledForTests(): Promise<void>;
43
44
  /**
44
45
  * Compute real embedding using transformer model
45
46
  *
@@ -95,6 +96,8 @@ export declare function allowEmbedderInitRetry(): void;
95
96
  * for the breaker window as well as the caller's retry interval. The probe
96
97
  * must find the identity this process bound to (ADR-097): a changed
97
98
  * fingerprint means vectors would not be comparable.
99
+ * The client refuses it (EmbedderEndpointIdentityChangedError) and keeps
100
+ * refusing every caller, also when its breaker recovers on its own (#1282).
98
101
  * Callers rate-limit rechecks, then embed a canary to confirm.
99
102
  */
100
103
  export declare function recheckEmbedder(config?: Partial<EmbeddingConfig>): Promise<void>;
@@ -8,9 +8,10 @@
8
8
  // Re-export cosineSimilarity from shared utility for backward compatibility
9
9
  export { cosineSimilarity } from '../shared/utils/vector-math.js';
10
10
  import { toErrorMessage } from '../shared/error-utils.js';
11
- import { EmbedderEndpointClient, redactEndpoint, } from './embedder-endpoint-client.js';
11
+ import { EmbedderEndpointClient, ENDPOINT_IDENTITY_CANARY, redactEndpoint, } from './embedder-endpoint-client.js';
12
12
  import { loadEmbedderIdentity, resetEmbedderIdentityStore, saveEmbedderIdentity, } from './embedder-identity-store.js';
13
13
  import { EMBEDDING_SPACE_CANARY, deriveEmbeddingSpaceIdentity, fingerprintEmbeddingRuntime, } from './embedding-space.js';
14
+ import { resolveEmbeddingSpace, } from './embedding-space-registry.js';
14
15
  // Lazy-loaded transformer pipeline
15
16
  let pipeline = null;
16
17
  let embeddingModel = null;
@@ -106,7 +107,7 @@ async function initializeModel(config = {}, retryingAfterFailure = false) {
106
107
  });
107
108
  // Probe + identity fingerprint. Fails loud on dim mismatch.
108
109
  endpointIdentity = await endpointClient.probe();
109
- activeEmbeddingSpaceIdentity = deriveEmbeddingSpaceIdentity({
110
+ const derivedSpace = deriveEmbeddingSpaceIdentity({
110
111
  provider: 'openai-compatible-endpoint',
111
112
  model: fullConfig.modelName,
112
113
  dimensions: endpointIdentity.dim,
@@ -116,6 +117,11 @@ async function initializeModel(config = {}, retryingAfterFailure = false) {
116
117
  implementation: endpointIdentity.endpoint,
117
118
  runtimeFingerprint: endpointIdentity.fingerprint,
118
119
  });
120
+ const boundCanary = endpointClient.getBoundCanary();
121
+ const space = boundCanary
122
+ ? await resolveActiveSpace(derivedSpace, ENDPOINT_IDENTITY_CANARY, [...boundCanary])
123
+ : null;
124
+ activeEmbeddingSpaceIdentity = space?.identity ?? derivedSpace;
119
125
  console.log(`[RealEmbeddings] Endpoint identity: dim=${endpointIdentity.dim} fingerprint=${endpointIdentity.fingerprint}`);
120
126
  // Cross-run drift detection: compare against the last-known identity
121
127
  // for this endpoint (memory.db kv_store, namespace _system). If the
@@ -124,9 +130,14 @@ async function initializeModel(config = {}, retryingAfterFailure = false) {
124
130
  // remote silently changed (poisoning risk for the existing index).
125
131
  try {
126
132
  const previous = loadEmbedderIdentity(endpointIdentity.endpoint);
127
- if (previous && previous.fingerprint !== endpointIdentity.fingerprint) {
133
+ // #1298: a restart that kept its registered space is not a change,
134
+ // even when float noise moved the fingerprint.
135
+ const spaceKept = space?.resolution === 'matched-exact' || space?.resolution === 'matched-cosine';
136
+ const changed = (previous !== null && previous.fingerprint !== endpointIdentity.fingerprint) ||
137
+ (space?.otherSpaces ?? 0) > 0;
138
+ if (!spaceKept && changed) {
128
139
  console.warn(`[RealEmbeddings] WARNING: endpoint identity changed since last run. ` +
129
- `Previous fingerprint=${previous.fingerprint} dim=${previous.dim}, ` +
140
+ `Previous fingerprint=${previous?.fingerprint ?? 'unknown'} dim=${previous?.dim ?? 'unknown'}, ` +
130
141
  `current fingerprint=${endpointIdentity.fingerprint} dim=${endpointIdentity.dim}. ` +
131
142
  `Vectors written before this change may no longer be comparable.`);
132
143
  }
@@ -175,7 +186,7 @@ async function initializeModel(config = {}, retryingAfterFailure = false) {
175
186
  normalize: true,
176
187
  });
177
188
  const canaryVector = Array.from(canary.data);
178
- activeEmbeddingSpaceIdentity = deriveEmbeddingSpaceIdentity({
189
+ const derivedSpace = deriveEmbeddingSpaceIdentity({
179
190
  provider: 'huggingface-transformers',
180
191
  model: fullConfig.modelName,
181
192
  dimensions: canaryVector.length,
@@ -185,6 +196,7 @@ async function initializeModel(config = {}, retryingAfterFailure = false) {
185
196
  implementation: `transformers:${fullConfig.quantized ? 'quantized' : 'full'}`,
186
197
  runtimeFingerprint: fingerprintEmbeddingRuntime(canaryVector),
187
198
  });
199
+ activeEmbeddingSpaceIdentity = (await resolveActiveSpace(derivedSpace, EMBEDDING_SPACE_CANARY, canaryVector)).identity;
188
200
  initializationFailed = false;
189
201
  failureReason = '';
190
202
  const loadTime = performance.now() - startTime;
@@ -198,6 +210,35 @@ async function initializeModel(config = {}, retryingAfterFailure = false) {
198
210
  })();
199
211
  return initPromise;
200
212
  }
213
+ /** @internal test seam: settles when the last space registration write ran. */
214
+ let lastSpaceRegistration = Promise.resolve();
215
+ export function __spaceRegistrationSettledForTests() {
216
+ return lastSpaceRegistration;
217
+ }
218
+ /**
219
+ * #1298: keep a restarted runtime in its registered embedding space when its
220
+ * canary is within the round-trip cosine of that space's reference, instead
221
+ * of minting a new id from the exact fingerprint. Uses the shared memory.db
222
+ * connection only when UnifiedMemory is already open; otherwise (and on any
223
+ * registry error) the derived space is used, as before.
224
+ */
225
+ async function resolveActiveSpace(derived, canaryText, canary) {
226
+ let db = null;
227
+ try {
228
+ const { getOpenUnifiedMemoryDatabase } = await import('../kernel/unified-memory.js');
229
+ db = getOpenUnifiedMemoryDatabase();
230
+ }
231
+ catch (error) {
232
+ console.warn(`[RealEmbeddings] embedding-space registry unavailable: ${toErrorMessage(error)}`);
233
+ }
234
+ const resolved = resolveEmbeddingSpace(db, derived, canaryText, canary);
235
+ lastSpaceRegistration = resolved.registration;
236
+ if (resolved.resolution === 'matched-cosine') {
237
+ console.log(`[RealEmbeddings] Embedding space ${resolved.identity.spaceId.slice(0, 12)} kept: ` +
238
+ `runtime fingerprint ${derived.runtimeFingerprint} is within the round-trip cosine of its reference`);
239
+ }
240
+ return resolved;
241
+ }
201
242
  /**
202
243
  * Build a FeatureExtractionPipeline-shaped wrapper around the endpoint client.
203
244
  * The shape matches `pipeline('feature-extraction', ...)` so the rest of
@@ -432,6 +473,8 @@ export function allowEmbedderInitRetry() {
432
473
  * for the breaker window as well as the caller's retry interval. The probe
433
474
  * must find the identity this process bound to (ADR-097): a changed
434
475
  * fingerprint means vectors would not be comparable.
476
+ * The client refuses it (EmbedderEndpointIdentityChangedError) and keeps
477
+ * refusing every caller, also when its breaker recovers on its own (#1282).
435
478
  * Callers rate-limit rechecks, then embed a canary to confirm.
436
479
  */
437
480
  export async function recheckEmbedder(config = {}) {
@@ -446,12 +489,7 @@ export async function recheckEmbedder(config = {}) {
446
489
  // succeeded yet; embed() would only start that trial and fail fast.
447
490
  if (!client || !client.needsTrial())
448
491
  return;
449
- const identity = await client.probeThroughOpenBreaker();
450
- if (endpointIdentity && identity.fingerprint !== endpointIdentity.fingerprint) {
451
- throw new Error(`[RealEmbeddings] endpoint identity changed since this process bound to it ` +
452
- `(fingerprint ${endpointIdentity.fingerprint} -> ${identity.fingerprint}); ` +
453
- `restart to use the new embedding space`);
454
- }
492
+ await client.probeThroughOpenBreaker();
455
493
  }
456
494
  async function retryInitialization(config) {
457
495
  if (endpointClient) {