agentic-qe 3.15.15 → 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.
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +168 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/audit/witness-chain.d.ts +7 -0
- package/dist/audit/witness-chain.js +10 -0
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-OMILP6KH.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-EUF4XVUC.js → agent-booster-wasm-6BUOFQZA.js} +2 -2
- package/dist/cli/chunks/{agent-handler-MOX6PSIQ.js → agent-handler-HPDK3JI3.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-AEXKIGDG.js → agent-memory-branch-5QKUTWK5.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-OXH5CCOS.js +2 -0
- package/dist/cli/chunks/{arena-IQ5ZZDRF.js → arena-7OKPMNHD.js} +2 -2
- package/dist/cli/chunks/{arena-M7GA3CVG.js → arena-HZ35LESR.js} +4 -4
- package/dist/cli/chunks/{audit-4IPBMKWB.js → audit-XI575SVK.js} +3 -3
- package/dist/cli/chunks/base-MAK2BLTG.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-IKDKJ2IE.js → better-sqlite3-YO5X7ZJS.js} +2 -2
- package/dist/cli/chunks/{brain-handler-5NQUDH4W.js → brain-handler-GCQZFZGQ.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-KSXELWRC.js → branch-enumerator-N6G44UU2.js} +2 -2
- package/dist/cli/chunks/{browser-6LACARWE.js → browser-EVKPTLOI.js} +2 -2
- package/dist/cli/chunks/browser-workflow-IR3VF2TL.js +2 -0
- package/dist/cli/chunks/{chunk-DKX4GNRU.js → chunk-2EQK7B5L.js} +2 -2
- package/dist/cli/chunks/chunk-2PCEMDIX.js +757 -0
- package/dist/cli/chunks/{chunk-JCQGJGGZ.js → chunk-2UUZCQSD.js} +7 -7
- package/dist/cli/chunks/chunk-2YWYW7NU.js +21 -0
- package/dist/cli/chunks/{chunk-PFQCV6YS.js → chunk-45223KK6.js} +6 -6
- package/dist/cli/chunks/chunk-4EJLHNER.js +12 -0
- package/dist/cli/chunks/{chunk-E5G4WZ2T.js → chunk-4L6WX5KC.js} +1 -1
- package/dist/cli/chunks/{chunk-UQPA33UK.js → chunk-4NKZU2JZ.js} +2 -2
- package/dist/cli/chunks/{chunk-OBDONJQM.js → chunk-4UKTIQDT.js} +2 -2
- package/dist/cli/chunks/{chunk-7BLZHFKD.js → chunk-4YM45Z5B.js} +1 -1
- package/dist/cli/chunks/{chunk-ZWBGYJ7K.js → chunk-5FSPELOG.js} +2 -2
- package/dist/cli/chunks/{chunk-NWIIYHT6.js → chunk-5WATBVU6.js} +2 -2
- package/dist/cli/chunks/{chunk-7ACCBHRB.js → chunk-5WYZVSL2.js} +1 -1
- package/dist/cli/chunks/{chunk-ZYJB6FML.js → chunk-6LSZCEW2.js} +1 -1
- package/dist/cli/chunks/{chunk-U62OUXBF.js → chunk-6V6BD6PH.js} +1 -1
- package/dist/cli/chunks/{chunk-MIA447GY.js → chunk-74MDUIAZ.js} +1 -1
- package/dist/cli/chunks/{chunk-AJPROCDW.js → chunk-776K4ZLE.js} +2 -2
- package/dist/cli/chunks/{chunk-CBK5CT6T.js → chunk-7BSOO3CY.js} +2 -2
- package/dist/cli/chunks/{chunk-ERN56H6S.js → chunk-7SNSI4VY.js} +1 -1
- package/dist/cli/chunks/{chunk-JKJOB65O.js → chunk-A4BVDYIL.js} +1 -1
- package/dist/cli/chunks/{chunk-MV55NXTD.js → chunk-AGCS5GSO.js} +2 -2
- package/dist/cli/chunks/{chunk-XIVVTYM2.js → chunk-AVHYJ3XP.js} +2 -2
- package/dist/cli/chunks/{chunk-KJBPB7P5.js → chunk-BE7ZHM34.js} +2 -2
- package/dist/cli/chunks/{chunk-GKSMRBHU.js → chunk-BHQ2DLJU.js} +1 -1
- package/dist/cli/chunks/{chunk-7XB3FCKM.js → chunk-BKHEQIRZ.js} +2 -2
- package/dist/cli/chunks/{chunk-G242G224.js → chunk-BSIWI4ES.js} +2 -2
- package/dist/cli/chunks/{chunk-NQS3BWS6.js → chunk-C7QLLMYI.js} +1 -1
- package/dist/cli/chunks/{chunk-XWIAZG3C.js → chunk-CMN7PU2H.js} +2 -2
- package/dist/cli/chunks/{chunk-4X3SWKBA.js → chunk-COTQ44YO.js} +2 -2
- package/dist/cli/chunks/{chunk-3J3RNJNX.js → chunk-CQER6IJ5.js} +1 -1
- package/dist/cli/chunks/{chunk-6KCSKGVY.js → chunk-CVPXHDQU.js} +1 -1
- package/dist/cli/chunks/{chunk-R6LHJ7ME.js → chunk-CVYPMGUM.js} +2 -2
- package/dist/cli/chunks/chunk-CXCMATZ6.js +3 -0
- package/dist/cli/chunks/{chunk-PYPS65P7.js → chunk-D75GLKEL.js} +2 -2
- package/dist/cli/chunks/chunk-DCDSN67A.js +2 -0
- package/dist/cli/chunks/{chunk-6RBTS3NF.js → chunk-DHKSPOUQ.js} +2 -2
- package/dist/cli/chunks/{chunk-JW74KRBC.js → chunk-DJDVD6RM.js} +2 -2
- package/dist/cli/chunks/{chunk-X33CWRDF.js → chunk-DNVRTJKB.js} +2 -2
- package/dist/cli/chunks/{chunk-BQ47GQPK.js → chunk-DS5IFRY6.js} +2 -2
- package/dist/cli/chunks/{chunk-AHMWD6JG.js → chunk-E7XIMOKW.js} +2 -2
- package/dist/cli/chunks/{chunk-SON6ZRH3.js → chunk-ECKHDHR2.js} +2 -2
- package/dist/cli/chunks/chunk-EPVPXHL7.js +2 -0
- package/dist/cli/chunks/{chunk-BP5T3OEV.js → chunk-ERYADKMZ.js} +4 -4
- package/dist/cli/chunks/{chunk-DUKE27HC.js → chunk-EUWG2JG4.js} +2 -2
- package/dist/cli/chunks/chunk-FAQ24UHB.js +29 -0
- package/dist/cli/chunks/{chunk-XG4F4XH4.js → chunk-FBBPRVNF.js} +2 -2
- package/dist/cli/chunks/{chunk-5PTAFGJT.js → chunk-FBSBXCZS.js} +2 -2
- package/dist/cli/chunks/chunk-G2X3OLMN.js +153 -0
- package/dist/cli/chunks/{chunk-IXL5ZHWJ.js → chunk-GG7PMTHD.js} +1 -1
- package/dist/cli/chunks/{chunk-6BRQPHMZ.js → chunk-GN6OE3JT.js} +1 -1
- package/dist/cli/chunks/{chunk-SZAZQZWI.js → chunk-GPPTRKEM.js} +2 -2
- package/dist/cli/chunks/{chunk-LTQVUAPH.js → chunk-H2LHWZRE.js} +2 -2
- package/dist/cli/chunks/{chunk-WVXJ2QIG.js → chunk-HAQJFUAQ.js} +2 -2
- package/dist/cli/chunks/{chunk-C5CXL3JP.js → chunk-HD6W6PHV.js} +2 -2
- package/dist/cli/chunks/{chunk-K3WZICFA.js → chunk-HFZD5KLR.js} +1 -1
- package/dist/cli/chunks/{chunk-VCXI4XC4.js → chunk-HRUHHHVR.js} +2 -2
- package/dist/cli/chunks/{chunk-GV2QE5TO.js → chunk-HVT7RMGV.js} +1 -1
- package/dist/cli/chunks/chunk-HWQPMUSN.js +2 -0
- package/dist/cli/chunks/{chunk-4ATQP3PR.js → chunk-HZ5O7G2P.js} +1 -1
- package/dist/cli/chunks/{chunk-XHHWABJV.js → chunk-IHQGNDMX.js} +2 -2
- package/dist/cli/chunks/{chunk-UUBIQR6A.js → chunk-IJSROBM6.js} +18 -18
- package/dist/cli/chunks/{chunk-PS6UMZVK.js → chunk-IJZFJPHS.js} +2 -2
- package/dist/cli/chunks/{chunk-C4KLXFJP.js → chunk-IKB3M7OF.js} +1 -1
- package/dist/cli/chunks/{chunk-SJCKCSN3.js → chunk-INI3Q4CN.js} +1 -1
- package/dist/cli/chunks/{chunk-LYJHUNBK.js → chunk-IOWEBPXJ.js} +2 -2
- package/dist/cli/chunks/{chunk-HTZSRMHW.js → chunk-IQL6XRF5.js} +2 -2
- package/dist/cli/chunks/{chunk-DEKR3CTS.js → chunk-IRHXGCQR.js} +2 -2
- package/dist/cli/chunks/{chunk-TODNOP7C.js → chunk-J3QFJI2Y.js} +6 -6
- package/dist/cli/chunks/{chunk-OLZH5LRT.js → chunk-J6QRNQJF.js} +11 -11
- package/dist/cli/chunks/{chunk-HL2ANKN3.js → chunk-J7Q5TXFZ.js} +2 -2
- package/dist/cli/chunks/{chunk-6YVMX2TC.js → chunk-JHKKIJT2.js} +2 -2
- package/dist/cli/chunks/{chunk-K3XBQC3R.js → chunk-JI33PMPZ.js} +1 -1
- package/dist/cli/chunks/{chunk-74YG72NQ.js → chunk-JRIJM4LE.js} +3 -3
- package/dist/cli/chunks/{chunk-TDQWTSBS.js → chunk-JVWZAE2H.js} +2 -2
- package/dist/cli/chunks/{chunk-RDMRY7CT.js → chunk-K7WAI662.js} +1 -1
- package/dist/cli/chunks/{chunk-C4RTAVC6.js → chunk-KB34MTFZ.js} +2 -2
- package/dist/cli/chunks/{chunk-2CKERSMB.js → chunk-KPIPVSIP.js} +2 -2
- package/dist/cli/chunks/{chunk-LNX74WHQ.js → chunk-KR2TAAF6.js} +1 -1
- package/dist/cli/chunks/{chunk-73PBAWAF.js → chunk-KT2QCXO6.js} +2 -2
- package/dist/cli/chunks/{chunk-BBRROA3Z.js → chunk-KTORRIX3.js} +2 -2
- package/dist/cli/chunks/{chunk-GCHYOPRZ.js → chunk-LCWEQRZI.js} +2 -2
- package/dist/cli/chunks/{chunk-M4WMSCAE.js → chunk-LG5PPJT7.js} +1 -1
- package/dist/cli/chunks/{chunk-UAQZI6N4.js → chunk-LIF6UWHV.js} +2 -2
- package/dist/cli/chunks/chunk-LN7NKE3N.js +27 -0
- package/dist/cli/chunks/chunk-LOLSZG5J.js +2 -0
- package/dist/cli/chunks/{chunk-BLL2XU7A.js → chunk-LOMT4UC2.js} +2 -2
- package/dist/cli/chunks/chunk-LRKLATSH.js +2 -0
- package/dist/cli/chunks/{chunk-EKP2SC77.js → chunk-LRY6UIRI.js} +2 -2
- package/dist/cli/chunks/{chunk-JCZCJE6X.js → chunk-LV7UIK4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-LVABQNRF.js → chunk-M2YI5YUR.js} +2 -2
- package/dist/cli/chunks/{chunk-RIRZHOS2.js → chunk-MCXW3DKE.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSOMUTNL.js → chunk-MGZ6XZHU.js} +1 -1
- package/dist/cli/chunks/{chunk-H5DER3JY.js → chunk-MLMD3I75.js} +1 -1
- package/dist/cli/chunks/{chunk-UXIY4IAI.js → chunk-MVVVGQJ6.js} +2 -2
- package/dist/cli/chunks/{chunk-WUOOX7UG.js → chunk-ND72UDVH.js} +2 -2
- package/dist/cli/chunks/{chunk-AKZO6GGG.js → chunk-NE3LRUNC.js} +4 -4
- package/dist/cli/chunks/{chunk-O6EWL5DQ.js → chunk-NKUHMA4T.js} +2 -2
- package/dist/cli/chunks/{chunk-L32JNNKL.js → chunk-NQFDJ6BT.js} +1 -1
- package/dist/cli/chunks/{chunk-T66PPF4D.js → chunk-NZJVDOUN.js} +31 -31
- package/dist/cli/chunks/{chunk-EBTNMQSS.js → chunk-O7VJ3VKD.js} +2 -2
- package/dist/cli/chunks/{chunk-76P32JVU.js → chunk-OJIUIEI4.js} +1 -1
- package/dist/cli/chunks/chunk-OO2M2QUV.js +12 -0
- package/dist/cli/chunks/{chunk-CAOUV5GZ.js → chunk-ORQ2YBRR.js} +2 -2
- package/dist/cli/chunks/chunk-OWIQR6N2.js +4 -0
- package/dist/cli/chunks/chunk-OWIZBZLN.js +14 -0
- package/dist/cli/chunks/{chunk-J3FP5UGL.js → chunk-P3D7SEHW.js} +1 -1
- package/dist/cli/chunks/{chunk-3CYNZFKH.js → chunk-P4OB6WDJ.js} +1 -1
- package/dist/cli/chunks/{chunk-LHMQIZ6B.js → chunk-PCL5JRKN.js} +2 -2
- package/dist/cli/chunks/{chunk-KLTMOXIK.js → chunk-PIWGKGWP.js} +2 -2
- package/dist/cli/chunks/{chunk-VMAM46HQ.js → chunk-PK34KJH7.js} +2 -2
- package/dist/cli/chunks/chunk-POPSZDI2.js +65 -0
- package/dist/cli/chunks/{chunk-JUDUBQHA.js → chunk-Q6F3DYZN.js} +2 -2
- package/dist/cli/chunks/{chunk-Y2OX6KGN.js → chunk-QJSSUBO3.js} +2 -2
- package/dist/cli/chunks/{chunk-XM6ZVFM5.js → chunk-QN7HP2UW.js} +235 -173
- package/dist/cli/chunks/{chunk-T4GE7MPI.js → chunk-QSQNXBD2.js} +2 -2
- package/dist/cli/chunks/{chunk-5C62XMJR.js → chunk-QTQDX4TZ.js} +33 -33
- package/dist/cli/chunks/{chunk-DURD37JZ.js → chunk-R3KBOQ3O.js} +2 -2
- package/dist/cli/chunks/{chunk-LJMYRTJ7.js → chunk-REY52O7J.js} +1 -1
- package/dist/cli/chunks/{chunk-W5ZJG2OU.js → chunk-RKCN4B26.js} +2 -2
- package/dist/cli/chunks/chunk-S3DT5TPR.js +14 -0
- package/dist/cli/chunks/{chunk-4HKAD25N.js → chunk-S3TBOKAZ.js} +22 -22
- package/dist/cli/chunks/{chunk-2IIXCEMS.js → chunk-SAEECT23.js} +2 -2
- package/dist/cli/chunks/{chunk-LB2LGEDP.js → chunk-SAZ4PJBR.js} +2 -2
- package/dist/cli/chunks/{chunk-FOOW4JVS.js → chunk-SFITYZLV.js} +2 -2
- package/dist/cli/chunks/{chunk-2ZFLULL4.js → chunk-SRBCBVSI.js} +2 -2
- package/dist/cli/chunks/chunk-SUAZ5Z47.js +63 -0
- package/dist/cli/chunks/{chunk-RBKUU7WF.js → chunk-TDZ6N43D.js} +2 -2
- package/dist/cli/chunks/chunk-TIVKDIF7.js +2 -0
- package/dist/cli/chunks/{chunk-MPFPWJTH.js → chunk-TM75GAXG.js} +2 -2
- package/dist/cli/chunks/{chunk-UJABDXST.js → chunk-TWBZONKT.js} +2 -2
- package/dist/cli/chunks/{chunk-AOKKUB5F.js → chunk-U4S74IIZ.js} +1 -1
- package/dist/cli/chunks/{chunk-W62OOK7A.js → chunk-U5SMBJ6F.js} +2 -2
- package/dist/cli/chunks/{chunk-6LE362LZ.js → chunk-UHJVZEQA.js} +2 -2
- package/dist/cli/chunks/{chunk-T67R2MUN.js → chunk-UOVCTK5L.js} +2 -2
- package/dist/cli/chunks/{chunk-FTRSS64D.js → chunk-VDEKVIP5.js} +2 -2
- package/dist/cli/chunks/{chunk-BDKEAGQ2.js → chunk-VITV7AEC.js} +2 -2
- package/dist/cli/chunks/{chunk-BU4UQR36.js → chunk-VKREKVFI.js} +2 -2
- package/dist/cli/chunks/{chunk-BZULJMGH.js → chunk-VLTDW7XJ.js} +2 -2
- package/dist/cli/chunks/{chunk-UE2J6MA5.js → chunk-VQFV2IPV.js} +1 -1
- package/dist/cli/chunks/{chunk-TZIHDJZD.js → chunk-VYPVU3JF.js} +2 -2
- package/dist/cli/chunks/{chunk-UORB2QDU.js → chunk-WAOEQA3W.js} +2 -2
- package/dist/cli/chunks/{chunk-GQABPCQE.js → chunk-WBDWHHKP.js} +2 -2
- package/dist/cli/chunks/{chunk-GGQGCT4Y.js → chunk-WX4PO65Q.js} +2 -2
- package/dist/cli/chunks/chunk-X2DWHGCC.js +6 -0
- package/dist/cli/chunks/{chunk-337Z52QM.js → chunk-X5QD76IU.js} +2 -2
- package/dist/cli/chunks/{chunk-E56PVVWC.js → chunk-XBTGEYED.js} +2 -2
- package/dist/cli/chunks/{chunk-5AFVEWMT.js → chunk-XEMCHGAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-E3MRDIZF.js → chunk-XEYFZLIT.js} +1 -1
- package/dist/cli/chunks/{chunk-KCQNFBBR.js → chunk-XFTX3KLE.js} +1 -1
- package/dist/cli/chunks/{chunk-QFGYH6HD.js → chunk-XPTCQKVE.js} +1 -1
- package/dist/cli/chunks/{chunk-PXATBHWN.js → chunk-YAJOBZE5.js} +2 -2
- package/dist/cli/chunks/{chunk-27HE2BHC.js → chunk-YCVLKU6H.js} +2 -2
- package/dist/cli/chunks/{chunk-ZIPAB5J6.js → chunk-YD2C6EPN.js} +2 -2
- package/dist/cli/chunks/{chunk-5G4UFTV4.js → chunk-YKRLUTK7.js} +2 -2
- package/dist/cli/chunks/{chunk-YUS6TWAL.js → chunk-YMUY3TES.js} +6 -6
- package/dist/cli/chunks/chunk-YR5QBUHZ.js +6 -0
- package/dist/cli/chunks/{chunk-XH4JMX5O.js → chunk-Z7SKUC6P.js} +1 -1
- package/dist/cli/chunks/{chunk-EFUJDMNC.js → chunk-ZAQMRFBB.js} +2 -2
- package/dist/cli/chunks/{chunk-22UKJGGN.js → chunk-ZC3KDNJW.js} +3 -3
- package/dist/cli/chunks/{chunk-AP2W7Z3A.js → chunk-ZGV7L4MW.js} +1 -1
- package/dist/cli/chunks/{chunk-W27AJ5B4.js → chunk-ZN35XSKF.js} +2 -2
- package/dist/cli/chunks/{chunk-M4CJCPCQ.js → chunk-ZNXM6WVL.js} +2 -2
- package/dist/cli/chunks/{chunk-5I7357KS.js → chunk-ZP5AWQRO.js} +2 -2
- package/dist/cli/chunks/{chunk-OQG3UQQ7.js → chunk-ZTP3DQ5M.js} +1 -1
- package/dist/cli/chunks/{chunk-BFQTLF5X.js → chunk-ZVMSSCTH.js} +2 -2
- package/dist/cli/chunks/chunk-ZWUF27P4.js +2 -0
- package/dist/cli/chunks/{ci-UCUJOSBW.js → ci-3RTTTS2D.js} +2 -2
- package/dist/cli/chunks/{ci-config-2XILD3XG.js → ci-config-XRUR3I4K.js} +2 -2
- package/dist/cli/chunks/{ci-output-BL6KWOHW.js → ci-output-E5IAMU2U.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-5XLIOXE5.js → circuit-breaker-SHR2P44P.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-4IMP6ACS.js → claude-flow-setup-ZDDILFMF.js} +2 -2
- package/dist/cli/chunks/client-NO5FOWT4.js +2 -0
- package/dist/cli/chunks/{cline-installer-RYLHCDK7.js → cline-installer-BGYVUM6G.js} +2 -2
- package/dist/cli/chunks/{code-WY3GJXHX.js → code-PJ4MC3MC.js} +4 -3
- package/dist/cli/chunks/{code-index-extractor-Y4MZBZCW.js → code-index-extractor-IW2P22YG.js} +2 -2
- package/dist/cli/chunks/{codex-installer-SCJ3T3DX.js → codex-installer-A7WZ6OGL.js} +2 -2
- package/dist/cli/chunks/{completions-CN2DXQFU.js → completions-KS23WD5J.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-7MDPPIBH.js → complexity-analyzer-Q7GLSR2E.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-GCEJRK34.js → continuedev-installer-SK55BFW2.js} +2 -2
- package/dist/cli/chunks/copilot-installer-3N5J3WTM.js +3 -0
- package/dist/cli/chunks/core-handlers-JNAZPXE2.js +2 -0
- package/dist/cli/chunks/{cost-tracker-VO5MFWR6.js → cost-tracker-NENVSO4A.js} +2 -2
- package/dist/cli/chunks/{coverage-LYFQYNH6.js → coverage-5L7UQWDH.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-HEBM767Z.js +2 -0
- package/dist/cli/chunks/{cursor-installer-KP4HA7TV.js → cursor-installer-XXBO2ZE6.js} +2 -2
- package/dist/cli/chunks/{daemon-7RC7TS57.js → daemon-CDCQU3LR.js} +3 -3
- package/dist/cli/chunks/daemon-JEBJGEUK.js +18 -0
- package/dist/cli/chunks/{dag-attention-scheduler-NKA44RSR.js → dag-attention-scheduler-HOMMF7FA.js} +2 -2
- package/dist/cli/chunks/{detect-CMYAJWYF.js → detect-FXCOUG6X.js} +2 -2
- package/dist/cli/chunks/{dist-node-EN3PYEGW.js → dist-node-GXQ7FMTY.js} +2 -2
- package/dist/cli/chunks/{domain-handler-EXSZCX7A.js → domain-handler-TI3JBAPC.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-HCQFSNL7.js → domain-plugins-R7LTUM32.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-3LGSNTPO.js → domain-transfer-LBIAFHIQ.js} +2 -2
- package/dist/cli/chunks/dream-GQDCEJMS.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-33KLHDD5.js +3 -0
- package/dist/cli/chunks/embedding-space-HHLWTBF5.js +2 -0
- package/dist/cli/chunks/{eval-OQELIWJK.js → eval-KDOZMAXJ.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-X45PECQN.js +40 -0
- package/dist/cli/chunks/{fast-paths-UV4NDEWM.js → fast-paths-462V6UUB.js} +2 -2
- package/dist/cli/chunks/{feature-flags-H7H33B6C.js → feature-flags-G66OT3AS.js} +2 -2
- package/dist/cli/chunks/{feature-flags-CKTYX67J.js → feature-flags-NIRQ4YDM.js} +2 -2
- package/dist/cli/chunks/file-discovery-33USPLB5.js +2 -0
- package/dist/cli/chunks/{fleet-ZJBCAKRG.js → fleet-PXWGB7CU.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-RUE2QZRG.js → gnn-wrapper-7MUW3M5M.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-XRV327M7.js → heartbeat-handler-5237PB35.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-LIXLC5IH.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-62D5UH27.js +2 -0
- package/dist/cli/chunks/hnsw-index-GSGUMQQC.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-UJID6ZZ4.js → hnsw-legacy-bridge-OSQPW7JP.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-WS43R4AX.js → hnswlib-node-GX6WG2GB.js} +2 -2
- package/dist/cli/chunks/{hooks-YZNJKXAJ.js → hooks-GUWHL7VC.js} +23 -22
- package/dist/cli/chunks/hybrid-backend-FRWP4BOY.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-XQJSIMTS.js → hypergraph-engine-SRWLLCU3.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-ZD2NYXMR.js → hypergraph-handler-AVOPRHHO.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-7KF3AQXV.js +2 -0
- package/dist/cli/chunks/{init-guard-DSRUAVRT.js → init-guard-P4N6EVZS.js} +2 -2
- package/dist/cli/chunks/{init-handler-RJU5QMAP.js → init-handler-LRGWOJMD.js} +6 -6
- package/dist/cli/chunks/init-wizard-XWWAXY25.js +2 -0
- package/dist/cli/chunks/kernel-ZEJPNDBW.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-BCPOCVMC.js → kilocode-installer-7R2EPOQ6.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-GFCWCB2S.js → kiro-installer-QNM7DPOB.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-RRZQS7KY.js +2 -0
- package/dist/cli/chunks/{learning-FZTD72CF.js → learning-7OIZBPXZ.js} +3 -3
- package/dist/cli/chunks/{llm-router-GJVKGRJL.js → llm-router-SIDXES23.js} +4 -4
- package/dist/cli/chunks/llm-router-service-3OSW67LC.js +2 -0
- package/dist/cli/chunks/{load-YKTPOYBE.js → load-EI2E2C3S.js} +2 -2
- package/dist/cli/chunks/load-test-7TRIH2WJ.js +2 -0
- package/dist/cli/chunks/{mcp-LT6R2IKS.js → mcp-IOE5WOCS.js} +2 -2
- package/dist/cli/chunks/{memory-4HKKOLRY.js → memory-DLYGJAP7.js} +5 -5
- package/dist/cli/chunks/memory-backend-G7ZW6Q2B.js +2 -0
- package/dist/cli/chunks/memory-handlers-TPF3KCO5.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-2YPM2WTK.js → multi-model-executor-WHH4YCHM.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-WBAJMH5K.js → opencode-installer-63FDZAMS.js} +2 -2
- package/dist/cli/chunks/{orchestrator-5W5WVMVJ.js → orchestrator-3LA776KK.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-OU3ZC3NR.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-GXRMNPAZ.js → pattern-usage-recorder-NW54QUGI.js} +2 -2
- package/dist/cli/chunks/{pipeline-2NA4DRDA.js → pipeline-P3TYX6J6.js} +2 -2
- package/dist/cli/chunks/{platform-BGERNQ5V.js → platform-FNA2WLI6.js} +2 -2
- package/dist/cli/chunks/{plugin-L4EPVENR.js → plugin-NJS7BC2S.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-RTQRTPTM.js → prime-radiant-advanced-wasm-NIAVL2OT.js} +2 -2
- package/dist/cli/chunks/project-root-GMOFJEKD.js +2 -0
- package/dist/cli/chunks/protocol-executor-AD345XRO.js +2 -0
- package/dist/cli/chunks/{protocol-handler-SYQXM6JK.js → protocol-handler-JU5C4JHY.js} +2 -2
- package/dist/cli/chunks/{prove-5O7GPJCU.js → prove-35VOSLYP.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-NLTP26RC.js +2 -0
- package/dist/cli/chunks/{quality-KIIDHGNF.js → quality-ET74X7HN.js} +2 -2
- package/dist/cli/chunks/{quality-gate-H65VECD3.js → quality-gate-FEDQISNB.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-2TB4FWS6.js +2 -0
- package/dist/cli/chunks/real-embeddings-II6CXTCI.js +2 -0
- package/dist/cli/chunks/{ref-validation-CSBJOMZM.js → ref-validation-DTBPYCEB.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-G7OVYXEN.js → roocode-installer-LYQEMR4J.js} +2 -2
- package/dist/cli/chunks/router-PLM3MWME.js +2 -0
- package/dist/cli/chunks/routing-feedback-I7VOX2HU.js +2 -0
- package/dist/cli/chunks/{routing-handler-ZNZPPI5Y.js → routing-handler-DJOJFPII.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-C6IG3OY3.js → ruvector-commands-VXYGJDPW.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-GQZHFWO2.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-3TVKBCAM.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-XUHKLMT6.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-5GUTYOWS.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-3G6LFLT3.js → rvf-store-integrity-GA2ZYOEG.js} +2 -2
- package/dist/cli/chunks/safe-db-RZPQGLGQ.js +2 -0
- package/dist/cli/chunks/schedule-G7JMQDUX.js +2 -0
- package/dist/cli/chunks/scheduler-4SEGPCKD.js +2 -0
- package/dist/cli/chunks/{security-A3IMVLFM.js → security-MM6YOECX.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-VHWQ6US5.js → shared-rvf-adapter-6AHPA3V5.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-JB3QS7IG.js → shared-rvf-dual-writer-EYAVY2GZ.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-IVE4SQXR.js +2 -0
- package/dist/cli/chunks/{standalone-memory-DDNXCSBD.js → standalone-memory-A3PLB4CZ.js} +2 -2
- package/dist/cli/chunks/{status-handler-2HK7XPEK.js → status-handler-OSSFAP4Z.js} +2 -2
- package/dist/cli/chunks/{structural-health-DSJVLEPV.js → structural-health-PGY5XUNO.js} +2 -2
- package/dist/cli/chunks/{sync-NTUR53PI.js → sync-CWEHYGNN.js} +2 -2
- package/dist/cli/chunks/sync-PM6D7EQF.js +2 -0
- package/dist/cli/chunks/task-handler-LHMQ75W4.js +64 -0
- package/dist/cli/chunks/{task-handlers-VJR6EHRZ.js → task-handlers-S2TX5FTR.js} +4 -4
- package/dist/cli/chunks/test-4EGZZ6NJ.js +34 -0
- package/dist/cli/chunks/test-runner-process-72YACW6M.js +2 -0
- package/dist/cli/chunks/{test-scheduling-Q6QEEOS6.js → test-scheduling-YJQHH3XE.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-DJNETMVW.js +2 -0
- package/dist/cli/chunks/{token-usage-YEEFWSSI.js → token-usage-WPNOJR6H.js} +2 -2
- package/dist/cli/chunks/{transformers-BZCHJJJT.js → transformers-4MRPXCPU.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-UVWSDXFR.js +2 -0
- package/dist/cli/chunks/{types-4AOKZYOX.js → types-6P5FB4EB.js} +2 -2
- package/dist/cli/chunks/unified-memory-2VMGSGQL.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-3KULVD3N.js +2 -0
- package/dist/cli/chunks/unified-persistence-QCSLU2SV.js +2 -0
- package/dist/cli/chunks/{upgrade-2MWW6BT2.js → upgrade-4ICTN63Y.js} +2 -2
- package/dist/cli/chunks/{validate-PAEV3GT5.js → validate-HQF5GZ7L.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-ZIXACK5K.js → validate-swarm-45JYG7VW.js} +2 -2
- package/dist/cli/chunks/visual-security-ZYP2KPH7.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-VLTXZFAB.js → web-tree-sitter-UOTWZLNH.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-VELMLOZF.js → windsurf-installer-WDWSBXGN.js} +2 -2
- package/dist/cli/chunks/witness-chain-5QRT7EMX.js +2 -0
- package/dist/cli/chunks/witness-chain-DOYMNPC7.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-CUF2AFQB.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-MIDWD4JS.js → witness-chain-verifier-JB42X62J.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-OSVCWOB2.js → witness-key-manager-LXXO6L2G.js} +2 -2
- package/dist/cli/chunks/{workflow-MK7A7QCX.js → workflow-6ARK47NF.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-RYDDWIXN.js +2 -0
- package/dist/cli/chunks/wrappers-CYQBOMPL.js +2 -0
- package/dist/cli/commands/code.js +4 -0
- package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +10 -2
- package/dist/cli/commands/test.js +26 -4
- package/dist/cli/handlers/task-handler.d.ts +5 -0
- package/dist/cli/handlers/task-handler.js +21 -1
- package/dist/cli/utils/task-result.d.ts +11 -0
- package/dist/cli/utils/task-result.js +39 -0
- package/dist/coordination/handlers/test-execution-handlers.js +137 -59
- package/dist/coordination/mincut/mincut-persistence.js +29 -25
- package/dist/domains/code-intelligence/coordinator.d.ts +4 -0
- package/dist/domains/code-intelligence/coordinator.js +46 -13
- package/dist/domains/code-intelligence/interfaces.d.ts +10 -1
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +37 -7
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +135 -62
- package/dist/domains/code-intelligence/services/text-relevance.d.ts +32 -0
- package/dist/domains/code-intelligence/services/text-relevance.js +63 -0
- package/dist/domains/learning-optimization/services/learning-coordinator.js +1 -1
- package/dist/domains/quality-assessment/coordinator.js +2 -1
- package/dist/domains/test-execution/coordinator.d.ts +3 -1
- package/dist/domains/test-execution/coordinator.js +21 -7
- package/dist/domains/test-execution/interfaces.d.ts +17 -0
- package/dist/domains/test-execution/plugin.js +8 -2
- package/dist/domains/test-execution/services/flaky-detector.d.ts +9 -1
- package/dist/domains/test-execution/services/flaky-detector.js +26 -8
- package/dist/domains/test-execution/services/retry-handler.d.ts +9 -1
- package/dist/domains/test-execution/services/retry-handler.js +56 -12
- package/dist/domains/test-execution/services/runner-test-cases.d.ts +2 -0
- package/dist/domains/test-execution/services/runner-test-cases.js +7 -3
- package/dist/domains/test-execution/services/test-executor.d.ts +6 -1
- package/dist/domains/test-execution/services/test-executor.js +97 -14
- package/dist/domains/visual-accessibility/coordinator.d.ts +15 -7
- package/dist/domains/visual-accessibility/coordinator.js +15 -7
- package/dist/domains/visual-accessibility/interfaces.d.ts +27 -3
- package/dist/domains/visual-accessibility/services/accessibility-contrast.d.ts +39 -0
- package/dist/domains/visual-accessibility/services/accessibility-contrast.js +93 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-browser.d.ts +18 -3
- package/dist/domains/visual-accessibility/services/accessibility-tester-browser.js +50 -40
- package/dist/domains/visual-accessibility/services/accessibility-tester-checks.d.ts +27 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-checks.js +137 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +5 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester.js +43 -24
- package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.d.ts +2 -3
- package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.js +8 -14
- package/dist/feedback/coverage-learner.js +13 -9
- package/dist/feedback/test-outcome-tracker.js +13 -9
- package/dist/governance/witness-chain.d.ts +5 -0
- package/dist/governance/witness-chain.js +22 -6
- package/dist/init/copilot-installer.d.ts +6 -0
- package/dist/init/copilot-installer.js +37 -17
- package/dist/init/platform-config-generator.d.ts +10 -0
- package/dist/init/platform-config-generator.js +26 -1
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +22 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +115 -45
- package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.d.ts +6 -0
- package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.js +51 -33
- package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +17 -9
- package/dist/integrations/embeddings/cache/EmbeddingCache.d.ts +8 -0
- package/dist/integrations/embeddings/cache/EmbeddingCache.js +24 -10
- package/dist/integrations/ruvector/delta-tracker.d.ts +11 -0
- package/dist/integrations/ruvector/delta-tracker.js +16 -0
- package/dist/integrations/ruvector/sona-persistence.d.ts +10 -0
- package/dist/integrations/ruvector/sona-persistence.js +49 -24
- package/dist/kernel/unified-memory.d.ts +32 -0
- package/dist/kernel/unified-memory.js +76 -8
- package/dist/learning/aqe-learning-engine.js +1 -1
- package/dist/learning/embed-and-insert-pattern.js +4 -2
- package/dist/learning/embedder-endpoint-client.d.ts +76 -0
- package/dist/learning/embedder-endpoint-client.js +201 -13
- package/dist/learning/embedding-space-registry.d.ts +75 -0
- package/dist/learning/embedding-space-registry.js +142 -0
- package/dist/learning/embedding-space.d.ts +12 -0
- package/dist/learning/embedding-space.js +17 -0
- package/dist/learning/experience-capture-middleware.js +25 -13
- package/dist/learning/experience-capture.js +1 -1
- package/dist/learning/experience-consolidation.d.ts +18 -0
- package/dist/learning/experience-consolidation.js +55 -8
- package/dist/learning/experience-space-verification.d.ts +71 -0
- package/dist/learning/experience-space-verification.js +147 -0
- package/dist/learning/pattern-lifecycle.d.ts +40 -4
- package/dist/learning/pattern-lifecycle.js +153 -76
- package/dist/learning/pattern-null-store.d.ts +5 -0
- package/dist/learning/pattern-null-store.js +8 -0
- package/dist/learning/pattern-promotion.js +6 -3
- package/dist/learning/pattern-store.d.ts +6 -0
- package/dist/learning/pattern-store.js +19 -6
- package/dist/learning/qe-reasoning-bank.js +2 -2
- package/dist/learning/real-embeddings.d.ts +3 -0
- package/dist/learning/real-embeddings.js +52 -12
- package/dist/learning/real-qe-reasoning-bank.d.ts +5 -0
- package/dist/learning/real-qe-reasoning-bank.js +77 -47
- package/dist/learning/rvf-pattern-store.js +6 -2
- package/dist/learning/sqlite-persistence.d.ts +6 -0
- package/dist/learning/sqlite-persistence.js +10 -0
- package/dist/mcp/bundle.js +699 -619
- package/dist/mcp/entry.js +4 -0
- package/dist/mcp/handlers/domain-handler-configs.js +2 -0
- package/dist/mcp/handlers/trajectory-judge.js +1 -1
- package/dist/mcp/protocol-server.js +1 -0
- package/dist/mcp/tools/visual-accessibility/index.js +8 -2
- package/dist/mcp/types.d.ts +6 -0
- package/dist/optimization/session-cache.d.ts +17 -1
- package/dist/optimization/session-cache.js +40 -36
- package/dist/planning/goap-planner.d.ts +6 -0
- package/dist/planning/goap-planner.js +35 -19
- package/dist/planning/plan-executor.js +24 -15
- package/dist/routing/co-execution-repository.js +12 -9
- package/dist/routing/routing-feedback.d.ts +8 -0
- package/dist/routing/routing-feedback.js +46 -24
- package/dist/routing/routing-outcomes-migration.js +7 -2
- package/dist/shared/embeddings/index.d.ts +2 -2
- package/dist/shared/embeddings/index.js +1 -1
- package/dist/shared/embeddings/nomic-embedder.d.ts +8 -2
- package/dist/shared/embeddings/nomic-embedder.js +19 -11
- package/dist/shared/embeddings/ollama-client.d.ts +28 -2
- package/dist/shared/embeddings/ollama-client.js +84 -22
- package/dist/shared/embeddings/types.d.ts +15 -0
- package/dist/shared/embeddings/types.js +4 -0
- package/dist/shared/llm/spend-ledger.d.ts +9 -0
- package/dist/shared/llm/spend-ledger.js +64 -39
- package/dist/shared/pytest-junit-report.d.ts +93 -0
- package/dist/shared/pytest-junit-report.js +241 -0
- package/dist/shared/sqlite-lock-wait.d.ts +27 -0
- package/dist/shared/sqlite-lock-wait.js +37 -0
- package/dist/shared/sqlite-write-queue.d.ts +28 -0
- package/dist/shared/sqlite-write-queue.js +38 -0
- package/dist/shared/test-runner-project.d.ts +119 -0
- package/dist/shared/test-runner-project.js +301 -0
- package/dist/skills/security-visual-testing/index.d.ts +3 -1
- package/dist/skills/security-visual-testing/index.js +49 -35
- package/dist/skills/security-visual-testing/types.d.ts +19 -3
- package/dist/workers/workers/heartbeat-scheduler.js +5 -5
- package/dist/workers/workers/learning-consolidation.js +8 -7
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-QU6INSKP.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-PAJPENJD.js +0 -2
- package/dist/cli/chunks/base-OTGSN6IC.js +0 -2
- package/dist/cli/chunks/browser-workflow-WLZGR6SB.js +0 -2
- package/dist/cli/chunks/chunk-2LUTPMBO.js +0 -21
- package/dist/cli/chunks/chunk-3HVFIITW.js +0 -2
- package/dist/cli/chunks/chunk-4D4CWP72.js +0 -2
- package/dist/cli/chunks/chunk-5KA5TVPR.js +0 -6
- package/dist/cli/chunks/chunk-6NBRMD25.js +0 -13
- package/dist/cli/chunks/chunk-7O45RQHF.js +0 -153
- package/dist/cli/chunks/chunk-EMSZVUYA.js +0 -29
- package/dist/cli/chunks/chunk-G6RDCCFV.js +0 -4
- package/dist/cli/chunks/chunk-HH4ED4F7.js +0 -744
- package/dist/cli/chunks/chunk-Q6I4SIUU.js +0 -65
- package/dist/cli/chunks/chunk-QGBGSQ2E.js +0 -14
- package/dist/cli/chunks/chunk-QRKTBSZT.js +0 -27
- package/dist/cli/chunks/chunk-SHRI7TKJ.js +0 -62
- package/dist/cli/chunks/chunk-TX2CHQD7.js +0 -2
- package/dist/cli/chunks/chunk-UGYM4U44.js +0 -2
- package/dist/cli/chunks/chunk-VY4U6DPO.js +0 -12
- package/dist/cli/chunks/chunk-WNTA4YKE.js +0 -14
- package/dist/cli/chunks/chunk-XHLYGXYE.js +0 -2
- package/dist/cli/chunks/client-KKRNPX4F.js +0 -2
- package/dist/cli/chunks/copilot-installer-BHPDSELY.js +0 -3
- package/dist/cli/chunks/core-handlers-47MPMED7.js +0 -2
- package/dist/cli/chunks/cross-domain-router-U6MBFHEC.js +0 -2
- package/dist/cli/chunks/daemon-AXLVPKVO.js +0 -18
- package/dist/cli/chunks/dream-76L6EEN7.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-B6MNHICW.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-SUFILYPW.js +0 -40
- package/dist/cli/chunks/file-discovery-VSFKZ3LJ.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-NIK3KKEH.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-WJG7LUJJ.js +0 -2
- package/dist/cli/chunks/hnsw-index-D6PRI5HC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-RIUR3I7F.js +0 -2
- package/dist/cli/chunks/impact-analyzer-C36YYTJ5.js +0 -2
- package/dist/cli/chunks/init-wizard-JCKNGIGT.js +0 -2
- package/dist/cli/chunks/kernel-F7ILJTYD.js +0 -2
- package/dist/cli/chunks/knowledge-graph-VTXDBHB2.js +0 -2
- package/dist/cli/chunks/llm-router-service-TNOWQINA.js +0 -2
- package/dist/cli/chunks/load-test-FPVBK2EV.js +0 -2
- package/dist/cli/chunks/memory-backend-2QE7O67A.js +0 -2
- package/dist/cli/chunks/memory-handlers-X4CMVBXB.js +0 -2
- package/dist/cli/chunks/pattern-null-store-UI35ORHW.js +0 -2
- package/dist/cli/chunks/project-root-S7WDFTMU.js +0 -2
- package/dist/cli/chunks/protocol-executor-OPANXQVB.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-3OTF4DYQ.js +0 -2
- package/dist/cli/chunks/queen-coordinator-WTYH4TAN.js +0 -2
- package/dist/cli/chunks/real-embeddings-DYIOLKQ3.js +0 -2
- package/dist/cli/chunks/router-DBBW4NC2.js +0 -2
- package/dist/cli/chunks/routing-feedback-W35QHCL4.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-X3NSL25Z.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-TZR7GDOK.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-4ATTHGHD.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-HD25ZYV5.js +0 -2
- package/dist/cli/chunks/safe-db-ZS2QKANY.js +0 -2
- package/dist/cli/chunks/schedule-ZH6VNA32.js +0 -2
- package/dist/cli/chunks/scheduler-T6CD74B6.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-47WU5EKZ.js +0 -2
- package/dist/cli/chunks/sync-3MUV6S5E.js +0 -2
- package/dist/cli/chunks/task-handler-74MZN2EO.js +0 -62
- package/dist/cli/chunks/test-O6FK3FVF.js +0 -34
- package/dist/cli/chunks/test-runner-process-2NPW3UDQ.js +0 -2
- package/dist/cli/chunks/token-bootstrap-TTRCECLP.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-RZAND65G.js +0 -2
- package/dist/cli/chunks/unified-memory-FZ5K2C7W.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-VREWX56M.js +0 -2
- package/dist/cli/chunks/unified-persistence-YZGMKX6B.js +0 -2
- package/dist/cli/chunks/visual-security-GXGSFBVA.js +0 -2
- package/dist/cli/chunks/witness-chain-MRJKVCOW.js +0 -2
- package/dist/cli/chunks/witness-chain-WWHJKITG.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-5SAXPETG.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-SG7DV72E.js +0 -2
- package/dist/cli/chunks/wrappers-5QFMCKXL.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
|
-
|
|
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.
|
|
@@ -82,35 +87,79 @@ export function parseEndpoint(endpoint) {
|
|
|
82
87
|
safeUrl: url.toString().replace(/\/$/, ''),
|
|
83
88
|
};
|
|
84
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* #1216: a connect or request timeout. The host did not answer within the
|
|
92
|
+
* budget, so the breaker opens on the first one instead of counting it as one
|
|
93
|
+
* failure of `failureThreshold`.
|
|
94
|
+
*/
|
|
95
|
+
export class EmbedderEndpointTimeoutError extends Error {
|
|
96
|
+
phase;
|
|
97
|
+
limitMs;
|
|
98
|
+
constructor(phase, limitMs) {
|
|
99
|
+
super(`[EmbedderEndpointClient] ${phase} timeout after ${limitMs}ms`);
|
|
100
|
+
this.phase = phase;
|
|
101
|
+
this.limitMs = limitMs;
|
|
102
|
+
this.name = 'EmbedderEndpointTimeoutError';
|
|
103
|
+
}
|
|
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
|
+
}
|
|
85
124
|
/**
|
|
86
125
|
* Circuit breaker state.
|
|
87
126
|
*
|
|
88
|
-
* Tracks failure timestamps within `windowMs`. Opens when count reaches `threshold
|
|
127
|
+
* Tracks failure timestamps within `windowMs`. Opens when count reaches `threshold`,
|
|
128
|
+
* or at once on a timeout (#1216): timeouts arrive one timeout apart, so with a
|
|
129
|
+
* 30 s request timeout and a 60 s window they would never add up to three.
|
|
89
130
|
* While open, every request fast-fails until the window expires. On recovery
|
|
90
131
|
* (window elapses), the breaker calls `onRecover` so the client can invalidate
|
|
91
132
|
* cached endpoint identity — endpoint restarts often coincide with model swaps.
|
|
133
|
+
* Whenever it opens, it calls `onTrip` so the client can abandon requests
|
|
134
|
+
* still waiting on the host.
|
|
92
135
|
*/
|
|
93
136
|
class CircuitBreaker {
|
|
94
137
|
threshold;
|
|
95
138
|
windowMs;
|
|
96
139
|
onRecover;
|
|
140
|
+
onTrip;
|
|
97
141
|
failures = [];
|
|
98
142
|
trippedAt = null;
|
|
99
|
-
constructor(threshold, windowMs, onRecover = () => { }) {
|
|
143
|
+
constructor(threshold, windowMs, onRecover = () => { }, onTrip = () => { }) {
|
|
100
144
|
this.threshold = threshold;
|
|
101
145
|
this.windowMs = windowMs;
|
|
102
146
|
this.onRecover = onRecover;
|
|
147
|
+
this.onTrip = onTrip;
|
|
103
148
|
}
|
|
104
149
|
recordSuccess() {
|
|
105
150
|
this.failures = [];
|
|
106
151
|
this.trippedAt = null;
|
|
107
152
|
}
|
|
108
|
-
recordFailure() {
|
|
153
|
+
recordFailure(tripNow = false) {
|
|
154
|
+
// Requests abandoned when the breaker opened fail too; they must not
|
|
155
|
+
// extend the window.
|
|
156
|
+
if (this.trippedAt !== null)
|
|
157
|
+
return;
|
|
109
158
|
const now = Date.now();
|
|
110
159
|
this.failures = this.failures.filter((t) => now - t < this.windowMs);
|
|
111
160
|
this.failures.push(now);
|
|
112
|
-
if (this.failures.length >= this.threshold) {
|
|
113
|
-
this.
|
|
161
|
+
if (tripNow || this.failures.length >= this.threshold) {
|
|
162
|
+
this.trip();
|
|
114
163
|
}
|
|
115
164
|
}
|
|
116
165
|
isOpen() {
|
|
@@ -128,12 +177,16 @@ class CircuitBreaker {
|
|
|
128
177
|
/** #1204: open (or re-open) the breaker for a full window from now. */
|
|
129
178
|
trip() {
|
|
130
179
|
this.trippedAt = Date.now();
|
|
180
|
+
this.onTrip();
|
|
131
181
|
}
|
|
132
182
|
/** For tests / observability */
|
|
133
183
|
getState() {
|
|
134
184
|
return { open: this.isOpen(), failures: this.failures.length, trippedAt: this.trippedAt };
|
|
135
185
|
}
|
|
136
186
|
}
|
|
187
|
+
function sameIdentity(a, b) {
|
|
188
|
+
return a.fingerprint === b.fingerprint && a.dim === b.dim;
|
|
189
|
+
}
|
|
137
190
|
/**
|
|
138
191
|
* OpenAI-compatible embeddings client with keep-alive, circuit breaker, and identity probe.
|
|
139
192
|
*/
|
|
@@ -143,8 +196,25 @@ export class EmbedderEndpointClient {
|
|
|
143
196
|
breaker;
|
|
144
197
|
opts;
|
|
145
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;
|
|
146
208
|
/** True while a probe is in flight — prevents the embed() lazy-probe race. */
|
|
147
209
|
probeInFlight = null;
|
|
210
|
+
/**
|
|
211
|
+
* #1216: set when the breaker window elapsed and no probe has succeeded
|
|
212
|
+
* since. The next probe is the breaker's half-open trial; it runs in the
|
|
213
|
+
* background so no caller waits on a host that may still not answer.
|
|
214
|
+
*/
|
|
215
|
+
trialPending = false;
|
|
216
|
+
/** #1216: requests waiting on the host, abandoned when the breaker opens. */
|
|
217
|
+
inFlight = new Set();
|
|
148
218
|
constructor(options) {
|
|
149
219
|
this.opts = {
|
|
150
220
|
endpoint: options.endpoint,
|
|
@@ -177,6 +247,35 @@ export class EmbedderEndpointClient {
|
|
|
177
247
|
// On breaker recovery, drop identity so the next embed() re-probes.
|
|
178
248
|
// Endpoint restarts (the common cause of recovery) often change models.
|
|
179
249
|
this.cachedIdentity = null;
|
|
250
|
+
this.trialPending = true;
|
|
251
|
+
}, () => this.abandonInFlight());
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* #1216: the breaker opened, so the host is treated as down. Requests that
|
|
255
|
+
* are still waiting on it fail now rather than each waiting out its own
|
|
256
|
+
* timeout.
|
|
257
|
+
*/
|
|
258
|
+
abandonInFlight() {
|
|
259
|
+
if (this.inFlight.size === 0)
|
|
260
|
+
return;
|
|
261
|
+
const err = new Error(`[EmbedderEndpointClient] circuit breaker opened for ${this.parsed.safeUrl} — request abandoned`);
|
|
262
|
+
for (const reject of [...this.inFlight])
|
|
263
|
+
reject(err);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* #1216: true while the endpoint is not known to work: the breaker is open,
|
|
267
|
+
* or its window elapsed and the trial probe has not succeeded yet.
|
|
268
|
+
*/
|
|
269
|
+
needsTrial() {
|
|
270
|
+
return this.breaker.isOpen() || this.trialPending;
|
|
271
|
+
}
|
|
272
|
+
/** Start the half-open trial probe in the background (one at a time). */
|
|
273
|
+
startTrialProbe() {
|
|
274
|
+
if (this.probeInFlight)
|
|
275
|
+
return;
|
|
276
|
+
this.probe().catch(() => {
|
|
277
|
+
// Still failing: keep fast-failing for another full window.
|
|
278
|
+
this.breaker.trip();
|
|
180
279
|
});
|
|
181
280
|
}
|
|
182
281
|
/** Public, redacted endpoint URL for logs/metrics. */
|
|
@@ -197,10 +296,21 @@ export class EmbedderEndpointClient {
|
|
|
197
296
|
if (texts.length === 0)
|
|
198
297
|
return [];
|
|
199
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;
|
|
200
302
|
throw new Error(`[EmbedderEndpointClient] circuit breaker open for ${this.parsed.safeUrl} — fast-failing`);
|
|
201
303
|
}
|
|
202
304
|
// Identity gate: every embed call must have a verified identity behind it.
|
|
203
305
|
if (this.cachedIdentity === null) {
|
|
306
|
+
if (this.trialPending) {
|
|
307
|
+
// #1216: half-open. The endpoint failed until a window ago and may
|
|
308
|
+
// still not answer. Probe it in the background as the single trial
|
|
309
|
+
// and fail fast here; callers after a successful trial embed again.
|
|
310
|
+
this.startTrialProbe();
|
|
311
|
+
throw new Error(`[EmbedderEndpointClient] circuit breaker half-open for ${this.parsed.safeUrl} — ` +
|
|
312
|
+
`trial probe running, fast-failing`);
|
|
313
|
+
}
|
|
204
314
|
await this.ensureProbed();
|
|
205
315
|
}
|
|
206
316
|
try {
|
|
@@ -210,7 +320,7 @@ export class EmbedderEndpointClient {
|
|
|
210
320
|
return vectors;
|
|
211
321
|
}
|
|
212
322
|
catch (err) {
|
|
213
|
-
this.breaker.recordFailure();
|
|
323
|
+
this.breaker.recordFailure(err instanceof EmbedderEndpointTimeoutError);
|
|
214
324
|
throw err;
|
|
215
325
|
}
|
|
216
326
|
}
|
|
@@ -242,7 +352,7 @@ export class EmbedderEndpointClient {
|
|
|
242
352
|
this.breaker.recordSuccess();
|
|
243
353
|
}
|
|
244
354
|
catch (err) {
|
|
245
|
-
this.breaker.recordFailure();
|
|
355
|
+
this.breaker.recordFailure(err instanceof EmbedderEndpointTimeoutError);
|
|
246
356
|
throw err;
|
|
247
357
|
}
|
|
248
358
|
if (!vec || vec.length !== this.opts.expectedDim) {
|
|
@@ -257,16 +367,73 @@ export class EmbedderEndpointClient {
|
|
|
257
367
|
buf.writeInt16LE(q, i * 2);
|
|
258
368
|
}
|
|
259
369
|
const fingerprint = createHash('sha256').update(buf).digest('hex').slice(0, 16);
|
|
260
|
-
|
|
370
|
+
const identity = {
|
|
261
371
|
dim: vec.length,
|
|
262
372
|
fingerprint,
|
|
263
373
|
endpoint: this.parsed.safeUrl,
|
|
264
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;
|
|
387
|
+
this.trialPending = false;
|
|
265
388
|
return this.cachedIdentity;
|
|
266
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
|
+
}
|
|
267
426
|
getCachedIdentity() {
|
|
268
427
|
return this.cachedIdentity;
|
|
269
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
|
+
}
|
|
270
437
|
getBreakerState() {
|
|
271
438
|
return this.breaker.getState();
|
|
272
439
|
}
|
|
@@ -374,18 +541,30 @@ export class EmbedderEndpointClient {
|
|
|
374
541
|
const requestTimeoutMs = this.opts.requestTimeoutMs;
|
|
375
542
|
return new Promise((resolve, reject) => {
|
|
376
543
|
let settled = false;
|
|
544
|
+
// #1285: removes this request's listeners from its socket. Keep-alive
|
|
545
|
+
// sockets serve many requests; listeners left behind pile up and a
|
|
546
|
+
// finished request's timeout handler would fire for a later request.
|
|
547
|
+
let detachFromSocket = () => { };
|
|
377
548
|
const safeResolve = (val) => {
|
|
378
549
|
if (settled)
|
|
379
550
|
return;
|
|
380
551
|
settled = true;
|
|
552
|
+
detachFromSocket();
|
|
553
|
+
this.inFlight.delete(abandon);
|
|
381
554
|
resolve(val);
|
|
382
555
|
};
|
|
383
556
|
const safeReject = (err) => {
|
|
384
557
|
if (settled)
|
|
385
558
|
return;
|
|
386
559
|
settled = true;
|
|
560
|
+
detachFromSocket();
|
|
561
|
+
this.inFlight.delete(abandon);
|
|
387
562
|
reject(err);
|
|
388
563
|
};
|
|
564
|
+
const abandon = (err) => {
|
|
565
|
+
safeReject(err);
|
|
566
|
+
req.destroy(err);
|
|
567
|
+
};
|
|
389
568
|
const req = requestFn(reqOptions, (res) => {
|
|
390
569
|
const chunks = [];
|
|
391
570
|
res.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
|
|
@@ -426,18 +605,27 @@ export class EmbedderEndpointClient {
|
|
|
426
605
|
else {
|
|
427
606
|
onConnect();
|
|
428
607
|
}
|
|
429
|
-
|
|
608
|
+
const onTimeout = () => {
|
|
430
609
|
// Distinguish phase for the error message.
|
|
431
610
|
const phase = socket.connecting ? 'connect' : 'request';
|
|
432
611
|
const limit = socket.connecting ? connectTimeoutMs : requestTimeoutMs;
|
|
433
|
-
const err = new
|
|
612
|
+
const err = new EmbedderEndpointTimeoutError(phase, limit);
|
|
434
613
|
// Reject FIRST, then destroy. If we destroy first, the 'error' event
|
|
435
614
|
// races us and we might lose the timeout-specific message.
|
|
436
615
|
safeReject(err);
|
|
437
616
|
req.destroy(err);
|
|
438
|
-
}
|
|
617
|
+
};
|
|
618
|
+
socket.on('timeout', onTimeout);
|
|
619
|
+
detachFromSocket = () => {
|
|
620
|
+
socket.removeListener('timeout', onTimeout);
|
|
621
|
+
socket.removeListener('connect', onConnect);
|
|
622
|
+
};
|
|
623
|
+
// Settled before the socket was assigned: nothing of ours may stay on it.
|
|
624
|
+
if (settled)
|
|
625
|
+
detachFromSocket();
|
|
439
626
|
});
|
|
440
627
|
req.on('error', (err) => safeReject(err));
|
|
628
|
+
this.inFlight.add(abandon);
|
|
441
629
|
req.write(body);
|
|
442
630
|
req.end();
|
|
443
631
|
});
|
|
@@ -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
|
|
@@ -57,6 +57,18 @@ export declare const EMBEDDING_RUNTIME_UNAVAILABLE_CAUSE: string;
|
|
|
57
57
|
export declare function reportEmbeddingRuntimeUnavailable(): void;
|
|
58
58
|
/** @internal test-only seam */
|
|
59
59
|
export declare function __resetEmbeddingRuntimeNoticeForTests(): void;
|
|
60
|
+
/**
|
|
61
|
+
* #1217: record the embedding space of a vector stored on a
|
|
62
|
+
* captured_experiences row. ExperienceReplay compares only vectors of the
|
|
63
|
+
* active space. On a table without the column (it is added by
|
|
64
|
+
* ExperienceReplay's schema) the vector stays without provenance: it is never
|
|
65
|
+
* compared, and ExperienceReplay re-embeds it at its next start.
|
|
66
|
+
*/
|
|
67
|
+
export declare function recordExperienceEmbeddingSpace(db: {
|
|
68
|
+
prepare(sql: string): {
|
|
69
|
+
run(...params: unknown[]): unknown;
|
|
70
|
+
};
|
|
71
|
+
}, experienceId: string, spaceId: string | undefined): void;
|
|
60
72
|
/** Sidecar path used to bind a persistent ANN index to one embedding space. */
|
|
61
73
|
export declare function embeddingSpaceManifestPath(indexPath: string): string;
|
|
62
74
|
/**
|
|
@@ -120,6 +120,23 @@ export function reportEmbeddingRuntimeUnavailable() {
|
|
|
120
120
|
export function __resetEmbeddingRuntimeNoticeForTests() {
|
|
121
121
|
embeddingRuntimeNoticeShown = false;
|
|
122
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* #1217: record the embedding space of a vector stored on a
|
|
125
|
+
* captured_experiences row. ExperienceReplay compares only vectors of the
|
|
126
|
+
* active space. On a table without the column (it is added by
|
|
127
|
+
* ExperienceReplay's schema) the vector stays without provenance: it is never
|
|
128
|
+
* compared, and ExperienceReplay re-embeds it at its next start.
|
|
129
|
+
*/
|
|
130
|
+
export function recordExperienceEmbeddingSpace(db, experienceId, spaceId) {
|
|
131
|
+
if (!spaceId)
|
|
132
|
+
return;
|
|
133
|
+
try {
|
|
134
|
+
db.prepare('UPDATE captured_experiences SET embedding_space_id = ? WHERE id = ?').run(spaceId, experienceId);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Older table without the column; see above.
|
|
138
|
+
}
|
|
139
|
+
}
|
|
123
140
|
/** Sidecar path used to bind a persistent ANN index to one embedding space. */
|
|
124
141
|
export function embeddingSpaceManifestPath(indexPath) {
|
|
125
142
|
return `${indexPath}.space.json`;
|