agentic-qe 3.15.14 → 3.15.16
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/agents/v3/templates/qx-report-template.html +1 -1
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +136 -0
- package/assets/agents/v3/templates/qx-report-template.html +1 -1
- 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-6CQ2PIP5.js +2 -0
- package/dist/cli/chunks/agent-booster-wasm-45NWEKVS.js +2 -0
- package/dist/cli/chunks/{agent-handler-P3IY7XEE.js → agent-handler-LVHMYFEF.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-WWKC2H3G.js → agent-memory-branch-YDWOJFEQ.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +2 -0
- package/dist/cli/chunks/{arena-EIV5OALF.js → arena-CZKHXDDS.js} +2 -2
- package/dist/cli/chunks/{arena-4BMFF6BS.js → arena-ELDZH3CZ.js} +4 -4
- package/dist/cli/chunks/{audit-DNTI453H.js → audit-5MT4T47Z.js} +3 -3
- package/dist/cli/chunks/base-SMCMMVGP.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-TQBQGNC6.js → better-sqlite3-6TGYPC2B.js} +2 -2
- package/dist/cli/chunks/{brain-handler-HY57CNAO.js → brain-handler-HQWZFO52.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-THPMZPHQ.js → branch-enumerator-WVILM4SO.js} +2 -2
- package/dist/cli/chunks/{browser-O6JJOZCK.js → browser-RX5ALU3H.js} +2 -2
- package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +2 -0
- package/dist/cli/chunks/{chunk-CIINJHOX.js → chunk-24OX5TQJ.js} +1 -1
- package/dist/cli/chunks/{chunk-6P4Q4RTC.js → chunk-24QHCVX6.js} +1 -1
- package/dist/cli/chunks/{chunk-U6IOQKCT.js → chunk-2H4XH6FT.js} +2 -2
- package/dist/cli/chunks/{chunk-OGEIHS76.js → chunk-2YZ4G6NW.js} +1 -1
- package/dist/cli/chunks/chunk-32BPDLRZ.js +27 -0
- package/dist/cli/chunks/{chunk-5PLBQZ5J.js → chunk-32GN3JKR.js} +1 -1
- package/dist/cli/chunks/{chunk-AJVLVF7V.js → chunk-3HD7E6HN.js} +2 -2
- package/dist/cli/chunks/{chunk-X7CUI7KH.js → chunk-4D4DENG6.js} +2 -2
- package/dist/cli/chunks/{chunk-E2JLAW3U.js → chunk-4LQFBY5L.js} +6 -6
- package/dist/cli/chunks/{chunk-E3QIQMMN.js → chunk-4NFQLP6R.js} +1 -1
- package/dist/cli/chunks/{chunk-7Y3LXH57.js → chunk-525CFDUE.js} +2 -2
- package/dist/cli/chunks/chunk-5B5QPCNU.js +65 -0
- package/dist/cli/chunks/{chunk-X6Q2N5S5.js → chunk-5JZRZI4S.js} +2 -2
- package/dist/cli/chunks/{chunk-MB4UKUBV.js → chunk-5LAVKGLH.js} +2 -2
- package/dist/cli/chunks/chunk-5NNNEWLS.js +755 -0
- package/dist/cli/chunks/{chunk-NKOLILT7.js → chunk-5PBLPQ5T.js} +2 -2
- package/dist/cli/chunks/chunk-5QO3R3TU.js +6 -0
- package/dist/cli/chunks/{chunk-7T6L3LFN.js → chunk-5SPCGMBB.js} +2 -2
- package/dist/cli/chunks/{chunk-2QLE6NDW.js → chunk-5V3TI2LG.js} +1 -1
- package/dist/cli/chunks/{chunk-A2T56XVL.js → chunk-5VZL4UVN.js} +2 -2
- package/dist/cli/chunks/{chunk-TWOV3I3A.js → chunk-63GMRQ25.js} +1 -1
- package/dist/cli/chunks/{chunk-YGOSSVY5.js → chunk-63ZKI4PX.js} +6 -6
- package/dist/cli/chunks/{chunk-FHPNWHY7.js → chunk-67Z5R7RJ.js} +2 -2
- package/dist/cli/chunks/{chunk-PCQZIAXB.js → chunk-6DPYNAOK.js} +2 -2
- package/dist/cli/chunks/{chunk-WCM6WE7G.js → chunk-6ICX3FEG.js} +3 -3
- package/dist/cli/chunks/{chunk-JB7R77SH.js → chunk-6XXZDV2C.js} +2 -2
- package/dist/cli/chunks/{chunk-FJOIBZUB.js → chunk-6ZBXSOX6.js} +2 -2
- package/dist/cli/chunks/{chunk-WZQADC5R.js → chunk-72XSEQMW.js} +2 -2
- package/dist/cli/chunks/{chunk-AYLEH2UF.js → chunk-7TE5ONQQ.js} +1 -1
- package/dist/cli/chunks/{chunk-7QUSNBAA.js → chunk-A5GBXCP5.js} +2 -2
- package/dist/cli/chunks/{chunk-7724KXM2.js → chunk-AAMLQ2LF.js} +3 -3
- package/dist/cli/chunks/chunk-AG2EWGXS.js +21 -0
- package/dist/cli/chunks/{chunk-2UZBLC5H.js → chunk-AGRV5B3T.js} +2 -2
- package/dist/cli/chunks/{chunk-V6SE2ZU2.js → chunk-AJMJNQMP.js} +1 -1
- package/dist/cli/chunks/{chunk-2HPNGK7A.js → chunk-AR67RJPY.js} +2 -2
- package/dist/cli/chunks/{chunk-G7HGUQAE.js → chunk-ASEOFRIG.js} +2 -2
- package/dist/cli/chunks/{chunk-7TH4PJSU.js → chunk-BEKDKVQT.js} +2 -2
- package/dist/cli/chunks/{chunk-M5JEA6ZY.js → chunk-BY5OF7OH.js} +2 -2
- package/dist/cli/chunks/{chunk-OLUOVNUF.js → chunk-C5FP5GW3.js} +2 -2
- package/dist/cli/chunks/{chunk-R5RRWLRI.js → chunk-C6D5AHBO.js} +2 -2
- package/dist/cli/chunks/{chunk-K7GFYFBO.js → chunk-CAKMOVZ6.js} +2 -2
- package/dist/cli/chunks/{chunk-6NIGSY5L.js → chunk-CEYSYSK5.js} +2 -2
- package/dist/cli/chunks/{chunk-U4TML2VD.js → chunk-CGGUM2YJ.js} +2 -2
- package/dist/cli/chunks/{chunk-YE54T2NQ.js → chunk-CJSHWQXP.js} +2 -2
- package/dist/cli/chunks/{chunk-7SQTLUEN.js → chunk-CRPIYUTJ.js} +2 -2
- package/dist/cli/chunks/{chunk-65EE2EST.js → chunk-D6COXLYE.js} +2 -2
- package/dist/cli/chunks/{chunk-4WLIOPHX.js → chunk-DTMAS2GB.js} +2 -2
- package/dist/cli/chunks/{chunk-E7QTWGPI.js → chunk-DVYHMDFR.js} +470 -411
- package/dist/cli/chunks/chunk-DXD6K2ZP.js +3 -0
- package/dist/cli/chunks/{chunk-HSDWPQQY.js → chunk-E3D4GPLP.js} +3 -3
- package/dist/cli/chunks/{chunk-JJHLGGPP.js → chunk-EA4YQVKS.js} +1 -1
- package/dist/cli/chunks/{chunk-EIEEST4T.js → chunk-EGYE5UPQ.js} +2 -2
- package/dist/cli/chunks/{chunk-O756AOUX.js → chunk-EK7OLYOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-57DRT6UA.js → chunk-F742SZAX.js} +2 -2
- package/dist/cli/chunks/{chunk-6OI5SK7M.js → chunk-FBDVGRSC.js} +1 -1
- package/dist/cli/chunks/{chunk-H3C5FJRH.js → chunk-FDDC72IA.js} +2 -2
- package/dist/cli/chunks/{chunk-IQRPR4KB.js → chunk-FL64OUBA.js} +2 -2
- package/dist/cli/chunks/{chunk-BNG4J3CE.js → chunk-FLNAW7C4.js} +2 -2
- package/dist/cli/chunks/{chunk-C3OIBFAA.js → chunk-G5RHFBAY.js} +2 -2
- package/dist/cli/chunks/{chunk-NPCXGX7N.js → chunk-GAHNO6JJ.js} +2 -2
- package/dist/cli/chunks/{chunk-PNRPVQGI.js → chunk-GFWHUQSF.js} +2 -2
- package/dist/cli/chunks/{chunk-OCN53CCK.js → chunk-GJYHWYXR.js} +2 -2
- package/dist/cli/chunks/{chunk-5Z4MO2F3.js → chunk-GQ6TUIKY.js} +1 -1
- package/dist/cli/chunks/{chunk-N736GLWZ.js → chunk-GSKMOPL7.js} +2 -2
- package/dist/cli/chunks/{chunk-43XHGWYH.js → chunk-HCH4Y6XX.js} +2 -2
- package/dist/cli/chunks/{chunk-QP6GL3O5.js → chunk-HGWXF45W.js} +1 -1
- package/dist/cli/chunks/{chunk-PGN4TARY.js → chunk-HJ6ZGVTB.js} +2 -2
- package/dist/cli/chunks/{chunk-M2TG7VDK.js → chunk-HLUXXCHF.js} +1 -1
- package/dist/cli/chunks/{chunk-UMHFTQTR.js → chunk-HVRRLYX6.js} +4 -4
- package/dist/cli/chunks/{chunk-L7PC675Y.js → chunk-I7MQIM2U.js} +1 -1
- package/dist/cli/chunks/{chunk-JSSU4RIK.js → chunk-IESR7TNB.js} +2 -2
- package/dist/cli/chunks/{chunk-H4LYXLAT.js → chunk-IHRXZZQM.js} +1 -1
- package/dist/cli/chunks/{chunk-HV43NX4A.js → chunk-IOKYCMTJ.js} +6 -6
- package/dist/cli/chunks/{chunk-NZQYJCO6.js → chunk-IOQ6ZQ5W.js} +1 -1
- package/dist/cli/chunks/{chunk-JO26SG47.js → chunk-IOYG4VFL.js} +2 -2
- package/dist/cli/chunks/{chunk-6O63ZTVX.js → chunk-IUBJVHNB.js} +2 -2
- package/dist/cli/chunks/{chunk-XSPMLJCQ.js → chunk-J442IZLE.js} +1 -1
- package/dist/cli/chunks/{chunk-LTGQJYYO.js → chunk-J4ELZNLY.js} +2 -2
- package/dist/cli/chunks/chunk-J7I6PABJ.js +153 -0
- package/dist/cli/chunks/chunk-JDIYMZCQ.js +2 -0
- package/dist/cli/chunks/{chunk-TOJF3ZG4.js → chunk-JHQCRRJI.js} +2 -2
- package/dist/cli/chunks/{chunk-QUZ745UQ.js → chunk-JQ3DYUMS.js} +2 -2
- package/dist/cli/chunks/{chunk-P2TPH3TC.js → chunk-KITOPKRG.js} +2 -2
- package/dist/cli/chunks/{chunk-QNQE3EOH.js → chunk-KKU2QGSJ.js} +2 -2
- package/dist/cli/chunks/chunk-KL7OKSU2.js +4 -0
- package/dist/cli/chunks/{chunk-L5VSLPMW.js → chunk-KNSRL6NO.js} +2 -2
- package/dist/cli/chunks/{chunk-INGXD5IX.js → chunk-KPRCB5LT.js} +2 -2
- package/dist/cli/chunks/{chunk-GY4P7KAI.js → chunk-KQYJ4VQ5.js} +1 -1
- package/dist/cli/chunks/{chunk-Z2S7DNFP.js → chunk-KU2AUFGX.js} +2 -2
- package/dist/cli/chunks/{chunk-O5CEL447.js → chunk-KVF4NXGQ.js} +2 -2
- package/dist/cli/chunks/{chunk-2IJO3657.js → chunk-KXCLACFG.js} +2 -2
- package/dist/cli/chunks/{chunk-ZJGFQK27.js → chunk-L2DWPVNJ.js} +1 -1
- package/dist/cli/chunks/{chunk-E7OR6V3V.js → chunk-L6QSTQME.js} +2 -2
- package/dist/cli/chunks/{chunk-RE6JTSDM.js → chunk-LE4QJREF.js} +1 -1
- package/dist/cli/chunks/{chunk-DSQESXL4.js → chunk-LKTTUHLF.js} +2 -2
- package/dist/cli/chunks/{chunk-YGC5QKQ4.js → chunk-LQLPB2T6.js} +2 -2
- package/dist/cli/chunks/{chunk-VGZOPQQY.js → chunk-LRSX2FJM.js} +1 -1
- package/dist/cli/chunks/chunk-M4FRQ4TE.js +12 -0
- package/dist/cli/chunks/chunk-M7WJCTG3.js +2 -0
- package/dist/cli/chunks/{chunk-56NSE3LJ.js → chunk-MAFQV4U4.js} +2 -2
- package/dist/cli/chunks/{chunk-MKYOE7NE.js → chunk-MD43XRX5.js} +1 -1
- package/dist/cli/chunks/{chunk-3TF27MG5.js → chunk-MI5MFHRA.js} +2 -2
- package/dist/cli/chunks/{chunk-JK6PMLQQ.js → chunk-MO55CVMT.js} +32 -32
- package/dist/cli/chunks/{chunk-X6NJOT3V.js → chunk-N7HL5PHH.js} +1 -1
- package/dist/cli/chunks/chunk-NAEWCFQT.js +14 -0
- package/dist/cli/chunks/{chunk-WUGXXNK4.js → chunk-NDJ7P2EP.js} +1 -1
- package/dist/cli/chunks/{chunk-D5GB5PUU.js → chunk-NO3IV5Q5.js} +1 -1
- package/dist/cli/chunks/{chunk-3XACRXBY.js → chunk-NQXXI77K.js} +2 -2
- package/dist/cli/chunks/{chunk-EC65UZ77.js → chunk-NVEWF4JV.js} +1 -1
- package/dist/cli/chunks/{chunk-JI67T6Q2.js → chunk-NZU4ACBZ.js} +2 -2
- package/dist/cli/chunks/chunk-O5W3FIO6.js +63 -0
- package/dist/cli/chunks/{chunk-YEFTK4HD.js → chunk-OAEE6JWQ.js} +2 -2
- package/dist/cli/chunks/{chunk-JAOCHPYX.js → chunk-OCV2XEWQ.js} +2 -2
- package/dist/cli/chunks/{chunk-IDBA5GK2.js → chunk-P3EYRILV.js} +2 -2
- package/dist/cli/chunks/{chunk-4RPBODN5.js → chunk-PEQDY4BO.js} +2 -2
- package/dist/cli/chunks/{chunk-CPPYZYXC.js → chunk-PF7RBAYL.js} +2 -2
- package/dist/cli/chunks/{chunk-WCPSR4MJ.js → chunk-PHT5N7SC.js} +2 -2
- package/dist/cli/chunks/{chunk-O2AAYJUV.js → chunk-PINSJCM3.js} +1 -1
- package/dist/cli/chunks/{chunk-HEDGFKC5.js → chunk-PPUZWYUG.js} +2 -2
- package/dist/cli/chunks/{chunk-XMCSKYDE.js → chunk-QPEOLAAS.js} +1 -1
- package/dist/cli/chunks/{chunk-7MUO4DEH.js → chunk-QQWBWEJS.js} +18 -18
- package/dist/cli/chunks/{chunk-UFP7SN5V.js → chunk-QVDCVD5D.js} +2 -2
- package/dist/cli/chunks/{chunk-NHEG2DLN.js → chunk-RJIEG3NA.js} +2 -2
- package/dist/cli/chunks/{chunk-KJ5A54ZH.js → chunk-RV74I3YO.js} +2 -2
- package/dist/cli/chunks/{chunk-UDSB3XCG.js → chunk-S75SOOZL.js} +2 -2
- package/dist/cli/chunks/{chunk-BPDAQB3F.js → chunk-SASBO5Y5.js} +2 -2
- package/dist/cli/chunks/{chunk-VJBJRFUO.js → chunk-SDLWKRVL.js} +9 -9
- package/dist/cli/chunks/{chunk-J6ASX536.js → chunk-SHKOCGNK.js} +2 -2
- package/dist/cli/chunks/{chunk-J35JWDJE.js → chunk-SI6DPU5D.js} +1 -1
- package/dist/cli/chunks/{chunk-V3MGY76S.js → chunk-SJ6Y4725.js} +2 -2
- package/dist/cli/chunks/{chunk-FTYRPEJS.js → chunk-SR52XP5F.js} +1 -1
- package/dist/cli/chunks/{chunk-ZUE524JL.js → chunk-SSUAAX3F.js} +2 -2
- package/dist/cli/chunks/{chunk-VG32EEUG.js → chunk-SSYAQZXA.js} +2 -2
- package/dist/cli/chunks/{chunk-HTVGHHX2.js → chunk-SUDMM5SO.js} +2 -2
- package/dist/cli/chunks/{chunk-K2SMP4OD.js → chunk-TIUKLYAI.js} +1 -1
- package/dist/cli/chunks/{chunk-VCVRZD4Y.js → chunk-TVGI32MB.js} +33 -33
- package/dist/cli/chunks/{chunk-CAZM63TP.js → chunk-U2A7NHZA.js} +2 -2
- package/dist/cli/chunks/{chunk-WBC6WB32.js → chunk-UE5ZOZR2.js} +2 -2
- package/dist/cli/chunks/{chunk-BQJ7CV53.js → chunk-UHEOGZLX.js} +12 -12
- package/dist/cli/chunks/chunk-UNGBRZDK.js +12 -0
- package/dist/cli/chunks/{chunk-XN3KCKAM.js → chunk-V5NHZV7S.js} +2 -2
- package/dist/cli/chunks/{chunk-UNYTHZDZ.js → chunk-VJCIEHEF.js} +1 -1
- package/dist/cli/chunks/{chunk-5Y7UFHJD.js → chunk-VMDFFTCK.js} +1 -1
- package/dist/cli/chunks/chunk-VSIKHWZ4.js +29 -0
- package/dist/cli/chunks/{chunk-UPWLMIDY.js → chunk-VWPM27GU.js} +2 -2
- package/dist/cli/chunks/{chunk-USAKCGHC.js → chunk-VXFLJNCA.js} +2 -2
- package/dist/cli/chunks/{chunk-WKI46WWN.js → chunk-W5HQUIML.js} +2 -2
- package/dist/cli/chunks/{chunk-Z54G2YOL.js → chunk-WP4RETKG.js} +2 -2
- package/dist/cli/chunks/{chunk-IRPNEXOU.js → chunk-XIIQ5QTT.js} +2 -2
- package/dist/cli/chunks/{chunk-O32BFQV4.js → chunk-XIQW7EFL.js} +2 -2
- package/dist/cli/chunks/{chunk-TW6Z6W4X.js → chunk-XWUWX7BV.js} +13 -13
- package/dist/cli/chunks/{chunk-57FX3GP6.js → chunk-Y4PFUMOU.js} +1 -1
- package/dist/cli/chunks/chunk-YAPLJR7K.js +2 -0
- package/dist/cli/chunks/{chunk-4T7XV5KQ.js → chunk-YLMNVLDK.js} +1 -1
- package/dist/cli/chunks/{chunk-TSP6SU5V.js → chunk-YNMJEDN5.js} +2 -2
- package/dist/cli/chunks/{chunk-PWQWKYBG.js → chunk-YPBSUGMI.js} +1 -1
- package/dist/cli/chunks/{chunk-QP2HLKTS.js → chunk-YRAX7SFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-O3ERGUXH.js → chunk-YTHTQPWR.js} +1 -1
- package/dist/cli/chunks/{chunk-MR2OPUSA.js → chunk-YU2BDRSD.js} +1 -1
- package/dist/cli/chunks/chunk-ZB3LEFYG.js +2 -0
- package/dist/cli/chunks/{chunk-2W5MQDHM.js → chunk-ZFL436FN.js} +2 -2
- package/dist/cli/chunks/{chunk-7MISCSL5.js → chunk-ZJH5MU2I.js} +2 -2
- package/dist/cli/chunks/{chunk-52KOPIMI.js → chunk-ZQ2XW3IP.js} +2 -2
- package/dist/cli/chunks/chunk-ZR2TKVXQ.js +14 -0
- package/dist/cli/chunks/{ci-UMA2SMNW.js → ci-MFUR4CWV.js} +2 -2
- package/dist/cli/chunks/{ci-config-UQSILJFQ.js → ci-config-PNDLQ6XV.js} +2 -2
- package/dist/cli/chunks/{ci-output-U6YZLLKH.js → ci-output-PFZ4M7NC.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-ATYQP6X2.js → circuit-breaker-5HH6NLZN.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-6YHFD7AN.js → claude-flow-setup-QCKYLGLC.js} +2 -2
- package/dist/cli/chunks/client-MHQRTZM4.js +2 -0
- package/dist/cli/chunks/{cline-installer-EPE7IOZE.js → cline-installer-EASVPFXR.js} +2 -2
- package/dist/cli/chunks/{code-NUEJ4XYO.js → code-UJXDVYRK.js} +4 -3
- package/dist/cli/chunks/{code-index-extractor-D4DBT6OL.js → code-index-extractor-BZJ3UDP4.js} +2 -2
- package/dist/cli/chunks/{codex-installer-633SM4LR.js → codex-installer-XSQZUVOZ.js} +4 -4
- package/dist/cli/chunks/{completions-WUKVIW3L.js → completions-OWOOJFI2.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-F73ACR5H.js → complexity-analyzer-KP5TOHDT.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-QH42TKMS.js → continuedev-installer-IFKQXLHM.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-Y3XC7BTT.js → copilot-installer-IGJ6KGQY.js} +2 -2
- package/dist/cli/chunks/core-handlers-UAK3LLJE.js +2 -0
- package/dist/cli/chunks/{cost-tracker-57QPV7E3.js → cost-tracker-MMDDNKZB.js} +2 -2
- package/dist/cli/chunks/{coverage-IBCHMBCR.js → coverage-LUH2B7NT.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +2 -0
- package/dist/cli/chunks/{cursor-installer-F4UYQHIN.js → cursor-installer-4YLM5GWM.js} +2 -2
- package/dist/cli/chunks/daemon-CAVZ7OFV.js +18 -0
- package/dist/cli/chunks/{daemon-XR4Q6YZF.js → daemon-MZKVM4CJ.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-ZR5ZD3TW.js → dag-attention-scheduler-X4CYW665.js} +2 -2
- package/dist/cli/chunks/{detect-GEGYURLL.js → detect-7BM2XINO.js} +2 -2
- package/dist/cli/chunks/{dist-node-JU3KT2JO.js → dist-node-Y5APLEYB.js} +2 -2
- package/dist/cli/chunks/{domain-handler-7QI3FJGE.js → domain-handler-X3ZRJNAH.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-O2YRM2PD.js → domain-plugins-2UW5KQJB.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-7J3S2OS6.js → domain-transfer-35W4CIBV.js} +2 -2
- package/dist/cli/chunks/dream-EJY24JN6.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +3 -0
- package/dist/cli/chunks/embedding-space-SBM2MZD2.js +2 -0
- package/dist/cli/chunks/{eval-RVMCIUOR.js → eval-4QA2SROK.js} +2 -2
- package/dist/cli/chunks/experience-capture-middleware-Z6BF6KYM.js +40 -0
- package/dist/cli/chunks/{fast-paths-QUKPKWKZ.js → fast-paths-FIORX6GN.js} +2 -2
- package/dist/cli/chunks/{feature-flags-K7JXNKJI.js → feature-flags-6LYI2T4G.js} +2 -2
- package/dist/cli/chunks/{feature-flags-5JCSKL2P.js → feature-flags-ZOO7LMIC.js} +2 -2
- package/dist/cli/chunks/file-discovery-UZSFSS4V.js +2 -0
- package/dist/cli/chunks/{fleet-II4Q6HXK.js → fleet-7WF53H4F.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-M7VO2EMS.js → gnn-wrapper-KJ6B7BRM.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-ND5CY26N.js → heartbeat-handler-DEKKMOVW.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +2 -0
- package/dist/cli/chunks/hnsw-index-POCPMVJH.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-N3AUUUU7.js → hnsw-legacy-bridge-L27WS27N.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-NZY3E5EN.js → hnswlib-node-4YOQC6L4.js} +2 -2
- package/dist/cli/chunks/{hooks-QVJDTII5.js → hooks-TAOKV4EJ.js} +23 -22
- package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-ZRY6MTDV.js → hypergraph-engine-BODRJLHL.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-56DO4XZQ.js → hypergraph-handler-RKMYJNTU.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +2 -0
- package/dist/cli/chunks/{init-guard-DTF4EVUY.js → init-guard-MXHSLSB2.js} +2 -2
- package/dist/cli/chunks/{init-handler-M6CNQHMX.js → init-handler-HUE57IFW.js} +6 -6
- package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +2 -0
- package/dist/cli/chunks/kernel-CCDWT7KS.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-IJN7XKBH.js → kilocode-installer-S333IKYQ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-UKKPGPDC.js → kiro-installer-WM5DLQWC.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +2 -0
- package/dist/cli/chunks/{learning-W2HETWQ4.js → learning-LNHMQLH5.js} +3 -3
- package/dist/cli/chunks/{llm-router-Y546K4VX.js → llm-router-EWFXYZZR.js} +4 -4
- package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +2 -0
- package/dist/cli/chunks/{load-MKAB2AXE.js → load-FGYGWVDK.js} +2 -2
- package/dist/cli/chunks/load-test-UNZUWY3F.js +2 -0
- package/dist/cli/chunks/{mcp-AZKUS6K3.js → mcp-2FHNAAOM.js} +2 -2
- package/dist/cli/chunks/{memory-ZDOQN2KU.js → memory-DZMQ73AB.js} +5 -5
- package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +2 -0
- package/dist/cli/chunks/memory-handlers-MP426XRJ.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-WWVXDHG4.js → multi-model-executor-6F2UAEUW.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-YUJNXXWS.js → opencode-installer-XY3BGOTZ.js} +2 -2
- package/dist/cli/chunks/{orchestrator-Z6PWPLRE.js → orchestrator-B4CNKUOS.js} +17 -17
- package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-TPWPX32U.js → pattern-usage-recorder-R4GUFNMD.js} +2 -2
- package/dist/cli/chunks/{pipeline-4BBGTE4M.js → pipeline-FG5RKVRO.js} +2 -2
- package/dist/cli/chunks/{platform-5GSHXCV5.js → platform-3BT4KEVJ.js} +2 -2
- package/dist/cli/chunks/{plugin-OFDVF5HS.js → plugin-WI4RIN7O.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-NC6MUYGJ.js → prime-radiant-advanced-wasm-7ECDNQFS.js} +2 -2
- package/dist/cli/chunks/project-root-BEANNYWU.js +2 -0
- package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +2 -0
- package/dist/cli/chunks/{protocol-handler-MPOAAEPA.js → protocol-handler-WNODKPGW.js} +2 -2
- package/dist/cli/chunks/{prove-CDKMAIVM.js → prove-5RHAEPYZ.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +2 -0
- package/dist/cli/chunks/{quality-ZH4F7R7R.js → quality-WPHR7BGQ.js} +2 -2
- package/dist/cli/chunks/{quality-gate-IDRMW6OE.js → quality-gate-4RKTEZMX.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +2 -0
- package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +2 -0
- package/dist/cli/chunks/{ref-validation-Z5GCGVXK.js → ref-validation-TPAWHOHH.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-IZ2S7PH2.js → roocode-installer-7AVHFNDI.js} +2 -2
- package/dist/cli/chunks/router-EP34O3KB.js +2 -0
- package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +2 -0
- package/dist/cli/chunks/{routing-handler-NAX35VUW.js → routing-handler-YKEDVJSH.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-5YW2SOFF.js → ruvector-commands-JUAMM354.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-IPGCAT6C.js → rvf-store-integrity-VJDUIRTX.js} +2 -2
- package/dist/cli/chunks/safe-db-TCAU4FUT.js +2 -0
- package/dist/cli/chunks/schedule-NB5KV435.js +2 -0
- package/dist/cli/chunks/scheduler-JKXGKVK6.js +2 -0
- package/dist/cli/chunks/{security-3IH4BO5Z.js → security-ORDN3RD2.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-ABY7PAY2.js → shared-rvf-adapter-CF4BCIO7.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-6KENLN2W.js → shared-rvf-dual-writer-C32UBR6D.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +2 -0
- package/dist/cli/chunks/{standalone-memory-RLFAUGOW.js → standalone-memory-OXRJYZXN.js} +2 -2
- package/dist/cli/chunks/{status-handler-FCOZBPE5.js → status-handler-BCX5D4HY.js} +2 -2
- package/dist/cli/chunks/{structural-health-4RDA5UUM.js → structural-health-LFG7RUU6.js} +2 -2
- package/dist/cli/chunks/sync-OSF7C2NL.js +2 -0
- package/dist/cli/chunks/{sync-KGEEXXCC.js → sync-YJEE2K2L.js} +2 -2
- package/dist/cli/chunks/task-handler-6LXKPTXJ.js +64 -0
- package/dist/cli/chunks/{task-handlers-6H7L2UT4.js → task-handlers-CILP36I7.js} +4 -4
- package/dist/cli/chunks/{test-S7IG6EIX.js → test-SD457QJ6.js} +4 -4
- package/dist/cli/chunks/test-runner-process-VKD65QQU.js +2 -0
- package/dist/cli/chunks/{test-scheduling-7XYXI4L2.js → test-scheduling-ISI2O4Q5.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +2 -0
- package/dist/cli/chunks/{token-usage-Y2YTPOFE.js → token-usage-XOC5KG7S.js} +2 -2
- package/dist/cli/chunks/{transformers-UCJ3HHHC.js → transformers-LSLQAARK.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +2 -0
- package/dist/cli/chunks/{types-6CMFPETH.js → types-5BLCGLCR.js} +2 -2
- package/dist/cli/chunks/unified-memory-GI76TXFV.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +2 -0
- package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +2 -0
- package/dist/cli/chunks/{upgrade-K25DN6WU.js → upgrade-RQJYLK3J.js} +2 -2
- package/dist/cli/chunks/{validate-T4V3TBY3.js → validate-QBHWXXCK.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-XSRC576T.js → validate-swarm-IKXBKFB5.js} +2 -2
- package/dist/cli/chunks/visual-security-GZ2MOKWB.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-YOZXHRTN.js → web-tree-sitter-ZF6FIE5R.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-ITPU2IYL.js → windsurf-installer-HQGDZT5D.js} +2 -2
- package/dist/cli/chunks/witness-chain-DCHCAMSQ.js +2 -0
- package/dist/cli/chunks/witness-chain-P3XXXA62.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-DTDSVKOG.js → witness-chain-verifier-PX2OQ6XT.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-EWACWGAW.js → witness-key-manager-RXYQNFJB.js} +2 -2
- package/dist/cli/chunks/{workflow-ZIQ4FV42.js → workflow-FBKCA4H6.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +2 -0
- package/dist/cli/chunks/wrappers-TWSKBTWD.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/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 +92 -58
- 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 +32 -7
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +112 -53
- 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.js +10 -5
- package/dist/domains/test-execution/interfaces.d.ts +12 -0
- package/dist/domains/test-execution/plugin.js +6 -2
- package/dist/domains/test-execution/services/retry-handler.d.ts +2 -0
- package/dist/domains/test-execution/services/retry-handler.js +14 -9
- package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
- package/dist/domains/test-execution/services/test-executor.js +28 -9
- 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/init-wizard-hooks.d.ts +1 -1
- package/dist/init/init-wizard-hooks.js +7 -8
- package/dist/init/phases/08-mcp.js +9 -0
- package/dist/init/settings-merge.d.ts +13 -0
- package/dist/init/settings-merge.js +49 -2
- package/dist/integrations/agent-booster-wasm/agent_booster_wasm.js +849 -0
- package/dist/integrations/agent-booster-wasm/agent_booster_wasm_bg.wasm +0 -0
- package/dist/integrations/agent-booster-wasm/index.d.ts +8 -0
- package/dist/integrations/agent-booster-wasm/index.js +25 -2
- package/dist/integrations/agent-booster-wasm/package.json +16 -0
- 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 +24 -0
- package/dist/kernel/unified-memory.js +63 -8
- package/dist/learning/aqe-learning-engine.js +1 -1
- package/dist/learning/dream/dream-engine.d.ts +3 -2
- package/dist/learning/dream/dream-engine.js +42 -24
- package/dist/learning/dream/dream-lock-retry.d.ts +38 -0
- package/dist/learning/dream/dream-lock-retry.js +66 -0
- package/dist/learning/dream/speculative-dreamer.js +1 -1
- package/dist/learning/embed-and-insert-pattern.js +4 -2
- package/dist/learning/embedder-endpoint-client.d.ts +31 -0
- package/dist/learning/embedder-endpoint-client.js +103 -10
- 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.js +3 -1
- 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 +642 -571
- 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/llm/spend-ledger.d.ts +9 -0
- package/dist/shared/llm/spend-ledger.js +64 -39
- 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 +69 -0
- package/dist/shared/test-runner-project.js +186 -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 +4 -2
- package/dist/cli/chunks/adapter-23KA2YW7.js +0 -2
- package/dist/cli/chunks/agent-booster-wasm-2DLAEZK6.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-MUICAXW5.js +0 -2
- package/dist/cli/chunks/base-XPWGYDKD.js +0 -2
- package/dist/cli/chunks/browser-workflow-UMQVBVGK.js +0 -2
- package/dist/cli/chunks/chunk-3FITMWWJ.js +0 -21
- package/dist/cli/chunks/chunk-ARRBXCII.js +0 -4
- package/dist/cli/chunks/chunk-BBYJBZHG.js +0 -14
- package/dist/cli/chunks/chunk-BM3EJLMV.js +0 -153
- package/dist/cli/chunks/chunk-D3ZZ2NLL.js +0 -62
- package/dist/cli/chunks/chunk-DLTB5KCR.js +0 -2
- package/dist/cli/chunks/chunk-DRLSJJIC.js +0 -6
- package/dist/cli/chunks/chunk-HAYKLXCT.js +0 -744
- package/dist/cli/chunks/chunk-HHBF2BZC.js +0 -65
- package/dist/cli/chunks/chunk-K7RT6ITZ.js +0 -2
- package/dist/cli/chunks/chunk-L752CNG3.js +0 -13
- package/dist/cli/chunks/chunk-MQXWG55U.js +0 -12
- package/dist/cli/chunks/chunk-WM2QRIRD.js +0 -14
- package/dist/cli/chunks/chunk-WRC3HLUY.js +0 -29
- package/dist/cli/chunks/chunk-XTZGAG6P.js +0 -27
- package/dist/cli/chunks/chunk-YKQWIXUY.js +0 -2
- package/dist/cli/chunks/client-E43GWLQH.js +0 -2
- package/dist/cli/chunks/core-handlers-R5A3SQDY.js +0 -2
- package/dist/cli/chunks/cross-domain-router-LLYVPZF6.js +0 -2
- package/dist/cli/chunks/daemon-BYYPIJ7G.js +0 -18
- package/dist/cli/chunks/dream-6C4NURSE.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-URES5Q6J.js +0 -3
- package/dist/cli/chunks/experience-capture-middleware-SYJQSBKE.js +0 -40
- package/dist/cli/chunks/file-discovery-J5IE5KP7.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-FC5PBTMN.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-47UIVOBG.js +0 -2
- package/dist/cli/chunks/hnsw-index-3AKVLOZQ.js +0 -2
- package/dist/cli/chunks/hybrid-backend-YAOSNX47.js +0 -2
- package/dist/cli/chunks/impact-analyzer-4FMJXM4M.js +0 -2
- package/dist/cli/chunks/init-wizard-RTLCRWDT.js +0 -2
- package/dist/cli/chunks/kernel-2OWIGGGT.js +0 -2
- package/dist/cli/chunks/knowledge-graph-25XXKDJN.js +0 -2
- package/dist/cli/chunks/llm-router-service-G3EIN4UB.js +0 -2
- package/dist/cli/chunks/load-test-D6QYNIVT.js +0 -2
- package/dist/cli/chunks/memory-backend-LDFFZMEQ.js +0 -2
- package/dist/cli/chunks/memory-handlers-3SQVY7FE.js +0 -2
- package/dist/cli/chunks/pattern-null-store-KDVRM7PW.js +0 -2
- package/dist/cli/chunks/project-root-DDGBWDP6.js +0 -2
- package/dist/cli/chunks/protocol-executor-KBOLLCWA.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-GRXBT7FC.js +0 -2
- package/dist/cli/chunks/queen-coordinator-L2QWMJ5Q.js +0 -2
- package/dist/cli/chunks/real-embeddings-I2UVNNB3.js +0 -2
- package/dist/cli/chunks/router-FT5WJPUH.js +0 -2
- package/dist/cli/chunks/routing-feedback-EO2MKOUX.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-WHBFQJVU.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-YT3APF2I.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-VUIZHTVG.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-37PUFKQD.js +0 -2
- package/dist/cli/chunks/safe-db-TDZKUOZJ.js +0 -2
- package/dist/cli/chunks/schedule-CRKTRY2A.js +0 -2
- package/dist/cli/chunks/scheduler-6ZBDVQWN.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-FFJQAIKW.js +0 -2
- package/dist/cli/chunks/sync-54LUAUTK.js +0 -2
- package/dist/cli/chunks/task-handler-K3OXHYKU.js +0 -62
- package/dist/cli/chunks/test-runner-process-OTQDAJLN.js +0 -2
- package/dist/cli/chunks/token-bootstrap-3QMABE45.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-D6JTTHTP.js +0 -2
- package/dist/cli/chunks/unified-memory-QARWQKJ2.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-LHY3DXCP.js +0 -2
- package/dist/cli/chunks/unified-persistence-WEYYGLHM.js +0 -2
- package/dist/cli/chunks/visual-security-O4ALMCXQ.js +0 -2
- package/dist/cli/chunks/witness-chain-B3YW5NMS.js +0 -2
- package/dist/cli/chunks/witness-chain-PIYR72HJ.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-YUG7E3UX.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-3ZN2BCGY.js +0 -2
- package/dist/cli/chunks/wrappers-PW2O27LL.js +0 -2
|
@@ -31,6 +31,7 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
31
31
|
import { getUnifiedPersistence } from '../../kernel/unified-persistence.js';
|
|
32
32
|
import { registerStoreCloser } from '../../kernel/process-lifecycle.js';
|
|
33
33
|
import { ConceptGraph } from './concept-graph.js';
|
|
34
|
+
import { DREAM_LOCK_WAIT_MS, DREAM_SHUTDOWN_LOCK_WAIT_MS, isBusyError, retryWhileBusy, withBusyTimeout, } from './dream-lock-retry.js';
|
|
34
35
|
import { SpreadingActivation, } from './spreading-activation.js';
|
|
35
36
|
import { InsightGenerator, } from './insight-generator.js';
|
|
36
37
|
import { DEFAULT_VALIDATION_THRESHOLDS, } from './rvcow-branch-manager.js';
|
|
@@ -277,16 +278,14 @@ export class DreamEngine {
|
|
|
277
278
|
await this.persistence.initialize();
|
|
278
279
|
}
|
|
279
280
|
this.db = this.persistence.getDatabase();
|
|
280
|
-
//
|
|
281
|
-
//
|
|
282
|
-
//
|
|
283
|
-
//
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
// Migrate legacy schema: rename 'duration' → 'duration_ms' if needed
|
|
289
|
-
this.migrateSchema();
|
|
281
|
+
// #1253: no 60 s busy_timeout on this shared connection. better-sqlite3
|
|
282
|
+
// waits synchronously, so it froze the whole process (the MCP event loop)
|
|
283
|
+
// while another writer held the database. Dream writes instead wait
|
|
284
|
+
// briefly per attempt and retry asynchronously (dream-lock-retry.ts),
|
|
285
|
+
// which keeps the patience that avoided failures under contention (#1060).
|
|
286
|
+
// Migrate legacy schema: rename 'duration' → 'duration_ms' if needed.
|
|
287
|
+
// #1253: a short lock wait only; migrateSchema() logs and carries on.
|
|
288
|
+
withBusyTimeout(this.db, DREAM_LOCK_WAIT_MS, () => this.migrateSchema());
|
|
290
289
|
// Initialize concept graph (shares same unified persistence)
|
|
291
290
|
this.graph = new ConceptGraph();
|
|
292
291
|
await this.graph.initialize();
|
|
@@ -296,9 +295,19 @@ export class DreamEngine {
|
|
|
296
295
|
'committed in one short transaction instead of a SAVEPOINT held across the dream');
|
|
297
296
|
}
|
|
298
297
|
// #1060: a process that exited mid-dream left its cycle 'running'.
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
298
|
+
// #1253: housekeeping, so a locked database skips it after a short
|
|
299
|
+
// wait instead of blocking the process; the next initialize() retries.
|
|
300
|
+
const db = this.db;
|
|
301
|
+
try {
|
|
302
|
+
const abandoned = withBusyTimeout(db, DREAM_LOCK_WAIT_MS, () => markAbandonedCycles(db, Math.max(this.config.maxDurationMs, MAX_TOOL_DREAM_MS) + ABANDONED_CYCLE_GRACE_MS));
|
|
303
|
+
if (abandoned > 0) {
|
|
304
|
+
dreamLogger.info('Marked abandoned dream cycles as interrupted', { abandoned });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
if (!isBusyError(error))
|
|
309
|
+
throw error;
|
|
310
|
+
dreamLogger.warn('Abandoned dream cycle sweep skipped: database is locked', { error: toErrorMessage(error) });
|
|
302
311
|
}
|
|
303
312
|
this.initialized = true;
|
|
304
313
|
this.closing = false;
|
|
@@ -433,7 +442,7 @@ export class DreamEngine {
|
|
|
433
442
|
let committed = false;
|
|
434
443
|
try {
|
|
435
444
|
if (commitResults)
|
|
436
|
-
await this.saveCycle(cycle);
|
|
445
|
+
await this.saveCycle(cycle, live);
|
|
437
446
|
if (!live())
|
|
438
447
|
throw new Error('Dream cycle cancelled');
|
|
439
448
|
// 1. Check we have enough concepts
|
|
@@ -483,7 +492,7 @@ export class DreamEngine {
|
|
|
483
492
|
committed = true; // nothing to record: the caller decides
|
|
484
493
|
return { ...result, pending: computed };
|
|
485
494
|
}
|
|
486
|
-
const commit = this.commitComputed(db, computed);
|
|
495
|
+
const commit = await this.commitComputed(db, computed, live);
|
|
487
496
|
committed = true;
|
|
488
497
|
result.commitDurationMs = commit.durationMs;
|
|
489
498
|
result.retention = commit.retention;
|
|
@@ -499,7 +508,7 @@ export class DreamEngine {
|
|
|
499
508
|
cycle.durationMs = Date.now() - startTime;
|
|
500
509
|
if (commitResults && this.db === db) {
|
|
501
510
|
try {
|
|
502
|
-
this.updateCycleSync(cycle);
|
|
511
|
+
await retryWhileBusy(db, () => this.updateCycleSync(cycle), { shouldContinue: () => this.db === db });
|
|
503
512
|
}
|
|
504
513
|
catch { /* best effort */ }
|
|
505
514
|
}
|
|
@@ -528,9 +537,10 @@ export class DreamEngine {
|
|
|
528
537
|
* #1060: write the results of a `dream(…, { commit: false })` run, in the
|
|
529
538
|
* same single transaction a normal dream uses. Returns the commit duration
|
|
530
539
|
* in ms. Throws (and writes nothing) if the engine is closed or the write
|
|
531
|
-
* fails.
|
|
540
|
+
* fails. #1253: async, because a locked database is retried without
|
|
541
|
+
* blocking the process.
|
|
532
542
|
*/
|
|
533
|
-
commitDreamResult(result) {
|
|
543
|
+
async commitDreamResult(result) {
|
|
534
544
|
this.ensureInitialized();
|
|
535
545
|
if (this.closing) {
|
|
536
546
|
throw new Error('Dream engine is closing; nothing is committed');
|
|
@@ -538,7 +548,8 @@ export class DreamEngine {
|
|
|
538
548
|
if (!result.pending) {
|
|
539
549
|
throw new Error('Dream result has nothing pending to commit (it was already committed)');
|
|
540
550
|
}
|
|
541
|
-
const
|
|
551
|
+
const db = this.db;
|
|
552
|
+
const commit = await this.commitComputed(db, result.pending, () => !this.closing && this.db === db);
|
|
542
553
|
result.pending = undefined;
|
|
543
554
|
result.commitDurationMs = commit.durationMs;
|
|
544
555
|
result.retention = commit.retention;
|
|
@@ -548,8 +559,12 @@ export class DreamEngine {
|
|
|
548
559
|
* Commit a computed dream, then record it in the witness chain (#1060) and
|
|
549
560
|
* run the default retention steps (#1239).
|
|
550
561
|
*/
|
|
551
|
-
commitComputed(db, computed) {
|
|
552
|
-
|
|
562
|
+
async commitComputed(db, computed, live) {
|
|
563
|
+
// #1253: retry a locked database asynchronously; each attempt is short.
|
|
564
|
+
const commit = await retryWhileBusy(db, () => commitDream(db, computed), {
|
|
565
|
+
shouldContinue: live,
|
|
566
|
+
cancelledError: () => new Error('Dream cycle cancelled'),
|
|
567
|
+
});
|
|
553
568
|
try {
|
|
554
569
|
this._witnessChain?.append('DREAM_COMMIT', {
|
|
555
570
|
cycleId: computed.cycle.id,
|
|
@@ -613,7 +628,9 @@ export class DreamEngine {
|
|
|
613
628
|
cycle.endTime = new Date();
|
|
614
629
|
cycle.durationMs = Date.now() - startTime;
|
|
615
630
|
try {
|
|
616
|
-
|
|
631
|
+
// #1253: a short wait only; if the database stays locked, the
|
|
632
|
+
// abandoned-cycle sweep marks the cycle interrupted later.
|
|
633
|
+
withBusyTimeout(this.db, DREAM_SHUTDOWN_LOCK_WAIT_MS, () => this.updateCycleSync(cycle));
|
|
617
634
|
}
|
|
618
635
|
catch {
|
|
619
636
|
// Best effort during shutdown
|
|
@@ -912,16 +929,17 @@ export class DreamEngine {
|
|
|
912
929
|
// ==========================================================================
|
|
913
930
|
// Persistence
|
|
914
931
|
// ==========================================================================
|
|
915
|
-
async saveCycle(cycle) {
|
|
932
|
+
async saveCycle(cycle, live) {
|
|
916
933
|
if (!this.db)
|
|
917
934
|
return;
|
|
935
|
+
const db = this.db;
|
|
918
936
|
const stmt = this.db.prepare(`
|
|
919
937
|
INSERT INTO dream_cycles
|
|
920
938
|
(id, start_time, end_time, duration_ms, concepts_processed, associations_found,
|
|
921
939
|
insights_generated, status, error, created_at)
|
|
922
940
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
923
941
|
`);
|
|
924
|
-
stmt.run(cycle.id, cycle.startTime.toISOString(), cycle.endTime?.toISOString() ?? null, cycle.durationMs ?? null, cycle.conceptsProcessed, cycle.associationsFound, cycle.insightsGenerated, cycle.status, cycle.error ?? null, cycle.startTime.toISOString());
|
|
942
|
+
await retryWhileBusy(db, () => stmt.run(cycle.id, cycle.startTime.toISOString(), cycle.endTime?.toISOString() ?? null, cycle.durationMs ?? null, cycle.conceptsProcessed, cycle.associationsFound, cycle.insightsGenerated, cycle.status, cycle.error ?? null, cycle.startTime.toISOString()), { shouldContinue: live, cancelledError: () => new Error('Dream cycle cancelled') });
|
|
925
943
|
}
|
|
926
944
|
updateCycleSync(cycle) {
|
|
927
945
|
if (!this.db)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lock waits for dream writes (#1253).
|
|
3
|
+
*
|
|
4
|
+
* better-sqlite3 waits for a locked database synchronously, so a long
|
|
5
|
+
* busy_timeout freezes the whole process: in the MCP server that is the event
|
|
6
|
+
* loop and every tool call. Dream writes therefore wait only briefly per
|
|
7
|
+
* attempt and retry asynchronously, so other work runs between attempts.
|
|
8
|
+
*/
|
|
9
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
10
|
+
/** Longest a single dream write attempt blocks the process on a locked database. */
|
|
11
|
+
export declare const DREAM_LOCK_WAIT_MS = 200;
|
|
12
|
+
/** Total time a dream write keeps retrying a locked database before it fails. */
|
|
13
|
+
export declare const DREAM_LOCK_RETRY_BUDGET_MS = 60000;
|
|
14
|
+
/** True for SQLite "database is locked" / "busy" failures. */
|
|
15
|
+
export declare function isBusyError(error: unknown): boolean;
|
|
16
|
+
/** Run `fn` with a temporary busy_timeout, restoring the connection's previous value. */
|
|
17
|
+
export declare function withBusyTimeout<T>(db: DatabaseType, timeoutMs: number, fn: () => T): T;
|
|
18
|
+
export interface RetryWhileBusyOptions {
|
|
19
|
+
/** Synchronous wait per attempt (default DREAM_LOCK_WAIT_MS). */
|
|
20
|
+
waitMs?: number;
|
|
21
|
+
/** Total retry time before the busy error is thrown (default DREAM_LOCK_RETRY_BUDGET_MS). */
|
|
22
|
+
budgetMs?: number;
|
|
23
|
+
/** Checked before every attempt; when false, `cancelledError` is thrown instead of retrying. */
|
|
24
|
+
shouldContinue?: () => boolean;
|
|
25
|
+
cancelledError?: () => Error;
|
|
26
|
+
/** Injectable for tests. */
|
|
27
|
+
sleep?: (ms: number) => Promise<void>;
|
|
28
|
+
now?: () => number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run a synchronous write, retrying while the database is locked. Each attempt
|
|
32
|
+
* blocks for at most `waitMs`; between attempts the event loop is free. Errors
|
|
33
|
+
* other than a busy database are thrown at once.
|
|
34
|
+
*/
|
|
35
|
+
export declare function retryWhileBusy<T>(db: DatabaseType, fn: () => T, options?: RetryWhileBusyOptions): Promise<T>;
|
|
36
|
+
/** Wait for the synchronous best-effort write made while a dream is interrupted at shutdown. */
|
|
37
|
+
export declare const DREAM_SHUTDOWN_LOCK_WAIT_MS = 1000;
|
|
38
|
+
//# sourceMappingURL=dream-lock-retry.d.ts.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lock waits for dream writes (#1253).
|
|
3
|
+
*
|
|
4
|
+
* better-sqlite3 waits for a locked database synchronously, so a long
|
|
5
|
+
* busy_timeout freezes the whole process: in the MCP server that is the event
|
|
6
|
+
* loop and every tool call. Dream writes therefore wait only briefly per
|
|
7
|
+
* attempt and retry asynchronously, so other work runs between attempts.
|
|
8
|
+
*/
|
|
9
|
+
/** Longest a single dream write attempt blocks the process on a locked database. */
|
|
10
|
+
export const DREAM_LOCK_WAIT_MS = 200;
|
|
11
|
+
/** Total time a dream write keeps retrying a locked database before it fails. */
|
|
12
|
+
export const DREAM_LOCK_RETRY_BUDGET_MS = 60_000;
|
|
13
|
+
/** Longest pause between attempts; the pause doubles from 25 ms up to this. */
|
|
14
|
+
const MAX_BACKOFF_MS = 1000;
|
|
15
|
+
/** True for SQLite "database is locked" / "busy" failures. */
|
|
16
|
+
export function isBusyError(error) {
|
|
17
|
+
const code = error?.code;
|
|
18
|
+
if (typeof code === 'string' && /^SQLITE_(BUSY|LOCKED)/.test(code))
|
|
19
|
+
return true;
|
|
20
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
21
|
+
return /database is locked|database table is locked|SQLITE_BUSY/i.test(message);
|
|
22
|
+
}
|
|
23
|
+
/** Run `fn` with a temporary busy_timeout, restoring the connection's previous value. */
|
|
24
|
+
export function withBusyTimeout(db, timeoutMs, fn) {
|
|
25
|
+
const previous = db.pragma('busy_timeout', { simple: true });
|
|
26
|
+
db.pragma(`busy_timeout = ${timeoutMs}`);
|
|
27
|
+
try {
|
|
28
|
+
return fn();
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
try {
|
|
32
|
+
db.pragma(`busy_timeout = ${previous}`);
|
|
33
|
+
}
|
|
34
|
+
catch { /* connection closed */ }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Run a synchronous write, retrying while the database is locked. Each attempt
|
|
39
|
+
* blocks for at most `waitMs`; between attempts the event loop is free. Errors
|
|
40
|
+
* other than a busy database are thrown at once.
|
|
41
|
+
*/
|
|
42
|
+
export async function retryWhileBusy(db, fn, options = {}) {
|
|
43
|
+
const waitMs = options.waitMs ?? DREAM_LOCK_WAIT_MS;
|
|
44
|
+
const budgetMs = options.budgetMs ?? DREAM_LOCK_RETRY_BUDGET_MS;
|
|
45
|
+
const sleep = options.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
46
|
+
const now = options.now ?? Date.now;
|
|
47
|
+
const started = now();
|
|
48
|
+
let backoff = 25;
|
|
49
|
+
for (;;) {
|
|
50
|
+
if (options.shouldContinue && !options.shouldContinue()) {
|
|
51
|
+
throw options.cancelledError?.() ?? new Error('Cancelled while waiting for a locked database');
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
return withBusyTimeout(db, waitMs, fn);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (!isBusyError(error) || now() - started + backoff >= budgetMs)
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
await sleep(backoff);
|
|
61
|
+
backoff = Math.min(backoff * 2, MAX_BACKOFF_MS);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Wait for the synchronous best-effort write made while a dream is interrupted at shutdown. */
|
|
65
|
+
export const DREAM_SHUTDOWN_LOCK_WAIT_MS = 1000;
|
|
66
|
+
//# sourceMappingURL=dream-lock-retry.js.map
|
|
@@ -117,7 +117,7 @@ export class SpeculativeDreamer {
|
|
|
117
117
|
let commitDurationMs;
|
|
118
118
|
if (winner?.result) {
|
|
119
119
|
try {
|
|
120
|
-
commitDurationMs = this.engine.commitDreamResult(winner.result);
|
|
120
|
+
commitDurationMs = await this.engine.commitDreamResult(winner.result);
|
|
121
121
|
winner.selected = true;
|
|
122
122
|
}
|
|
123
123
|
catch (error) {
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* fail-soft (errors are logged at debug level and swallowed) — pattern row
|
|
19
19
|
* persistence must not regress when embedding computation fails.
|
|
20
20
|
*/
|
|
21
|
+
import { writeWhenUnlockedOn } from '../shared/sqlite-write-queue.js';
|
|
21
22
|
import { computeRealEmbedding, DEFAULT_EMBEDDING_CONFIG, getActiveEmbeddingSpaceIdentity, } from './real-embeddings.js';
|
|
22
23
|
/**
|
|
23
24
|
* Compute an embedding for a pattern (`name + description + tags`) and persist
|
|
@@ -44,8 +45,9 @@ export async function ensurePatternEmbedding(db, patternId, name, description, t
|
|
|
44
45
|
const spaceId = getActiveEmbeddingSpaceIdentity()?.spaceId;
|
|
45
46
|
if (!spaceId)
|
|
46
47
|
throw new Error('VECTOR_SPACE_UNVERIFIED: embedder has no runtime provenance');
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
// #1283: queued on the shared connection so a locked memory.db does not freeze the MCP server.
|
|
49
|
+
await writeWhenUnlockedOn(db, () => db.prepare(`INSERT OR REPLACE INTO qe_pattern_embeddings (pattern_id, embedding, dimension, model, space_id)
|
|
50
|
+
VALUES (?, ?, ?, ?, ?)`).run(patternId, buffer, embedding.length, fullConfig.modelName, spaceId));
|
|
49
51
|
}
|
|
50
52
|
catch (error) {
|
|
51
53
|
// Non-fatal: pattern row already persisted; embedding can be backfilled later.
|
|
@@ -82,6 +82,16 @@ interface ParsedEndpoint {
|
|
|
82
82
|
*/
|
|
83
83
|
export declare function redactEndpoint(endpoint: string): string;
|
|
84
84
|
export declare function parseEndpoint(endpoint: string): ParsedEndpoint;
|
|
85
|
+
/**
|
|
86
|
+
* #1216: a connect or request timeout. The host did not answer within the
|
|
87
|
+
* budget, so the breaker opens on the first one instead of counting it as one
|
|
88
|
+
* failure of `failureThreshold`.
|
|
89
|
+
*/
|
|
90
|
+
export declare class EmbedderEndpointTimeoutError extends Error {
|
|
91
|
+
readonly phase: 'connect' | 'request';
|
|
92
|
+
readonly limitMs: number;
|
|
93
|
+
constructor(phase: 'connect' | 'request', limitMs: number);
|
|
94
|
+
}
|
|
85
95
|
/**
|
|
86
96
|
* OpenAI-compatible embeddings client with keep-alive, circuit breaker, and identity probe.
|
|
87
97
|
*/
|
|
@@ -93,7 +103,28 @@ export declare class EmbedderEndpointClient {
|
|
|
93
103
|
private cachedIdentity;
|
|
94
104
|
/** True while a probe is in flight — prevents the embed() lazy-probe race. */
|
|
95
105
|
private probeInFlight;
|
|
106
|
+
/**
|
|
107
|
+
* #1216: set when the breaker window elapsed and no probe has succeeded
|
|
108
|
+
* since. The next probe is the breaker's half-open trial; it runs in the
|
|
109
|
+
* background so no caller waits on a host that may still not answer.
|
|
110
|
+
*/
|
|
111
|
+
private trialPending;
|
|
112
|
+
/** #1216: requests waiting on the host, abandoned when the breaker opens. */
|
|
113
|
+
private readonly inFlight;
|
|
96
114
|
constructor(options: EmbedderEndpointClientOptions);
|
|
115
|
+
/**
|
|
116
|
+
* #1216: the breaker opened, so the host is treated as down. Requests that
|
|
117
|
+
* are still waiting on it fail now rather than each waiting out its own
|
|
118
|
+
* timeout.
|
|
119
|
+
*/
|
|
120
|
+
private abandonInFlight;
|
|
121
|
+
/**
|
|
122
|
+
* #1216: true while the endpoint is not known to work: the breaker is open,
|
|
123
|
+
* or its window elapsed and the trial probe has not succeeded yet.
|
|
124
|
+
*/
|
|
125
|
+
needsTrial(): boolean;
|
|
126
|
+
/** Start the half-open trial probe in the background (one at a time). */
|
|
127
|
+
private startTrialProbe;
|
|
97
128
|
/** Public, redacted endpoint URL for logs/metrics. */
|
|
98
129
|
getSafeEndpoint(): string;
|
|
99
130
|
/**
|
|
@@ -82,35 +82,60 @@ export function parseEndpoint(endpoint) {
|
|
|
82
82
|
safeUrl: url.toString().replace(/\/$/, ''),
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* #1216: a connect or request timeout. The host did not answer within the
|
|
87
|
+
* budget, so the breaker opens on the first one instead of counting it as one
|
|
88
|
+
* failure of `failureThreshold`.
|
|
89
|
+
*/
|
|
90
|
+
export class EmbedderEndpointTimeoutError extends Error {
|
|
91
|
+
phase;
|
|
92
|
+
limitMs;
|
|
93
|
+
constructor(phase, limitMs) {
|
|
94
|
+
super(`[EmbedderEndpointClient] ${phase} timeout after ${limitMs}ms`);
|
|
95
|
+
this.phase = phase;
|
|
96
|
+
this.limitMs = limitMs;
|
|
97
|
+
this.name = 'EmbedderEndpointTimeoutError';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
85
100
|
/**
|
|
86
101
|
* Circuit breaker state.
|
|
87
102
|
*
|
|
88
|
-
* Tracks failure timestamps within `windowMs`. Opens when count reaches `threshold
|
|
103
|
+
* Tracks failure timestamps within `windowMs`. Opens when count reaches `threshold`,
|
|
104
|
+
* or at once on a timeout (#1216): timeouts arrive one timeout apart, so with a
|
|
105
|
+
* 30 s request timeout and a 60 s window they would never add up to three.
|
|
89
106
|
* While open, every request fast-fails until the window expires. On recovery
|
|
90
107
|
* (window elapses), the breaker calls `onRecover` so the client can invalidate
|
|
91
108
|
* cached endpoint identity — endpoint restarts often coincide with model swaps.
|
|
109
|
+
* Whenever it opens, it calls `onTrip` so the client can abandon requests
|
|
110
|
+
* still waiting on the host.
|
|
92
111
|
*/
|
|
93
112
|
class CircuitBreaker {
|
|
94
113
|
threshold;
|
|
95
114
|
windowMs;
|
|
96
115
|
onRecover;
|
|
116
|
+
onTrip;
|
|
97
117
|
failures = [];
|
|
98
118
|
trippedAt = null;
|
|
99
|
-
constructor(threshold, windowMs, onRecover = () => { }) {
|
|
119
|
+
constructor(threshold, windowMs, onRecover = () => { }, onTrip = () => { }) {
|
|
100
120
|
this.threshold = threshold;
|
|
101
121
|
this.windowMs = windowMs;
|
|
102
122
|
this.onRecover = onRecover;
|
|
123
|
+
this.onTrip = onTrip;
|
|
103
124
|
}
|
|
104
125
|
recordSuccess() {
|
|
105
126
|
this.failures = [];
|
|
106
127
|
this.trippedAt = null;
|
|
107
128
|
}
|
|
108
|
-
recordFailure() {
|
|
129
|
+
recordFailure(tripNow = false) {
|
|
130
|
+
// Requests abandoned when the breaker opened fail too; they must not
|
|
131
|
+
// extend the window.
|
|
132
|
+
if (this.trippedAt !== null)
|
|
133
|
+
return;
|
|
109
134
|
const now = Date.now();
|
|
110
135
|
this.failures = this.failures.filter((t) => now - t < this.windowMs);
|
|
111
136
|
this.failures.push(now);
|
|
112
|
-
if (this.failures.length >= this.threshold) {
|
|
113
|
-
this.
|
|
137
|
+
if (tripNow || this.failures.length >= this.threshold) {
|
|
138
|
+
this.trip();
|
|
114
139
|
}
|
|
115
140
|
}
|
|
116
141
|
isOpen() {
|
|
@@ -128,6 +153,7 @@ class CircuitBreaker {
|
|
|
128
153
|
/** #1204: open (or re-open) the breaker for a full window from now. */
|
|
129
154
|
trip() {
|
|
130
155
|
this.trippedAt = Date.now();
|
|
156
|
+
this.onTrip();
|
|
131
157
|
}
|
|
132
158
|
/** For tests / observability */
|
|
133
159
|
getState() {
|
|
@@ -145,6 +171,14 @@ export class EmbedderEndpointClient {
|
|
|
145
171
|
cachedIdentity = null;
|
|
146
172
|
/** True while a probe is in flight — prevents the embed() lazy-probe race. */
|
|
147
173
|
probeInFlight = null;
|
|
174
|
+
/**
|
|
175
|
+
* #1216: set when the breaker window elapsed and no probe has succeeded
|
|
176
|
+
* since. The next probe is the breaker's half-open trial; it runs in the
|
|
177
|
+
* background so no caller waits on a host that may still not answer.
|
|
178
|
+
*/
|
|
179
|
+
trialPending = false;
|
|
180
|
+
/** #1216: requests waiting on the host, abandoned when the breaker opens. */
|
|
181
|
+
inFlight = new Set();
|
|
148
182
|
constructor(options) {
|
|
149
183
|
this.opts = {
|
|
150
184
|
endpoint: options.endpoint,
|
|
@@ -177,6 +211,35 @@ export class EmbedderEndpointClient {
|
|
|
177
211
|
// On breaker recovery, drop identity so the next embed() re-probes.
|
|
178
212
|
// Endpoint restarts (the common cause of recovery) often change models.
|
|
179
213
|
this.cachedIdentity = null;
|
|
214
|
+
this.trialPending = true;
|
|
215
|
+
}, () => this.abandonInFlight());
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* #1216: the breaker opened, so the host is treated as down. Requests that
|
|
219
|
+
* are still waiting on it fail now rather than each waiting out its own
|
|
220
|
+
* timeout.
|
|
221
|
+
*/
|
|
222
|
+
abandonInFlight() {
|
|
223
|
+
if (this.inFlight.size === 0)
|
|
224
|
+
return;
|
|
225
|
+
const err = new Error(`[EmbedderEndpointClient] circuit breaker opened for ${this.parsed.safeUrl} — request abandoned`);
|
|
226
|
+
for (const reject of [...this.inFlight])
|
|
227
|
+
reject(err);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* #1216: true while the endpoint is not known to work: the breaker is open,
|
|
231
|
+
* or its window elapsed and the trial probe has not succeeded yet.
|
|
232
|
+
*/
|
|
233
|
+
needsTrial() {
|
|
234
|
+
return this.breaker.isOpen() || this.trialPending;
|
|
235
|
+
}
|
|
236
|
+
/** Start the half-open trial probe in the background (one at a time). */
|
|
237
|
+
startTrialProbe() {
|
|
238
|
+
if (this.probeInFlight)
|
|
239
|
+
return;
|
|
240
|
+
this.probe().catch(() => {
|
|
241
|
+
// Still failing: keep fast-failing for another full window.
|
|
242
|
+
this.breaker.trip();
|
|
180
243
|
});
|
|
181
244
|
}
|
|
182
245
|
/** Public, redacted endpoint URL for logs/metrics. */
|
|
@@ -201,6 +264,14 @@ export class EmbedderEndpointClient {
|
|
|
201
264
|
}
|
|
202
265
|
// Identity gate: every embed call must have a verified identity behind it.
|
|
203
266
|
if (this.cachedIdentity === null) {
|
|
267
|
+
if (this.trialPending) {
|
|
268
|
+
// #1216: half-open. The endpoint failed until a window ago and may
|
|
269
|
+
// still not answer. Probe it in the background as the single trial
|
|
270
|
+
// and fail fast here; callers after a successful trial embed again.
|
|
271
|
+
this.startTrialProbe();
|
|
272
|
+
throw new Error(`[EmbedderEndpointClient] circuit breaker half-open for ${this.parsed.safeUrl} — ` +
|
|
273
|
+
`trial probe running, fast-failing`);
|
|
274
|
+
}
|
|
204
275
|
await this.ensureProbed();
|
|
205
276
|
}
|
|
206
277
|
try {
|
|
@@ -210,7 +281,7 @@ export class EmbedderEndpointClient {
|
|
|
210
281
|
return vectors;
|
|
211
282
|
}
|
|
212
283
|
catch (err) {
|
|
213
|
-
this.breaker.recordFailure();
|
|
284
|
+
this.breaker.recordFailure(err instanceof EmbedderEndpointTimeoutError);
|
|
214
285
|
throw err;
|
|
215
286
|
}
|
|
216
287
|
}
|
|
@@ -242,7 +313,7 @@ export class EmbedderEndpointClient {
|
|
|
242
313
|
this.breaker.recordSuccess();
|
|
243
314
|
}
|
|
244
315
|
catch (err) {
|
|
245
|
-
this.breaker.recordFailure();
|
|
316
|
+
this.breaker.recordFailure(err instanceof EmbedderEndpointTimeoutError);
|
|
246
317
|
throw err;
|
|
247
318
|
}
|
|
248
319
|
if (!vec || vec.length !== this.opts.expectedDim) {
|
|
@@ -262,6 +333,7 @@ export class EmbedderEndpointClient {
|
|
|
262
333
|
fingerprint,
|
|
263
334
|
endpoint: this.parsed.safeUrl,
|
|
264
335
|
};
|
|
336
|
+
this.trialPending = false;
|
|
265
337
|
return this.cachedIdentity;
|
|
266
338
|
}
|
|
267
339
|
getCachedIdentity() {
|
|
@@ -374,18 +446,30 @@ export class EmbedderEndpointClient {
|
|
|
374
446
|
const requestTimeoutMs = this.opts.requestTimeoutMs;
|
|
375
447
|
return new Promise((resolve, reject) => {
|
|
376
448
|
let settled = false;
|
|
449
|
+
// #1285: removes this request's listeners from its socket. Keep-alive
|
|
450
|
+
// sockets serve many requests; listeners left behind pile up and a
|
|
451
|
+
// finished request's timeout handler would fire for a later request.
|
|
452
|
+
let detachFromSocket = () => { };
|
|
377
453
|
const safeResolve = (val) => {
|
|
378
454
|
if (settled)
|
|
379
455
|
return;
|
|
380
456
|
settled = true;
|
|
457
|
+
detachFromSocket();
|
|
458
|
+
this.inFlight.delete(abandon);
|
|
381
459
|
resolve(val);
|
|
382
460
|
};
|
|
383
461
|
const safeReject = (err) => {
|
|
384
462
|
if (settled)
|
|
385
463
|
return;
|
|
386
464
|
settled = true;
|
|
465
|
+
detachFromSocket();
|
|
466
|
+
this.inFlight.delete(abandon);
|
|
387
467
|
reject(err);
|
|
388
468
|
};
|
|
469
|
+
const abandon = (err) => {
|
|
470
|
+
safeReject(err);
|
|
471
|
+
req.destroy(err);
|
|
472
|
+
};
|
|
389
473
|
const req = requestFn(reqOptions, (res) => {
|
|
390
474
|
const chunks = [];
|
|
391
475
|
res.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
|
|
@@ -426,18 +510,27 @@ export class EmbedderEndpointClient {
|
|
|
426
510
|
else {
|
|
427
511
|
onConnect();
|
|
428
512
|
}
|
|
429
|
-
|
|
513
|
+
const onTimeout = () => {
|
|
430
514
|
// Distinguish phase for the error message.
|
|
431
515
|
const phase = socket.connecting ? 'connect' : 'request';
|
|
432
516
|
const limit = socket.connecting ? connectTimeoutMs : requestTimeoutMs;
|
|
433
|
-
const err = new
|
|
517
|
+
const err = new EmbedderEndpointTimeoutError(phase, limit);
|
|
434
518
|
// Reject FIRST, then destroy. If we destroy first, the 'error' event
|
|
435
519
|
// races us and we might lose the timeout-specific message.
|
|
436
520
|
safeReject(err);
|
|
437
521
|
req.destroy(err);
|
|
438
|
-
}
|
|
522
|
+
};
|
|
523
|
+
socket.on('timeout', onTimeout);
|
|
524
|
+
detachFromSocket = () => {
|
|
525
|
+
socket.removeListener('timeout', onTimeout);
|
|
526
|
+
socket.removeListener('connect', onConnect);
|
|
527
|
+
};
|
|
528
|
+
// Settled before the socket was assigned: nothing of ours may stay on it.
|
|
529
|
+
if (settled)
|
|
530
|
+
detachFromSocket();
|
|
439
531
|
});
|
|
440
532
|
req.on('error', (err) => safeReject(err));
|
|
533
|
+
this.inFlight.add(abandon);
|
|
441
534
|
req.write(body);
|
|
442
535
|
req.end();
|
|
443
536
|
});
|
|
@@ -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`;
|