@ebrindley/build 0.0.0-stage → 1.42.1-rc28
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/.build-project/providers/catalog.json +13951 -0
- package/.build-project/providers/pricing.json +1978 -0
- package/.build-project/providers/registry.json +4103 -0
- package/.github/SECURITY.md +75 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +661 -0
- package/CODE_OF_CONDUCT.md +44 -0
- package/CONTRIBUTING.md +24 -0
- package/INSTALL.md +623 -0
- package/LICENSE +21 -0
- package/README.md +118 -2
- package/THIRD_PARTY_NOTICES.txt +26 -0
- package/dist/ai-judge-UE5UOYOO.js +191 -0
- package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
- package/dist/allowlist-utils-MZZKKXRD.js +31 -0
- package/dist/apply-completion-mode-EM37UZHB.js +110 -0
- package/dist/artifact-migrator-WPACNSEP.js +276 -0
- package/dist/ask-2OZ4JFQR.js +176 -0
- package/dist/auth-6UKBTJUQ.js +185 -0
- package/dist/auth-H5KJL6HL.js +165 -0
- package/dist/auth-LVJRJDMU.js +12 -0
- package/dist/auth-NHZOCNRR.js +94 -0
- package/dist/auth-PBXHWXGW.js +95 -0
- package/dist/auth-T7Y5DCAH.js +91 -0
- package/dist/auth-TVVKCHQW.js +13 -0
- package/dist/auth-UHB2UCSS.js +97 -0
- package/dist/auth-VACA3VUL.js +98 -0
- package/dist/auth-VVLC77S3.js +44 -0
- package/dist/auth-liveness-XO4AGDDD.js +53 -0
- package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
- package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
- package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
- package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
- package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
- package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
- package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
- package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
- package/dist/autoloop-success-C32QVWOP.js +93 -0
- package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
- package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
- package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
- package/dist/backend-YUTFDZXZ.js +30 -0
- package/dist/background-executor-Z3ODTMD7.js +260 -0
- package/dist/backlog-75QPEAMW.js +403 -0
- package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
- package/dist/backup-active-store-XHWLN34M.js +16 -0
- package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
- package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
- package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
- package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
- package/dist/build-gate-7NKWPY62.js +68 -0
- package/dist/build-root-S7DINODY.js +18 -0
- package/dist/change-summary-R6CB6VXJ.js +50 -0
- package/dist/chunk-24MNKKOM.js +173 -0
- package/dist/chunk-2H6VZFIO.js +235 -0
- package/dist/chunk-2JIX3EKV.js +39 -0
- package/dist/chunk-2KO7HVZM.js +106 -0
- package/dist/chunk-2L36U25O.js +100 -0
- package/dist/chunk-2NMNFUQA.js +475 -0
- package/dist/chunk-2OUAEH67.js +83 -0
- package/dist/chunk-2VLJUXJU.js +115 -0
- package/dist/chunk-2VUEDIUM.js +77 -0
- package/dist/chunk-2Y2IIHPI.js +430 -0
- package/dist/chunk-2YRG3LHZ.js +220 -0
- package/dist/chunk-2Z5Q3SUY.js +65 -0
- package/dist/chunk-32IYXIE5.js +873 -0
- package/dist/chunk-33IGPPUI.js +292 -0
- package/dist/chunk-352PCJLK.js +283 -0
- package/dist/chunk-35J4NE6S.js +226 -0
- package/dist/chunk-3C7WBIVK.js +1016 -0
- package/dist/chunk-3H3EY6U7.js +1225 -0
- package/dist/chunk-3H4MWYIC.js +198 -0
- package/dist/chunk-3HHWQR3N.js +2479 -0
- package/dist/chunk-3JKNRYEE.js +14 -0
- package/dist/chunk-3LECCYZY.js +128 -0
- package/dist/chunk-3LOY6YZI.js +852 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3NOTLVLG.js +3803 -0
- package/dist/chunk-3OPP2OZB.js +1480 -0
- package/dist/chunk-3P5IN5E7.js +9 -0
- package/dist/chunk-3PL22IYZ.js +20 -0
- package/dist/chunk-3REDAJUJ.js +14 -0
- package/dist/chunk-3S2R4XJI.js +203 -0
- package/dist/chunk-3UBZI5DW.js +61 -0
- package/dist/chunk-3VV5OBGG.js +308 -0
- package/dist/chunk-3WY5TU2O.js +823 -0
- package/dist/chunk-43OKHTW4.js +82 -0
- package/dist/chunk-45KUJBDI.js +112 -0
- package/dist/chunk-47X5LM7B.js +224 -0
- package/dist/chunk-4B6FQJ77.js +268 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4DJL2VXA.js +24 -0
- package/dist/chunk-4EBSXZ73.js +48 -0
- package/dist/chunk-4QKP6I4C.js +294 -0
- package/dist/chunk-4U6XK2DG.js +300 -0
- package/dist/chunk-4UMRUFBD.js +132 -0
- package/dist/chunk-4US4SYJ4.js +569 -0
- package/dist/chunk-4ZPLWEZO.js +154 -0
- package/dist/chunk-56WPYDJH.js +624 -0
- package/dist/chunk-57WRCJJW.js +50 -0
- package/dist/chunk-5AW4RMNG.js +24 -0
- package/dist/chunk-5EQN56OZ.js +155 -0
- package/dist/chunk-5F43TUIN.js +38 -0
- package/dist/chunk-5FKHIKTS.js +115 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5KQETTNS.js +152 -0
- package/dist/chunk-5PDVN2KO.js +498 -0
- package/dist/chunk-5UBIFVRD.js +509 -0
- package/dist/chunk-5YDE3Q62.js +46 -0
- package/dist/chunk-626AJVMU.js +302 -0
- package/dist/chunk-633XZ7UF.js +3583 -0
- package/dist/chunk-63DHNHGA.js +236 -0
- package/dist/chunk-666656AR.js +568 -0
- package/dist/chunk-67YRJPJO.js +19 -0
- package/dist/chunk-6CAU7VBA.js +20 -0
- package/dist/chunk-6CB3KJRY.js +21 -0
- package/dist/chunk-6DBMALXL.js +29 -0
- package/dist/chunk-6E25C4IA.js +269 -0
- package/dist/chunk-6FIBNIQU.js +73 -0
- package/dist/chunk-6G57FYBV.js +189 -0
- package/dist/chunk-6KZKRTG3.js +4885 -0
- package/dist/chunk-6LAH2UV2.js +525 -0
- package/dist/chunk-6PZY2TTU.js +921 -0
- package/dist/chunk-6T6NHXK4.js +230 -0
- package/dist/chunk-6TBEX4R4.js +432 -0
- package/dist/chunk-6TRD7TEE.js +911 -0
- package/dist/chunk-6XCP2RAI.js +47 -0
- package/dist/chunk-726G6WDL.js +351 -0
- package/dist/chunk-75EMT7BF.js +616 -0
- package/dist/chunk-762ACDZJ.js +4696 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DJ6SQH3.js +510 -0
- package/dist/chunk-7HPCIOMA.js +1383 -0
- package/dist/chunk-7HYBSRPZ.js +17503 -0
- package/dist/chunk-7KBEOPVB.js +73 -0
- package/dist/chunk-7LHJDJB3.js +2222 -0
- package/dist/chunk-7NVJMH52.js +306 -0
- package/dist/chunk-7RMARDVH.js +33 -0
- package/dist/chunk-7SEWU4QG.js +36 -0
- package/dist/chunk-7TUTZTI2.js +911 -0
- package/dist/chunk-7VBDFPUM.js +340 -0
- package/dist/chunk-7VRJHTGZ.js +6406 -0
- package/dist/chunk-7YAOUUKK.js +493 -0
- package/dist/chunk-AAAODV76.js +860 -0
- package/dist/chunk-AB4HUJVQ.js +339 -0
- package/dist/chunk-AEQWV746.js +611 -0
- package/dist/chunk-AHU3FKPA.js +11639 -0
- package/dist/chunk-AISTV5XU.js +226 -0
- package/dist/chunk-AJBTKGJZ.js +48 -0
- package/dist/chunk-AJJNW7XT.js +248 -0
- package/dist/chunk-AJN5Y5YZ.js +160 -0
- package/dist/chunk-ALDTFNZ3.js +150 -0
- package/dist/chunk-ARARVIZK.js +281 -0
- package/dist/chunk-ATBM6AW5.js +53 -0
- package/dist/chunk-ATKEKM3E.js +206 -0
- package/dist/chunk-AUJLW6JZ.js +92 -0
- package/dist/chunk-AY3MHEFM.js +24 -0
- package/dist/chunk-B7PYTV72.js +236 -0
- package/dist/chunk-B7YRSULE.js +1423 -0
- package/dist/chunk-BAWJNMWF.js +339 -0
- package/dist/chunk-BBPIILO2.js +88 -0
- package/dist/chunk-BD3PGW6A.js +957 -0
- package/dist/chunk-BDPYFAB4.js +44 -0
- package/dist/chunk-BIUV23HH.js +729 -0
- package/dist/chunk-BQ3VAGXH.js +243 -0
- package/dist/chunk-BQJOGAWT.js +31 -0
- package/dist/chunk-BT7EG7CO.js +68 -0
- package/dist/chunk-BV3XQQLU.js +27 -0
- package/dist/chunk-BY6ODHNZ.js +78 -0
- package/dist/chunk-BZRLSZNV.js +79 -0
- package/dist/chunk-C3DH3NCY.js +2773 -0
- package/dist/chunk-C3KCMAJP.js +756 -0
- package/dist/chunk-C7AGUJ5K.js +267 -0
- package/dist/chunk-CBSWKQCX.js +342 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFCVYHSW.js +373 -0
- package/dist/chunk-CHA2HDE5.js +126 -0
- package/dist/chunk-CIHWPGS5.js +146 -0
- package/dist/chunk-CJBSZX3F.js +127 -0
- package/dist/chunk-CLA6QIJM.js +43 -0
- package/dist/chunk-CPSVQR2I.js +365 -0
- package/dist/chunk-CRPRVNQ4.js +254 -0
- package/dist/chunk-CSIE4Y7C.js +1093 -0
- package/dist/chunk-CSOPSYDY.js +142 -0
- package/dist/chunk-CSXLLEGB.js +205 -0
- package/dist/chunk-CTDLERWU.js +293 -0
- package/dist/chunk-CULBXMSK.js +110 -0
- package/dist/chunk-D2M2Y5ID.js +21 -0
- package/dist/chunk-D37WY7SH.js +1060 -0
- package/dist/chunk-D4VJFCGZ.js +89 -0
- package/dist/chunk-D6WTZMZB.js +48 -0
- package/dist/chunk-DBHOWDUH.js +976 -0
- package/dist/chunk-DCACX7BV.js +19364 -0
- package/dist/chunk-DFHX4XYA.js +128 -0
- package/dist/chunk-DIKBRRKE.js +176 -0
- package/dist/chunk-DJG5RIOR.js +9 -0
- package/dist/chunk-DNIOIISW.js +616 -0
- package/dist/chunk-DOA5G7IA.js +315 -0
- package/dist/chunk-DP7FKP6W.js +855 -0
- package/dist/chunk-DS2JZ677.js +79 -0
- package/dist/chunk-DSRLVYBS.js +82 -0
- package/dist/chunk-EAEVKNJA.js +209 -0
- package/dist/chunk-EEUESN3T.js +575 -0
- package/dist/chunk-EJ4LUU5Y.js +73 -0
- package/dist/chunk-EJIWTPSZ.js +1063 -0
- package/dist/chunk-EJVCDTAN.js +116 -0
- package/dist/chunk-EKLUBDBQ.js +627 -0
- package/dist/chunk-EN62WLFD.js +849 -0
- package/dist/chunk-ENYRCL43.js +26 -0
- package/dist/chunk-EP22ZMFO.js +273 -0
- package/dist/chunk-EP4SVAVI.js +87 -0
- package/dist/chunk-EPAMVGI3.js +1562 -0
- package/dist/chunk-EPRMH6HO.js +24 -0
- package/dist/chunk-ES6NWJ36.js +4057 -0
- package/dist/chunk-ETA2K4KI.js +30 -0
- package/dist/chunk-ETAD4NKD.js +31 -0
- package/dist/chunk-EUWIIDQ7.js +93 -0
- package/dist/chunk-EVE3OD2W.js +141 -0
- package/dist/chunk-EXA26FFC.js +459 -0
- package/dist/chunk-EXSPAA35.js +244 -0
- package/dist/chunk-F55YABKV.js +258 -0
- package/dist/chunk-F5DNGU5W.js +27 -0
- package/dist/chunk-F622MJYV.js +103 -0
- package/dist/chunk-F6NIQD74.js +5111 -0
- package/dist/chunk-FAWJTC34.js +43 -0
- package/dist/chunk-FAZBRHGG.js +47 -0
- package/dist/chunk-FIEUSGNJ.js +39 -0
- package/dist/chunk-FKCG7K6H.js +1146 -0
- package/dist/chunk-FOVVXV45.js +229 -0
- package/dist/chunk-FRBPKBFE.js +30 -0
- package/dist/chunk-FSA5BPFI.js +268 -0
- package/dist/chunk-FSJ5TTZ3.js +29 -0
- package/dist/chunk-FT7SGLXT.js +193 -0
- package/dist/chunk-FUUVZZUB.js +62 -0
- package/dist/chunk-FYMRVUNZ.js +1697 -0
- package/dist/chunk-FYTAA5FG.js +162 -0
- package/dist/chunk-G3VB2UCZ.js +3892 -0
- package/dist/chunk-G6OIMVXH.js +405 -0
- package/dist/chunk-G7PQCXVH.js +228 -0
- package/dist/chunk-GAB6UW52.js +1087 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GC4CRMTS.js +642 -0
- package/dist/chunk-GFHSIWHL.js +5297 -0
- package/dist/chunk-GI5M67YA.js +735 -0
- package/dist/chunk-GIJWHUWF.js +191 -0
- package/dist/chunk-GO6DRECI.js +1 -0
- package/dist/chunk-GOFVBTMN.js +314 -0
- package/dist/chunk-GQIP72ZJ.js +13 -0
- package/dist/chunk-GQXLXRFA.js +28 -0
- package/dist/chunk-GT6HFKJB.js +48 -0
- package/dist/chunk-GVJGSSKM.js +174 -0
- package/dist/chunk-GWHGTG37.js +36 -0
- package/dist/chunk-GZAJHLKO.js +18 -0
- package/dist/chunk-GZK62I3N.js +314 -0
- package/dist/chunk-H3HGMISG.js +483 -0
- package/dist/chunk-H3ISZJMJ.js +403 -0
- package/dist/chunk-H4HXVWEC.js +9 -0
- package/dist/chunk-H6MJGKAW.js +120 -0
- package/dist/chunk-HBTTGVR5.js +353 -0
- package/dist/chunk-HBZ322WZ.js +35 -0
- package/dist/chunk-HEP3ILP4.js +34 -0
- package/dist/chunk-HGFXODKO.js +106 -0
- package/dist/chunk-HHWDTB6S.js +59 -0
- package/dist/chunk-HKO45NLZ.js +286 -0
- package/dist/chunk-HLVTEA6A.js +89 -0
- package/dist/chunk-HS3SY6HN.js +160 -0
- package/dist/chunk-HT5OCGKN.js +899 -0
- package/dist/chunk-HXIIEMGF.js +78 -0
- package/dist/chunk-I56TH7VM.js +46 -0
- package/dist/chunk-I6FN3R5D.js +352 -0
- package/dist/chunk-I7SCBHJN.js +655 -0
- package/dist/chunk-IJM4GKAT.js +529 -0
- package/dist/chunk-IMEYU36R.js +344 -0
- package/dist/chunk-INJ3SS6A.js +936 -0
- package/dist/chunk-IUKOPCCE.js +441 -0
- package/dist/chunk-IVEPZQJO.js +33 -0
- package/dist/chunk-IVZEONFC.js +43 -0
- package/dist/chunk-IWBHRSG7.js +936 -0
- package/dist/chunk-IYY3HQAD.js +484 -0
- package/dist/chunk-J2ICMYDA.js +48 -0
- package/dist/chunk-J2QCFLUN.js +505 -0
- package/dist/chunk-J5HM6V5P.js +1039 -0
- package/dist/chunk-J6NZX6QH.js +398 -0
- package/dist/chunk-JBBB2Y47.js +432 -0
- package/dist/chunk-JDCZQZU7.js +42 -0
- package/dist/chunk-JEDNXGSS.js +169 -0
- package/dist/chunk-JHP7OT6K.js +89 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JNMWYMC6.js +38 -0
- package/dist/chunk-JNSTWNNW.js +25 -0
- package/dist/chunk-JOSK6GEU.js +9564 -0
- package/dist/chunk-JQUMSIGC.js +100 -0
- package/dist/chunk-JVHGMURQ.js +1106 -0
- package/dist/chunk-JYXS47FQ.js +951 -0
- package/dist/chunk-K2ZMW2Z5.js +2147 -0
- package/dist/chunk-K7FAFORM.js +14 -0
- package/dist/chunk-KBJXX3ON.js +333 -0
- package/dist/chunk-KHFKVQWY.js +486 -0
- package/dist/chunk-KHMEI3DQ.js +173 -0
- package/dist/chunk-KHW3UD7B.js +69 -0
- package/dist/chunk-KKQKWAMF.js +365 -0
- package/dist/chunk-KOKXJV2U.js +455 -0
- package/dist/chunk-KQ4NGOJI.js +14 -0
- package/dist/chunk-KQYQOXMS.js +342 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-KUEWV2JH.js +593 -0
- package/dist/chunk-KXYDV3HP.js +1523 -0
- package/dist/chunk-KZ4JMGZ5.js +96 -0
- package/dist/chunk-KZWGBUIO.js +2659 -0
- package/dist/chunk-L2CBG5IX.js +1892 -0
- package/dist/chunk-L2S235CU.js +314 -0
- package/dist/chunk-L32WD57F.js +98 -0
- package/dist/chunk-LDJCKAJP.js +123 -0
- package/dist/chunk-LDWNBEN7.js +541 -0
- package/dist/chunk-LJVH57G2.js +241 -0
- package/dist/chunk-LPQ7NZEN.js +209 -0
- package/dist/chunk-LRGH3CCV.js +148 -0
- package/dist/chunk-LULOGMMM.js +1133 -0
- package/dist/chunk-LWGKN2GY.js +8284 -0
- package/dist/chunk-LX4F24ZH.js +157 -0
- package/dist/chunk-M4BUEXXF.js +839 -0
- package/dist/chunk-M6UHOC4I.js +553 -0
- package/dist/chunk-MCBNWZNO.js +657 -0
- package/dist/chunk-MEMSY6VY.js +223 -0
- package/dist/chunk-MHLEZQQI.js +145 -0
- package/dist/chunk-MJ6WNSIX.js +192 -0
- package/dist/chunk-MKASIKWZ.js +442 -0
- package/dist/chunk-MNOVBYFU.js +60 -0
- package/dist/chunk-MO2BYAAF.js +2896 -0
- package/dist/chunk-MP6P7Y2A.js +180 -0
- package/dist/chunk-MQ4TFJAG.js +3365 -0
- package/dist/chunk-MT2WAIR3.js +131 -0
- package/dist/chunk-MTU7VTNN.js +1122 -0
- package/dist/chunk-MULMXX4V.js +150 -0
- package/dist/chunk-MW2DWWVA.js +147 -0
- package/dist/chunk-MY3ZPUN4.js +151 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N3Q2JNPV.js +249 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-NAINGKHF.js +35 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NHNPEZS4.js +1408 -0
- package/dist/chunk-NHTIXJCR.js +17 -0
- package/dist/chunk-NKLPMBNV.js +1154 -0
- package/dist/chunk-NMVZ5YES.js +199 -0
- package/dist/chunk-NRFRY3GE.js +256 -0
- package/dist/chunk-NTD6CSI6.js +1266 -0
- package/dist/chunk-NUO7B3SH.js +318 -0
- package/dist/chunk-NVOHIJKG.js +1319 -0
- package/dist/chunk-NXH3RX7O.js +523 -0
- package/dist/chunk-NXZ3DURF.js +257 -0
- package/dist/chunk-O26L6F7F.js +209 -0
- package/dist/chunk-O5RRIUEP.js +124 -0
- package/dist/chunk-O5X6BKAO.js +10 -0
- package/dist/chunk-O6ZQUVTR.js +31 -0
- package/dist/chunk-O7FE75QZ.js +306 -0
- package/dist/chunk-OC7Z6AJQ.js +81 -0
- package/dist/chunk-OH7IEZ63.js +307 -0
- package/dist/chunk-OI734GRS.js +115 -0
- package/dist/chunk-OJBH62DK.js +684 -0
- package/dist/chunk-OKJLVSTJ.js +247 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ONHAMBN6.js +12 -0
- package/dist/chunk-ONYPLIVE.js +753 -0
- package/dist/chunk-OSK7QWPD.js +637 -0
- package/dist/chunk-OTXLMJKP.js +438 -0
- package/dist/chunk-OV5PKQMA.js +213 -0
- package/dist/chunk-OXK5HA4B.js +31 -0
- package/dist/chunk-OYDWFQA4.js +272 -0
- package/dist/chunk-OZAUKWHB.js +22 -0
- package/dist/chunk-P5P2EKGH.js +94 -0
- package/dist/chunk-P6SSWAKY.js +29 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-P7RVCHQV.js +197 -0
- package/dist/chunk-PEBWDYIW.js +726 -0
- package/dist/chunk-PFCXFO7A.js +9193 -0
- package/dist/chunk-PFLDWMX6.js +168 -0
- package/dist/chunk-PHZGLQSK.js +15883 -0
- package/dist/chunk-PNFTPNSR.js +20 -0
- package/dist/chunk-PPHXX4W7.js +175 -0
- package/dist/chunk-PPZESPJT.js +262 -0
- package/dist/chunk-PRDHI2L5.js +296 -0
- package/dist/chunk-PSTKWHHN.js +32 -0
- package/dist/chunk-PV53ODOT.js +555 -0
- package/dist/chunk-PVJBTI7P.js +24 -0
- package/dist/chunk-PXKERBKX.js +100 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3DHEZA5.js +85 -0
- package/dist/chunk-Q5RZDVQK.js +204 -0
- package/dist/chunk-Q64IR2Z2.js +4933 -0
- package/dist/chunk-Q6Z5UGPL.js +398 -0
- package/dist/chunk-QAMAV4DT.js +627 -0
- package/dist/chunk-QBWF4444.js +112 -0
- package/dist/chunk-QDKYT4CI.js +22805 -0
- package/dist/chunk-QFLBRWCJ.js +126 -0
- package/dist/chunk-QILAQACE.js +107 -0
- package/dist/chunk-QJ6OEH4K.js +3683 -0
- package/dist/chunk-QK3NLYTV.js +320 -0
- package/dist/chunk-QOFLUS24.js +535 -0
- package/dist/chunk-QOIASNEJ.js +98 -0
- package/dist/chunk-QP4UTSOV.js +3587 -0
- package/dist/chunk-QP5ST7RI.js +904 -0
- package/dist/chunk-QS5AGRZN.js +167 -0
- package/dist/chunk-QTAOU53N.js +107 -0
- package/dist/chunk-QTCLJHLZ.js +351 -0
- package/dist/chunk-QTOLTG4L.js +119 -0
- package/dist/chunk-QWDV4OSL.js +142 -0
- package/dist/chunk-QWMQ74KD.js +508 -0
- package/dist/chunk-QX6LOMMH.js +158 -0
- package/dist/chunk-QXBKIHY7.js +238 -0
- package/dist/chunk-QXBKTJT6.js +270 -0
- package/dist/chunk-QYQOVOLR.js +196 -0
- package/dist/chunk-R2CKS6WT.js +73 -0
- package/dist/chunk-R2TIYG7U.js +68 -0
- package/dist/chunk-R2W3LESH.js +465 -0
- package/dist/chunk-R5EXHMUN.js +100 -0
- package/dist/chunk-RBBTBCHX.js +289 -0
- package/dist/chunk-RBKLOUXA.js +121 -0
- package/dist/chunk-RCP2Y6DQ.js +86 -0
- package/dist/chunk-RCYEJSD5.js +260 -0
- package/dist/chunk-RFDVSI4N.js +134 -0
- package/dist/chunk-RGJU63FV.js +1717 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RIMARPCF.js +152 -0
- package/dist/chunk-RJ6RSNT6.js +42 -0
- package/dist/chunk-RNI2GUIF.js +131 -0
- package/dist/chunk-RPHUWJ3K.js +264 -0
- package/dist/chunk-RPIMAMV7.js +361 -0
- package/dist/chunk-RQFX6YRN.js +49 -0
- package/dist/chunk-RRC5BL7B.js +285 -0
- package/dist/chunk-RSYTSBOO.js +79 -0
- package/dist/chunk-RWQQIKIC.js +35 -0
- package/dist/chunk-RZUBOZH2.js +373 -0
- package/dist/chunk-S2E632FQ.js +380 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S2XIMQJQ.js +681 -0
- package/dist/chunk-S47ISY27.js +183 -0
- package/dist/chunk-S6I4KISU.js +142 -0
- package/dist/chunk-S6TAFQI5.js +2403 -0
- package/dist/chunk-SBBNT5ZJ.js +27 -0
- package/dist/chunk-SDJV2DTQ.js +491 -0
- package/dist/chunk-SDPIFNLD.js +33 -0
- package/dist/chunk-SF6YK3JI.js +835 -0
- package/dist/chunk-SK3ZFONO.js +976 -0
- package/dist/chunk-SKTFRFQ7.js +1775 -0
- package/dist/chunk-SNGM452K.js +2002 -0
- package/dist/chunk-STW7OFOA.js +581 -0
- package/dist/chunk-SU6UFUQY.js +1351 -0
- package/dist/chunk-SVJM3LJA.js +27 -0
- package/dist/chunk-SVUNZOPG.js +129 -0
- package/dist/chunk-T5XLUYV3.js +34 -0
- package/dist/chunk-T7E5JS6N.js +57 -0
- package/dist/chunk-TA3N5MMO.js +450 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TDEMDRN2.js +1639 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TGCVL74Y.js +28 -0
- package/dist/chunk-TGXXYDL4.js +1012 -0
- package/dist/chunk-TIKTYUJO.js +296 -0
- package/dist/chunk-TIZAJD4M.js +6029 -0
- package/dist/chunk-TLSEZZCG.js +5549 -0
- package/dist/chunk-TMBDRHAX.js +19 -0
- package/dist/chunk-TRURQUBP.js +1217 -0
- package/dist/chunk-TSQ256N5.js +152 -0
- package/dist/chunk-TUQMMFEQ.js +2244 -0
- package/dist/chunk-U424MJLC.js +81 -0
- package/dist/chunk-U4DRS6ZW.js +11 -0
- package/dist/chunk-U5KS22IN.js +204 -0
- package/dist/chunk-UAPHFJPN.js +673 -0
- package/dist/chunk-UB7LQITD.js +1040 -0
- package/dist/chunk-UBVRHGAZ.js +237 -0
- package/dist/chunk-UDNNAQN5.js +98 -0
- package/dist/chunk-UJP3XM54.js +342 -0
- package/dist/chunk-UJYDH2MW.js +305 -0
- package/dist/chunk-UKMPASIC.js +399 -0
- package/dist/chunk-UKUL3EHK.js +763 -0
- package/dist/chunk-UPHU64NB.js +1327 -0
- package/dist/chunk-URMSZXAD.js +43 -0
- package/dist/chunk-US3RT6CY.js +525 -0
- package/dist/chunk-UTDEOPKV.js +30 -0
- package/dist/chunk-UUUDKV7N.js +13 -0
- package/dist/chunk-UVKWU3SM.js +39 -0
- package/dist/chunk-V2TVPO3X.js +521 -0
- package/dist/chunk-V3KLVK7B.js +398 -0
- package/dist/chunk-V3YFFHDR.js +17 -0
- package/dist/chunk-VAG6GUBR.js +1162 -0
- package/dist/chunk-VBENAHDA.js +1814 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VCGSWN5M.js +1300 -0
- package/dist/chunk-VE2O2I7M.js +115 -0
- package/dist/chunk-VIFHYTI5.js +31 -0
- package/dist/chunk-VJER3FUS.js +5080 -0
- package/dist/chunk-VLMDM56Q.js +268 -0
- package/dist/chunk-VMFZEVVX.js +99 -0
- package/dist/chunk-VNDPQVUZ.js +1853 -0
- package/dist/chunk-VSPJRLGA.js +4783 -0
- package/dist/chunk-VSWC5ZXI.js +103 -0
- package/dist/chunk-VYI4DSZP.js +2017 -0
- package/dist/chunk-W4BAIQ6L.js +1212 -0
- package/dist/chunk-W7VQAL2K.js +2203 -0
- package/dist/chunk-WEI3ZDZH.js +33 -0
- package/dist/chunk-WEIUS5NT.js +26 -0
- package/dist/chunk-WEW7UFWE.js +546 -0
- package/dist/chunk-WGQAXLNA.js +384 -0
- package/dist/chunk-WJAL4JL3.js +206 -0
- package/dist/chunk-WKFOJ5ZG.js +141 -0
- package/dist/chunk-WMWQEFLN.js +2177 -0
- package/dist/chunk-WNECKKO2.js +154 -0
- package/dist/chunk-WPKLYOAM.js +195 -0
- package/dist/chunk-WSH37YQN.js +243 -0
- package/dist/chunk-WV3KQDPE.js +84 -0
- package/dist/chunk-WZFC4V4U.js +389 -0
- package/dist/chunk-XCOIBNET.js +13 -0
- package/dist/chunk-XDM65LBX.js +53 -0
- package/dist/chunk-XGU6PBO5.js +645 -0
- package/dist/chunk-XHOI4V62.js +43 -0
- package/dist/chunk-XIBVFMLQ.js +6858 -0
- package/dist/chunk-XJ2E7YEJ.js +117 -0
- package/dist/chunk-XON4ZCYX.js +69 -0
- package/dist/chunk-XQPEWJPI.js +127 -0
- package/dist/chunk-XSJTIFUY.js +31 -0
- package/dist/chunk-XT7OVWM3.js +64 -0
- package/dist/chunk-XTXYIISX.js +1104 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XWIZ6B5S.js +109 -0
- package/dist/chunk-XWLIKOBX.js +240 -0
- package/dist/chunk-XZOXEIN4.js +156 -0
- package/dist/chunk-XZRS7I7W.js +3673 -0
- package/dist/chunk-Y4ZDDHB6.js +44 -0
- package/dist/chunk-Y733RB7T.js +194 -0
- package/dist/chunk-YBHUB4XR.js +14931 -0
- package/dist/chunk-YKC75XK4.js +147 -0
- package/dist/chunk-YKMXFVK7.js +27 -0
- package/dist/chunk-YO5BAJ55.js +225 -0
- package/dist/chunk-YPDCLXNZ.js +568 -0
- package/dist/chunk-YSQPGVFK.js +116 -0
- package/dist/chunk-YTVVTIWJ.js +716 -0
- package/dist/chunk-YVCMDVBB.js +698 -0
- package/dist/chunk-YYTOA6DP.js +114 -0
- package/dist/chunk-Z5WGNULV.js +88 -0
- package/dist/chunk-Z6NGVVXG.js +66 -0
- package/dist/chunk-Z7CDQNH3.js +20 -0
- package/dist/chunk-ZH4G3FU5.js +187 -0
- package/dist/chunk-ZJB6SQPA.js +257 -0
- package/dist/chunk-ZL6E4HMY.js +42 -0
- package/dist/chunk-ZMLOC3DW.js +62 -0
- package/dist/chunk-ZORW64QH.js +101 -0
- package/dist/chunk-ZVVD2XGV.js +1369 -0
- package/dist/cli-utils-ER33ODC5.js +31 -0
- package/dist/cli-validation-6CHPTANV.js +146 -0
- package/dist/commit-utils-3STAY7C7.js +49 -0
- package/dist/compatibility-notice-IHNXR2JR.js +21 -0
- package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
- package/dist/compete-results-XUM3PJHS.js +318 -0
- package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
- package/dist/config-4HHE4OIK.js +238 -0
- package/dist/config-D6YAZASH.js +10 -0
- package/dist/config-MIPRDYYV.js +46 -0
- package/dist/config-audit-GA5DCUAI.js +371 -0
- package/dist/config-explain-4LMO556H.js +71 -0
- package/dist/config-loader-RGP634PC.js +51 -0
- package/dist/config-manager-J2UTO635.js +114 -0
- package/dist/config-merger-TVUJBZTS.js +14 -0
- package/dist/config-validator-H4ZVIE56.js +122 -0
- package/dist/cost-HSIV5U2Y.js +85 -0
- package/dist/data-migration-state-OAUL2WPQ.js +35 -0
- package/dist/db-migrator-NUOW5NKR.js +34 -0
- package/dist/default-paths-UILB62BN.js +49 -0
- package/dist/discovery-V6GYUJUC.js +53 -0
- package/dist/doctor-BBSMCDWE.js +271 -0
- package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
- package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
- package/dist/doctor-purpose-6YJOXPBE.js +30 -0
- package/dist/domain-analyzer-S35ABUNA.js +48 -0
- package/dist/ensure-initialized-Q6PEU55O.js +78 -0
- package/dist/entry.js +922 -0
- package/dist/error-parser-core-MZFMFANN.js +70 -0
- package/dist/evaluation-context-GQBYDAEV.js +63 -0
- package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
- package/dist/execution-data-writer-YCG5UH37.js +72 -0
- package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
- package/dist/execution-preflight-DASJWWQF.js +223 -0
- package/dist/execution-roles-KNSNNB2D.js +112 -0
- package/dist/exit-code-error-QIY5DOKF.js +18 -0
- package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
- package/dist/factory-YCYCB7AE.js +209 -0
- package/dist/file-utils-ZQYNBQBW.js +45 -0
- package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
- package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
- package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
- package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
- package/dist/flywheel-executor-JWU43KAY.js +437 -0
- package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
- package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
- package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
- package/dist/flywheel-preflight-III2C7TH.js +163 -0
- package/dist/flywheel-resume-2O45MS7Y.js +31 -0
- package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
- package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
- package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
- package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
- package/dist/git-message-style-KCXGMTDT.js +104 -0
- package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
- package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
- package/dist/identity-XLQJ4YJF.js +25 -0
- package/dist/index-query-6NUY4FKX.js +37 -0
- package/dist/index.js +85588 -0
- package/dist/indexer-DL54CM3K.js +44 -0
- package/dist/init-OUZ72344.js +245 -0
- package/dist/instructions-import-offer-NSYXSITC.js +363 -0
- package/dist/instructions-run-NBII7W36.js +114 -0
- package/dist/interrupted-work-E4TLKJLE.js +43 -0
- package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
- package/dist/judge-scoring.json +64 -0
- package/dist/lab-mode-YXQ2Y3NG.js +44 -0
- package/dist/lab-utils-5QAMDJR5.js +29 -0
- package/dist/linux-host-class-YDWQX65O.js +31 -0
- package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
- package/dist/local-ci-config-VZ4WWDT5.js +48 -0
- package/dist/local-executor-DCMDDRX2.js +280 -0
- package/dist/logger-5KNKS3O4.js +154 -0
- package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
- package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
- package/dist/merge-batch-RTEEMVDB.js +313 -0
- package/dist/merge-batch-members-VIWGVRHP.js +24 -0
- package/dist/merge-queue-TIIUSOY6.js +126 -0
- package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
- package/dist/metadata-UKSMWM6J.js +29 -0
- package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
- package/dist/model-invocations-db-XTUPPQ34.js +70 -0
- package/dist/model-resolver-JFZ2MHOJ.js +39 -0
- package/dist/model-resolver-SCQ57KAQ.js +217 -0
- package/dist/model-roles-D3OR4NAH.js +110 -0
- package/dist/monitor-F4SIU5G2.js +96 -0
- package/dist/nested-worktrees-2WUWQ75N.js +23 -0
- package/dist/next-S3IRLVER.js +96 -0
- package/dist/next-UKPFRXOO.js +148 -0
- package/dist/opportunistic-TL4S26VX.js +86 -0
- package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
- package/dist/package-HJR4QJT4.js +10 -0
- package/dist/parse-git-status-7PIYFPS2.js +21 -0
- package/dist/path-security-5WJSY56G.js +41 -0
- package/dist/paths-JUI7C4KU.js +45 -0
- package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
- package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
- package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
- package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
- package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
- package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
- package/dist/preflight-PJHGTJNZ.js +12 -0
- package/dist/process-registry-B4ZUCN7T.js +28 -0
- package/dist/process-scanner-TU3QHWVB.js +23 -0
- package/dist/processes-6FHVGT72.js +28 -0
- package/dist/processes-json-fast-YWTMUWXB.js +72 -0
- package/dist/profile-HWTC56SG.js +209 -0
- package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
- package/dist/protected-branches-N36LDBFY.js +71 -0
- package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
- package/dist/provider-matrix-2KO2V5OM.js +214 -0
- package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
- package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
- package/dist/provider-registry-WCZ65QHC.js +136 -0
- package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
- package/dist/prune-engine-EOQVWEP6.js +448 -0
- package/dist/publication-turn-S42RZTQF.js +44 -0
- package/dist/quality-gate-JQMVCKOO.js +72 -0
- package/dist/quickstart-3O6FRCFB.js +105 -0
- package/dist/readiness-GW6ABRHB.js +139 -0
- package/dist/readiness-KFZCXDTT.js +215 -0
- package/dist/registry-7XG376SY.js +217 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-YG6MQZDW.js +28 -0
- package/dist/resolution-engine-FFEK7HQ2.js +187 -0
- package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
- package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
- package/dist/routing-events-AW6SRZ6G.js +13 -0
- package/dist/routing-history-store-FMDDQL6W.js +39 -0
- package/dist/routing-planner-C6OHO3EY.js +221 -0
- package/dist/runner-KHDNQ5KU.js +1194 -0
- package/dist/runner-PIS2BW7Y.js +1801 -0
- package/dist/safety-E3JJVSFL.js +67 -0
- package/dist/safety-stanza-HE6GXP4G.js +49 -0
- package/dist/sandbox-7LBZC5PE.js +72 -0
- package/dist/sandbox-ASWCDYZL.js +80 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-JI22TBEB.js +17 -0
- package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
- package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
- package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
- package/dist/shared-utils-34HJZ6JX.js +40 -0
- package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
- package/dist/sprint-N7JFTEGL.js +403 -0
- package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
- package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
- package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
- package/dist/sprint-manager-MU2ZUWN2.js +140 -0
- package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
- package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
- package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
- package/dist/storage-access-I3V5LER7.js +31 -0
- package/dist/store-XVG64ZR2.js +25 -0
- package/dist/task-classifier-MN2DYE5R.js +558 -0
- package/dist/task-list-fast-7AT6LTTA.js +112 -0
- package/dist/task-manager-LHPBBRRE.js +136 -0
- package/dist/task-report-OLPAWBTK.js +64 -0
- package/dist/task-type-detector-6RG3YNZF.js +27 -0
- package/dist/task-type-resolver-EQHOUIHT.js +64 -0
- package/dist/telemetry-5VYSK772.js +212 -0
- package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
- package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
- package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
- package/dist/transports-NREZQTJK.js +106 -0
- package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
- package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
- package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
- package/dist/user-agents-QLIGPLP2.js +30 -0
- package/dist/variant-execution-I4ZZUAWY.js +319 -0
- package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
- package/dist/variant-request-input-PL37N3AN.js +11 -0
- package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
- package/dist/variant-worker-COB5YTJX.js +4517 -0
- package/dist/variant-worker.js +26 -0
- package/dist/variants-XGDSXYG3.js +267 -0
- package/dist/verification-command-YSPU4VBH.js +66 -0
- package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
- package/dist/verify-commands-LOHMOFKC.js +65 -0
- package/dist/warning-JSKSFKBT.js +13 -0
- package/dist/work-edge-K65NHVWY.js +50 -0
- package/dist/work-item-writer-KY5ZWZWW.js +30 -0
- package/dist/worker-JNXXEIT6.js +1504 -0
- package/dist/worker.js +21 -0
- package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
- package/dist/worktree-environment-WTVABAQW.js +64 -0
- package/dist/worktree-metrics-VZRQI26T.js +66 -0
- package/dist/writeback-TQFQBJNU.js +50 -0
- package/docs/CLI_REFERENCE.md +8287 -0
- package/docs/PROVIDER_SETUP.md +1737 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2209 -0
- package/docs/getting-started/QUICK_START.md +260 -0
- package/docs/getting-started/README.md +198 -0
- package/docs/getting-started/SETUP.md +25 -0
- package/docs/reference/AGENT_CONTEXT.md +84 -0
- package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/SECURITY.md +291 -0
- package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
- package/integrations/bb-plugin-build/README.md +391 -0
- package/integrations/bb-plugin-build/app.css +431 -0
- package/integrations/bb-plugin-build/app.tsx +6210 -0
- package/integrations/bb-plugin-build/package.json +45 -0
- package/integrations/bb-plugin-build/server.ts +488 -0
- package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
- package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
- package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-build/src/contract.ts +718 -0
- package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
- package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
- package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
- package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-build/src/model.ts +1318 -0
- package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
- package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
- package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
- package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
- package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
- package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
- package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-build/src/project-target.ts +45 -0
- package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
- package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
- package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
- package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
- package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
- package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
- package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
- package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
- package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
- package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
- package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
- package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
- package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
- package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
- package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
- package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
- package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
- package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
- package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
- package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
- package/package.json +306 -4
- package/schemas/README.md +80 -0
- package/schemas/build.config.schema.json +2110 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +257 -0
- package/schemas/provider-config.schema.json +179 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +146 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/setup-git-hooks.mjs +39 -0
- package/scripts/sync.sh +2871 -0
- package/scripts/write-node-launcher.sh +138 -0
- package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
- package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
- package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
- package/templates/.build-project/README.md +41 -0
- package/templates/.build-project/agents/README.md +50 -0
- package/templates/.build-project/agents/architect.md +10 -0
- package/templates/.build-project/agents/code-reviewer.md +10 -0
- package/templates/.build-project/agents/debugger.md +10 -0
- package/templates/.build-project/agents/documenter.md +10 -0
- package/templates/.build-project/agents/test-automator.md +10 -0
- package/templates/.build-project/config/build.config.jsonc +64 -0
- package/templates/.build-project/config/project-context.template.json +6 -0
- package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.build-project/config/task-type-aliases.yaml +29 -0
- package/templates/.build-project/gitignore.template +70 -0
- package/templates/.build-project/task-types/analysis.yaml +38 -0
- package/templates/.build-project/task-types/architecture.yaml +35 -0
- package/templates/.build-project/task-types/doc.yaml +34 -0
- package/templates/.build-project/task-types/feature.yaml +22 -0
- package/templates/.build-project/task-types/general.yaml +4 -0
- package/templates/.build-project/task-types/security.yaml +38 -0
- package/templates/AGENTS.template.md +85 -0
- package/templates/CLAUDE.template.md +1 -0
- package/templates/GEMINI.template.md +1 -0
- package/templates/builtin-workflows/code-review.yaml +73 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
- package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
- package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
- package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
- package/templates/ci/incident-intake.mjs +787 -0
- package/templates/ci/incidents.yml.template +103 -0
- package/templates/ci/node.yml.template +17 -0
- package/templates/ci/python.yml.template +17 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
- package/templates/guard-kit/build-guard.yml.template +189 -0
- package/templates/guard-kit/check.mjs.template +932 -0
- package/templates/guard-kit/config.json.template +7 -0
- package/templates/guard-kit/policy.json.template +1 -0
- package/templates/profiles/README.md +57 -0
- package/templates/profiles/frontier-claude.json +23 -0
- package/templates/profiles/frontier-codex.json +23 -0
|
@@ -0,0 +1,1523 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getTelemetryLogger
|
|
3
|
+
} from "./chunk-UUUDKV7N.js";
|
|
4
|
+
import {
|
|
5
|
+
SCHEMA_INVARIANTS,
|
|
6
|
+
VARIANT_EXECUTION_COLUMNS
|
|
7
|
+
} from "./chunk-XIBVFMLQ.js";
|
|
8
|
+
import {
|
|
9
|
+
globalScope,
|
|
10
|
+
projectScope
|
|
11
|
+
} from "./chunk-GAFJEYLK.js";
|
|
12
|
+
import {
|
|
13
|
+
TelemetryPathResolver
|
|
14
|
+
} from "./chunk-C3KCMAJP.js";
|
|
15
|
+
import {
|
|
16
|
+
applySqlitePragmas
|
|
17
|
+
} from "./chunk-HEP3ILP4.js";
|
|
18
|
+
import {
|
|
19
|
+
emitTelemetryFallbackWarning
|
|
20
|
+
} from "./chunk-BQJOGAWT.js";
|
|
21
|
+
import {
|
|
22
|
+
getGlobalTelemetryDir
|
|
23
|
+
} from "./chunk-56WPYDJH.js";
|
|
24
|
+
import {
|
|
25
|
+
emitWarning
|
|
26
|
+
} from "./chunk-7VRJHTGZ.js";
|
|
27
|
+
|
|
28
|
+
// src/telemetry/dashboard.ts
|
|
29
|
+
import fs from "fs";
|
|
30
|
+
import path from "path";
|
|
31
|
+
import Database from "better-sqlite3";
|
|
32
|
+
|
|
33
|
+
// src/telemetry/trend-direction.ts
|
|
34
|
+
var MIN_TASKS_FOR_TREND = 4;
|
|
35
|
+
function classifyTrend(taskCount, change, withinStableBand) {
|
|
36
|
+
if (taskCount < MIN_TASKS_FOR_TREND) return "insufficient_data";
|
|
37
|
+
if (withinStableBand) return "stable";
|
|
38
|
+
return change > 0 ? "improving" : "declining";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/telemetry/dashboard.ts
|
|
42
|
+
var TelemetryDashboard = class _TelemetryDashboard {
|
|
43
|
+
/**
|
|
44
|
+
* Exclude synthetic test rows from dashboard queries.
|
|
45
|
+
* Tests that leak into the real DB typically have NULL verdict and/or task IDs
|
|
46
|
+
* prefixed with common test IDs (test-* and task-*).
|
|
47
|
+
* Without this filter, synthetic rows appear as failures and distort success-rate metrics.
|
|
48
|
+
*/
|
|
49
|
+
static REAL_DATA_FILTER = "verdict IS NOT NULL AND verdict != '' AND task_id NOT LIKE 'test-%' AND task_id NOT LIKE 'task-%'";
|
|
50
|
+
/** SQLite database connection for variant execution telemetry */
|
|
51
|
+
variantsDb;
|
|
52
|
+
/** SQLite database connection for validation telemetry */
|
|
53
|
+
validationsDb;
|
|
54
|
+
enabled = true;
|
|
55
|
+
projectScopeWhere;
|
|
56
|
+
projectScopeParams;
|
|
57
|
+
/**
|
|
58
|
+
* Creates a new TelemetryDashboard instance
|
|
59
|
+
*
|
|
60
|
+
* Establishes connections to SQLite telemetry databases in .build-project/telemetry/db/
|
|
61
|
+
*
|
|
62
|
+
* @param options - Configuration options
|
|
63
|
+
* @throws {Error} If database files cannot be accessed
|
|
64
|
+
*/
|
|
65
|
+
constructor(options = {}) {
|
|
66
|
+
const buildDir = options.buildDir || path.join(process.cwd(), ".build-project");
|
|
67
|
+
const resolver = TelemetryPathResolver.getInstance();
|
|
68
|
+
const dbDir = resolver.resolveDbDir(buildDir);
|
|
69
|
+
const projectId = options.projectId?.trim() || resolver.getProjectId(buildDir, { register: false });
|
|
70
|
+
const isGlobalDb = path.resolve(dbDir) === path.resolve(path.join(getGlobalTelemetryDir(), "db"));
|
|
71
|
+
const tenancyScope = projectScope(projectId, {
|
|
72
|
+
includeLabs: true,
|
|
73
|
+
includeLegacyProjectRows: !isGlobalDb,
|
|
74
|
+
legacyProjectIds: [""]
|
|
75
|
+
});
|
|
76
|
+
this.projectScopeWhere = tenancyScope.where;
|
|
77
|
+
this.projectScopeParams = tenancyScope.params;
|
|
78
|
+
try {
|
|
79
|
+
if (!fs.existsSync(dbDir)) {
|
|
80
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
this.variantsDb = new Database(path.join(dbDir, "variants.db"));
|
|
83
|
+
this.validationsDb = new Database(path.join(dbDir, "validations.db"));
|
|
84
|
+
try {
|
|
85
|
+
applySqlitePragmas(this.variantsDb);
|
|
86
|
+
} catch {
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
applySqlitePragmas(this.validationsDb);
|
|
90
|
+
} catch {
|
|
91
|
+
}
|
|
92
|
+
this.enabled = true;
|
|
93
|
+
} catch (err) {
|
|
94
|
+
console.warn(
|
|
95
|
+
"Telemetry dashboard: directory creation failed, attempting to open DB files directly",
|
|
96
|
+
err
|
|
97
|
+
);
|
|
98
|
+
try {
|
|
99
|
+
this.variantsDb = new Database(path.join(dbDir, "variants.db"));
|
|
100
|
+
this.validationsDb = new Database(path.join(dbDir, "validations.db"));
|
|
101
|
+
try {
|
|
102
|
+
applySqlitePragmas(this.variantsDb);
|
|
103
|
+
} catch {
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
applySqlitePragmas(this.validationsDb);
|
|
107
|
+
} catch {
|
|
108
|
+
}
|
|
109
|
+
this.enabled = true;
|
|
110
|
+
} catch (err2) {
|
|
111
|
+
emitWarning(
|
|
112
|
+
"CFG-002",
|
|
113
|
+
{
|
|
114
|
+
taskId: "system",
|
|
115
|
+
subsystem: "telemetry",
|
|
116
|
+
executionPhase: "setup"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
severity: "ERROR" /* ERROR */,
|
|
120
|
+
metadata: {
|
|
121
|
+
operation: "dashboard_initialization",
|
|
122
|
+
error: err2 instanceof Error ? err2.message : String(err2),
|
|
123
|
+
dbDir
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
this.variantsDb = new Database(":memory:");
|
|
128
|
+
this.validationsDb = new Database(":memory:");
|
|
129
|
+
this.enabled = false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Returns true if the dashboard has persistent DB backing (not in-memory fallback) */
|
|
134
|
+
isEnabled() {
|
|
135
|
+
return this.enabled;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Retrieve leaderboard data with optional advanced metrics and CI bounds.
|
|
139
|
+
* Returns structured rows for programmatic consumption (CLI export, UI).
|
|
140
|
+
*/
|
|
141
|
+
getLeaderboardData(options = {}) {
|
|
142
|
+
const filters = [
|
|
143
|
+
this.projectScopeWhere,
|
|
144
|
+
"completed_at IS NOT NULL",
|
|
145
|
+
_TelemetryDashboard.REAL_DATA_FILTER
|
|
146
|
+
];
|
|
147
|
+
const params = [...this.projectScopeParams];
|
|
148
|
+
if (options.taskId && options.taskId.trim() !== "") {
|
|
149
|
+
filters.push("task_id = ?");
|
|
150
|
+
params.push(options.taskId.trim());
|
|
151
|
+
}
|
|
152
|
+
let baseQuery = `
|
|
153
|
+
SELECT
|
|
154
|
+
variant,
|
|
155
|
+
COUNT(*) as total_tasks,
|
|
156
|
+
SUM(CASE WHEN verdict = 'success' THEN 1 ELSE 0 END) as successes,
|
|
157
|
+
CAST(SUM(CASE WHEN verdict = 'success' THEN 1 ELSE 0 END) AS REAL) / COUNT(*) as success_rate,
|
|
158
|
+
AVG(completeness) as avg_completeness,
|
|
159
|
+
AVG(total_duration_sec) as avg_duration_sec,
|
|
160
|
+
MIN(started_at) as first_execution,
|
|
161
|
+
MAX(started_at) as last_execution
|
|
162
|
+
FROM variant_executions
|
|
163
|
+
WHERE ${filters.join(" AND ")}
|
|
164
|
+
GROUP BY variant
|
|
165
|
+
ORDER BY COALESCE(success_rate * 0.5 + AVG(completeness) / 200.0, success_rate) DESC, total_tasks DESC, variant
|
|
166
|
+
`;
|
|
167
|
+
const limit = typeof options.limit === "number" && Number.isFinite(options.limit) && options.limit > 0 ? Math.floor(options.limit) : void 0;
|
|
168
|
+
if (limit !== void 0) {
|
|
169
|
+
baseQuery += " LIMIT ?";
|
|
170
|
+
params.push(limit);
|
|
171
|
+
}
|
|
172
|
+
const stmt = this.variantsDb.prepare(baseQuery);
|
|
173
|
+
const rows = params.length ? stmt.all(...params) : stmt.all();
|
|
174
|
+
if (!rows) {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
const result = rows.map((row) => {
|
|
178
|
+
const enriched = { ...row };
|
|
179
|
+
if (options.includeCI) {
|
|
180
|
+
const { lower, upper, width } = this.wilsonCI(row.success_rate, row.total_tasks);
|
|
181
|
+
enriched.ci_lower = lower;
|
|
182
|
+
enriched.ci_upper = upper;
|
|
183
|
+
enriched.ci_width = width;
|
|
184
|
+
}
|
|
185
|
+
return enriched;
|
|
186
|
+
});
|
|
187
|
+
if (options.includeFScore) {
|
|
188
|
+
const perVariantConf = this.computeConfusionByVariant();
|
|
189
|
+
result.forEach((row) => {
|
|
190
|
+
const conf = perVariantConf.get(row.variant);
|
|
191
|
+
const fScores = this.calculateFScores(conf);
|
|
192
|
+
if (!conf) {
|
|
193
|
+
Object.assign(row, {
|
|
194
|
+
...fScores,
|
|
195
|
+
mcc: null,
|
|
196
|
+
balanced_accuracy: null
|
|
197
|
+
});
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const { tp, fp, tn, fn } = conf;
|
|
201
|
+
const tpr = tp + fn > 0 ? tp / (tp + fn) : null;
|
|
202
|
+
const tnr = tn + fp > 0 ? tn / (tn + fp) : null;
|
|
203
|
+
const balancedAccuracy = tpr !== null && tnr !== null ? (tpr + tnr) / 2 : null;
|
|
204
|
+
const mccDen = Math.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn));
|
|
205
|
+
const mcc = mccDen > 0 ? (tp * tn - fp * fn) / mccDen : null;
|
|
206
|
+
Object.assign(row, {
|
|
207
|
+
...fScores,
|
|
208
|
+
mcc,
|
|
209
|
+
balanced_accuracy: balancedAccuracy
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Retrieve prompt performance data with optional CI and F-scores.
|
|
217
|
+
* Grouped by prompt_version with per-variant breakdowns.
|
|
218
|
+
*/
|
|
219
|
+
getPromptPerformanceData(options = {}) {
|
|
220
|
+
const query = `
|
|
221
|
+
SELECT
|
|
222
|
+
variant,
|
|
223
|
+
prompt_version,
|
|
224
|
+
COUNT(*) as sample_size,
|
|
225
|
+
CAST(SUM(CASE WHEN verdict = 'success' THEN 1 ELSE 0 END) AS REAL) / COUNT(*) as success_rate
|
|
226
|
+
FROM variant_executions
|
|
227
|
+
WHERE ${this.projectScopeWhere}
|
|
228
|
+
AND completed_at IS NOT NULL AND prompt_version IS NOT NULL
|
|
229
|
+
AND ${_TelemetryDashboard.REAL_DATA_FILTER}
|
|
230
|
+
GROUP BY variant, prompt_version
|
|
231
|
+
ORDER BY variant, prompt_version
|
|
232
|
+
`;
|
|
233
|
+
const rows = this.variantsDb.prepare(query).all(...this.projectScopeParams);
|
|
234
|
+
if (rows.length === 0) return [];
|
|
235
|
+
const confByVariantPrompt = options.includeFScore ? this.computeConfusionByVariantPrompt() : /* @__PURE__ */ new Map();
|
|
236
|
+
const byPrompt = /* @__PURE__ */ new Map();
|
|
237
|
+
rows.forEach((r) => {
|
|
238
|
+
const arr = byPrompt.get(r.prompt_version) || [];
|
|
239
|
+
const enriched = {
|
|
240
|
+
variant: r.variant,
|
|
241
|
+
prompt_version: r.prompt_version,
|
|
242
|
+
total_tasks: r.sample_size,
|
|
243
|
+
successes: Math.round(r.success_rate * r.sample_size),
|
|
244
|
+
success_rate: r.success_rate,
|
|
245
|
+
avg_completeness: null,
|
|
246
|
+
// Not available in this query
|
|
247
|
+
sample_size: r.sample_size
|
|
248
|
+
};
|
|
249
|
+
if (options.includeCI) {
|
|
250
|
+
const { lower, upper } = this.wilsonCI(r.success_rate, r.sample_size);
|
|
251
|
+
enriched.ci_lower = lower;
|
|
252
|
+
enriched.ci_upper = upper;
|
|
253
|
+
}
|
|
254
|
+
if (options.includeFScore) {
|
|
255
|
+
const key = `${r.variant}@@${r.prompt_version}`;
|
|
256
|
+
const conf = confByVariantPrompt.get(key);
|
|
257
|
+
Object.assign(enriched, this.calculateFScores(conf));
|
|
258
|
+
}
|
|
259
|
+
arr.push(enriched);
|
|
260
|
+
byPrompt.set(r.prompt_version, arr);
|
|
261
|
+
});
|
|
262
|
+
const result = [];
|
|
263
|
+
for (const [prompt, arr] of byPrompt.entries()) {
|
|
264
|
+
const avgSuccessRate = arr.reduce((s, v) => s + v.success_rate, 0) / arr.length;
|
|
265
|
+
const totalSamples = arr.reduce((s, v) => s + v.sample_size, 0);
|
|
266
|
+
const mean = avgSuccessRate;
|
|
267
|
+
const variance = arr.reduce((s, v) => s + (v.success_rate - mean) ** 2, 0) / arr.length;
|
|
268
|
+
const consistencyScore = Math.max(0, 1 - Math.sqrt(variance));
|
|
269
|
+
const shouldPrune = avgSuccessRate < 0.5 || totalSamples < 3 || consistencyScore < 0.3;
|
|
270
|
+
result.push({
|
|
271
|
+
prompt_version: prompt,
|
|
272
|
+
total_samples: totalSamples,
|
|
273
|
+
avg_success_rate: avgSuccessRate,
|
|
274
|
+
consistency_score: consistencyScore,
|
|
275
|
+
should_prune: shouldPrune,
|
|
276
|
+
variants: arr.map((v) => ({
|
|
277
|
+
variant: String(v.variant),
|
|
278
|
+
sample_size: v.sample_size,
|
|
279
|
+
success_rate: v.success_rate,
|
|
280
|
+
ci_lower: v.ci_lower,
|
|
281
|
+
ci_upper: v.ci_upper,
|
|
282
|
+
precision: v.precision,
|
|
283
|
+
recall: v.recall,
|
|
284
|
+
f1: v.f1,
|
|
285
|
+
f05: v.f05,
|
|
286
|
+
f2: v.f2
|
|
287
|
+
}))
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
return result.sort(
|
|
291
|
+
(a, b) => b.avg_success_rate * 0.7 + b.consistency_score * 0.3 - (a.avg_success_rate * 0.7 + a.consistency_score * 0.3)
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
getTrendTaskGroups(limit) {
|
|
295
|
+
const query = `
|
|
296
|
+
SELECT task_id, variant, verdict, completeness, started_at, total_duration_sec
|
|
297
|
+
FROM variant_executions
|
|
298
|
+
WHERE ${this.projectScopeWhere}
|
|
299
|
+
AND completed_at IS NOT NULL
|
|
300
|
+
AND ${_TelemetryDashboard.REAL_DATA_FILTER}
|
|
301
|
+
ORDER BY started_at DESC
|
|
302
|
+
LIMIT ?
|
|
303
|
+
`;
|
|
304
|
+
const rows = this.variantsDb.prepare(query).all(...this.projectScopeParams, limit * 3);
|
|
305
|
+
if (rows.length === 0) return [];
|
|
306
|
+
const byVariant = {};
|
|
307
|
+
rows.forEach((row) => {
|
|
308
|
+
if (!byVariant[row.variant]) {
|
|
309
|
+
byVariant[row.variant] = [];
|
|
310
|
+
}
|
|
311
|
+
const variantArray = byVariant[row.variant];
|
|
312
|
+
if (variantArray) {
|
|
313
|
+
variantArray.push(row);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
const groups = [];
|
|
317
|
+
for (const variant of Object.keys(byVariant)) {
|
|
318
|
+
const variantData = byVariant[variant];
|
|
319
|
+
if (!variantData) continue;
|
|
320
|
+
groups.push({ variant, tasks: variantData.slice(0, limit) });
|
|
321
|
+
}
|
|
322
|
+
return groups;
|
|
323
|
+
}
|
|
324
|
+
calculateTrendWindow(tasks) {
|
|
325
|
+
const successes = tasks.filter((task) => task.verdict === "success").length;
|
|
326
|
+
const successRate = tasks.length > 0 ? successes / tasks.length : 0;
|
|
327
|
+
const avgCompleteness = tasks.reduce((sum, task) => sum + (task.completeness || 0), 0) / (tasks.length || 1);
|
|
328
|
+
const recentWindow = Math.min(5, Math.floor(tasks.length / 2));
|
|
329
|
+
const olderWindow = Math.min(5, tasks.length - recentWindow);
|
|
330
|
+
const recentTasks = tasks.slice(0, recentWindow);
|
|
331
|
+
const olderTasks = tasks.slice(recentWindow, recentWindow + olderWindow);
|
|
332
|
+
const recentSuccessRate = recentTasks.length ? recentTasks.filter((task) => task.verdict === "success").length / recentTasks.length : 0;
|
|
333
|
+
const olderSuccessRate = olderTasks.length ? olderTasks.filter((task) => task.verdict === "success").length / olderTasks.length : recentSuccessRate;
|
|
334
|
+
return {
|
|
335
|
+
successes,
|
|
336
|
+
successRate,
|
|
337
|
+
avgCompleteness,
|
|
338
|
+
recentWindow,
|
|
339
|
+
olderWindow,
|
|
340
|
+
recentSuccessRate,
|
|
341
|
+
olderSuccessRate,
|
|
342
|
+
successTrend: recentSuccessRate - olderSuccessRate
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Retrieve trend data with optional CI and validation fusion (warnings/errors).
|
|
347
|
+
*/
|
|
348
|
+
getTrendsData(limit = 10, options = {}) {
|
|
349
|
+
const out = [];
|
|
350
|
+
for (const { variant, tasks } of this.getTrendTaskGroups(limit)) {
|
|
351
|
+
const { successRate, avgCompleteness, recentSuccessRate, olderSuccessRate, successTrend } = this.calculateTrendWindow(tasks);
|
|
352
|
+
const delta = successTrend * 100;
|
|
353
|
+
const entry = {
|
|
354
|
+
variant,
|
|
355
|
+
tasks: tasks.length,
|
|
356
|
+
success_rate: successRate,
|
|
357
|
+
avg_completeness: avgCompleteness,
|
|
358
|
+
recent_success_rate: recentSuccessRate,
|
|
359
|
+
older_success_rate: olderSuccessRate,
|
|
360
|
+
delta_pp: delta,
|
|
361
|
+
trend: classifyTrend(tasks.length, delta, delta >= -5 && delta <= 5)
|
|
362
|
+
};
|
|
363
|
+
if (options.includeCI) {
|
|
364
|
+
const { lower, upper } = this.wilsonCI(successRate, tasks.length);
|
|
365
|
+
entry.ci_lower = lower;
|
|
366
|
+
entry.ci_upper = upper;
|
|
367
|
+
}
|
|
368
|
+
if (options.includeValidationFusion) {
|
|
369
|
+
const taskIds = tasks.map((t) => t.task_id);
|
|
370
|
+
if (taskIds.length) {
|
|
371
|
+
const placeholders = taskIds.map(() => "?").join(",");
|
|
372
|
+
const validations = this.validationsDb.prepare(
|
|
373
|
+
`SELECT task_id, AVG(warnings_count) as avg_warn, AVG(errors_count) as avg_err
|
|
374
|
+
FROM validations WHERE ${this.projectScopeWhere}
|
|
375
|
+
AND task_id IN (${placeholders}) GROUP BY task_id`
|
|
376
|
+
).all(...this.projectScopeParams, ...taskIds);
|
|
377
|
+
const avgWarn = validations.reduce((s, v) => s + (v.avg_warn || 0), 0) / (validations.length || 1);
|
|
378
|
+
const avgErr = validations.reduce((s, v) => s + (v.avg_err || 0), 0) / (validations.length || 1);
|
|
379
|
+
entry.avg_validation_warnings = avgWarn;
|
|
380
|
+
entry.avg_validation_errors = avgErr;
|
|
381
|
+
entry.brittle_success = successRate >= 0.8 && (avgErr > 0 || avgWarn >= 2);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
out.push(entry);
|
|
385
|
+
}
|
|
386
|
+
return out;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Generate variant performance leaderboard
|
|
390
|
+
*
|
|
391
|
+
* Queries the variant_executions table to rank all variants by a weighted score
|
|
392
|
+
* combining success rate and completeness. Displays comprehensive performance
|
|
393
|
+
* metrics in a formatted table with insights.
|
|
394
|
+
*
|
|
395
|
+
* **SQL Query Details:**
|
|
396
|
+
* - **Table:** variant_executions
|
|
397
|
+
* - **Filters:** completed_at IS NOT NULL (excludes in-flight executions)
|
|
398
|
+
* - **Groups by:** variant
|
|
399
|
+
* - **Orders by:** Weighted score DESC
|
|
400
|
+
*
|
|
401
|
+
* **Scoring Formula:**
|
|
402
|
+
* ```
|
|
403
|
+
* score = (success_rate × 0.5) + (avg_completeness / 100 × 0.5)
|
|
404
|
+
* ```
|
|
405
|
+
*
|
|
406
|
+
* **Metrics Calculated:**
|
|
407
|
+
* - Total tasks executed
|
|
408
|
+
* - Success count and rate
|
|
409
|
+
* - Average completeness percentage
|
|
410
|
+
* - Average execution duration
|
|
411
|
+
* - First and last execution timestamps
|
|
412
|
+
*
|
|
413
|
+
* **Output Format:**
|
|
414
|
+
* - Table header with scoring explanation
|
|
415
|
+
* - Ranked rows: Rank | Variant | Score | Success Rate | Completeness | Duration | Tasks
|
|
416
|
+
* - Performance insights: Best performer and improvement opportunity
|
|
417
|
+
*
|
|
418
|
+
* @example
|
|
419
|
+
* ```typescript
|
|
420
|
+
* dashboard.leaderboard();
|
|
421
|
+
* // Output:
|
|
422
|
+
* //
|
|
423
|
+
* // Ranked by weighted score: (success_rate × 0.5) + (completeness × 0.5)
|
|
424
|
+
* //
|
|
425
|
+
* // Rank | Variant | Score | Success Rate | Completeness | Duration | Tasks
|
|
426
|
+
* //
|
|
427
|
+
* // 1 | CLAUDE | 87.3 | 85.0% | 89.5% | 45s | 20
|
|
428
|
+
* // 2 | CURSOR | 82.1 | 80.0% | 84.2% | 38s | 15
|
|
429
|
+
* // ...
|
|
430
|
+
* ```
|
|
431
|
+
*
|
|
432
|
+
* @returns {void} Prints formatted leaderboard to console
|
|
433
|
+
*/
|
|
434
|
+
leaderboard(options = {}) {
|
|
435
|
+
try {
|
|
436
|
+
const results = this.getLeaderboardData({
|
|
437
|
+
includeCI: true,
|
|
438
|
+
includeFScore: true,
|
|
439
|
+
taskId: options.taskId,
|
|
440
|
+
limit: options.limit
|
|
441
|
+
});
|
|
442
|
+
if (results.length === 0) {
|
|
443
|
+
console.log("No variant execution data available.");
|
|
444
|
+
console.log(" Run some tasks to generate telemetry data.");
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
console.log("\nVariant Performance Leaderboard");
|
|
448
|
+
console.log("Ranked by weighted score: (success_rate \xD7 0.5) + (completeness \xD7 0.5)");
|
|
449
|
+
console.log("Rank | Variant | Score | Success Rate | Completeness | Duration | Tasks");
|
|
450
|
+
const computeScore = (r) => r.avg_completeness != null ? r.success_rate * 0.5 + r.avg_completeness / 100 * 0.5 : r.success_rate;
|
|
451
|
+
results.slice().sort((a, b) => computeScore(a) < computeScore(b) ? 1 : -1).forEach((row, i) => {
|
|
452
|
+
const score = computeScore(row) * 100;
|
|
453
|
+
const successRate = (row.success_rate * 100).toFixed(1);
|
|
454
|
+
const completeness = row.avg_completeness != null ? row.avg_completeness.toFixed(1) : "N/A";
|
|
455
|
+
const duration = row.avg_duration_sec ? `${Math.round(row.avg_duration_sec)}s` : "N/A";
|
|
456
|
+
const variantPadded = row.variant.toUpperCase().padEnd(12);
|
|
457
|
+
const scorePadded = `${score.toFixed(1)}`.padStart(5);
|
|
458
|
+
const successPadded = `${successRate}%`.padStart(12);
|
|
459
|
+
const completenessPadded = `${completeness}%`.padStart(12);
|
|
460
|
+
const durationPadded = duration.padStart(8);
|
|
461
|
+
const tasksPadded = row.total_tasks.toString().padStart(5);
|
|
462
|
+
console.log(
|
|
463
|
+
`${(i + 1).toString().padStart(4)} | ${variantPadded} | ${scorePadded} | ${successPadded} | ${completenessPadded} | ${durationPadded} | ${tasksPadded}`
|
|
464
|
+
);
|
|
465
|
+
const ciLower = row.ci_lower !== void 0 ? (row.ci_lower * 100).toFixed(1) : null;
|
|
466
|
+
const ciUpper = row.ci_upper !== void 0 ? (row.ci_upper * 100).toFixed(1) : null;
|
|
467
|
+
if (ciLower !== null && ciUpper !== null) {
|
|
468
|
+
console.log(
|
|
469
|
+
` CI95: [${ciLower}%, ${ciUpper}%] ` + (row.f1 != null ? `F1: ${(row.f1 * 100).toFixed(1)} F0.5: ${row.f05 != null ? (row.f05 * 100).toFixed(1) : "\u2014"} F2: ${row.f2 != null ? (row.f2 * 100).toFixed(1) : "\u2014"}` : "")
|
|
470
|
+
);
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
const sorted = results.slice().sort((a, b) => computeScore(a) < computeScore(b) ? 1 : -1);
|
|
474
|
+
const best = sorted[0];
|
|
475
|
+
const worst = sorted[sorted.length - 1];
|
|
476
|
+
if (best && worst) {
|
|
477
|
+
console.log(
|
|
478
|
+
`
|
|
479
|
+
Best Performer: ${best.variant.toUpperCase()} (${(computeScore(best) * 100).toFixed(1)}/100)`
|
|
480
|
+
);
|
|
481
|
+
if (computeScore(worst) < computeScore(best)) {
|
|
482
|
+
console.log(
|
|
483
|
+
`Improvement Opportunity: ${worst.variant.toUpperCase()} (${(computeScore(worst) * 100).toFixed(1)}/100)`
|
|
484
|
+
);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
if (sorted.length >= 2) {
|
|
488
|
+
const a = sorted[0];
|
|
489
|
+
const b = sorted[1];
|
|
490
|
+
if (!a || !b) return;
|
|
491
|
+
const { lower: aL, upper: aU } = this.wilsonCI(a.success_rate, a.total_tasks);
|
|
492
|
+
const { lower: bL, upper: bU } = this.wilsonCI(b.success_rate, b.total_tasks);
|
|
493
|
+
const overlap = !(aL > bU || bL > aU);
|
|
494
|
+
const p = this.twoProportionPValue(
|
|
495
|
+
a.successes,
|
|
496
|
+
a.total_tasks - a.successes,
|
|
497
|
+
b.successes,
|
|
498
|
+
b.total_tasks - b.successes
|
|
499
|
+
);
|
|
500
|
+
if (!overlap && p < 0.05) {
|
|
501
|
+
console.log(
|
|
502
|
+
"Significance: Statistically higher than runner-up (p<0.05). Likely truly better."
|
|
503
|
+
);
|
|
504
|
+
} else {
|
|
505
|
+
console.log("Significance: Likely indistinguishable at 95% CI. Collect more data.");
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
} catch (error) {
|
|
509
|
+
console.error("Error generating leaderboard:", error.message);
|
|
510
|
+
console.log(" Ensure telemetry database exists and contains data.");
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Analyze prompt performance across variants
|
|
515
|
+
*
|
|
516
|
+
* Queries variant_executions grouped by prompt_version to identify:
|
|
517
|
+
* - Reliable prompts (high success rate, low variance)
|
|
518
|
+
* - Unreliable prompts (low success rate, high variance)
|
|
519
|
+
* - Prompts that should be pruned
|
|
520
|
+
*
|
|
521
|
+
* **SQL Query Details:**
|
|
522
|
+
* - **Table:** variant_executions
|
|
523
|
+
* - **Filters:** completed_at IS NOT NULL AND prompt_version IS NOT NULL
|
|
524
|
+
* - **Groups by:** variant, prompt_version
|
|
525
|
+
* - **Orders by:** variant, prompt_version
|
|
526
|
+
*
|
|
527
|
+
* **Analysis Methodology:**
|
|
528
|
+
* 1. **Success Rate:** Average success across all variants for this prompt
|
|
529
|
+
* 2. **Consistency Score:** 1 - sqrt(variance) where variance measures success rate spread
|
|
530
|
+
* 3. **Overall Score:** success_rate × 0.7 + consistency_score × 0.3
|
|
531
|
+
* 4. **Prune Recommendations:** Flags prompts with:
|
|
532
|
+
* - Success rate < 50%
|
|
533
|
+
* - Sample size < 3
|
|
534
|
+
* - Consistency score < 0.3
|
|
535
|
+
*
|
|
536
|
+
* **Metrics Per Prompt:**
|
|
537
|
+
* - Overall success rate across all variants
|
|
538
|
+
* - Consistency score (0-100, higher = more consistent)
|
|
539
|
+
* - Total sample size (sum across variants)
|
|
540
|
+
* - Per-variant breakdown with success rates
|
|
541
|
+
* - Pruning recommendation if applicable
|
|
542
|
+
*
|
|
543
|
+
* **Status Indicators:**
|
|
544
|
+
* - EXCELLENT: ≥80% success rate
|
|
545
|
+
* - GOOD: ≥60% success rate
|
|
546
|
+
* - Fair: FAIR: ≥50% success rate
|
|
547
|
+
* - PRUNE: <50% success rate or poor consistency
|
|
548
|
+
*
|
|
549
|
+
* @example
|
|
550
|
+
* ```typescript
|
|
551
|
+
* dashboard.promptPerformance();
|
|
552
|
+
* // Output:
|
|
553
|
+
* // Prompt: v2.1.0 EXCELLENT
|
|
554
|
+
* //
|
|
555
|
+
* // Overall Success Rate: 85.0%
|
|
556
|
+
* // Consistency Score: 92.3%
|
|
557
|
+
* // Total Sample Size: 45
|
|
558
|
+
* // Variant Breakdown:
|
|
559
|
+
* // claude : 87.5% success (n=16)
|
|
560
|
+
* // cursor : 82.4% success (n=17)
|
|
561
|
+
* // codex : 75.0% success (n=12)
|
|
562
|
+
* // ...
|
|
563
|
+
* ```
|
|
564
|
+
*
|
|
565
|
+
* @returns {void} Prints formatted prompt analysis to console
|
|
566
|
+
*/
|
|
567
|
+
promptPerformance() {
|
|
568
|
+
try {
|
|
569
|
+
const promptAnalysis = this.getPromptPerformanceData();
|
|
570
|
+
if (promptAnalysis.length === 0) {
|
|
571
|
+
console.log("No prompt performance data available.");
|
|
572
|
+
console.log(" Run tasks with different prompt versions to generate data.");
|
|
573
|
+
return;
|
|
574
|
+
}
|
|
575
|
+
console.log("\nPrompt Performance Analysis");
|
|
576
|
+
promptAnalysis.forEach((analysis) => {
|
|
577
|
+
const {
|
|
578
|
+
prompt_version: promptVersion,
|
|
579
|
+
variants,
|
|
580
|
+
avg_success_rate: avgSuccessRate,
|
|
581
|
+
total_samples: totalSamples,
|
|
582
|
+
consistency_score: consistencyScore,
|
|
583
|
+
should_prune: shouldPrune
|
|
584
|
+
} = analysis;
|
|
585
|
+
const status = shouldPrune ? "PRUNE" : avgSuccessRate >= 0.8 ? "EXCELLENT" : avgSuccessRate >= 0.6 ? "GOOD" : "FAIR";
|
|
586
|
+
console.log(`
|
|
587
|
+
Prompt: ${promptVersion} ${status}`);
|
|
588
|
+
console.log(`Overall Success Rate: ${(avgSuccessRate * 100).toFixed(1)}%`);
|
|
589
|
+
console.log(`Consistency Score: ${(consistencyScore * 100).toFixed(1)}%`);
|
|
590
|
+
console.log(`Total Sample Size: ${totalSamples}`);
|
|
591
|
+
console.log("Variant Breakdown:");
|
|
592
|
+
if (variants) {
|
|
593
|
+
variants.forEach((v) => {
|
|
594
|
+
const performance = v.success_rate >= 0.8 ? "EXCELLENT" : v.success_rate >= 0.6 ? "GOOD" : "PRUNE";
|
|
595
|
+
console.log(
|
|
596
|
+
` ${performance} ${String(v.variant).padEnd(12)}: ${(v.success_rate * 100).toFixed(1)}% success (n=${v.sample_size})`
|
|
597
|
+
);
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
if (shouldPrune) {
|
|
601
|
+
console.log("\nRECOMMENDATION: Consider pruning this prompt version");
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
} catch (error) {
|
|
605
|
+
console.error("Error analyzing prompt performance:", error.message);
|
|
606
|
+
console.log(" Ensure telemetry database exists and contains data.");
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Show historical performance trends over time
|
|
611
|
+
*
|
|
612
|
+
* Queries recent variant executions to analyze performance trends by comparing
|
|
613
|
+
* recent vs. older task outcomes. Useful for identifying improving or declining
|
|
614
|
+
* variant performance over time.
|
|
615
|
+
*
|
|
616
|
+
* **SQL Query Details:**
|
|
617
|
+
* - **Table:** variant_executions
|
|
618
|
+
* - **Filters:** completed_at IS NOT NULL
|
|
619
|
+
* - **Orders by:** started_at DESC (most recent first)
|
|
620
|
+
* - **Limit:** limit × 3 (allows showing limit tasks per variant)
|
|
621
|
+
*
|
|
622
|
+
* **Trend Analysis Methodology:**
|
|
623
|
+
* 1. Splits tasks into two windows per variant:
|
|
624
|
+
* - **Recent window:** Last N/2 tasks (up to 5 tasks)
|
|
625
|
+
* - **Older window:** Previous N/2 tasks (up to 5 tasks)
|
|
626
|
+
* 2. Compares success rates between windows
|
|
627
|
+
* 3. Classifies trend as:
|
|
628
|
+
* - **Improving:** Recent success rate >10% higher
|
|
629
|
+
* - **Stable:** Within ±10% change
|
|
630
|
+
* - **Declining:** Recent success rate >10% lower
|
|
631
|
+
*
|
|
632
|
+
* **Metrics Per Variant:**
|
|
633
|
+
* - Overall success rate (all tasks in window)
|
|
634
|
+
* - Average completeness percentage
|
|
635
|
+
* - Recent window success rate
|
|
636
|
+
* - Older window success rate
|
|
637
|
+
* - Percentage point change with trend indicator
|
|
638
|
+
*
|
|
639
|
+
* @param limit - Maximum number of tasks to show per variant (default: 10)
|
|
640
|
+
*
|
|
641
|
+
* @example
|
|
642
|
+
* ```typescript
|
|
643
|
+
* dashboard.trends(15);
|
|
644
|
+
* // Output:
|
|
645
|
+
* // CLAUDE
|
|
646
|
+
* //
|
|
647
|
+
* // Overall Performance (15 tasks):
|
|
648
|
+
* // Success Rate: 86.7% (13/15)
|
|
649
|
+
* // Avg Completeness: 88.3%
|
|
650
|
+
* //
|
|
651
|
+
* // Trend Analysis (improving):
|
|
652
|
+
* // Recent Success: 90.0% (last 5 tasks)
|
|
653
|
+
* // Previous Success: 75.0% (previous 5 tasks)
|
|
654
|
+
* // Change: +15.0 percentage points
|
|
655
|
+
* // ...
|
|
656
|
+
* ```
|
|
657
|
+
*
|
|
658
|
+
* @returns {void} Prints formatted trend analysis to console
|
|
659
|
+
*/
|
|
660
|
+
trends(limit = 10) {
|
|
661
|
+
try {
|
|
662
|
+
const groups = this.getTrendTaskGroups(limit);
|
|
663
|
+
if (groups.length === 0) {
|
|
664
|
+
console.log("No historical trend data available.");
|
|
665
|
+
console.log(" Run some tasks to generate trend data.");
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
console.log(`
|
|
669
|
+
Historical Trends (last ${limit} tasks per variant)`);
|
|
670
|
+
groups.forEach(({ variant, tasks }) => {
|
|
671
|
+
if (tasks.length === 0) {
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
674
|
+
const {
|
|
675
|
+
successes,
|
|
676
|
+
successRate,
|
|
677
|
+
avgCompleteness,
|
|
678
|
+
recentWindow,
|
|
679
|
+
olderWindow,
|
|
680
|
+
recentSuccessRate,
|
|
681
|
+
olderSuccessRate,
|
|
682
|
+
successTrend
|
|
683
|
+
} = this.calculateTrendWindow(tasks);
|
|
684
|
+
const trendText = classifyTrend(
|
|
685
|
+
tasks.length,
|
|
686
|
+
successTrend,
|
|
687
|
+
Math.abs(successTrend) < 0.1
|
|
688
|
+
).replace("_", " ");
|
|
689
|
+
console.log(`
|
|
690
|
+
${variant.toUpperCase()} ${trendText}`);
|
|
691
|
+
console.log(`Overall Performance (${tasks.length} tasks):`);
|
|
692
|
+
console.log(
|
|
693
|
+
` Success Rate: ${(successRate * 100).toFixed(1)}% (${successes}/${tasks.length})`
|
|
694
|
+
);
|
|
695
|
+
console.log(` Avg Completeness: ${avgCompleteness.toFixed(1)}%`);
|
|
696
|
+
console.log(`
|
|
697
|
+
Trend Analysis (${trendText}):`);
|
|
698
|
+
console.log(
|
|
699
|
+
` Recent Success: ${(recentSuccessRate * 100).toFixed(1)}% (last ${recentWindow} tasks)`
|
|
700
|
+
);
|
|
701
|
+
console.log(
|
|
702
|
+
` Previous Success: ${(olderSuccessRate * 100).toFixed(1)}% (previous ${olderWindow} tasks)`
|
|
703
|
+
);
|
|
704
|
+
console.log(
|
|
705
|
+
` Change: ${successTrend > 0 ? "+" : ""}${(successTrend * 100).toFixed(1)} percentage points`
|
|
706
|
+
);
|
|
707
|
+
});
|
|
708
|
+
} catch (error) {
|
|
709
|
+
console.error("Error analyzing trends:", error.message);
|
|
710
|
+
console.log(" Ensure telemetry database exists and contains data.");
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
/** Compute Wilson 95% CI for success rate */
|
|
714
|
+
wilsonCI(p, n) {
|
|
715
|
+
if (!n || n <= 0) return { lower: 0, upper: 1, width: 1 };
|
|
716
|
+
const z = 1.96;
|
|
717
|
+
const denom = 1 + z * z / n;
|
|
718
|
+
const center = (p + z * z / (2 * n)) / denom;
|
|
719
|
+
const margin = z / denom * Math.sqrt(p * (1 - p) / n + z * z / (4 * n * n));
|
|
720
|
+
const lower = Math.max(0, center - margin);
|
|
721
|
+
const upper = Math.min(1, center + margin);
|
|
722
|
+
return { lower, upper, width: upper - lower };
|
|
723
|
+
}
|
|
724
|
+
/** Two-proportion z-test p-value (two-tailed). Inputs: successes/failures for A and B */
|
|
725
|
+
twoProportionPValue(aSucc, aFail, bSucc, bFail) {
|
|
726
|
+
const n1 = aSucc + aFail;
|
|
727
|
+
const n2 = bSucc + bFail;
|
|
728
|
+
if (n1 === 0 || n2 === 0) return 1;
|
|
729
|
+
const p1 = aSucc / n1;
|
|
730
|
+
const p2 = bSucc / n2;
|
|
731
|
+
const pPool = (aSucc + bSucc) / (n1 + n2);
|
|
732
|
+
const se = Math.sqrt(pPool * (1 - pPool) * (1 / n1 + 1 / n2));
|
|
733
|
+
if (se === 0) return 1;
|
|
734
|
+
const z = Math.abs((p1 - p2) / se);
|
|
735
|
+
const p = 2 * (1 - this.normalCdf(z));
|
|
736
|
+
return Math.max(0, Math.min(1, p));
|
|
737
|
+
}
|
|
738
|
+
/** Standard normal CDF approximation */
|
|
739
|
+
normalCdf(z) {
|
|
740
|
+
const t = 1 / (1 + 0.2316419 * z);
|
|
741
|
+
const d = Math.exp(-0.5 * z * z) / Math.sqrt(2 * Math.PI);
|
|
742
|
+
const poly = (((1.330274429 * t - 1.821255978) * t + 1.781477937) * t - 0.356563782) * t + 0.31938153;
|
|
743
|
+
const approx = 1 - d * poly;
|
|
744
|
+
return z >= 0 ? approx : 1 - approx;
|
|
745
|
+
}
|
|
746
|
+
calculateFScores(conf) {
|
|
747
|
+
if (!conf) return { precision: null, recall: null, f1: null, f05: null, f2: null };
|
|
748
|
+
const { tp, fp, fn } = conf;
|
|
749
|
+
const precision = tp + fp > 0 ? tp / (tp + fp) : null;
|
|
750
|
+
const recall = tp + fn > 0 ? tp / (tp + fn) : null;
|
|
751
|
+
const f1 = precision && recall && precision + recall > 0 ? 2 * precision * recall / (precision + recall) : null;
|
|
752
|
+
const beta05 = 0.5;
|
|
753
|
+
const f05 = precision && recall && beta05 * beta05 * precision + recall > 0 ? (1 + beta05 * beta05) * precision * recall / (beta05 * beta05 * precision + recall) : null;
|
|
754
|
+
const beta2 = 2;
|
|
755
|
+
const f2 = precision && recall && beta2 * beta2 * precision + recall > 0 ? (1 + beta2 * beta2) * precision * recall / (beta2 * beta2 * precision + recall) : null;
|
|
756
|
+
return { precision, recall, f1, f05, f2 };
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* Compute confusion-matrix aggregates by variant, using validations as predictor
|
|
760
|
+
* (predicted success = all validations for a task passed; conservative heuristic).
|
|
761
|
+
*/
|
|
762
|
+
computeConfusionByVariant() {
|
|
763
|
+
return this.computeConfusion("variant");
|
|
764
|
+
}
|
|
765
|
+
/** Confusion by variant+prompt_version for prompt analytics */
|
|
766
|
+
computeConfusionByVariantPrompt() {
|
|
767
|
+
return this.computeConfusion("variantPrompt");
|
|
768
|
+
}
|
|
769
|
+
computeConfusion(grouping) {
|
|
770
|
+
const validations = this.validationsDb.prepare(
|
|
771
|
+
`SELECT task_id, MIN(passed) as all_passed, COUNT(*) as cnt
|
|
772
|
+
FROM validations WHERE ${this.projectScopeWhere} GROUP BY task_id`
|
|
773
|
+
).all(...this.projectScopeParams);
|
|
774
|
+
const predMap = /* @__PURE__ */ new Map();
|
|
775
|
+
validations.forEach((v) => {
|
|
776
|
+
if (v.cnt > 0) predMap.set(v.task_id, v.all_passed);
|
|
777
|
+
});
|
|
778
|
+
const outcomeQuery = grouping === "variant" ? `SELECT task_id, variant, CASE WHEN verdict = 'success' THEN 1 ELSE 0 END as actual_success
|
|
779
|
+
FROM variant_executions WHERE ${this.projectScopeWhere}
|
|
780
|
+
AND completed_at IS NOT NULL AND ${_TelemetryDashboard.REAL_DATA_FILTER}` : `SELECT task_id, variant, prompt_version, CASE WHEN verdict = 'success' THEN 1 ELSE 0 END as actual_success
|
|
781
|
+
FROM variant_executions WHERE ${this.projectScopeWhere}
|
|
782
|
+
AND completed_at IS NOT NULL AND prompt_version IS NOT NULL
|
|
783
|
+
AND ${_TelemetryDashboard.REAL_DATA_FILTER}`;
|
|
784
|
+
const execRows = this.variantsDb.prepare(outcomeQuery).all(...this.projectScopeParams);
|
|
785
|
+
const confByGroup = /* @__PURE__ */ new Map();
|
|
786
|
+
for (const r of execRows) {
|
|
787
|
+
const pred = grouping === "variantPrompt" ? predMap.has(r.task_id) ? predMap.get(r.task_id) : null : predMap.get(r.task_id);
|
|
788
|
+
if (grouping === "variantPrompt" ? pred === null : pred === void 0) continue;
|
|
789
|
+
const key = grouping === "variantPrompt" ? `${r.variant}@@${r.prompt_version}` : r.variant;
|
|
790
|
+
let agg = confByGroup.get(key);
|
|
791
|
+
if (!agg) {
|
|
792
|
+
agg = { tp: 0, fp: 0, tn: 0, fn: 0 };
|
|
793
|
+
confByGroup.set(key, agg);
|
|
794
|
+
}
|
|
795
|
+
if (pred === 1 && r.actual_success === 1) agg.tp++;
|
|
796
|
+
else if (pred === 1 && r.actual_success === 0) agg.fp++;
|
|
797
|
+
else if (pred === 0 && r.actual_success === 0) agg.tn++;
|
|
798
|
+
else if (pred === 0 && r.actual_success === 1) agg.fn++;
|
|
799
|
+
}
|
|
800
|
+
return confByGroup;
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Close all database connections
|
|
804
|
+
*
|
|
805
|
+
* Cleanly closes the SQLite database connections for both variants and validations
|
|
806
|
+
* databases. Should be called when the dashboard is no longer needed to free resources.
|
|
807
|
+
*
|
|
808
|
+
* @returns {void}
|
|
809
|
+
*
|
|
810
|
+
* @example
|
|
811
|
+
* ```typescript
|
|
812
|
+
* const dashboard = new TelemetryDashboard();
|
|
813
|
+
* try {
|
|
814
|
+
* dashboard.leaderboard();
|
|
815
|
+
* dashboard.trends();
|
|
816
|
+
* } finally {
|
|
817
|
+
* // Always close connections
|
|
818
|
+
* dashboard.close();
|
|
819
|
+
* }
|
|
820
|
+
* ```
|
|
821
|
+
*
|
|
822
|
+
* @remarks
|
|
823
|
+
* This method is idempotent - calling it multiple times is safe and will not
|
|
824
|
+
* throw errors. However, attempting to use dashboard methods after closing will
|
|
825
|
+
* result in database errors.
|
|
826
|
+
*/
|
|
827
|
+
close() {
|
|
828
|
+
this.variantsDb.close();
|
|
829
|
+
this.validationsDb.close();
|
|
830
|
+
}
|
|
831
|
+
};
|
|
832
|
+
|
|
833
|
+
// src/telemetry/event-types.ts
|
|
834
|
+
function isCoreVariantEvent(event) {
|
|
835
|
+
return ["started", "first_commit", "completed", "failed", "evaluated"].includes(event);
|
|
836
|
+
}
|
|
837
|
+
function validateEventType(event) {
|
|
838
|
+
if (isCoreVariantEvent(event)) {
|
|
839
|
+
return event;
|
|
840
|
+
}
|
|
841
|
+
throw new Error(`Unrecognized telemetry event type: ${event}`);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
// src/telemetry/insights.ts
|
|
845
|
+
import fs2 from "fs";
|
|
846
|
+
import path2 from "path";
|
|
847
|
+
import Database2 from "better-sqlite3";
|
|
848
|
+
var TelemetryInsightEngine = class _TelemetryInsightEngine {
|
|
849
|
+
static REAL_DATA_FILTER = "verdict IS NOT NULL AND verdict != '' AND task_id NOT LIKE 'test-%' AND task_id NOT LIKE 'task-%'";
|
|
850
|
+
buildDir;
|
|
851
|
+
variantsDb;
|
|
852
|
+
enabled = true;
|
|
853
|
+
enableRealTime;
|
|
854
|
+
calculationInterval;
|
|
855
|
+
intervalId;
|
|
856
|
+
projectId;
|
|
857
|
+
includeAllProjects;
|
|
858
|
+
tenancy;
|
|
859
|
+
projectScopeWhere;
|
|
860
|
+
projectScopeParams;
|
|
861
|
+
/**
|
|
862
|
+
* Initialize the TelemetryInsightEngine with configuration options.
|
|
863
|
+
*
|
|
864
|
+
* @param options - Configuration options for the insight engine
|
|
865
|
+
*/
|
|
866
|
+
constructor(options = {}) {
|
|
867
|
+
this.buildDir = options.buildDir || path2.join(process.cwd(), ".build-project");
|
|
868
|
+
const resolver = TelemetryPathResolver.getInstance();
|
|
869
|
+
const dbDir = resolver.resolveDbDir(this.buildDir);
|
|
870
|
+
this.includeAllProjects = options.includeAllProjects === true;
|
|
871
|
+
this.tenancy = this.includeAllProjects ? "all-projects" : "project";
|
|
872
|
+
this.projectId = options.projectId?.trim() || resolver.getProjectId(this.buildDir, { register: false });
|
|
873
|
+
const isGlobalDb = path2.resolve(dbDir) === path2.resolve(path2.join(getGlobalTelemetryDir(), "db"));
|
|
874
|
+
const tenancyScope = this.includeAllProjects ? globalScope({ includeLabs: true }) : projectScope(this.projectId, {
|
|
875
|
+
includeLabs: true,
|
|
876
|
+
includeLegacyProjectRows: !isGlobalDb,
|
|
877
|
+
legacyProjectIds: [""]
|
|
878
|
+
});
|
|
879
|
+
this.projectScopeWhere = tenancyScope.where;
|
|
880
|
+
this.projectScopeParams = tenancyScope.params;
|
|
881
|
+
this.enableRealTime = options.enableRealTime ?? false;
|
|
882
|
+
this.calculationInterval = options.calculationInterval ?? 3e5;
|
|
883
|
+
try {
|
|
884
|
+
let parentDir = path2.dirname(dbDir);
|
|
885
|
+
while (!fs2.existsSync(parentDir) && parentDir !== path2.dirname(parentDir)) {
|
|
886
|
+
parentDir = path2.dirname(parentDir);
|
|
887
|
+
}
|
|
888
|
+
if (!fs2.existsSync(parentDir) || parentDir === path2.sep) {
|
|
889
|
+
throw new Error(`Telemetry base directory cannot be created at: ${dbDir}`);
|
|
890
|
+
}
|
|
891
|
+
const parentStats = fs2.statSync(parentDir);
|
|
892
|
+
if ((parentStats.mode & 146) === 0) {
|
|
893
|
+
throw new Error(`Telemetry parent directory is not writable: ${parentDir}`);
|
|
894
|
+
}
|
|
895
|
+
if (!fs2.existsSync(dbDir)) {
|
|
896
|
+
fs2.mkdirSync(dbDir, { recursive: true });
|
|
897
|
+
}
|
|
898
|
+
const stats = fs2.statSync(dbDir);
|
|
899
|
+
const writable = (stats.mode & 146) !== 0;
|
|
900
|
+
if (!writable) {
|
|
901
|
+
throw new Error(`Telemetry DB directory is not writable: ${dbDir}`);
|
|
902
|
+
}
|
|
903
|
+
this.variantsDb = new Database2(path2.join(dbDir, "variants.db"));
|
|
904
|
+
applySqlitePragmas(this.variantsDb);
|
|
905
|
+
this.bootstrapSchema();
|
|
906
|
+
this.enabled = true;
|
|
907
|
+
} catch (err) {
|
|
908
|
+
import("./warning-JSKSFKBT.js").then(({ emitTelemetryFallbackWarning: emitTelemetryFallbackWarning2 }) => {
|
|
909
|
+
emitTelemetryFallbackWarning2(
|
|
910
|
+
"could not initialize DB directory, using in-memory fallback",
|
|
911
|
+
err
|
|
912
|
+
);
|
|
913
|
+
}).catch(() => {
|
|
914
|
+
});
|
|
915
|
+
this.enabled = false;
|
|
916
|
+
this.variantsDb = new Database2(":memory:");
|
|
917
|
+
this.bootstrapSchema();
|
|
918
|
+
}
|
|
919
|
+
if (this.enableRealTime) {
|
|
920
|
+
this.startRealTimeMonitoring();
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
bootstrapSchema() {
|
|
924
|
+
const statements = [
|
|
925
|
+
`CREATE TABLE IF NOT EXISTS variant_executions (
|
|
926
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
927
|
+
project_id TEXT NOT NULL DEFAULT '',
|
|
928
|
+
task_id TEXT,
|
|
929
|
+
variant TEXT,
|
|
930
|
+
prompt_version TEXT,
|
|
931
|
+
completeness REAL,
|
|
932
|
+
verdict TEXT,
|
|
933
|
+
total_duration_sec REAL,
|
|
934
|
+
started_at TEXT,
|
|
935
|
+
completed_at TEXT,
|
|
936
|
+
project_language TEXT,
|
|
937
|
+
project_framework TEXT,
|
|
938
|
+
provider TEXT,
|
|
939
|
+
model TEXT,
|
|
940
|
+
task_complexity TEXT,
|
|
941
|
+
success_reason TEXT,
|
|
942
|
+
failure_reason TEXT,
|
|
943
|
+
code_quality_score REAL,
|
|
944
|
+
testing_score REAL,
|
|
945
|
+
documentation_score REAL,
|
|
946
|
+
architecture_score REAL,
|
|
947
|
+
anomaly_score REAL
|
|
948
|
+
)`,
|
|
949
|
+
"CREATE INDEX IF NOT EXISTS idx_variant_executions_variant ON variant_executions(variant)",
|
|
950
|
+
"CREATE INDEX IF NOT EXISTS idx_variant_executions_prompt_version ON variant_executions(prompt_version)",
|
|
951
|
+
"CREATE INDEX IF NOT EXISTS idx_variant_executions_completed_at ON variant_executions(completed_at)",
|
|
952
|
+
"CREATE INDEX IF NOT EXISTS idx_variant_executions_project_language ON variant_executions(project_language)",
|
|
953
|
+
"CREATE INDEX IF NOT EXISTS idx_variant_executions_task_id ON variant_executions(task_id)"
|
|
954
|
+
];
|
|
955
|
+
for (const stmt of statements) {
|
|
956
|
+
try {
|
|
957
|
+
this.variantsDb.prepare(stmt).run();
|
|
958
|
+
} catch (error) {
|
|
959
|
+
emitTelemetryFallbackWarning("Schema bootstrap statement failed", error);
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
try {
|
|
963
|
+
this.variantsDb.prepare("ALTER TABLE variant_executions ADD COLUMN project_id TEXT NOT NULL DEFAULT ''").run();
|
|
964
|
+
} catch {
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
insight(partial) {
|
|
968
|
+
return {
|
|
969
|
+
...partial,
|
|
970
|
+
tenancy: this.tenancy,
|
|
971
|
+
timestamp: partial.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
972
|
+
data: {
|
|
973
|
+
...partial.data,
|
|
974
|
+
tenancy: this.tenancy,
|
|
975
|
+
...this.includeAllProjects ? {} : { projectId: this.projectId }
|
|
976
|
+
}
|
|
977
|
+
};
|
|
978
|
+
}
|
|
979
|
+
scopeDisclosure() {
|
|
980
|
+
return this.insight({
|
|
981
|
+
type: "scope",
|
|
982
|
+
severity: "info",
|
|
983
|
+
title: "Cross-project telemetry scope",
|
|
984
|
+
description: "These insights mix variant_executions rows from every project in the shared telemetry store. Predictive routing never uses this scope.",
|
|
985
|
+
data: { includeAllProjects: true },
|
|
986
|
+
recommendations: ["Omit --all-projects to restrict insights to the current repository"],
|
|
987
|
+
confidence: 1
|
|
988
|
+
});
|
|
989
|
+
}
|
|
990
|
+
/**
|
|
991
|
+
* Distinct variants visible under the current tenancy filter.
|
|
992
|
+
* Used by tests and as a cheap scoping check for the CLI.
|
|
993
|
+
*/
|
|
994
|
+
listVisibleVariants() {
|
|
995
|
+
const rows = this.variantsDb.prepare(
|
|
996
|
+
`SELECT DISTINCT variant FROM variant_executions WHERE ${this.projectScopeWhere} ORDER BY variant`
|
|
997
|
+
).all(...this.projectScopeParams);
|
|
998
|
+
return rows.map((row) => row.variant);
|
|
999
|
+
}
|
|
1000
|
+
/** Returns true if the insight engine successfully initialized on-disk storage */
|
|
1001
|
+
isEnabled() {
|
|
1002
|
+
return this.enabled;
|
|
1003
|
+
}
|
|
1004
|
+
/**
|
|
1005
|
+
* Generate comprehensive insights from telemetry data.
|
|
1006
|
+
*
|
|
1007
|
+
* Analyzes all available telemetry data to produce actionable insights
|
|
1008
|
+
* across multiple dimensions: performance, optimization, prediction, and anomaly detection.
|
|
1009
|
+
*
|
|
1010
|
+
* @returns Array of insight results with recommendations
|
|
1011
|
+
*/
|
|
1012
|
+
async generateInsights() {
|
|
1013
|
+
const insights = [];
|
|
1014
|
+
try {
|
|
1015
|
+
if (this.includeAllProjects) {
|
|
1016
|
+
insights.push(this.scopeDisclosure());
|
|
1017
|
+
}
|
|
1018
|
+
insights.push(...this.analyzePerformanceTrends());
|
|
1019
|
+
insights.push(...this.generateOptimizationRecommendations());
|
|
1020
|
+
insights.push(...this.generatePredictiveInsights());
|
|
1021
|
+
insights.push(...this.detectAnomalies());
|
|
1022
|
+
insights.sort((a, b) => {
|
|
1023
|
+
const severityWeight = { critical: 3, warning: 2, info: 1 };
|
|
1024
|
+
const aSeverity = severityWeight[a.severity];
|
|
1025
|
+
const bSeverity = severityWeight[b.severity];
|
|
1026
|
+
if (aSeverity !== bSeverity) {
|
|
1027
|
+
return bSeverity - aSeverity;
|
|
1028
|
+
}
|
|
1029
|
+
return b.confidence - a.confidence;
|
|
1030
|
+
});
|
|
1031
|
+
return insights;
|
|
1032
|
+
} catch (error) {
|
|
1033
|
+
emitTelemetryFallbackWarning("Failed to generate insights", error);
|
|
1034
|
+
return [];
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
/**
|
|
1038
|
+
* Analyze performance trends across variants and providers.
|
|
1039
|
+
*/
|
|
1040
|
+
analyzePerformanceTrends() {
|
|
1041
|
+
const insights = [];
|
|
1042
|
+
const query = `
|
|
1043
|
+
SELECT
|
|
1044
|
+
variant,
|
|
1045
|
+
prompt_version,
|
|
1046
|
+
COUNT(*) as total_tasks,
|
|
1047
|
+
AVG(completeness) as avg_completeness,
|
|
1048
|
+
CAST(SUM(CASE WHEN verdict = 'success' THEN 1 ELSE 0 END) AS REAL) / COUNT(*) as success_rate,
|
|
1049
|
+
AVG(total_duration_sec) as avg_duration,
|
|
1050
|
+
MIN(started_at) as first_execution,
|
|
1051
|
+
MAX(started_at) as last_execution
|
|
1052
|
+
FROM variant_executions
|
|
1053
|
+
WHERE ${this.projectScopeWhere}
|
|
1054
|
+
AND completed_at IS NOT NULL
|
|
1055
|
+
AND ${_TelemetryInsightEngine.REAL_DATA_FILTER}
|
|
1056
|
+
AND started_at > datetime('now', '-30 days')
|
|
1057
|
+
GROUP BY variant, prompt_version
|
|
1058
|
+
HAVING total_tasks >= 3
|
|
1059
|
+
ORDER BY success_rate DESC, avg_completeness DESC
|
|
1060
|
+
`;
|
|
1061
|
+
const results = this.variantsDb.prepare(query).all(...this.projectScopeParams);
|
|
1062
|
+
if (results.length >= 2) {
|
|
1063
|
+
const topPerformer = results[0];
|
|
1064
|
+
const worstPerformer = results[results.length - 1];
|
|
1065
|
+
const performanceGap = topPerformer.success_rate - worstPerformer.success_rate;
|
|
1066
|
+
if (performanceGap > 0.3) {
|
|
1067
|
+
insights.push(
|
|
1068
|
+
this.insight({
|
|
1069
|
+
type: "performance",
|
|
1070
|
+
severity: "warning",
|
|
1071
|
+
title: "Significant Performance Gap Detected",
|
|
1072
|
+
description: `Variant ${topPerformer.variant} (v${topPerformer.prompt_version || "unknown"}) significantly outperforms ${worstPerformer.variant} (v${worstPerformer.prompt_version || "unknown"})`,
|
|
1073
|
+
data: {
|
|
1074
|
+
topPerformer: {
|
|
1075
|
+
variant: topPerformer.variant,
|
|
1076
|
+
version: topPerformer.prompt_version || "unknown",
|
|
1077
|
+
successRate: topPerformer.success_rate,
|
|
1078
|
+
completeness: topPerformer.avg_completeness
|
|
1079
|
+
},
|
|
1080
|
+
worstPerformer: {
|
|
1081
|
+
variant: worstPerformer.variant,
|
|
1082
|
+
version: worstPerformer.prompt_version || "unknown",
|
|
1083
|
+
successRate: worstPerformer.success_rate,
|
|
1084
|
+
completeness: worstPerformer.avg_completeness
|
|
1085
|
+
},
|
|
1086
|
+
gap: performanceGap
|
|
1087
|
+
},
|
|
1088
|
+
recommendations: [
|
|
1089
|
+
`Consider using ${topPerformer.variant} variant for similar tasks`,
|
|
1090
|
+
`Review and optimize ${worstPerformer.variant} prompt strategy`,
|
|
1091
|
+
"Analyze successful patterns from top performer"
|
|
1092
|
+
],
|
|
1093
|
+
confidence: 0.85
|
|
1094
|
+
})
|
|
1095
|
+
);
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
return insights;
|
|
1099
|
+
}
|
|
1100
|
+
/**
|
|
1101
|
+
* Generate optimization recommendations based on performance data.
|
|
1102
|
+
*/
|
|
1103
|
+
generateOptimizationRecommendations() {
|
|
1104
|
+
const insights = [];
|
|
1105
|
+
const promptQuery = `
|
|
1106
|
+
SELECT
|
|
1107
|
+
variant,
|
|
1108
|
+
prompt_version,
|
|
1109
|
+
COUNT(*) as sample_size,
|
|
1110
|
+
AVG(completeness) as avg_completeness,
|
|
1111
|
+
CAST(SUM(CASE WHEN verdict = 'success' THEN 1 ELSE 0 END) AS REAL) / COUNT(*) as success_rate
|
|
1112
|
+
FROM variant_executions
|
|
1113
|
+
WHERE ${this.projectScopeWhere}
|
|
1114
|
+
AND completed_at IS NOT NULL
|
|
1115
|
+
AND prompt_version IS NOT NULL
|
|
1116
|
+
AND ${_TelemetryInsightEngine.REAL_DATA_FILTER}
|
|
1117
|
+
GROUP BY variant, prompt_version
|
|
1118
|
+
HAVING sample_size >= 5
|
|
1119
|
+
ORDER BY success_rate DESC
|
|
1120
|
+
`;
|
|
1121
|
+
const promptResults = this.variantsDb.prepare(promptQuery).all(...this.projectScopeParams);
|
|
1122
|
+
const byVariant = /* @__PURE__ */ new Map();
|
|
1123
|
+
promptResults.forEach((row) => {
|
|
1124
|
+
const entries = byVariant.get(row.variant) || [];
|
|
1125
|
+
entries.push(row);
|
|
1126
|
+
byVariant.set(row.variant, entries);
|
|
1127
|
+
});
|
|
1128
|
+
for (const [variant, versions] of Array.from(byVariant.entries())) {
|
|
1129
|
+
if (versions.length >= 2) {
|
|
1130
|
+
const best = versions[0];
|
|
1131
|
+
const current = versions.find(
|
|
1132
|
+
(v) => v.prompt_version.includes("latest") || v.prompt_version.includes("current")
|
|
1133
|
+
) || versions[versions.length - 1];
|
|
1134
|
+
if (best.success_rate - current.success_rate > 0.15) {
|
|
1135
|
+
insights.push(
|
|
1136
|
+
this.insight({
|
|
1137
|
+
type: "optimization",
|
|
1138
|
+
severity: "warning",
|
|
1139
|
+
title: `Prompt Optimization Opportunity for ${variant}`,
|
|
1140
|
+
description: `Version ${best.prompt_version} significantly outperforms current version ${current.prompt_version}`,
|
|
1141
|
+
data: {
|
|
1142
|
+
variant,
|
|
1143
|
+
bestVersion: best.prompt_version,
|
|
1144
|
+
currentVersion: current.prompt_version,
|
|
1145
|
+
improvement: best.success_rate - current.success_rate,
|
|
1146
|
+
bestSuccessRate: best.success_rate,
|
|
1147
|
+
currentSuccessRate: current.success_rate
|
|
1148
|
+
},
|
|
1149
|
+
recommendations: [
|
|
1150
|
+
`Consider promoting version ${best.prompt_version} to current`,
|
|
1151
|
+
`Analyze differences between ${best.prompt_version} and ${current.prompt_version}`,
|
|
1152
|
+
`Apply successful patterns from ${best.prompt_version} to future prompts`
|
|
1153
|
+
],
|
|
1154
|
+
confidence: 0.78
|
|
1155
|
+
})
|
|
1156
|
+
);
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
return insights;
|
|
1161
|
+
}
|
|
1162
|
+
/**
|
|
1163
|
+
* Generate predictive insights based on historical patterns.
|
|
1164
|
+
*/
|
|
1165
|
+
generatePredictiveInsights() {
|
|
1166
|
+
const insights = [];
|
|
1167
|
+
const predictionQuery = `
|
|
1168
|
+
SELECT
|
|
1169
|
+
project_language,
|
|
1170
|
+
project_framework,
|
|
1171
|
+
COUNT(*) as total_tasks,
|
|
1172
|
+
CAST(SUM(CASE WHEN verdict = 'success' THEN 1 ELSE 0 END) AS REAL) / COUNT(*) as success_rate,
|
|
1173
|
+
AVG(completeness) as avg_completeness,
|
|
1174
|
+
AVG(total_duration_sec) as avg_duration
|
|
1175
|
+
FROM variant_executions
|
|
1176
|
+
WHERE ${this.projectScopeWhere}
|
|
1177
|
+
AND completed_at IS NOT NULL
|
|
1178
|
+
AND project_language IS NOT NULL
|
|
1179
|
+
AND ${_TelemetryInsightEngine.REAL_DATA_FILTER}
|
|
1180
|
+
GROUP BY project_language, project_framework
|
|
1181
|
+
HAVING total_tasks >= 10
|
|
1182
|
+
ORDER BY success_rate DESC
|
|
1183
|
+
`;
|
|
1184
|
+
const predictions = this.variantsDb.prepare(predictionQuery).all(...this.projectScopeParams);
|
|
1185
|
+
const successfulScenarios = predictions.filter((p) => p.success_rate > 0.8);
|
|
1186
|
+
const challengingScenarios = predictions.filter((p) => p.success_rate < 0.5);
|
|
1187
|
+
if (successfulScenarios.length > 0 && challengingScenarios.length > 0) {
|
|
1188
|
+
insights.push(
|
|
1189
|
+
this.insight({
|
|
1190
|
+
type: "prediction",
|
|
1191
|
+
severity: "info",
|
|
1192
|
+
title: "Project Type Success Patterns Identified",
|
|
1193
|
+
description: `Analysis of ${predictions.length} project scenarios reveals distinct success patterns`,
|
|
1194
|
+
data: {
|
|
1195
|
+
successfulPatterns: successfulScenarios.slice(0, 3),
|
|
1196
|
+
challengingPatterns: challengingScenarios.slice(0, 3),
|
|
1197
|
+
totalAnalyzed: predictions.length
|
|
1198
|
+
},
|
|
1199
|
+
recommendations: [
|
|
1200
|
+
"Leverage successful patterns for similar project types",
|
|
1201
|
+
"Consider additional support for challenging scenarios",
|
|
1202
|
+
"Adjust prompt strategies based on project characteristics"
|
|
1203
|
+
],
|
|
1204
|
+
confidence: 0.72
|
|
1205
|
+
})
|
|
1206
|
+
);
|
|
1207
|
+
}
|
|
1208
|
+
return insights;
|
|
1209
|
+
}
|
|
1210
|
+
/**
|
|
1211
|
+
* Detect anomalies in performance data.
|
|
1212
|
+
*/
|
|
1213
|
+
detectAnomalies() {
|
|
1214
|
+
const insights = [];
|
|
1215
|
+
const durationQuery = `
|
|
1216
|
+
SELECT
|
|
1217
|
+
variant,
|
|
1218
|
+
task_id,
|
|
1219
|
+
total_duration_sec,
|
|
1220
|
+
verdict,
|
|
1221
|
+
completeness,
|
|
1222
|
+
started_at
|
|
1223
|
+
FROM variant_executions
|
|
1224
|
+
WHERE ${this.projectScopeWhere}
|
|
1225
|
+
AND completed_at IS NOT NULL
|
|
1226
|
+
AND total_duration_sec IS NOT NULL
|
|
1227
|
+
AND ${_TelemetryInsightEngine.REAL_DATA_FILTER}
|
|
1228
|
+
AND started_at > datetime('now', '-7 days')
|
|
1229
|
+
ORDER BY total_duration_sec DESC
|
|
1230
|
+
LIMIT 20
|
|
1231
|
+
`;
|
|
1232
|
+
const durationResults = this.variantsDb.prepare(durationQuery).all(...this.projectScopeParams);
|
|
1233
|
+
if (durationResults.length >= 5) {
|
|
1234
|
+
const durations = durationResults.map((r) => r.total_duration_sec);
|
|
1235
|
+
const mean = durations.reduce((a, b) => a + b, 0) / durations.length;
|
|
1236
|
+
const stdDev = Math.sqrt(
|
|
1237
|
+
durations.reduce((sq, n) => sq + (n - mean) ** 2, 0) / durations.length
|
|
1238
|
+
);
|
|
1239
|
+
const anomalies = durationResults.filter(
|
|
1240
|
+
(r) => Math.abs(r.total_duration_sec - mean) > 2 * stdDev
|
|
1241
|
+
);
|
|
1242
|
+
if (anomalies.length > 0) {
|
|
1243
|
+
insights.push(
|
|
1244
|
+
this.insight({
|
|
1245
|
+
type: "anomaly",
|
|
1246
|
+
severity: "warning",
|
|
1247
|
+
title: "Unusual Execution Duration Patterns Detected",
|
|
1248
|
+
description: `Found ${anomalies.length} executions with unusual duration patterns`,
|
|
1249
|
+
data: {
|
|
1250
|
+
anomalies: anomalies.map((a) => ({
|
|
1251
|
+
taskId: a.task_id,
|
|
1252
|
+
variant: a.variant,
|
|
1253
|
+
duration: a.total_duration_sec,
|
|
1254
|
+
verdict: a.verdict,
|
|
1255
|
+
deviation: Math.abs(a.total_duration_sec - mean) / stdDev
|
|
1256
|
+
})),
|
|
1257
|
+
averageDuration: mean,
|
|
1258
|
+
standardDeviation: stdDev
|
|
1259
|
+
},
|
|
1260
|
+
recommendations: [
|
|
1261
|
+
"Investigate unusually long or short executions",
|
|
1262
|
+
"Check for timeout issues or incomplete work",
|
|
1263
|
+
"Review task complexity estimates"
|
|
1264
|
+
],
|
|
1265
|
+
confidence: 0.68
|
|
1266
|
+
})
|
|
1267
|
+
);
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
return insights;
|
|
1271
|
+
}
|
|
1272
|
+
/**
|
|
1273
|
+
* Start real-time monitoring for continuous insight generation.
|
|
1274
|
+
*/
|
|
1275
|
+
startRealTimeMonitoring() {
|
|
1276
|
+
this.intervalId = setInterval(async () => {
|
|
1277
|
+
try {
|
|
1278
|
+
await this.generateInsights();
|
|
1279
|
+
} catch (error) {
|
|
1280
|
+
emitTelemetryFallbackWarning("Real-time insight generation failed", error);
|
|
1281
|
+
}
|
|
1282
|
+
}, this.calculationInterval);
|
|
1283
|
+
}
|
|
1284
|
+
/**
|
|
1285
|
+
* Stop real-time monitoring.
|
|
1286
|
+
*/
|
|
1287
|
+
stopRealTimeMonitoring() {
|
|
1288
|
+
if (this.intervalId) {
|
|
1289
|
+
clearInterval(this.intervalId);
|
|
1290
|
+
this.intervalId = void 0;
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
/**
|
|
1294
|
+
* Get provider performance DNA analysis.
|
|
1295
|
+
*
|
|
1296
|
+
* @internal Preview / not fully implemented. Only `provider`, a coarse
|
|
1297
|
+
* `codeGeneration` capability, and `consistencyScore` are derived from real
|
|
1298
|
+
* data; `model` is reported as `'unknown'` and `optimalUseCases`,
|
|
1299
|
+
* `limitations`, and most adaptation fields are placeholders (empty/`null`).
|
|
1300
|
+
* Public CLI surfaces must label this output as a preview and must not present
|
|
1301
|
+
* the placeholder fields as real analytics.
|
|
1302
|
+
*/
|
|
1303
|
+
async getProviderPerformanceDNA() {
|
|
1304
|
+
const query = `
|
|
1305
|
+
SELECT
|
|
1306
|
+
CASE WHEN INSTR(variant, ':') > 0
|
|
1307
|
+
THEN SUBSTR(variant, 1, INSTR(variant, ':') - 1)
|
|
1308
|
+
ELSE variant
|
|
1309
|
+
END as provider,
|
|
1310
|
+
COUNT(*) as total_tasks,
|
|
1311
|
+
CAST(SUM(CASE WHEN verdict = 'success' THEN 1 ELSE 0 END) AS REAL) / COUNT(*) as success_rate,
|
|
1312
|
+
AVG(completeness) as avg_completeness,
|
|
1313
|
+
AVG(total_duration_sec) as avg_duration
|
|
1314
|
+
FROM variant_executions
|
|
1315
|
+
WHERE ${this.projectScopeWhere}
|
|
1316
|
+
AND completed_at IS NOT NULL
|
|
1317
|
+
GROUP BY CASE WHEN INSTR(variant, ':') > 0
|
|
1318
|
+
THEN SUBSTR(variant, 1, INSTR(variant, ':') - 1)
|
|
1319
|
+
ELSE variant
|
|
1320
|
+
END
|
|
1321
|
+
HAVING total_tasks >= 5
|
|
1322
|
+
`;
|
|
1323
|
+
const results = this.variantsDb.prepare(query).all(...this.projectScopeParams);
|
|
1324
|
+
return results.map((row) => ({
|
|
1325
|
+
provider: row.provider,
|
|
1326
|
+
model: "unknown",
|
|
1327
|
+
// Would need more detailed tracking
|
|
1328
|
+
capabilities: {
|
|
1329
|
+
codeGeneration: row.success_rate,
|
|
1330
|
+
debugging: null,
|
|
1331
|
+
refactoring: null,
|
|
1332
|
+
testing: null,
|
|
1333
|
+
documentation: null,
|
|
1334
|
+
architecture: null
|
|
1335
|
+
},
|
|
1336
|
+
optimalUseCases: [],
|
|
1337
|
+
// Would need more detailed analysis
|
|
1338
|
+
limitations: [],
|
|
1339
|
+
// Would need failure pattern analysis
|
|
1340
|
+
adaptationPatterns: {
|
|
1341
|
+
learningRate: null,
|
|
1342
|
+
consistencyScore: Math.min(row.success_rate / 0.8, 1),
|
|
1343
|
+
contextRetention: null
|
|
1344
|
+
}
|
|
1345
|
+
}));
|
|
1346
|
+
}
|
|
1347
|
+
/**
|
|
1348
|
+
* Analyze behavioral patterns from execution data.
|
|
1349
|
+
*
|
|
1350
|
+
* @internal Not yet implemented. Always returns an empty array; behavioral
|
|
1351
|
+
* telemetry collection is not wired up. Do not present as real analytics.
|
|
1352
|
+
*/
|
|
1353
|
+
async analyzeBehavioralPatterns() {
|
|
1354
|
+
return [];
|
|
1355
|
+
}
|
|
1356
|
+
/**
|
|
1357
|
+
* Generate semantic task profiles.
|
|
1358
|
+
*
|
|
1359
|
+
* @internal Not yet implemented. Always returns an empty array; semantic
|
|
1360
|
+
* analysis is not wired up. Do not present as real analytics.
|
|
1361
|
+
*/
|
|
1362
|
+
async generateSemanticProfiles() {
|
|
1363
|
+
return [];
|
|
1364
|
+
}
|
|
1365
|
+
/**
|
|
1366
|
+
* Start the telemetry insight engine
|
|
1367
|
+
*
|
|
1368
|
+
* Initializes the insight engine and prepares it for generating insights
|
|
1369
|
+
* from telemetry data. This method must be called before using other
|
|
1370
|
+
* insight engine functionality.
|
|
1371
|
+
*
|
|
1372
|
+
* @returns {void}
|
|
1373
|
+
*
|
|
1374
|
+
* @example
|
|
1375
|
+
* ```typescript
|
|
1376
|
+
* const engine = new TelemetryInsightEngine();
|
|
1377
|
+
* engine.start();
|
|
1378
|
+
* // Now the engine is ready to generate insights
|
|
1379
|
+
* ```
|
|
1380
|
+
*/
|
|
1381
|
+
start() {
|
|
1382
|
+
if (!this.enabled) {
|
|
1383
|
+
emitTelemetryFallbackWarning("TelemetryInsightEngine is disabled - using in-memory fallback");
|
|
1384
|
+
return;
|
|
1385
|
+
}
|
|
1386
|
+
try {
|
|
1387
|
+
this.variantsDb.prepare("SELECT 1").get();
|
|
1388
|
+
if (this.enableRealTime) {
|
|
1389
|
+
this.startRealTimeMonitoring();
|
|
1390
|
+
}
|
|
1391
|
+
} catch (error) {
|
|
1392
|
+
emitTelemetryFallbackWarning("Failed to start TelemetryInsightEngine", error);
|
|
1393
|
+
throw new Error("TelemetryInsightEngine database connection is not available");
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
/**
|
|
1397
|
+
* Clean up resources and stop monitoring.
|
|
1398
|
+
*/
|
|
1399
|
+
close() {
|
|
1400
|
+
this.stopRealTimeMonitoring();
|
|
1401
|
+
this.variantsDb.close();
|
|
1402
|
+
}
|
|
1403
|
+
};
|
|
1404
|
+
|
|
1405
|
+
// src/telemetry/integrity-check.ts
|
|
1406
|
+
function getSchemaColumns(db) {
|
|
1407
|
+
return getTableColumns(db, "variant_executions");
|
|
1408
|
+
}
|
|
1409
|
+
function getTableColumns(db, table) {
|
|
1410
|
+
try {
|
|
1411
|
+
const rows = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
1412
|
+
return new Set(rows.map((r) => r.name));
|
|
1413
|
+
} catch {
|
|
1414
|
+
return /* @__PURE__ */ new Set();
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1417
|
+
function getWhitelistColumns() {
|
|
1418
|
+
return new Set(VARIANT_EXECUTION_COLUMNS);
|
|
1419
|
+
}
|
|
1420
|
+
function validateTelemetryIntegrity(db) {
|
|
1421
|
+
const schemaColumns = getSchemaColumns(db);
|
|
1422
|
+
const whitelistColumns = getWhitelistColumns();
|
|
1423
|
+
const excludedColumns = /* @__PURE__ */ new Set([
|
|
1424
|
+
"id",
|
|
1425
|
+
// Auto-increment primary key
|
|
1426
|
+
"project_id",
|
|
1427
|
+
// Scope dimension, always set by context-aware writers
|
|
1428
|
+
"lab_id",
|
|
1429
|
+
// Optional lab scoping dimension
|
|
1430
|
+
"lab_run_id",
|
|
1431
|
+
// Optional lab run scoping dimension
|
|
1432
|
+
"task_id",
|
|
1433
|
+
// Part of UNIQUE constraint, not dynamically updated
|
|
1434
|
+
"variant",
|
|
1435
|
+
// Part of UNIQUE constraint, not dynamically updated
|
|
1436
|
+
"created_at",
|
|
1437
|
+
// Auto-managed by DEFAULT CURRENT_TIMESTAMP
|
|
1438
|
+
"updated_at",
|
|
1439
|
+
// Auto-managed by DEFAULT CURRENT_TIMESTAMP
|
|
1440
|
+
"commit_sha_before",
|
|
1441
|
+
// Managed separately via git integration
|
|
1442
|
+
"commit_sha_after",
|
|
1443
|
+
// Managed separately via git integration
|
|
1444
|
+
"workspace_edit_success_rate",
|
|
1445
|
+
// Derived metric
|
|
1446
|
+
"score_breakdown_json",
|
|
1447
|
+
// Managed by judge evaluation system
|
|
1448
|
+
"strategy",
|
|
1449
|
+
// History only: variant strategy axis retired in schema v50, never written
|
|
1450
|
+
"strategy_state"
|
|
1451
|
+
// History only: retired with `strategy` in schema v50
|
|
1452
|
+
]);
|
|
1453
|
+
const schemaNotInWhitelist = [];
|
|
1454
|
+
const whitelistNotInSchema = [];
|
|
1455
|
+
for (const col of schemaColumns) {
|
|
1456
|
+
if (!whitelistColumns.has(col) && !excludedColumns.has(col)) {
|
|
1457
|
+
schemaNotInWhitelist.push(col);
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
for (const col of whitelistColumns) {
|
|
1461
|
+
if (!schemaColumns.has(col)) {
|
|
1462
|
+
whitelistNotInSchema.push(col);
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
const tableColumnCache = /* @__PURE__ */ new Map();
|
|
1466
|
+
for (const inv of SCHEMA_INVARIANTS) {
|
|
1467
|
+
let cols = tableColumnCache.get(inv.table);
|
|
1468
|
+
if (!cols) {
|
|
1469
|
+
cols = getTableColumns(db, inv.table);
|
|
1470
|
+
tableColumnCache.set(inv.table, cols);
|
|
1471
|
+
}
|
|
1472
|
+
if (cols.size === 0) continue;
|
|
1473
|
+
if (!cols.has(inv.column)) {
|
|
1474
|
+
schemaNotInWhitelist.push(`${inv.table}.${inv.column}`);
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
return {
|
|
1478
|
+
schemaNotInWhitelist,
|
|
1479
|
+
whitelistNotInSchema
|
|
1480
|
+
};
|
|
1481
|
+
}
|
|
1482
|
+
function formatIntegrityReport(issues) {
|
|
1483
|
+
const lines = [];
|
|
1484
|
+
if (issues.schemaNotInWhitelist.length > 0) {
|
|
1485
|
+
lines.push(
|
|
1486
|
+
`Warning: Schema columns not in whitelist: ${issues.schemaNotInWhitelist.join(", ")}`
|
|
1487
|
+
);
|
|
1488
|
+
lines.push(" These columns exist but cannot be queried safely.");
|
|
1489
|
+
lines.push(" Action: Add to VARIANT_EXECUTION_COLUMNS in variant-execution-columns.ts");
|
|
1490
|
+
}
|
|
1491
|
+
if (issues.whitelistNotInSchema.length > 0) {
|
|
1492
|
+
lines.push(
|
|
1493
|
+
`Warning: Whitelist columns not in schema: ${issues.whitelistNotInSchema.join(", ")}`
|
|
1494
|
+
);
|
|
1495
|
+
lines.push(" These whitelisted columns do not exist in the schema.");
|
|
1496
|
+
lines.push(" Action: Remove from VARIANT_EXECUTION_COLUMNS or add to schema");
|
|
1497
|
+
}
|
|
1498
|
+
if (lines.length === 0) {
|
|
1499
|
+
lines.push("OK: Telemetry integrity check passed");
|
|
1500
|
+
}
|
|
1501
|
+
return lines.join("\n");
|
|
1502
|
+
}
|
|
1503
|
+
|
|
1504
|
+
// src/telemetry/observability-metrics.ts
|
|
1505
|
+
function recordMetric(name, value, tags) {
|
|
1506
|
+
try {
|
|
1507
|
+
getTelemetryLogger().logEvent(`metric:${name}`, { value, ...tags ?? {} });
|
|
1508
|
+
} catch {
|
|
1509
|
+
}
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
export {
|
|
1513
|
+
TelemetryDashboard,
|
|
1514
|
+
isCoreVariantEvent,
|
|
1515
|
+
validateEventType,
|
|
1516
|
+
TelemetryInsightEngine,
|
|
1517
|
+
getSchemaColumns,
|
|
1518
|
+
getWhitelistColumns,
|
|
1519
|
+
validateTelemetryIntegrity,
|
|
1520
|
+
formatIntegrityReport,
|
|
1521
|
+
recordMetric
|
|
1522
|
+
};
|
|
1523
|
+
//# sourceMappingURL=chunk-KXYDV3HP.js.map
|