From ec9e80d36fbebd312008ef7f4fa48b58de01667b Mon Sep 17 00:00:00 2001 From: Joseph Date: Tue, 24 Mar 2026 10:01:07 +0700 Subject: [PATCH] first commit --- .DS_Store | Bin 0 -> 6148 bytes .env.example | 23 + .gitignore | 2 + Archive.zip | Bin 0 -> 30528 bytes README.md | 76 +++ ai.js | 88 +++ data/ebay_items.db | Bin 0 -> 1236992 bytes db.js | 214 ++++++ index.js | 556 ++++++++++++++++ package-lock.json | 1544 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 23 + public/index.html | 729 +++++++++++++++++++++ scanner.js | 607 +++++++++++++++++ server.js | 224 +++++++ test_access.js | 58 ++ 15 files changed, 4144 insertions(+) create mode 100644 .DS_Store create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 Archive.zip create mode 100644 README.md create mode 100644 ai.js create mode 100644 data/ebay_items.db create mode 100644 db.js create mode 100644 index.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/index.html create mode 100644 scanner.js create mode 100644 server.js create mode 100644 test_access.js diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b58b51eb1bcce3b292f0b283b09be84d2d433f4f GIT binary patch literal 6148 zcmeHKI|>3Z5S>vG!DdU#T)`Uz(Gz$9Q5#`FLF~8kTprCgpF&yfv{2r_^uvY(4IA~Jy+%GHLx*}i$t1{qNx9A_M4w?FUN?eW<5vR?;`JC>7NWGn3>-!^De zfC^9nDnJFOz{eHH5<8iG{A3;e&iX;6Vd)od{|=!lohtBGA;&_%QP(7ai*Ls7pS=NC^Gt$`e=02O#vU>M8B>i-J< zrvHB?aYY5Fz+Wk#qvd+Jz>~7J_8w=ow!k-V%eleLFn0c7o_SK_6`Nzf VCU${NN8IT^{tTEdG%E0I1@0mY6@&l) literal 0 HcmV?d00001 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ce16746 --- /dev/null +++ b/.env.example @@ -0,0 +1,23 @@ +EBAY_CLIENT_ID=apactech- +EBAY_CLIENT_SECRET=PRD-1c822 +EBAY_ENVIRONMENT=production + +OPENAI_API_KEY=sk-proj-_Hty3Bv8wVCtG9DCXl +OPENAI_MODEL=gpt-4o-mini + +# Files +KEYWORDS_FILE=./keywords.txt +PRICE_SHEET=./prices.xlsx +SYSTEM_PROMPT_FILE=./system_prompt.txt + +# Output dir +OUTPUT_DIR=./output + +# eBay search +EBAY_MARKETPLACE=EBAY_US +SHIP_TO_ZIP=10001 +SHIP_TO_COUNTRY=US +ITEMS_PER_PAGE=200 + +ROW_BATCH_SIZE=10 +MAX_ITEMS_PER_QUERY=100000 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1dcef2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +.env \ No newline at end of file diff --git a/Archive.zip b/Archive.zip new file mode 100644 index 0000000000000000000000000000000000000000..b48795c8c670d572ad8b050c3caf24ade7e9abee GIT binary patch literal 30528 zcmc$^Wo#vFlO=e~%*@QpcA1%(nVFf{x6I7U%ur@#W@cu)Ol2;6-miB@)7?AMGe1_l znF__9R45{!ql}|GM@be89324t&z&pnt_S#c7X*M9U~J83|mRe$wZ|Mzg$&~?NUM-SLDbZ!vZz_=YPygM|ZrHYk;?hsNbsi-=<_c4iY;_ceW zl((T3ED#`e03|06LsnT*BG)O>*e0|CLDIb!e9m{8y&mzvCA6!b%enIGb+s@Jph973 z!}2LSeefD^?olF)>b=oxzLU0YhuT6(zj4PFhC5W@7sEk=OVz07^}S?#?sU_@Kb@=~ zev>|!>9quDkg~foMl0feYFA;T+;{k0{xkB^bsyWQesZHgvDh{XLht4_45e?eB+oGVV4-EEPf%=r~qo? z^$d^~m@6-k42E5TWJUyO>=Q+rC@+v!&^*E8Lj~45{j=^@S{}jyG}3P94% zKuK8!@~1EVH2Gevb7FsP_PpQ42Al$5g4v(M`?NZIaz+XAz3B3`6F_%*Q1d=vtYm;1 zym6viK66u9-!lpCAtHVz@mlSg-ug-JoT+Ilym0wh6CZ>wuwYTO<}~5aAl+NCpqu&B zJ;LkSxsu?j3XZF3LiMgvOs=%X&Ch00ptznTt(dtpjCyPw@AD(3@Ph!;c3mcfG5)Fn z&smWt?N?h`K=U8Y>srSFgZDQ|yBf=*KCbLlj0|PR!Ks%DQ-`o7J$4aLnTbUI5wDFCGiyRvVl{AMBzS-*U#Ivr5jP*-_(3B znAQFa?gYrvFkU&zg83#sr4`X|ZFi8WtgICQcyEIVnZy*Q=yC`OcZWXDBhH#R0a zqjoOiTKa4K2@&Qa`1gsj#_TBHVeqkjdhWx%VNW)L996M5;cq(fZw#~FRAnIWPT+BJ z&jCrXiQ!xhw?nHsoL|mJX)aY$0h|F*j}oVh>qI4IDgDKi%hU7_FrpZoHKK8rBj=|0 z8zGV0%~B#fV^VF9wp$yoa~Ku18KStSuG$^abAQ~x$J6s%N-{7bmIUuYMSrj2+nOR5 zRm5xMz+_q3C^PvJ-(6|eY+de)WI1G1(J&ZM$)!xq{(+P`VniU#Uy4(y!*VU_$aSO& zBEEJevi&XjK6!PJDkP;`oo?91n(lFpuI+x1AE1AI*8JOGoaB-5_o!31@G}96fUV}LLwV0 zK{I;oERvyMwTgSIPR41QM`#iU)f9r^4DW2VTsvyt7Bs>D+BJR?bW76$8EiR#+QLN-qbJQmzj%*io_%_0R#HcXz)H^2>XF1SbDTdzI)c96IS zV$(#=AIub0cFlVP3k@*?bb&C59-gIB1(b?ud39=yBj1ZIaciKwR1sm^Jsj>Kmxetj}?AC0d}(`Owi&*7kh zqK4-V*~SsC&NOtbJeQE<5p5>hJQMK>P@Fw`?<@o$C4X12#nkcX0Jp_vQW@k@T`wr5C8xg8~~v7zuX4M|7-(8LwR9Q zMO7^(M#KN@Vko=sw>CAxFts!?F}jnN)3`&@h)@awO~3}DLdFAeCP5B;jmC)pjUyou zR-%*|gC{1vospfERWLU)Gm%p3(^ak=Y{&SgM<{3? zDT8N?e|AyvKk+|$UUc#Ne{3)_lmEpAzh@1duhO}bvlX%^ zoW^Ooye*i)rQ%Y+u#3fufaVP zKao49aZmC^68Z^=ldHcJQO^wtl0sd&N!KsNO56Ae5JDJ-+f&fe?}-2#*CZr!exTlM z2#ScuDy7-e+r3;d%rXMq?jjers-8G+r&~}ne(rSw9lD5-5ruY!_8B*Ch4QK#MEZTh zE|kp1o-IlJ$_!JCd^36T1B_?Y_zpBUL*j-5frRL`gvWXn(pdN8&tuU`}vF%v9hicty7P_KY_v*N8;-Z;>;Mp?`#-y#M)u7yZ?8mRnE}EK5|3l z$a+VR@uI1MlTObi=<+4j0FC46o#UN9XHH2k?cQK?$%>BWZ#^E-c zUR_k&C7Dz8T(F)l?&AGmLM}Pq%hD~-=I;sl)~l6u3t1KY0e^3v6?=c>JoT=pJ~@Rj zfk<>nw7~G#lfD8U3yZh*!iqG9)BesM?z31b`VJD~9%upT&H11#bGWKtApU9Q!w~c_N_9CEa~- zL4#^Yho7rKj}yO4I^ZO0W7Cs*Y;>%iju;jHITLsv$~O?v<0)tSaRb*#Gs`lPYhvEc zZ=M1DtpJmbMK6QyiY;c60CrBeyNp|`t0Wkm9>7XEGa8`GgW zfA=>3K*;wJ*{21&?UM#b^lWJxquiwD|LT+-ImB@avvhHofAFpV=eFi)Sb0;XAiT)m z3V%xB?{auQpYuRvN_`27bkGDd^#wWW?LA>{?1&&b>{SD1J4esBn5fP%yaI`=nf*i0 zblGXd?;xsh&^$RT`iW-Hz6^XV2TPBIyxoq~DOBtHd+OSJJV1)Kc*2-0Evx z1-oRMgtvI9xR7nr8hh3JIrbAqE(*u{aXrm(V##m7rJPv$Cgd_qG#7uqJF`}fR&`KW zUED;Sd7(Vzp}HXv`;`}bwYW%bLq%&VjQcuxSC7s)xjSl$ZETt06rAtXd_|UDqX+U% zHfwAQa5$=-@=`pcQZ>_Q=PHu4d8x7M`6AfL;==SwHhOCEc&sgJXj`MVdd6h^55Y0o z?_LubYj-|dX6saljV_26UuAs8ex~k1kGUU3kscE#P%f*LT(cyX`me_8qF;7)7*&O| zlAp^t@nY6hl2#oxafP=Nbe`GQXK!3w&oooqIfK@4jAX~8KO{+w;qb!j+?hYE=uTYA z)^sZKfinglVJfar0g);PkU@X>$iU}$Dn7G;vEJd*!;(U?C|#*dq(&)CbY{LIN7(Y0-zj9Wio5b%Kc zoiD$9RI^GBWqE7{_BOBEU(oU7(0I>I5fK7~XM5-;LI?IwXTQdMr~817BtRph3MwMf zvYK##ZyD7O4I6cz>DobqBgSFOHD@r>(BlSt_1lgm$h=Z^ZG#0VZ|I#+G-dj>-k0*#;R`R0TJnuatZ`nGwH%o_m^YPpG{nOF2{ z>(`X4aoYFRGAUCeHgQ)whiVtx>qE5_X*pxzJcVUbKRinIBtHG4PQX8AW?`RabJpW{ z!tvMoRTv~&LIt!Q&J3Z-cxVP0&+N4^A<%Txymu%2JX}v%XmO{>f-79_sFCq~BHTHQ zNxHrL#DZrj(Ane5Q13J)hcFggsXsfjTkh_^*9&W+zrp@RAB338d#<4X0As@ciaz`& z%JaWv690ct9w(sNf1o_j|IjpR2Qzc8{{`zA#_X{k`6vFBcld5x4yBU5KWJ=z;4`qq zLbPtVx_WgZ#x!Q@2hIms`mD`tfWj94O0bf~_O%kfuJ;YEPu12|f6JvH{c^q)-)@yK9t@SNK87DMy589;4aK@+P{{Z=2D0#)CE`jW zq}>Jv?)p1=2)^B`uJXJyjrNVxk{0>C>);hX;XmL;D_*DH)rgO~6 z8yHMy!af3f={WG^lhP^1%@#jM7;6MO+h>oz3hcGdY0FCQ*;LXaH7}IXv|z zXZ}Wf%gSWB%oXJDy?OL0mTs@O@03lrAI|8N|NwYzd-sACVhUa3*d>*Gb1 z110^`O<3aW?!R&Mnc07gZZKHxoGoepLRjfqoY59S-gc}}@4e7t&&Atz^PWlU(r1&3 z?1Skox|@4Z<1nnHUh$!Q*M8T)bM^pVxR^(0t%1y< zgKaKxb7(@LjPi$@sPaa>VQwx5@3+pRfWkKQg|{l=mfIoaHq4;7h2G!0uWdMP+zGtx zje9;~gcyQn_Fg8od_fnY&f3+J3k+%tc0ACuk6Zdvvh(H}c($$CGWteX(FqzJX|GHE z`@|kFHaagNO33}L?AlVX)KPy(MRxN|OI_Il;vQAx!Z`wRxC7`|(%sCNqevTt$7p~q z(C}th*3Usj(1}bB!!G4S%x_c}DnL`+%6@9m(750$U@VAQBy|@9vIN4Q^Y+*5w>USA zDNRpv~=vTHem(vK}0 z=f48%njSUU);jr2%WEHZf2)orKD1_&^TC>=$!&*u4~*l5n6Y4mQ7Clp6Y|k=Mhrp` z23f@pS>eSPqYk|g!?&)?cJ`(?^!VKI_%vL~nm^JKK?0l}Np^3E7zWQlm;PUM?nsRNjJ*mgpSp8y#CY?ZGwVkr zJKUw}wbL-#4;DX z7!J+nD;hV%l2tYQMeCm^RzZ+tSp^!id<-*g8wq%X2W3d!twXMwr$1f<<>B5=6ZlN9 zHP6M#-fcUFLOn~91!-SL8&Hfg-g{vV;NLC#<{e1lVF8Bd%I;kx?Fn$!Df8(eg(yaQ zj5@X#D$iW;_zURcm}{;~A-#yo} zWXy}l=xEw0#NH(IuJjjWhS&>%MdViUHdBpxH9(wPN^B- zqyp=7;U@a9HBOD$pI`k;1_T**Uflp2F?&$_t=itK7|#9-xI6FrQeSH{KWlTcJNPgt z3J*+DqvKbdI5E@^QfG6X02?U@!s(Pu`FWhmDsyUJrG&1-iP_X;wK7VCRsbh@r+o7; zwL4ai)*-t&tEhCS6sx92y_g5u7x*zZQdm-t^NbhzAxSBlf+021BmOWU<(AH32lS~t z&@OJEDew8=24c_z!Q>?GA1NNKthVki@kUQCdJ*Oc) z12hN#*2Y5#Jdo)i)(3uw+4zo4&{(vgd`? z|JliIHf`PV_8HpsGpuczmA*PWq$t|h3X*7=rKGYo4X4fAFid*AF zp^0|-8~BMlK~lvoKRKR2w@frHWK(MM3Psvp{v0o4;`7{3zo34cJWnmoD11*n-IDb9 zUY(~728zO(PxyKE`*R1i?mAY}lb8R5N=$=0>U>y^QSQQ%fFa0;-9kHJ-ym903vjE@ zz2vJLS|`$Sj|GdGAlB%+?fI*JRm?<3&-HUW#oD;{Oxkr{;Dy;`qQhY*B0fPn?(B#q z9$)R^Id}fTf>odvV@qt2poKpSRArMMTKm=0kv>$KROX}|ZY>#z233rb9rxgnMBd!4 zQEA7Zeo0^JMb?jyWZ=DB8FtH;d98s;{;q)E=Z<6t$4K08dXRA5K7v6Ub2V0fXbepN zTc4?mHr{ZN2B{sDTN1AxTJMgHBC$J{5rb%ReY+mpLxRn{S^QKtT?5%p%e=<9p)$D} zJPvQ|cVg|^sAU%lli@H&w%=$B?Xd((kUl6^CLhM{Jf6`hDu=bV_|EB6)ROo--SYw( z(JfiJM`lQR@QFQ`b;UUJ+3yc6(daJn+<>BB>544wF;Kq#IkopSdk4n%8Nn1f+XIWhMxfp1!X~s{^c#7MVluefQ_0nQ?`kAjZMD4A`0K zeq;#Ua?IVqC3ub3vZQrI4y&%gGzN>x=FA(#*xXt+VL#nw4g*qxWk`-n%BB7ajYs#)oha&|-i}D~Y3f!l0(S?|vWPG0tO7rpr$Q5G*H-Xv9BW&9K z@!Qw;S`S;~c`EP=tNFMf{h9(X6bTnPpBr7^*hseER-SLapDM+g38aoyE195pYD&9j zM`TuxcwQbmyddVlnkC)D_X`}p(koF?m1;`f6sZ;zlPX?ogUr~2j_7bL6;-?vj$Ox- zsVyz~iQ;^%+g^R+FvCz%z+pv)<41;|CZre(t%}^<_UI!G{^3ncEecy+xXjJCxK|B?BBlq8Z&6k zSoTjOHCD$YXl)YC_K|OIio73pP}LIo9`{>>0luMu&-ZhluTWvFQ5{}A6a`QjF*_t~ zAbY&{@usibX6h?RVUe<-pm%97Zs@0no=V&8#k#T`eHV0l**-Azs`qy9G6g`&d+}v3 zw;x}S*d=qbS^UUi{Sq2SCEkAi78C0@A}5s`2(JZOBP(2rxMlNm6CZacUheX^#c_|tAIMWIUT(B7R~M*_f8T67&F*Y!kTR09OOT> zh$Js-@=J_iv<^!~_pjCXT(v88>1S#V)}u|94WJRHE9RA(^BO_4sLf?xR26t<%Kmil zD3HybkOPHB%W7tw%p8(OTZ2($m=EwPJt`Eu1_zh}a=MPULfbFj6K}$am(R(An7f9c z_$$N^HBAS@k&JYS^pPz7yzv4*?OL&8KX`m^TDc-T0oncY z1wZ6yL)7{q3EhTr#Q7Od9XtD7&|8kw$nxor2d@C(8^AJ z-HO&o(SUt8f)>V-;^6?_HBth zvE}J#${L_5fO~pA>q!P!x;#|{$@@cOVIG;gieqs^+ZRx*tC$mq}kQDjC?SxD`2>^G$ZI!1owX)whGHe^@I zf_h2P%ha95^XHy@;bB2O&LU?vPR?uH{r9!O0}YaClSU^qH5%mdcAW^j;mMM|dbxCH zoh}pD%p?{Fk*DmH8rlcIQ6_JndXVV406>%f3bim3!wo&rhG(gNw9 zW^=s8-6#Ga=ir&i`tAu3MMW+MItZOY+-~WpkU`~yZ#Ac6K&pZj6!WW&j^w}JAA%N* zk;7~~S8J^IOHhPksj3-+RWQQ*A+0`bvM)CZSGBIP2r+{!)JEB%c&d|-*;xZh2wUw% zs8-PO0m@rOEflWA;?bVUj`~$*yKgJ%ANiwC7daX2TdP_p6oKoJ2U_onbgEDjz1mI|J)najT^j zK$8)p=|7_3KQZzXt8uySmR*z%q2Ws zXyGsW$0se@2s|UFJk!~AW(Tzr9c=Z6L}rgsto{L~kU6nkQ3Ah_#$R9rt}u_WdO#!Z zEsju`_ASnycn+B%W6HcnG+>-#Z%A!^h?nAm1Dy`fT{1TO%u-p~14vpV;FwN4_yWIo`|sMr+*N5j&L1cp&tj^4u{=1&=p^t#C?@;6DJ>W z_-D;(;TlHhHuhP@k#;!q*w!=?pUfjZ6HjxBfs7BdT+&8E3k@2KHr&M+Vz#YF0i<3` z$bd;03ocoSfcfzzx6>31bWc~lD&7e-Y&@xS{1gfjHiK+!Teg8TIDW?rxk}?$-fPdn z!U5fBwVLHt`q>>c+UN`MG)XTfN{~tywAQpto+apU*LF6M`rwdcby75SlFbqibw6B} zxi*ANAv{~Pe-sD-L1)hR`w+GU4oH3^Cjh+ZCe${cn)EF(qJPW@loR2WPQZ9Zf!LA0 zAiIhheiEnD1-iVUa!3Q^02X(p{^TA%e!_id{NT2YiTl*f_=jq9)wkS!ZMzmue6;C@KjSjwT3BhN6h!7}|IW|Axq zi$cuwIH55fXw|twSNE`s7}a7UdO?@==5j(MVRac1)Ahyk+hb~J(bq=`l3C$p8L zS{Z&}nvg$de(YT=5h&EuDa6)rN!%0n_!9GWv_Bu=3(J#)-JwD`KGRPW=6zi{FTRNG z18`SPw++#1n?iWk6M^)U4zJ)mpA`l{m4t=Z#J7uR0B})&LO)U!+l|A4#-OeXeq=YY z0Rxjb!Udpq`x)GeQk$E9YFAesZ~_VmT%E$#;1j@B{LH??;@{+Z>k-%8^J z0DAY%!p#fi{{h#Sv9-_~NnDsh2&6_|bWdRT4LGEO`f;|wR01IuD>VH?0krk`LnIyY zkMs+IBA+(L_$;1D9L+2A%dMTZZ(3|Lo|G3A5?d$YOsrJcWVV$30}5DJq*N?%)|4@- zbva#*`vH6pWnj5LH*HKQY^Wrb`AOF@rvs)cm$Zcd&mj<{5^5e_2zFRRKQ4t~uziRx zTjQcbgOyNWt9ucZPqO>;-P48DH;A&}16%JS(C43b4;_uq(&JA)jo;g8W`^>J(H`Wm zg8iF0mfPT0XDOkOi>W`@PsQGJ<-NrEH;_NYP_1a1RqpFF?Ftg{8vW z2A#B54RbI{Tl=Xy?=kU?Eat*W5XqhJ_qaDXFp~k=y_gc@F3OjN^%T9``~|6|YFa05 zUaFfNLm4P%kI09$m+2x|Ox-6A!5Tc8RYWoKhRO}PM;Yyi9Qihg@w{JjS4vlz*)ZWv z&-29T^@&yi*b)&Oo9qcmA;Iz-c<6^JLsPIn3f(@MLj?sxpu!X9#aD7xqj57jge51D46xo}Tu)H3fOneO>3$P;=O5>=-W%I7 ztJpwc?i!ymA0w`)D&EmjFD_Vb)g4%eYr!%HC14XC!U|3Z;6OrU9BBSPK;3CAqC9In zSd19k0&RG{f8u*$bOh#l7W;vyhaj);Ms*(a>5z~m|CQ?}An5z5r`*9V z>c{_y(frBG7Tq-SAQaMP*I?t6mWJbhat>j`(B7_aK%y(;%< z#*_)mzyduKz7@oDeK=J*itVR}zK2!HiV+EeU{F5QoMbD25_}{rk0dHcImO@r%CKR= z4Pr3Dr7Bg@#M-jaSN$H#>W26gd(CA#&jW4)NX?(g`&)HA0XuKYBI{`9nlJPBOv2BS zG~9l|{Wd%ILEpI8S22;EZYKW*-TeHQXhiDT?KAI18^&5P)~{a$o1!{`r3WLmxg>NF zlI_+VEb9KNDk^IVBu@))-n`Z03;o%A*wS(OLCp%&G_In9{KUvr;`7z3+)|NRl&$0; zW)u=Cb}QJT3g7EJoy&uvgAZ3D=!Ib!aYr%K@A~k-2DwM>Lk4NbPx>2-)TzuThe!+j zGHJ>z4A{`q$2-F4u?=xlz+cvlM`AJ@0H+eYa%ywF3kuIWQm}bKB)S!Cq#R6n#j+>e zN?N*hD^}FDd>eRxYyQjkl0PH(hgT`p%R5f4)IoaCgK?|#UMa6zXpkhjvT36zfz>FU zU}vx71?(H057}K9;U6>PjnN_%Pt%h?MZ{?4>OO4Ci#2GXdGJ8f&)&5eQNwZ!@=f~6 z1oH`|;~2mIp}yagoo(gM>=mM%-ldMq3g3O7GAgFTKIIgfXHUsfy3x!Jp*9n-fRa~T z1Z_w$1RYU^GGRhzu#>GFqoqnjTe;I9^Op(@>%Xu`b3%rTEGl74rQ;zQRY4Z~aYq@y z5mmBhv5xnQ)S9f!=cfsx*yaqfQaRs#(I)mXH|4uoijf#rdS3WX>fy@3WO^6TM>kNG zaxQAOV9~Zc0OistaoM9kNqV@M;56F4$WF7x5*W~QJGg}kR0{irNzBc2_4GNLiIS4? zirzQqk7o=YhqSHjxFf0KYLj!4E5y;(g~oeCape67M1hEl1J^5aDBy;TK{Vk=z!!$7 zhsHsheTnaXGg67u_HW4H0RZi)|6W!6&k7yde>774pNMt;wXk@vO$>Se&4vttFDepJ zAeRtFAaos976wB*JJU~`m6KncuBDWaT&1a$Vwjedo{^pdtKy0sVXt%yCyN%1`Y6Nt zsDgu?iH*AQTSKjy*@0o1i@AZhg|k^shLw%IwZUVSdU8(wmq#Z&MMR%ORSPDaV<6zG4XHQ zg*-p3Ctl+=@MRRq&K815LMdqUKz1V`@nPxUUjKf9)Bv9vynVuCUJ<+W4G~6@#1cAL z2a}ef%4=kl;7L+VXZG|(RD0ouX<|U`&i(vC=-KTyLVs=630YggI6+d}z&tX99x%I+ zAmPBxx^6!Q&!o3{cio3@9>fv`%q9t_%_g*xav1Mqaz0}2)OSTew%=xk( zyq6*U!gq@aI_8r26q1bw(|4ppg>16@7~UPHeo4B^JwW6?)KE2WV(Pn0zaEQRqhSg} zTatx87)@~TSBjboD>I)hO;GGW8@lx>*)9yZUtAIzJZST6?DM_;n*^R3uqiGJ0swG= z{(G?g=R?B!k6`^jJ+J>7u>bFy|Na3Q;QBw|3+i9^ayPNFHf8#sLF?upNZtMu|H}Wv zLHM7Gp!}!#|E=DCRqp@m$^T{C*Yx<0w#R=p{eMsXe|=r7-0bcCXHBo(^;`e<7~$Va z+LG}2{S}2-%Q3M-;*}ZAfsgnrNn&@U&f$Jsnj%gX3{@VL5IG3MsiKix{Vhn1LcLOk zRyTE%@0jc%PjCXsOpxU431KG|k}1j4K3xK=!1?{DBY&y9aG@t!Q*rn6=BnIGnZEem zlI$~DEPzkYalSp6tAZ#-kj$*51gKaBCpcy8y!(1OqnQg8`yhPHbm4tOS#rfb5e1n^ z=`3uD-HsS);!HT7?Igo{eHawxtQ8ipJW(DXHuqr=4@NskT4egZ-bazHDi~)i!T9ON zBK=8^?f#~Uj|IHv&^B}P*wsQ8&qC_j!I4Y%eI(D6Tvi;~&ZeBYWuJpWvixF=ahS^o z`LW@|Z;0L}aQ$aCZhsEu^Q~#^gB1Fa{lRhW@mD^lltl5Pgu%81yP=Yf)ATyWm&7=; zY*I+KWgpt&h1{v=gSX>i_8-N$a(cn}xJp0f4<4Bw@{;ngB>xi{BoE)GnBlN^p-d81>gn^8p={ z;DwvqSb2#%`Fs4+g3U<$Y$t(!khq|+QA7`|&u9B%&pE)q*wu7OaNxdNOeA^@Eq@mytZxn(@K{1Tid#<8g!R z4_YJ&aLS8j=BN^I44eq@e=uRp&@ta5roU z)FiwC=mYqnpD{I9#3=-n&7!DOSJR5}1IwCc1;6x$oPw*tZB?p`wiiK35i!;P-d`=y zj^~g-jOVtn;Z-FQ1Pj{(D64GWV`!(}Nc-XUv}`-}zAyv@0*pes9sq;*O+5}QB@;3T zB&>vC;;YQ)Mngh6m@U;9`ZxDXbjIbs42RYAyiA`asbEb5Ijhz(f8|vC*-aN83Gu7n zW~4!%*1~{7~@JSYWADdM5WjV}HgDSHF(ha%jg7#AfQ>z}hMaJ`x1Sd89%? zm|h`DhaQ$*2!2cAKtM015~s(QwYIU53;pVZ9koefyykbLBz zsS!@-4yByx93M3W@eGk|;0?;|VTpU2n13pS`i3V35h2Et22%(Cr?Er99-KO#@&iZ1 zg;u|)S>ITqZO7!-N?PMJ`t}WNwLhGc#(}bwhIFl2OtDZU!crni5pMw)TimB7RPM5X zqIsDOjn75Tx}ivb7*_s5X5_MIk-fsX4Lv#ndxJW~wmOhOaT`48HXEBryv=-5XMM|4 zV7X;XVB$K*#1|0%=Wk828O(+h&ME|f278cn72?=3Qr(?Kou?L_t9o}TM{yB!v5!!> zG-Wr}{7(z+_%DUtEGc~X(^Xfc4Ei)6L2A(jNF4U#th|?hy&-qUK zs4;uOQ3&lMlhdCkM68h-+Hf&u`cAqNRp#p*B#EnNMna7-w6i5%Zs!QyiCxpR*a+}~ z>G>*%& zsLj|PoF^=xcA;6*X{?Oi< za4=00BZEk;V(ZnI{4*gyEo7Y8Vpl{-JsXWoE49#pK{jKBJMtiLP^n3*M$Ac3>OvU@ zo9-uJDr_qnf~@Ud&wYW^T8rK%Cetd#1vNT4pLIIhK*3=5-8puTMW+O}Ow2Zd8om^X8E8HV`4ln2RO=N^yb{(b=7O-bK21WNOgVQodk5+18nz^viXXswsDDeE*1&gIIoTD-&nDj{=KE{!q$_| zznKF+4}I0C3E88pKeZ{DI){dnY&<;vVWklFB)+~qh58#W*eG4%TRHNJRoWd6~CM4T$yHn5!ps{1JP15q`GoE-o@PZEa zC_tfUqy(x-;tDw=DKB0)wcCNhS!oB`Tj^mS{fR0cm694Tv6V_d$7i_lfj@*Kt9@w^ zo(75U`?<1vDT+ZMhl18Lvl2dL@Mi_ZlAu+`t{DqB-pJ0XJ0OQ0%RV}HkVR}7P7Hb) zL8=F;|D%6=QpXcxbk8+BSJqmssKxAXy~Ch*`*SK#>OSSj7AVPr6RobE7G)Em^BRE_ z(h?Ej8nIHIchC$8f~$Bz8Yx6QhgW38(Lq6P%LkB!c$hva14~+>F3LRfZkL06?@m;n zCdwyaQi3}kjzCuc%7IRGMHy2L*hs3ktRfX;q&^g-Io9D`ah^=qR1|4JtTh=HbSGb= z+d;>F&*CBZ#NIcb_$@PFrm~na6AswuBv{_lJI8w+Sgy4I=)hb+ABZ~HDsHmU`GkWL4 zgp$KoA@5V1ddRJpYA>#vktgW=W3V8JX&REi(KekhRsC*hky#S-n0fR^pZm{KX1X-I-PLqiEUKUJ?)iQYr?i-E+LhQCIos{!eXw2fK^HJeU%rwYK1FMu$cwr z359?OZ^(A0je|IZV>)yqO5bU~bQ_PSDR5wVa?qo2G+@1C{34Jw_P$^O!3dZmylB;8 z(U)bpFfxrdZ>`{Z86O#0lRUnXWI`l15xhv;>;9r_Q@+x0+KOPXVtK=zGAkLeFcQzv zN5+b@fNU(+LYN*{^M{a@Eu<@?N9Dn6fJ1nt=-^HXCiS-8O z=}W?+(_?k6+_W0fEX+;FyGe!zjt92kMX4xG>SqhkLI1_)1jlmfxxG7^u3yCgR60iK zG?SC2to199$d}5B!ctBoe&!%hP#Vl|HMdYl{vV}yFl)n0^ zvt8-IdO$U7OXKB!_UYNdJnYt7k!uVz)s--Sl}y##g|ow>R49cVLKrZ-XdNDmF4+x6 zF*!#2F|#37@bPnU^F6Y(Gm21_12liO^_G~QKt4H$bp|!+PvH}g$gHe?w7r8(rPKz9 znLa|V4R%4OmDj7%-+HyC`%WWP|I>|_1L8`i$0u_bhV3IQhuI$r3Q|^m5+q%Q;gyU; zKEXNSS3qZbPGS;aR)x@fXnmo1x}H$xfkd8qK_1zb2g^(A)3QZLNUVhpt;1$VWqWR{ zc3s5jt83c!L8+6cd92Vj)?k3)j@NLNz-N;!Ro9A}(sZSZh?2Lb1hrus>NP*v0G!UN zaZBJGR>O+`?bFp?2vNbGEMvdOD%(>j?TU+K;CgiCK(ak2i7kSm;O|P$_OtjB0KRTSAGf?@EUGiCVR+vbY^qKA z`kqDme_}2H<<51h?1*NiWEY2{t@xNQ&EONJ{E?FChaS{9Ubl8V4X~-XJr5l@XDH~> z(~^%{jG&;1rR}W25Z47#I#^5?Mh10^M`&_b1Z=KsIl2OHJt*R4Ts(`+c!?0}efG|z z^++eG1GHitGO20Io=`9;P2gbs4tQXaE?|>|k>u8wB2Iwuj`P*8+ z+r)6 z_;B2CVg68x7nR)oW@bd4-wB7m6GG0Q2i36jd2BN6m$$R+XScbK;rI0j1^lBq-rHWW z*TYT^K#N||{?^=JOgw_mIq75KWZ)w6?;p#;LN;5|<(I(}`Shr_4Ra?qaN^LJ)h+bW zmHAJr37|ju!Hss%=6h;Vhy#sxYSQXXw0x}V!^qx-D1pnI2tlGXVIvhiWgBRM<*gZa zkW`Z;uvCw)u^JJBMdYMUTKvP{;Me&Q)d0J7BzyK98#lVAMb?C`L%1TtwILzmAMm}g z_a3QB@b2kgO%4u0ltR*hO~N%(Gf1*!^}U1Z_;!gUNq3ZA}9sdI6{U}uF`jDLB?Sr)6im+?u0mI;HFL~oLzNF7D?mR!I* z2p^86Dk)HGiZdO~G~}5rjOFs==kQ+khU$&VO6|=Na?-R%=BrkY$+GPPE1|2HZ%pbO z8o{)i+4dip)BXW7BDS0Jh(Wt+*&obvKMrT|yE(?6CEzjMhqCUXOMv;<)2Z8H$~bKK z<6~JtgPH!sT2_{0F7z`;&fv6Kn^4S!Woq#uXp1z1%uPsHLP zbZ@>Rb#H$3^ESHrjPO^wjiWHl}rC|+-(;pu0bRj@aJ7(@%($LPUo;OBkZB^%=6d5Zlo;7wqbfWEobude5 zaH-th6#j-c!V65%gP-7A@Vhgx+Sn0WlcC~CaXfPY*IwC zFjsJf2yarX29I@JuOZ|A9~-yG?RZg zI;d`jB?e@LTv<|4c2bkibUkpuxBNWzOs_Za;hFj|xM6?APh+5rzWSI?0+lnEMwzX*DY;kh}khSGc&}@%*-(}Gsh4!Gcz+YW6Uu#GqXL; zosq8h(LVd0kw%(smFibLy{fvqzN%W^yI!$(J)zoV31jHk6FHFXG}oc*VG2dT*s6G8He^~n58C@&d{f^OL`=)4tm z`jCJHo7FJ!AayKXi)q%V%*dcD(mZ@bJkP^`xL_;WP2d=8I;|~G&2`88WpdEl^)3J#|WW|6n%_t`j`WBzLaFGcD^UUrE@0Q89pIe?s)s=J`5;{ zb#Y4l6DqZ}^>ojwIq%5{s`NZSWM)gZDuFF`P2*$E_moQ@|Ppc1Of4(!oI7FAcwc-c?hLdxbmpjmp$So;-b| zAh1$JR8#Gw*QS);=cv&ei~%3EAL=R@su`?D=)%~c{&<3V?>eFMu&BvAMi?oMDwo#RzUVOK7=UvZ0S?C$+4+!QTVG*l&ZC;h*VbFIImh4A6i}y1*Z}C`-G#O6+iq3xW&7w$f?v#*VUs}0w2@M=_?|m%QGhS+S(oi zYkWlmH{g*{QNg^R(Su%jx4_lDU*fPKYj7!+N{yX4e}%pY#dEqAxzz4JA!cq%&uYZ7 zam|$JOhK}Negc?QWjPD5eIZoX>ixP-<)YR2a??u1;Ra2(l4-obZp|YIOh>h47Vi7N zX@q%wtNcJ3^RGoPV99Q1OKXK@R(Wi5)IeSWso%6Rza|PaT>UH#4f8hnAA=-yD;2xA z$(@@cOgoM1aqjyf1TZ)dZYiGT;F5jQw45I_Q{*<%riWfYViU}rp$FQJZ{gO=f?smX zxTOH!AtXv9xJlu5{5c<)ms`|(ULgyViO5%$yh=h)_H7&di!%_rC^ncRat_oqiM+9= znFFSgS}v@=Iea`fPA2Nl2_Hz)%Ui>+R9UNTb*OcmZMIxeHr!4~bd+B1hP%tPPF6Rm z#2>dXqszZejEp79@vl|BI_L6H^=M3sTO!fsJe z`1^{cwK6`EXCM8M!zS&^W@~ zG~6`QDk5U@#lCw(m4zQz;z;Iss!M9DW9StNmCc-bwBF0_6{P${YkVodrew9;TFdIomy zS921-oNYMwEC z1DR>?H_c$M9R28e_FIIb+Ha^>@Dl81V%8z~tp;REoTxkByosE8)Z6VSH)zIE{ho&TsJVT#I&;R-O$Ma6+I7|e;vkNd+uiibfmYpK zpE+zpD#L6Un<3b4W;L39qbX&Jg?Ed9Q{Zt<<6@SaOKAXJ3H9XnP2+>LOBO2e38GAL z)q!HeqN|jrI$T+K=diWwBM^jRHb1~AQY6qbjrT&2n}!%4XOjYyT|U_ckJiQ$hTruy zklTC7B25?y5SQ}?$FvDk!6p2p6|Ydc0+@G!cM@)A`}TniqwKBSFZ`t=TrB(CQT2do zb-BYaW>mZB8J?mM+B(`WcHTm_fPIbItDyF_rL&2nX1>8es=kN*O;sd{K`}e%qA7$T z?=ItO6FK)Ix{jx=B_Hp6`R5Bm*w<)a`2tIV+34(+Xfuw86-th zB?OALl;R zi~aoZ&L!cMf`&uejrL5ll#g;X+Fzf(;r_+2^<~j)U;Za@ovz0)TpwM!EcNSrck z|0ouHE>qY1N#nz=wM~U{=l94K(^bhQ6Q~^zVr&CA_^k5(;`#06rV;=_V_{Z{Ry~?$0w>%JY z{uEk0YUDSFOg5ajGo-ADEHHVV^u3pb_rM`3pQ1_apNfLs?0IY+_g|V!yxmr= zUG21Brf9C_<_UML@$#rtJ7;-j8${!##e&Uw*4m@`Y1QCu<|wmFN*Cz)*dtD-%Y;kf zg`6;AVQn25ACRW`O;&-nV{@45BFLkEgtY!F*tpYPvy>GQl{w?~dqL7etiL`G%q*f;Phn2)c7*fK->%gg<#fZA z&2!cnH#D5%XGVoiMA07YN)+2CYA5in);(cNrw$sodq(G;wd9aH%BFcXhh|C1TJYZs zl(}IDXge!Frps?N3PB7QA@@(vh z-Dei>b-m!5Ua*9D8E~6YC&a6#D*EwHRCZv;0X~YYc|6z+kfpeJ14!Ed@a77L6O^fn za1*j{u+fWf8_g|RmHqc&C>+tUTdq^NR+bhKHO*pdd~-Ac%0Lra6002BU2$yM8$gm$ zh&Eyu&KITKNrOL%tpVI!vwrR&%9>5rt*&`#Wl=ls`$n(=HBWWXqsU1YWHs zq1104N>|2prK|37X=4?qq#$BjulZA!<=afTiuc)*JN3d--d2l2SS&Ywx{DyzvD9wv z=KDhJp0Ay_(rp(hwdffj5(G~3<`y7WR$YZp&+5-VD!5mH;%>Xfee-lllGoW-|&&v1bVw%~#n)2yWjr=M0la6rH;lr#sM zs#o|p9rLys1KtsVwrMR0m5-uVfsXT&boWNGmv~rjK8`rqRJv}(k%%!Mwa%F_ZD)^e zOL1AT9UiTwmIUbZdm;)(jT-C$U^(v)PX3Glx z5J?vdue%KU{5= zS@%mDu(7e39$&{{u1e$>Ppu?)SC~{ACa>qi`yWGbZ9{P_Lvc+*b1T6(jmT{}ge9G@ z!5OqT2N%E;64HFbdZrmsMq?}*=24xQ7MNfuWpFP@6%2mk#$~S@*=+<99dW^XSjgT} zQ)lTkx|;)_D(v{u_5G{vEj2aTL7fBtjhh=5!&yAhqX$@F5C0G#`F#fWUSZ3xBxUp{ z=VoY(Y-rJr70{o*KnJTnR)_IDXqPgJU*efAw6M%akeq@uaPbm_uAZs^7UODdzj zV^U84(7HQ8C}>rXt;%Ygq1^C|thdt8j&&eh{Y~fmRTV;&#f5$~3ZUKcQBG(jK zbfS0DUyxvXb+`ABn4ao*%s0NZ)KGIa6t6+x z1Dg7!;6mb5NKt`U)SzLN{jPdMMG6{puBn(q zP#Z?wDDA_qa$Q=2(EAAJKifD{!$Pd2uTud?!8$oYGC@`byf*rqDDf1Ae?Eo-7q%@< z>!!;Odj$IKJ);2ULBzGRE&33Urr&A|zRNt28ITF6A=vN$g8_yfQG(aRJMy7E*j$U% zLP$$~8Al=oE0yc=G!UX-P6-}&>%3Kn#cp(aRet_~-4OBYJ%L$N5zhaWtBogXY5q;* z_8Kp|=Xz5ATHhO?pA~PA2foBh$eH-Kb^g|;CP52t60zF)b_i_oYhZV83k@?a+sd_p z`7gW(E0^!g;ScDQBiN0J_j~+TQJ6bFZ&I#i!VKOgpik(dO}JgZMO+7R_oe!IVW?3n z(Ee(xPhqJQC8}X3E%2E7<%0W6!0#C#-QqcQ*pd^~1E<21ov8M$*a3^WuEs6ZG;){F zNr(xwVQ*-G-gyc@iNGiyv6va1eMi#m)|>74?d%yg#eSCl5^AtuA4tFwy&t&x@F!e1 zhwU%((HzW#A39n3YA~8+X!}nZ%fLvx9>-e*m|sPh5;i7~c)wJ1MJI|mJi-HBxdZM^ z5Tb0vBWyU>H<`8-hODSpj zQ+u=#ez)rCJvIb_rPYqR&XB14Mfrr5On3#d?Av{zAVsqcqdUP~n9t<%{Q|!3Cf>1< zMGwZoL>{p4xkFNzBZ50qbLe&=`_YekaT%Bps)G8U9ieHY061-XT0;u29Th6@&Vys4 z=oVS-i*Ye9w&YzL%~(I4dVBr;_T}EV7d!T{1ezN?flobZ*R{~HIVV$Rn;^thfT*W= zBj4D=7b-Q(ejFB*=+dG~1=_U8cKj6$Lm2m^khxkbr=Sw6uWpRi2c+<=f>-id+zk5% zS(+`sa`kE3hAZa-6C6vsG9C`{XpzToco_EcbWl)5F&vPAk*H2_K7tiF9)^3%=!)T~ z&F{lS@NwmLzka{oL$Bbbx;u%U5Mr>VI44PY{1x4KGy)~Bk3>o>(d%D3Z|i@XQg8Lj z-HWFKty#^hIqMmVj5YSE8-O602@PJP8`eFDwXb9$&A_FI&r_UqU8x$ZnXLfa8Cg+B zJf_Q#M#N-JX46=i!F^PCbFd+;(gi>q(D5DNF#1 zVpF1B8viru?n}AE>QPS#^pKaX24xvcct_2W+WTwf6T|EAvN8mN_H`cn1B_GNT|v-l?aLLyYaf;Aib#S_;yB)i7{5_Z&~(S!@i%QlIJ?-j@iM~nK(H|? zu*VX*st#ko;+Z(ff%VWj=5+;;pF8!%$ySV1z%wp_@zO(tk?)KBGXm>b#1Leguqwu) z22{>j(Zc#ket(@AcZK0%3FkXVSx$*7|^mD(o z@e4orRX}+X#OveD0>r*U+RXRO*h3u2_|O6XS@qi_4y0_!;`R(ljAdh@@%dqeLYd9^bz0)sWyXcAs&KQ zW$7K%^5RlW1=x_DDf`fiBzN`+d?yH$URc_HRFj2j1P~$_qz`` zBK8=o7hYzAfh|~0wBuggeYS=~oJ@cAoe>I;by#!;@g}`J*Z8k%Z#Aks>@&Z)`g?cy z^P*!jy59gTt+TTe9*hWXSNlYAH{@%?kX?S4WrGJw;Rv;phJ^qjnyM8Ms=9IAka-1Z zC~GG4r0M<^`$9nIK*HyweOyQL8= zvLWE4#PVG`b%IqaI{I+2?hZM$X}W(iv<2Qf%rs()Hcm6^=|L9QHSGk z5pt|AJR$sUQH<@#T`AoN@+aa?8wc{+v65*-;2kitx~(w8WFunIP1kp2EmT5nAnml9Y_g_pVZ$QSV!GNzen5w{?*P4|g1tznpO z+4!Sp%hQuMwyIMO*A)6wkUerd0?oNnjq^TRjHtf9B)`LG7Tvf5CtHUH1Bd5DU9+b%z z6|oALrcdUg?Yf6f*2KSe2d=t0RtB$oqk89(9~*aFJg2L`?2K}c&CEo|JnQnL;q+wA z)#_n{>lFrDxKjpWlm*ACRD#uNZ?|p1n0PlTlzKl*7vJA?I;fAkA@NKumGgMqJmHRT zh)czKoxH;+OgQseYoF{psRXn@z7zh|+%L4o8!E)!(^Yrq;)fgX-~!)GlJw}_(Af~9 z#^{IK6ApPN&nhMsWn$S+fY+DaL_bXGCIP128jJfeK=hHG-Jdot5H&{t)ed;kbGjl> z2p+G$v2JsBG>5q-Xkf!k76)*Inr^Hr0Gu2Q_#J73&4E`p9efOq#G}t6>huIosvp1U zxLR1o&yynZlH9IKA#Yy6fK)n+<4jqExVp{4t;18UVeX9DWpY^+$!>J5`ZWD~yuO{d zvy)hdb65UH@MdXm$xd~gfOkE$Do za?V1fY6IuzK(lBY0EEsB>{Bbg)Y5QP>ad-zc5nz^gJA%QEg4}-uxRUtp?Qgx$wJ{k zG%3b)C`Ej2T~q;$QH)HHpA|Cup-kJ#E|oi}2|=~85^n|xv0i-ZCV1Mbe%xeOt*$@t z`^j1j(28PqGz$v0L8$!a6b)qRZydHAUbjL^71{Y-T>n5r9lYJwNEe_D8pnX4AOgOM ziw8Rzz6N)NajY80^||q(ObPpew8$z7lvs3I+k&$bz4e8{Nf)jiy&5n+k-L%&lyCHF zRufpf#q~=ZLbe`mOOKS|-T!%x@sIyL>E*Ag_c8C7hmA-y3A-CLJsTOW?ez%{f^xC}rj zu3Ien#bq7!y*^9XW*>j$#&*ktn^*&&MsdRC?L-asL%DB}jG6eT)=DCWB% z9Qs9U`{;E!bcxf@u@KXOEVD5!;bFR}|11ge5>-Fs$J_vp*{N%w5ydYO!r8nr@F36~ zccN2Yu4FQ~5f5$-mGFh7t;>>sJ=rOT6%?l>Pz*j)a5>O!g9RlR?VXq|kgM9aBE za#DS?w9wqcg_2;rm2hO~0Kt&(fL7{%6{??!bsK+iB5CwBZUgRn^=ZEU_PyOXKt9Yx>TC!QrOSz^l}bG)!N&| zNXJATn}asP?4?9PLxm-L<1MQbyr$)XU_dS1XU{dMP;h;dEK?@R$B7I7e52F)HiR1n8J!vTmBQmdEK%=g!mDMiH{x{}|| zl!Zn{-rA=5l#62RJezL(8{c)%@uLEFqq?S0y3J4cG?9aL5}s4=$qZF&LjLe zIeNRuHAkhKmU!Nhv)_9Tj4V-lztC9-#%O8)CV<+&WzdJw{(>N@undORSK$MWk^=(d2u_e5HgO;Di}$w}8zf zDRvX4;`e-baV>RE<*t+}!jh+Kh#u%5cOiEXJH|B;@h>H=7aP8?Sb@ZBdTl$PgPGhH zf?8Gq3-Q*5q6&|>0cqKBn>o;`hv}81)fzr#TpgqsMPd)UBPyp$a+`1?r`yk4p{mwD zWlZAqYgaAB@_)pOv3C^{mx*db+@>BH&Pwc|sXQK4Ns?Nb^ps`gKplIerZB{Il$0dw zdXqd5+y7c7;YGH~9Eg{9EN387D~rv6O>Mn!B#&ZT`QB9nJXk#Y?XKm5uTz1pWH>7h zSJo|wB8-6&1))}f7Ap)hRNBu!AC<9|}BovwrM%ST!Vt2IZRi@$Q zL!+Of+xmXh-r1)$5q5ye3ROVwr^8KdUS9zk#zstrA~0xx65Na!>NaQKMZQ?5$#6< zTq>Nh2-GnIFNm}(DK{`oL<@RAw{2+qtSd^3?zwZF@NTOZ1Yrs{N;GtSB_Wm$;%O6i zgvcSh=HWhuB1Z-D&`^OdHU{YORow@4cZ3BQhFps_)hO($PhaD1>B2f+=|?2dKqcJR zpY*e)C)ChJg(cW^gvyRyX67Jcc~|@&SvdsI1HZcI4Q+GKbtqJoFT9!s+0yLcFKRvV zEc4~tnUZhLau|j=?c-m8NiQ6NFf`p>sf|U1qBzvvM0V3Ko!MFi?bxBbB1Cv}>kHcg zS;A8^2oy0(UNv=O$(Zj`@}~v^MFDj~)lQ5nD9hld129t9150jzY5_9y6=6|T@uqA6 ziT&8rc#6-py06n1dDLuflR5lBx&uD-HOkZ6%S&9OF>744?@?u9&5Uf(Vh{Fkfl%Zq z9&t2^<^@Zco_8m*=w{l2D#ClQa`8v$vp%E{^PdwIg}q$+DI%%N7p zE5Nc85#AdK%H&=LO__bsW|5+=BVG{yIpZ`F#q%7WR?4#&`o!uRb<(-7;wzuMWjXVm zDH!|eS&e8N@?*PEvnNvy2Svn-?KV6pc7HXj<19UDuz}f&J;1j3Y*x~RNUs7ZI@;DC zHcW|P4dNqMVFEW)Z@Z3ZA>Sz zb4TfTA>!8B0gyR}H4x3}fIB(OhOslj^_=vmG4>aR*gM)Efq_l!ylA%f`T3ao&R#*6z2Ihwa238lRh7be)SM@j_mb6mVM?LT3$MWBW zx%F0mt#O6?Ab!~G%B9%;@yv-1U12X zEc_;V=594)o{l4AEEP9A0Q6L0Y+qn~TzjK6E{z#8lcLF0JPDHSB0paIBcD8R9Mq~x zy~K znO|hG=<5^&TA{_n@`jperII>(Vw!13HgX>_$R6`H#cff|x5FA?}1w2JnxQy;N;?T^L%K&n2vgzz3`!vxoqUx!8t0%f4sPXtmE*_qs)b88kH{3*g z&!pLjrn`2yQ6X?>%cG6@Zjqw8DS<5y&iJ)WM0Eb1k;7tUlVAAiV8%cbmsF zG~+tqQ(HBf*2aln=&@J*CiAJd3*r?+zdcq;ORFoJ0X7lDYCS>jLCCPw#uL5XnA@e9 z9CZZ>mNRc&KqvfpRJ~9!o6d9*_ zi5`xUd)Y_-<#vZ7AE);P*BX!uZ;3gTuDN97;nj>}q?Ab|M%KFayFA0lC@H;a5yTTG zwsE2dWomL_z1+5?2IsAqc`#T5p3s3SHq;Kv8JOF)^1#2nE zxc#%Qo4cG6Gi(<@%gaEjp5|kg;Elp+_N^Sg4VZ<}_AZV=!*CLaE^l1{1M!oa1!zHV zc_4JkI1}@lbd-0*(4~4rTPSC|D4HDdMPD>eNpZ_qStW~kq#oi!Z?9B`c$E<4Gl;q9 zm@nETo_xs%jU4D$YqY}sh@|g}vKM5S2U~@JLMsHPBiu1>J*-tH8uEAU{di}g)#xj2 zyJUwWVyrf!D56mt3V)iGnnS-=L_ANvU1@et<)Cd}rhCn$54Cp!M+=J~Y;P_fnJRe@ zG}9QWPfm@Nv$vQ)wj6x38zy(nZAO5RwEI>Xt~$K9vg&VX^K&+^Iv%u?1}wchEKsQi z>-=Djgl+&8U0BTZC#3~&5=MtA6Pf-ZwzvBjOn%Zho1><()n_5SGk$6jwaHmCOf~Ih03{r zz?s~38+}5-qLz$wvpl1zfW{-d)H}bhXS0@ zADc%obdF{l1B&^gNQ{6Q+I48p8{| zvhs^p9JW!Fh-ADJ&y}b~M)wLH++K5o_S7QfUP_2zfY%N>XukXL1+6f zS+?nJvU?;|6%`ci68TZX7b8FUS)@&~ks^z7?2T0DAB`%RZ53$O;cyUt2xq7&35X=%LIhrjxwktZupJCjwZxxvVb?Z<$(NhYDOUItxVn(7iZhY4GhxR!w z2k9>~70SP8{J#PJ$#MCd@B;G*oad`U1@O<&J0DX2MDBc+`iJ=WaH9Q%2txB0ssET0 z^Dpo}zq)^oT><|DKjrWIfd9KBmk-$gPH_3}U*;d!XQc?AVZI==e^vVTi7tPG{WE*< z^Ss8-*gW6n5A6S(x$=SilehBuxcOWhzd`@G%Kv=Mh5Urh^G!GVkos>= vt{=ER*ZQB8{=t1dw#a|Mk=y=N>Hkay{W$*s0DSp)i+%J<-2B)c0N{TCZkq$m literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..306cb87 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# eBay MPN Matcher + +Multi-step pipeline: eBay search → exact MPN match → AI match → price comparison. + +## Setup + +```bash +npm install +cp .env.example .env +# Fill in EBAY_CLIENT_ID, EBAY_CLIENT_SECRET, OPENAI_API_KEY +``` + +## Files required + +| File | Description | +|------|-------------| +| `keywords.txt` | One search keyword per line | +| `prices.xlsx` | Col A: partnumber, Col B: price (USD) | +| `system_prompt.txt` | AI system prompt for this product profile | + +## Run + +```bash +node index.js +``` + +Output saved to `./output/`: +- `results_.xlsx` — full results with PASS/FAIL +- `results_.json` — same data as JSON +- `run_.log` — full run log with timing +- `ai_cache.json` — cached AI matches (reused on next run) + +## Flow + +``` +keywords.txt + │ + ▼ Step 1: eBay search (all keywords, dedup by URL item ID) + │ + ▼ Step 2: Exact MPN match (regex + normalized) + │ ├─ matched → list A + │ └─ unmatched → Step 3 + │ + ▼ Step 3: AI match (gpt-4o-mini, batch 40 items) + │ ├─ GOOD_MATCH / VARIANT_MISMATCH → list B + │ ├─ INSUFFICIENT_DATA → fetch detail → retry AI + │ └─ UNRELATED_PRODUCT → skip + │ + ▼ Step 4: Merge A+B → compare price → PASS/FAIL → export +``` + +## Match methods in output + +| Method | Description | +|--------|-------------| +| `exact` | Regex found MPN in title/specs | +| `ai_exact` | AI matched with GOOD_MATCH | +| `ai_variant` | AI matched with VARIANT_MISMATCH | +| `ai_detail` | AI matched after fetching detail page | +| `ai_cached` | From previous run cache | + +## Config (.env) + +| Key | Default | Description | +|-----|---------|-------------| +| `AI_BATCH_SIZE` | 40 | Listings per AI request | +| `AI_CONFIDENCE_THRESHOLD` | 50 | Min confidence to count as PASS | +| `OPENAI_MODEL` | gpt-4o-mini | OpenAI model | +| `EBAY_MARKETPLACE` | EBAY_US | eBay marketplace ID | + +## Adding a new product profile + +1. Create new `keywords_.txt` +2. Create new `system_prompt_.txt` explaining the product domain +3. Update `.env` to point to new files +4. Run — AI cache is per-itemId so it auto-separates diff --git a/ai.js b/ai.js new file mode 100644 index 0000000..cb4f6df --- /dev/null +++ b/ai.js @@ -0,0 +1,88 @@ +require('dotenv').config(); +const { OpenAI } = require('openai'); +const db = require('./db'); + +const openai = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, +}); + +async function getAiSuggestion(item) { + try { + const prompt = ` +Bạn là một chuyên gia thẩm định hàng hoá điện tử trên eBay. +Hãy kiểm tra các thông tin dưới đây để trả lời 3 câu hỏi: +1. Item có bị ảo / lừa đảo (fake) không? +2. Seller có uy tín không? (so sánh feedback score, percent) +3. Dữ liệu hiện tại đã đúng sản phẩm chưa? (Part Number, Specs) + +THÔNG TIN TÌM KIẾM: +- Part Number: ${item.partNumber} +- Specs mục tiêu: ${item.specs} + +THÔNG TIN EBAY (Tìm được): +- Tiêu đề: ${item.title} +- Seller: ${item.seller_username} (Score: ${item.seller_feedback_score}, Positive: ${item.seller_feedback_percent}%) +- Price: ${item.price} +- Phân tích JSON chi tiết từ API: +${item.detail_response ? JSON.stringify(item.detail_response).substring(0, 1500) : 'Không có dữ liệu chi tiết'} + +YÊU CẦU ĐẦU RA (Quan trọng!): +Chỉ đưa ra kết luận DUY NHẤT 1 câu ngắn gọn. (Ví dụ: "Hãy mua ngay, seller uy tín và đúng chuẩn sản phẩm." HOẶC "Cẩn thận, seller ít feedback và tiêu đề không rõ ràng.") +Khong giải thích dài dòng! +`; + + const response = await openai.chat.completions.create({ + model: "gpt-4o-mini", + messages: [ + { role: "system", content: "Bạn là trợ lý AI chuyên thẩm định eBay. Chỉ trả về 1 câu ngắn gọn." }, + { role: "user", content: prompt } + ], + max_tokens: 100, + temperature: 0.3 + }); + + return { + suggestion: response.choices[0].message.content.trim(), + usage: response.usage.total_tokens + }; + } catch (error) { + console.error(`AI Error for item ${item.id}:`, error.message); + return { suggestion: "Lỗi khi gọi AI.", usage: 0 }; + } +} + +async function runAiSuggestions() { + console.log("Bat dau chay AI Suggestions..."); + const items = db.getMissingAiSuggestionItems(); + console.log(`Tim thay ${items.length} item can check AI.`); + + let totalTokens = 0; + const batchSize = 10; + for (let i = 0; i < items.length; i += batchSize) { + const batch = items.slice(i, i + batchSize); + const results = await Promise.all(batch.map(async item => { + console.log(`Dang check AI cho item: ${item.id}`); + const { suggestion, usage } = await getAiSuggestion(item); + db.updateAiSuggestion(item.id, suggestion); + console.log(`Ket qua AI cho ${item.id}: ${suggestion} (Tokens: ${usage})`); + return usage; + })); + totalTokens += results.reduce((a, b) => a + b, 0); + // Minimal delay between batches to respect rate limits + if (i + batchSize < items.length) { + await new Promise(r => setTimeout(r, 500)); + } + } + console.log(`Hoan thanh AI Suggestions. Total tokens: ${totalTokens}`); + return totalTokens; +} + +module.exports = { + runAiSuggestions, + getAiSuggestion +}; + +// Allow standalone run +if (require.main === module) { + runAiSuggestions().catch(console.error); +} diff --git a/data/ebay_items.db b/data/ebay_items.db new file mode 100644 index 0000000000000000000000000000000000000000..e8ff1d8d13505b25f050b1bfb4148bae87a77ec5 GIT binary patch literal 1236992 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%0A!_Z;g!eQ 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

HVjq%chQ^%(hr&0C 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 NuNHH7K9h$^zXGAZLD2vJ literal 0 HcmV?d00001 diff --git a/db.js b/db.js new file mode 100644 index 0000000..9d84466 --- /dev/null +++ b/db.js @@ -0,0 +1,214 @@ +const Database = require('better-sqlite3'); +const path = require('path'); +const fs = require('fs'); + +// Ensure data directory exists +const dbDir = path.join(__dirname, 'data'); +if (!fs.existsSync(dbDir)) { + fs.mkdirSync(dbDir, { recursive: true }); +} + +const db = new Database(path.join(dbDir, 'ebay_items.db')); + +// Create tables +function initDb() { + db.exec(` + CREATE TABLE IF NOT EXISTS profiles ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + price_ratio REAL DEFAULT 0.85, + last_scan_time DATETIME, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + ); + + CREATE TABLE IF NOT EXISTS search_keywords ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + profile_id INTEGER NOT NULL, + part_number TEXT, + keywords TEXT NOT NULL, -- JSON array + target_price REAL NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (profile_id) REFERENCES profiles(id) ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS items ( + id TEXT PRIMARY KEY, + profile_id INTEGER, + keyword_id INTEGER, + searchType TEXT, + partNumber TEXT, + manufacturer TEXT, + specs TEXT, + title TEXT, + url TEXT, + price REAL, + shipping REAL, + shippingLabel TEXT, + total REAL, + qty INTEGER, + avgPrice REAL, + available INTEGER, + targetPrice REAL, + threshold REAL, + passFail TEXT, + profit REAL, + images TEXT, -- JSON + detail_response TEXT, -- JSON + seller_username TEXT, + seller_feedback_score INTEGER, + seller_feedback_percent REAL, + review_status TEXT DEFAULT 'waiting', -- 'waiting', 'done', 'skip' + ai_suggestion TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (profile_id) REFERENCES profiles(id) ON DELETE CASCADE + ); + `); + + // Migration: Add columns if they don't exist + try { db.exec("ALTER TABLE profiles ADD COLUMN last_scan_time DATETIME;"); } catch(e){} + try { db.exec("ALTER TABLE items ADD COLUMN profile_id INTEGER;"); } catch(e){} + try { db.exec("ALTER TABLE items ADD COLUMN keyword_id INTEGER;"); } catch(e){} +} + +initDb(); + +const stmts = { + // Profiles + getProfiles: db.prepare('SELECT * FROM profiles ORDER BY name'), + getProfile: db.prepare('SELECT * FROM profiles WHERE id = ?'), + insertProfile: db.prepare('INSERT INTO profiles (name, price_ratio) VALUES (?, ?)'), + deleteProfile: db.prepare('DELETE FROM profiles WHERE id = ?'), + updateProfile: db.prepare('UPDATE profiles SET name = ?, price_ratio = ? WHERE id = ?'), + updateProfileScanTime: db.prepare('UPDATE profiles SET last_scan_time = CURRENT_TIMESTAMP WHERE id = ?'), + + // Search Keywords + getKeywordsByProfile: db.prepare('SELECT * FROM search_keywords WHERE profile_id = ?'), + insertKeyword: db.prepare('INSERT INTO search_keywords (profile_id, part_number, keywords, target_price) VALUES (?, ?, ?, ?)'), + deleteKeyword: db.prepare('DELETE FROM search_keywords WHERE id = ?'), + updateKeyword: db.prepare('UPDATE search_keywords SET part_number = ?, keywords = ?, target_price = ? WHERE id = ?'), + + // Items + insertOrUpdateItem: db.prepare(` + INSERT INTO items ( + id, profile_id, keyword_id, searchType, partNumber, manufacturer, specs, title, url, + price, shipping, shippingLabel, total, qty, avgPrice, available, + targetPrice, threshold, passFail, profit, images, detail_response, + seller_username, seller_feedback_score, seller_feedback_percent, + review_status + ) VALUES ( + @id, @profile_id, @keyword_id, @searchType, @partNumber, @manufacturer, @specs, @title, @url, + @price, @shipping, @shippingLabel, @total, @qty, @avgPrice, @available, + @targetPrice, @threshold, @passFail, @profit, @images, @detail_response, + @seller_username, @seller_feedback_score, @seller_feedback_percent, + COALESCE((SELECT review_status FROM items WHERE id = @id), 'waiting') + ) + ON CONFLICT(id) DO UPDATE SET + profile_id=excluded.profile_id, + keyword_id=excluded.keyword_id, + searchType=excluded.searchType, + partNumber=excluded.partNumber, + manufacturer=excluded.manufacturer, + specs=excluded.specs, + title=excluded.title, + url=excluded.url, + price=excluded.price, + shipping=excluded.shipping, + shippingLabel=excluded.shippingLabel, + total=excluded.total, + qty=excluded.qty, + avgPrice=excluded.avgPrice, + available=excluded.available, + targetPrice=excluded.targetPrice, + threshold=excluded.threshold, + passFail=excluded.passFail, + profit=excluded.profit, + images=excluded.images, + detail_response=excluded.detail_response, + seller_username=excluded.seller_username, + seller_feedback_score=excluded.seller_feedback_score, + seller_feedback_percent=excluded.seller_feedback_percent, + updated_at=CURRENT_TIMESTAMP + `), + + getItem: db.prepare('SELECT * FROM items WHERE id = ?'), + + getWaitingPassItemsByProfile: db.prepare(` + SELECT * FROM items + WHERE passFail = 'PASS' AND review_status = 'waiting' AND profile_id = ? + ORDER BY profit DESC + `), + + getWaitingPassItemsAll: db.prepare(` + SELECT * FROM items + WHERE passFail = 'PASS' AND review_status = 'waiting' + ORDER BY profit DESC + `), + + updateReviewStatus: db.prepare('UPDATE items SET review_status = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?'), + updateAiSuggestion: db.prepare('UPDATE items SET ai_suggestion = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?'), + + getAllMissingAiSuggestion: db.prepare(` + SELECT * FROM items + WHERE passFail = 'PASS' AND review_status = 'waiting' AND ai_suggestion IS NULL AND detail_response IS NOT NULL + `) +}; + +module.exports = { + db, + + // Profiles + getProfiles() { return stmts.getProfiles.all(); }, + getProfile(id) { return stmts.getProfile.get(id); }, + addProfile(name, ratio) { return stmts.insertProfile.run(name, ratio); }, + deleteProfile(id) { return stmts.deleteProfile.run(id); }, + updateProfile(id, name, ratio) { return stmts.updateProfile.run(name, ratio, id); }, + updateProfileScanTime(id) { return stmts.updateProfileScanTime.run(id); }, + + // Keywords + getKeywords(profileId) { + return stmts.getKeywordsByProfile.all(profileId).map(kw => ({ + ...kw, + keywords: JSON.parse(kw.keywords) + })); + }, + addKeyword(profileId, partNumber, keywords, targetPrice) { + return stmts.insertKeyword.run(profileId, partNumber, JSON.stringify(keywords), targetPrice); + }, + deleteKeyword(id) { return stmts.deleteKeyword.run(id); }, + updateKeyword(id, partNumber, keywords, targetPrice) { + return stmts.updateKeyword.run(partNumber, JSON.stringify(keywords), targetPrice, id); + }, + + // Items + saveItem(itemData) { + return stmts.insertOrUpdateItem.run(itemData); + }, + getItem(id) { + return stmts.getItem.get(id); + }, + getWaitingPassItems(profileId) { + const items = profileId + ? stmts.getWaitingPassItemsByProfile.all(profileId) + : stmts.getWaitingPassItemsAll.all(); + + return items.map(item => ({ + ...item, + images: item.images ? JSON.parse(item.images) : [], + detail_response: item.detail_response ? JSON.parse(item.detail_response) : null + })); + }, + updateReviewStatus(id, status) { + return stmts.updateReviewStatus.run(status, id); + }, + updateAiSuggestion(id, suggestion) { + return stmts.updateAiSuggestion.run(suggestion, id); + }, + getMissingAiSuggestionItems() { + return stmts.getAllMissingAiSuggestion.all().map(item => ({ + ...item, + images: item.images ? JSON.parse(item.images) : [], + detail_response: item.detail_response ? JSON.parse(item.detail_response) : null + })); + } +}; diff --git a/index.js b/index.js new file mode 100644 index 0000000..ba1c665 --- /dev/null +++ b/index.js @@ -0,0 +1,556 @@ +require('dotenv').config(); +const axios = require('axios'); +const XLSX = require('xlsx'); +const fs = require('fs'); +const path = require('path'); + +// ─── CONFIG ────────────────────────────────────────────────────────────────── +const CFG = { + ebayClientId: process.env.EBAY_CLIENT_ID, + ebayClientSecret: process.env.EBAY_CLIENT_SECRET, + isSandbox: (process.env.EBAY_ENVIRONMENT || 'production') === 'sandbox', + marketplace: process.env.EBAY_MARKETPLACE || 'EBAY_US', + shipZip: process.env.SHIP_TO_ZIP || '10001', + shipCountry: process.env.SHIP_TO_COUNTRY || 'US', + itemsPerPage: parseInt(process.env.ITEMS_PER_PAGE || '50'), + priceSheet: process.env.PRICE_SHEET || './prices.xlsx', + outputDir: process.env.OUTPUT_DIR || './output', + priceRatio: parseFloat(process.env.PRICE_RATIO || '0.85'), + rowBatchSize: parseInt(process.env.ROW_BATCH_SIZE || '5'), + pageSize: parseInt(process.env.PAGE_SIZE || '200'), + maxItemsPerQuery: parseInt(process.env.MAX_ITEMS_PER_QUERY || '500'), +}; + +const EBAY_SITES = [ + { id: 'US', market: 'EBAY_US', zip: '10001', country: 'US', domain: 'ebay.com' }, + { id: 'UK', market: 'EBAY_GB', zip: 'W1A 1AA', country: 'GB', domain: 'ebay.co.uk' }, + { id: 'AU', market: 'EBAY_AU', zip: '2000', country: 'AU', domain: 'ebay.com.au' }, + { id: 'CA', market: 'EBAY_CA', zip: 'M5H 2N2', country: 'CA', domain: 'ebay.ca' }, + { id: 'DE', market: 'EBAY_DE', zip: '10115', country: 'DE', domain: 'ebay.de' }, +]; + +const BASE_URL = CFG.isSandbox ? 'api.sandbox.ebay.com' : 'api.ebay.com'; + +// ─── LOGGER ────────────────────────────────────────────────────────────────── +const startTime = Date.now(); +const logLines = []; + +function log(msg, level = 'INFO') { + const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); + const line = `[${elapsed}s] [${level}] ${msg}`; + console.log(line); + logLines.push(line); +} + +function logSection(title) { + const bar = '─'.repeat(60); + log(''); + log(bar); + log(` ${title}`); + log(bar); +} + +// ─── UTIL ───────────────────────────────────────────────────────────────────── +function sleep(ms) { return new Promise(r => setTimeout(r, ms)); } + +function ensureDir(dir) { + if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); +} + +// ─── DEFECTIVE LISTING FILTER ───────────────────────────────────────────────── +// Patterns that indicate a listing is broken / for-parts / non-functional +const DEFECTIVE_PATTERNS = [ + /\bnon[\s-]?working\b/i, + /\bnot[\s-]?working\b/i, + /\bno[\s-]?working\b/i, + /\bfor[\s-]?parts?\b/i, + /\bparts?[\s-]?only\b/i, + /\bparts?[\s-]?or[\s-]?repair\b/i, + /\bbroken\b/i, + /\bdefective\b/i, + /\bfaulty\b/i, + /\bdead[\s-]?on[\s-]?arrival\b/i, + /\bdoa\b/i, + /\bas[\s-]?is\b/i, + /\bdamaged\b/i, + /\bmalfunctioning\b/i, + /\bno[\s-]?post\b/i, +]; + +function isDefectiveListing(item) { + const title = (item.title || '').toLowerCase(); + return DEFECTIVE_PATTERNS.some(re => re.test(title)); +} + +// ─── LOAD PRICE SHEET ──────────────────────────────────────────────────────── +/** + * Reads prices.xlsx and returns an array of row objects. + * Expected columns (row 0 = header): + * Specs | Manufacturer | Part Number | Capacity (GB) | Rank | + * Speed (MT/s) | Speed Grade | Type | Price + */ +function loadPriceSheet() { + const wb = XLSX.readFile(CFG.priceSheet); + const ws = wb.Sheets[wb.SheetNames[0]]; + const rows = XLSX.utils.sheet_to_json(ws, { header: 1 }); + + const headers = rows[0].map(h => String(h).trim()); + const data = []; + + for (let i = 1; i < rows.length; i++) { + const row = rows[i]; + if (!row || !row.length) continue; + + const obj = {}; + headers.forEach((h, idx) => { obj[h] = row[idx] !== undefined ? row[idx] : ''; }); + + const partNumber = String(obj['Part Number'] || '').trim(); + const price = parseFloat(obj['Price']); + + if (!partNumber || isNaN(price)) continue; + + data.push({ + specs: String(obj['Specs'] || '').trim(), + manufacturer: String(obj['Manufacturer'] || '').trim(), + partNumber, + capacity: obj['Capacity (GB)'], + rank: String(obj['Rank'] || '').trim(), + speedMTs: obj['Speed (MT/s)'], + speedGrade: String(obj['Speed Grade'] || '').trim(), + type: String(obj['Type'] || '').trim(), + price, + }); + } + + log(`Loaded ${data.length} rows from ${CFG.priceSheet}`); + return data; +} + +// ─── BUILD SEARCH QUERIES ──────────────────────────────────────────────────── +/** + * Returns 3 search query strings for a price sheet row: + * 1. Part Number only + * 2. Full spec with Speed (MT/s): e.g. "Samsung 64GB 2Rx4 4800 RDIMM" + * 3. Full spec with Speed Grade: e.g. "Samsung 64GB 2Rx4 PC5-38400 RDIMM" + */ +function buildQueries(row) { + const { manufacturer, partNumber, capacity, rank, speedMTs, speedGrade, type } = row; + + const capStr = capacity ? `${capacity}GB` : ''; + const speedStr = speedMTs ? String(speedMTs) : ''; + + const q1 = partNumber; + + // e.g. "Samsung 64GB 2Rx4 4800 RDIMM" + const q2Parts = [manufacturer, capStr, rank, speedStr, type].filter(Boolean); + const q2 = q2Parts.join(' '); + + // e.g. "Samsung 64GB 2Rx4 PC5-38400 RDIMM" + const q3Parts = [manufacturer, capStr, rank, speedGrade?.split("-")[1], type].filter(Boolean); + const q3 = q3Parts.join(' '); + + return [ + { label: 'PartNumber', query: q1 }, + { label: 'SpeedMTs', query: q2 }, + { label: 'SpeedGrade', query: q3 }, + ].filter(q => q.query.trim().length > 0); +} + +// ─── EBAY AUTH ─────────────────────────────────────────────────────────────── +async function getEbayToken() { + const creds = Buffer.from(`${CFG.ebayClientId}:${CFG.ebayClientSecret}`).toString('base64'); + const res = await axios.post( + `https://${BASE_URL}/identity/v1/oauth2/token`, + 'grant_type=client_credentials&scope=https://api.ebay.com/oauth/api_scope', + { headers: { Authorization: `Basic ${creds}`, 'Content-Type': 'application/x-www-form-urlencoded' } } + ); + return res.data.access_token; +} + +// ─── EBAY SEARCH (paginated) ───────────────────────────────────────────────── +// eBay US category ID for Computer Memory — scoping here forces eBay's engine +// to return only memory listings that actually match the searched keywords. +// const MEMORY_CATEGORY_ID = '170083'; + +/** + * Paginated eBay search. + * Scoped by the specific site marketplace and location context. + */ +async function searchEbay(token, keyword, site) { + const headers = { + Authorization: `Bearer ${token}`, + 'X-EBAY-C-MARKETPLACE-ID': site.market, + 'X-EBAY-C-ENDUSERCTX': `zip=${site.zip},country=${site.country}`, + }; + + const pageSize = Math.min(CFG.pageSize, 200); + const cap = CFG.maxItemsPerQuery; + // Convert "Micron 64GB 4DRx4 2933 LRDIMM" → '"Micron" "64GB" "4DRx4" "2933" "LRDIMM"' + // This explicitly forces eBay Browse API to treat each word as an exact match term. + const exactQuery = keyword.trim().split(/\s+/).map(w => `"${w}"`).join(' '); + + const baseUrl = `https://${BASE_URL}/buy/browse/v1/item_summary/search` + + `?q=${encodeURIComponent(exactQuery)}` + // + `&category_ids=${MEMORY_CATEGORY_ID}` + + `&fieldgroups=EXTENDED` + + `&filter=conditionIds:{1000|1500|2000|2500|3000|4000|5000|6000|7000}`; + + const all = []; + let offset = 0; + let total = null; + + do { + const url = `${baseUrl}&limit=${pageSize}&offset=${offset}`; + log(` [API] GET ${url}`, 'DEBUG'); + try { + const res = await axios.get(url, { headers }); + const data = res.data; + if (total === null) total = data.total || 0; + const page = data.itemSummaries || []; + all.push(...page); + offset += pageSize; + if (!page.length || all.length >= cap || offset >= total) break; + await sleep(150); // polite inter-page delay + } catch (err) { + const msg = err.response?.data?.errors?.[0]?.message || err.message; + log(` eBay search error for "${keyword}" offset=${offset}: ${msg}`, 'WARN'); + break; + } + } while (true); + + return all.slice(0, cap); +} + +// ─── PRICE EXTRACTION ──────────────────────────────────────────────────────── +function extractPrice(item) { + const p = item.price || item.currentBidPrice || {}; + return parseFloat(p.value || 0); +} + +function extractShipping(item) { + const opts = item.shippingOptions || []; + if (!opts.length) return { cost: 0, label: 'N/A' }; + const first = opts[0]; + if (first.shippingCostType === 'FREE') return { cost: 0, label: 'Free' }; + return { cost: parseFloat(first.shippingCost?.value || 0), label: first.shippingCostType || '' }; +} + +/** + * Detect quantity in listing (lot size / pack quantity). + * Checks availableQuantity first, then title patterns. + */ +function extractQty(item) { + const title = item.title || ''; + const patterns = [ + /\bLOT\s+OF\s+(\d+)\b/i, + /\b(\d+)\s*(?:PACK|PCS?|PIECES?|UNITS?)\b/i, + /\bQTY\s*[:\-]?\s*(\d+)\b/i, + /\b(\d+)\s*-\s*PACK\b/i, + /^(\d+)x\s/i, + /\bX(\d+)\b/i, + ]; + for (const p of patterns) { + const m = title.match(p); + if (m && parseInt(m[1]) > 1) return parseInt(m[1]); + } + return 1; +} + +// ─── COMPARE ───────────────────────────────────────────────────────────────── +/** + * For a given eBay item and row, compute avg price per unit and compare with target. + */ +function compareItem(item, row, searchLabel, site) { + const rawPrice = extractPrice(item); + const { cost: shipCost, label: shipLabel } = extractShipping(item); + const qty = extractQty(item); + const total = parseFloat((rawPrice + shipCost).toFixed(2)); + const avg = qty > 1 ? parseFloat((total / qty).toFixed(2)) : total; + const threshold = parseFloat((row.price * CFG.priceRatio).toFixed(2)); + const pass = avg <= threshold; + const available = item.availableQuantity ?? 1; + + const itemId = (item.itemWebUrl || '').match(/\/itm\/(\d+)/)?.[1] || item.itemId; + + const location = item.itemLocation?.country || 'Unknown'; + // Force the domain to the prioritized site domain so the link matches the search marketplace + const finalUrl = `https://www.${site.domain}/itm/${itemId}`; + + return { + 'Search Type': searchLabel, + 'Part Number': row.partNumber, + 'Manufacturer': row.manufacturer, + 'Specs': row.specs, + 'eBay Title': item.title, + 'Item ID': itemId, + 'Item Location': location, + 'eBay URL': finalUrl, + 'eBay Price (USD)': rawPrice, + 'Shipping (USD)': shipCost, + 'Shipping Label': shipLabel, + 'Total (USD)': total, + 'Qty in Listing': qty, + 'Avg Price/Unit': avg, + 'Available Qty': available, + 'Target Price': row.price, + [`Target × ${CFG.priceRatio}`]: threshold, + 'Pass/Fail': pass ? 'PASS' : 'FAIL', + 'Profit (est.)': pass ? parseFloat(((row.price - avg) * available).toFixed(2)) : null, + }; +} + +// ─── MAIN SEARCH LOOP ──────────────────────────────────────────────────────── +/** + * Process a single price-sheet row: run 3 eBay queries across 5 sites natively, + * filter defective and CN listings, dedupe globally by priority, and build results map. + */ +async function processRow(token, row, rowIndex, totalRows, globalResultsMap) { + const queries = buildQueries(row); + + log(`[${rowIndex + 1}/${totalRows}] ${row.partNumber} — ${row.manufacturer} ${row.specs}`); + + for (const site of EBAY_SITES) { + for (const { label, query } of queries) { + log(` [${rowIndex + 1}] [${site.id}] [${label}] Searching: "${query}"`); + const items = await searchEbay(token, query, site); + + let skipped = 0, cnSkipped = 0; + for (const item of items) { + const itemId = (item.itemWebUrl || '').match(/\/itm\/(\d+)/)?.[1] || item.itemId; + if (!itemId) continue; + + // Skip broken / non-working / for-parts listings + if (isDefectiveListing(item)) { skipped++; continue; } + + // Skip China listings + const locationCountry = item.itemLocation?.country; + if (locationCountry === 'CN') { cnSkipped++; continue; } + + // Determine priority: 2 if item natively located in the searched site, 1 otherwise + const priority = (locationCountry === site.country) ? 2 : 1; + + // Dedupe globally with priority overwrite + const existing = globalResultsMap.get(itemId); + if (!existing || existing._priority < priority) { + const processedRow = compareItem(item, row, label, site); + processedRow._priority = priority; // tag internal state + globalResultsMap.set(itemId, processedRow); + } + } + + const notes = []; + if (skipped) notes.push(`${skipped} defective`); + if (cnSkipped) notes.push(`${cnSkipped} CN-located`); + log(` [${rowIndex + 1}] [${site.id}] [${label}] → ${items.length} raw results${notes.length ? `, skipped: ${notes.join(', ')}` : ''}`); + await sleep(CFG.requestDelay); + } + } +} + +/** + * Run all rows in concurrent batches of CFG.rowBatchSize. + */ +async function runSearch(token, rows) { + logSection(`SEARCHING EBAY — ${rows.length} rows, batch size ${CFG.rowBatchSize} across ${EBAY_SITES.length} sites`); + const batchSize = CFG.rowBatchSize; + const totalBatch = Math.ceil(rows.length / batchSize); + + // We use a Map to keep track of the absolute best-priority matching row for each itemId globally + const globalResultsMap = new Map(); + + for (let b = 0; b < rows.length; b += batchSize) { + const batch = rows.slice(b, b + batchSize); + const batchNum = Math.floor(b / batchSize) + 1; + log(`\n── Batch ${batchNum}/${totalBatch} (rows ${b + 1}–${Math.min(b + batchSize, rows.length)}) ──`); + + await Promise.all( + batch.map((row, idx) => processRow(token, row, b + idx, rows.length, globalResultsMap)) + ); + } + + // Convert Map values to flat array and remove internal _priority field + return Array.from(globalResultsMap.values()).map(r => { + delete r._priority; + return r; + }); +} + +// ─── ITEM DETAIL API ───────────────────────────────────────────────────── +/** + * Fetch real available quantity from the item detail endpoint. + * Returns null on error. + */ +async function fetchAvailableQty(token, itemId) { + const headers = { + Authorization: `Bearer ${token}`, + 'X-EBAY-C-MARKETPLACE-ID': CFG.marketplace, + 'X-EBAY-C-ENDUSERCTX': `zip=${CFG.shipZip},country=${CFG.shipCountry}`, + }; + try { + const res = await axios.get( + `https://${BASE_URL}/buy/browse/v1/item/v1|${itemId}|0`, + { headers } + ); + const data = res.data; + // Prefer estimatedAvailabilities, fall back to quantity fields + const est = data.estimatedAvailabilities?.[0]; + if (est?.estimatedAvailableQuantity != null) return est.estimatedAvailableQuantity; + if (data.quantity != null) return data.quantity; + return null; + } catch { + return null; + } +} + +/** + * For every PASS row, concurrently fetch the real Available Qty from eBay + * item detail API and update the row in-place. + * Runs in batches of 5 to avoid hammering the API. + */ +async function enrichPassItems(token, results) { + const passRows = results.filter(r => r['Pass/Fail'] === 'PASS'); + if (!passRows.length) { log('No PASS items to enrich.'); return; } + + logSection(`ENRICHING ${passRows.length} PASS ITEMS — fetching Available Qty`); + + const batchSize = 5; + for (let b = 0; b < passRows.length; b += batchSize) { + const batch = passRows.slice(b, b + batchSize); + await Promise.all(batch.map(async row => { + const itemId = String(row['Item ID']); + const qty = await fetchAvailableQty(token, itemId); + if (qty !== null) { + row['Available Qty'] = qty; + // Recompute profit with real qty + const avg = row['Avg Price/Unit']; + const target = row['Target Price']; + row['Profit (est.)'] = parseFloat(((target - avg) * qty).toFixed(2)); + } + log(` Item ${itemId} → Available Qty: ${qty ?? '(failed)'}`); + })); + if (b + batchSize < passRows.length) await sleep(200); + } +} + +// ─── OUTPUT ─────────────────────────────────────────────────────────────────── +function applyHyperlinks(ws, headerName, totalRows) { + const range = XLSX.utils.decode_range(ws['!ref'] || 'A1'); + let urlCol = -1; + for (let c = range.s.c; c <= range.e.c; c++) { + if (ws[XLSX.utils.encode_cell({ r: 0, c })]?.v === headerName) { urlCol = c; break; } + } + if (urlCol < 0) return; + for (let r = 1; r <= totalRows; r++) { + const addr = XLSX.utils.encode_cell({ r, c: urlCol }); + const cell = ws[addr]; + if (!cell?.v || !String(cell.v).startsWith('http')) continue; + const url = String(cell.v); + delete cell.f; delete cell.z; + cell.t = 's'; cell.v = 'View on eBay'; + cell.l = { Target: url, Tooltip: url }; + } +} + +function saveOutputs(rows, runId) { + ensureDir(CFG.outputDir); + + // Sort: PASS first → profit desc → avg price asc + rows.sort((a, b) => { + if (a['Pass/Fail'] !== b['Pass/Fail']) return a['Pass/Fail'] === 'PASS' ? -1 : 1; + const profitA = a['Profit (est.)'] ?? -Infinity; + const profitB = b['Profit (est.)'] ?? -Infinity; + if (profitA !== profitB) return profitB - profitA; + return (a['Avg Price/Unit'] || 0) - (b['Avg Price/Unit'] || 0); + }); + + const passCount = rows.filter(r => r['Pass/Fail'] === 'PASS').length; + log(`Total rows : ${rows.length}`); + log(`PASS : ${passCount}`); + log(`FAIL : ${rows.length - passCount}`); + + // Excel + const xlsxPath = path.join(CFG.outputDir, `results_${runId}.xlsx`); + const wb = XLSX.utils.book_new(); + const ws = XLSX.utils.json_to_sheet(rows); + applyHyperlinks(ws, 'eBay URL', rows.length); + ws['!cols'] = [ + { wch: 12 }, // Search Type + { wch: 22 }, // Part Number + { wch: 14 }, // Manufacturer + { wch: 24 }, // Specs + { wch: 50 }, // eBay Title + { wch: 14 }, // Item ID + { wch: 14 }, // Item Location + { wch: 16 }, // eBay URL + { wch: 15 }, // eBay Price + { wch: 13 }, // Shipping + { wch: 13 }, // Shipping Label + { wch: 13 }, // Total + { wch: 12 }, // Qty + { wch: 14 }, // Avg Price/Unit + { wch: 12 }, // Available + { wch: 13 }, // Target Price + { wch: 14 }, // Target × ratio + { wch: 10 }, // Pass/Fail + { wch: 13 }, // Profit + ]; + XLSX.utils.book_append_sheet(wb, ws, 'Results'); + XLSX.writeFile(wb, xlsxPath); + log(`Excel saved : ${xlsxPath}`); + + // JSON + const jsonPath = path.join(CFG.outputDir, `results_${runId}.json`); + fs.writeFileSync(jsonPath, JSON.stringify(rows, null, 2)); + log(`JSON saved : ${jsonPath}`); + + // Log file + const logPath = path.join(CFG.outputDir, `run_${runId}.log`); + fs.writeFileSync(logPath, logLines.join('\n')); + log(`Log saved : ${logPath}`); + + return { xlsxPath, jsonPath, logPath }; +} + +// ─── MAIN ──────────────────────────────────────────────────────────────────── +async function main() { + const runId = Date.now(); + logSection(`eBay Price Scanner — Run ${runId}`); + + // Validate required env + const missing = ['EBAY_CLIENT_ID', 'EBAY_CLIENT_SECRET'].filter(k => !process.env[k]); + if (missing.length) { + log(`Missing env vars: ${missing.join(', ')}`, 'ERROR'); + process.exit(1); + } + + // Load price sheet + const priceRows = loadPriceSheet(); + if (!priceRows.length) { + log('No valid rows found in price sheet. Exiting.', 'ERROR'); + process.exit(1); + } + + // Get eBay token + log('Getting eBay token...'); + const token = await getEbayToken(); + log('eBay token acquired'); + + // Search + compare + const results = await runSearch(token, priceRows); + + // Enrich PASS items with real Available Qty from detail API + await enrichPassItems(token, results); + + // Save outputs + logSection('SAVING OUTPUTS'); + saveOutputs(results, runId); + + logSection('DONE'); + log(`Total elapsed : ${((Date.now() - startTime) / 1000).toFixed(1)}s`); + log(`Run ID : ${runId}`); +} + +main().catch(err => { + log(`FATAL: ${err.stack || err.message}`, 'ERROR'); + process.exit(1); +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a2b8315 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1544 @@ +{ + "name": "ebaydeepscan", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ebaydeepscan", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "axios": "^1.13.6", + "better-sqlite3": "^12.8.0", + "cors": "^2.8.6", + "dotenv": "^17.3.1", + "express": "^5.2.1", + "fs": "^0.0.1-security", + "openai": "^6.32.0", + "path": "^0.12.7", + "xlsx": "^0.18.5" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/better-sqlite3": { + "version": "12.8.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.8.0.tgz", + "integrity": "sha512-RxD2Vd96sQDjQr20kdP+F+dK/1OUNiVOl200vKBZY8u0vTwysfolF6Hq+3ZK2+h8My9YvZhHsF+RSGZW2VYrPQ==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.89.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", + "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openai": { + "version": "6.32.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.32.0.tgz", + "integrity": "sha512-j3k+BjydAf8yQlcOI7WUQMQTbbF5GEIMAE2iZYCOzwwB3S2pCheaWYp+XZRNAch4jWVc52PMDGRRjutao3lLCg==", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2791daf --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "ebaydeepscan", + "version": "1.0.0", + "description": "Multi-step pipeline: eBay search → exact MPN match → AI match → price comparison.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "axios": "^1.13.6", + "better-sqlite3": "^12.8.0", + "cors": "^2.8.6", + "dotenv": "^17.3.1", + "express": "^5.2.1", + "fs": "^0.0.1-security", + "openai": "^6.32.0", + "path": "^0.12.7", + "xlsx": "^0.18.5" + } +} diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..6bb4745 --- /dev/null +++ b/public/index.html @@ -0,0 +1,729 @@ + + + + + + eBay Scanner Dashboard + + + + + +

+

eBay Deep Scan Dashboard

+
+ + + +
+
+ + + +
+
+ + Ready +
+
+
+
+ +
+ Last scan: - + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + +
ImgProduct InfoMarket PriceProfit (Est)AI AnalysisReview
+
+
+ + + + + + + + + + + +
+ +
+ + + + diff --git a/scanner.js b/scanner.js new file mode 100644 index 0000000..6acfc12 --- /dev/null +++ b/scanner.js @@ -0,0 +1,607 @@ +require('dotenv').config(); +const axios = require('axios'); +const XLSX = require('xlsx'); +const fs = require('fs'); +const path = require('path'); +const db = require('./db'); +const ai = require('./ai'); + +// ─── CONFIG ────────────────────────────────────────────────────────────────── +const CFG = { + ebayClientId: process.env.EBAY_CLIENT_ID, + ebayClientSecret: process.env.EBAY_CLIENT_SECRET, + isSandbox: (process.env.EBAY_ENVIRONMENT || 'production') === 'sandbox', + marketplace: process.env.EBAY_MARKETPLACE || 'EBAY_US', + shipZip: process.env.SHIP_TO_ZIP || '10001', + shipCountry: process.env.SHIP_TO_COUNTRY || 'US', + itemsPerPage: parseInt(process.env.ITEMS_PER_PAGE || '50'), + priceSheet: process.env.PRICE_SHEET || './prices.xlsx', + priceRatio: parseFloat(process.env.PRICE_RATIO || '0.85'), + rowBatchSize: parseInt(process.env.ROW_BATCH_SIZE || '5'), + pageSize: parseInt(process.env.PAGE_SIZE || '200'), + maxItemsPerQuery: parseInt(process.env.MAX_ITEMS_PER_QUERY || '500'), + requestDelay: 100, +}; + +const EBAY_SITES = [ + { id: 'US', market: 'EBAY_US', zip: '10001', country: 'US', domain: 'ebay.com' }, + { id: 'UK', market: 'EBAY_GB', zip: 'W1A 1AA', country: 'GB', domain: 'ebay.co.uk' }, + { id: 'AU', market: 'EBAY_AU', zip: '2000', country: 'AU', domain: 'ebay.com.au' }, + { id: 'CA', market: 'EBAY_CA', zip: 'M5H 2N2', country: 'CA', domain: 'ebay.ca' }, + { id: 'DE', market: 'EBAY_DE', zip: '10115', country: 'DE', domain: 'ebay.de' }, +]; + +const BASE_URL = CFG.isSandbox ? 'api.sandbox.ebay.com' : 'api.ebay.com'; + +// ─── CURRENCY CONVERSION ───────────────────────────────────────────────────── +// Fallback approximate exchange rates to USD +let EXCHANGE_RATES = { + 'USD': 1.0, + 'GBP': 1.27, + 'EUR': 1.09, + 'AUD': 0.66, + 'CAD': 0.74, +}; + +async function fetchExchangeRates() { + log('Fetching latest exchange rates...'); + try { + const res = await axios.get('https://open.er-api.com/v6/latest/USD'); + if (res.data && res.data.rates) { + // The API returns rates relative to 1 USD (e.g., 1 USD = 0.78 GBP) + // We need the inverse: 1 GBP = X USD + const rates = res.data.rates; + const newRates = { 'USD': 1.0 }; + + const targets = ['GBP', 'EUR', 'AUD', 'CAD']; + targets.forEach(curr => { + if (rates[curr]) { + newRates[curr] = parseFloat((1 / rates[curr]).toFixed(4)); + } else { + newRates[curr] = EXCHANGE_RATES[curr]; // Fallback if missing + } + }); + + EXCHANGE_RATES = newRates; + log(`Rates updated: GBP=${EXCHANGE_RATES.GBP}, EUR=${EXCHANGE_RATES.EUR}, AUD=${EXCHANGE_RATES.AUD}, CAD=${EXCHANGE_RATES.CAD}`); + } + } catch (err) { + log(`Failed to fetch live rates, using fallbacks: ${err.message}`, 'WARN'); + } +} + +function convertToUsd(amount, fromCurrency) { + const rate = EXCHANGE_RATES[String(fromCurrency).toUpperCase()]; + if (!rate) { + // If unknown currency, log warning but return original (fail-safe) + return amount; + } + return parseFloat((amount * rate).toFixed(2)); +} + +// ─── LOGGER ────────────────────────────────────────────────────────────────── +let startTime = Date.now(); +const logLines = []; + +const STATS = { + quoteRequests: 0, + aiTokens: 0 +}; + +function log(msg, level = 'INFO') { + const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); + const line = `[${elapsed}s] [${level}] ${msg}`; + console.log(line); + logLines.push(line); +} + +function logSection(title) { + const bar = '─'.repeat(60); + log(''); + log(bar); + log(` ${title}`); + log(bar); +} + +// ─── UTIL ───────────────────────────────────────────────────────────────────── +function sleep(ms) { return new Promise(r => setTimeout(r, ms)); } + +// ─── DEFECTIVE LISTING FILTER ───────────────────────────────────────────────── +const DEFECTIVE_PATTERNS = [ + /\bnon[\s-]?working\b/i, + /\bnot[\s-]?working\b/i, + /\bno[\s-]?working\b/i, + /\bfor[\s-]?parts?\b/i, + /\bparts?[\s-]?only\b/i, + /\bparts?[\s-]?or[\s-]?repair\b/i, + /\bbroken\b/i, + /\bdefective\b/i, + /\bfaulty\b/i, + /\bdead[\s-]?on[\s-]?arrival\b/i, + /\bdoa\b/i, + /\bas[\s-]?is\b/i, + /\bdamaged\b/i, + /\bmalfunctioning\b/i, + /\bno[\s-]?post\b/i, +]; + +function isDefectiveListing(item) { + const title = (item.title || '').toLowerCase(); + return DEFECTIVE_PATTERNS.some(re => re.test(title)); +} + +// ─── LOAD PRICE SHEET ──────────────────────────────────────────────────────── +function loadPriceSheet() { + const wb = XLSX.readFile(CFG.priceSheet); + const ws = wb.Sheets[wb.SheetNames[0]]; + const rows = XLSX.utils.sheet_to_json(ws, { header: 1 }); + + const headers = rows[0].map(h => String(h).trim()); + const data = []; + + for (let i = 1; i < rows.length; i++) { + const row = rows[i]; + if (!row || !row.length) continue; + + const obj = {}; + headers.forEach((h, idx) => { obj[h] = row[idx] !== undefined ? row[idx] : ''; }); + + const partNumber = String(obj['Part Number'] || '').trim(); + const price = parseFloat(obj['Price']); + + if (!partNumber || isNaN(price)) continue; + + data.push({ + specs: String(obj['Specs'] || '').trim(), + manufacturer: String(obj['Manufacturer'] || '').trim(), + partNumber, + capacity: obj['Capacity (GB)'], + rank: String(obj['Rank'] || '').trim(), + speedMTs: obj['Speed (MT/s)'], + speedGrade: String(obj['Speed Grade'] || '').trim(), + type: String(obj['Type'] || '').trim(), + price, + }); + } + + log(`Loaded ${data.length} rows from ${CFG.priceSheet}`); + return data; +} + +// ─── BUILD SEARCH QUERIES ──────────────────────────────────────────────────── +function buildQueries(row) { + const { manufacturer, partNumber, capacity, rank, speedMTs, speedGrade, type } = row; + + const capStr = capacity ? `${capacity}GB` : ''; + const speedStr = speedMTs ? String(speedMTs) : ''; + + const q1 = partNumber; + const q2Parts = [manufacturer, capStr, rank, speedStr, type].filter(Boolean); + const q2 = q2Parts.join(' '); + const q3Parts = [manufacturer, capStr, rank, speedGrade?.split("-")[1], type].filter(Boolean); + const q3 = q3Parts.join(' '); + + return [ + { label: 'PartNumber', query: q1 }, + { label: 'SpeedMTs', query: q2 }, + { label: 'SpeedGrade', query: q3 }, + ].filter(q => q.query.trim().length > 0); +} + +// ─── EBAY AUTH ─────────────────────────────────────────────────────────────── +async function getEbayToken() { + const creds = Buffer.from(`${CFG.ebayClientId}:${CFG.ebayClientSecret}`).toString('base64'); + const res = await axios.post( + `https://${BASE_URL}/identity/v1/oauth2/token`, + 'grant_type=client_credentials&scope=https://api.ebay.com/oauth/api_scope', + { headers: { Authorization: `Basic ${creds}`, 'Content-Type': 'application/x-www-form-urlencoded' } } + ); + return res.data.access_token; +} + +// ─── EBAY SEARCH ───────────────────────────────────────────────────────────── +async function searchEbay(token, keyword, site) { + const headers = { + Authorization: `Bearer ${token}`, + 'X-EBAY-C-MARKETPLACE-ID': site.market, + 'X-EBAY-C-ENDUSERCTX': `zip=${site.zip},country=${site.country}`, + }; + + const pageSize = Math.min(CFG.pageSize, 200); + const cap = CFG.maxItemsPerQuery; + const exactQuery = keyword.trim().split(/\s+/).map(w => { + if (w.startsWith('-')) return w; // Negative keyword + return `"${w}"`; + }).join(' '); + + const baseUrl = `https://${BASE_URL}/buy/browse/v1/item_summary/search` + + `?q=${encodeURIComponent(exactQuery)}` + + `&fieldgroups=EXTENDED` + + `&filter=conditionIds:{1000|1500|2000|2500|3000|4000|5000|6000|7000}`; + + const all = []; + let offset = 0; + let total = null; + + do { + const url = `${baseUrl}&limit=${pageSize}&offset=${offset}`; + log(` [API] GET ${url}`, 'DEBUG'); + try { + const res = await axios.get(url, { headers }); + const data = res.data; + if (total === null) total = data.total || 0; + const page = data.itemSummaries || []; + all.push(...page); + offset += pageSize; + if (!page.length || all.length >= cap || offset >= total) break; + await sleep(150); + } catch (err) { + const msg = err.response?.data?.errors?.[0]?.message || err.message; + log(` eBay search error for "${keyword}" offset=${offset}: ${msg}`, 'WARN'); + break; + } + } while (true); + + return all.slice(0, cap); +} + +// ─── PRICE EXTRACTION ──────────────────────────────────────────────────────── +function extractPrice(item) { + const p = item.price || item.currentBidPrice || {}; + return { + value: parseFloat(p.value || 0), + currency: p.currency || 'USD' + }; +} + +function extractShipping(item) { + const opts = item.shippingOptions || []; + if (!opts.length) return { value: 0, currency: 'USD', label: 'N/A' }; + const first = opts[0]; + const currency = first.shippingCost?.currency || 'USD'; + if (first.shippingCostType === 'FREE') return { value: 0, currency, label: 'Free' }; + return { + value: parseFloat(first.shippingCost?.value || 0), + currency, + label: first.shippingCostType || '' + }; +} + +function extractQty(item) { + const title = item.title || ''; + const patterns = [ + /\bLOT\s+OF\s+(\d+)\b/i, // LOT OF 10 + /\b(\d+)\s*LOT\b/i, // 5 LOT + /\b(\d+)\s*(?:PACK|PCS?|PIECES?|UNITS?|STK|COUNT|CT)\b/i, + /\bQTY\s*[:\-]?\s*(\d+)\b/i, // QTY: 10 + /\b(\d+)\s*-\s*PACK\b/i, // 2-PACK + + // Multiplier context: Qty x Capacity (e.g. 4x256GB, 4 x 512 GB) + /\b(\d+)\s*[xX]\s*(?:\d+(?:\.\d+)?)\s*(?:GB|TB|MB|G|T)\b/i, + ]; + for (const p of patterns) { + const m = title.match(p); + if (m) { + // For some regexes, the group we want is at index 1 or 2 + const q = parseInt(m[1] || m[2]); + if (q > 1 && q < 128) return q; + } + } + return 1; +} + +// ─── COMPARE ───────────────────────────────────────────────────────────────── +function compareItem(item, row, searchLabel, site, profile) { + const priceData = extractPrice(item); + const shipData = extractShipping(item); + const qty = extractQty(item); + + // Convert to USD before comparison + const rawPriceUsd = convertToUsd(priceData.value, priceData.currency); + const shipCostUsd = convertToUsd(shipData.value, shipData.currency); + + const totalUsd = parseFloat((rawPriceUsd + shipCostUsd).toFixed(2)); + const avgUsd = qty > 1 ? parseFloat((totalUsd / qty).toFixed(2)) : totalUsd; + + // Use price_ratio from profile + const ratio = profile.price_ratio || 0.85; + const thresholdUsd = parseFloat((row.target_price * ratio).toFixed(2)); + + const pass = avgUsd <= thresholdUsd; + const available = item.availableQuantity ?? 1; + + const itemId = (item.itemWebUrl || '').match(/\/itm\/(\d+)/)?.[1] || item.itemId; + const finalUrl = `https://www.${site.domain}/itm/${itemId}`; + + // Heuristic extraction if missing + let extractedPN = row.part_number; + if (!extractedPN || extractedPN === 'N/A') { + // Look for more complex PN patterns (e.g., MZ-V7S1T0, M393A2K43BB1-CTD, CT1000MX500SSD1) + const pnMatch = item.title.match(/\b([A-Z0-9]{4,}-[A-Z0-9]{3,}|[A-Z0-9]{5,}\w[A-Z0-9]{2,})\b/); + if (pnMatch) extractedPN = pnMatch[1]; + } + + const itemGroupType = item.itemGroupType || ''; // SELLER_DEFINED_VARIATIONS etc. + + + let extractedBrand = ''; + const brands = ['Samsung', 'Hynix', 'Micron', 'Crucial', 'Dell', 'HP', 'Lenovo', 'Intel', 'Kingston', 'Sandisk', 'WD', 'Seagate', 'Toshiba']; + for (const b of brands) { + if (item.title.toLowerCase().includes(b.toLowerCase())) { + extractedBrand = b; + break; + } + } + + const initialImages = item.image?.imageUrl ? [item.image.imageUrl] : []; + + return { + id: itemId, + profile_id: profile.id, + keyword_id: row.id, + searchType: searchLabel, + partNumber: extractedPN || 'N/A', + manufacturer: extractedBrand || 'Generic', + specs: itemGroupType === 'SELLER_DEFINED_VARIATIONS' ? 'Multi-Variation' : '', + title: item.title, + url: finalUrl, + price: rawPriceUsd, // Always USD in DB now + shipping: shipCostUsd, // Always USD in DB now + shippingLabel: shipData.label, + total: totalUsd, + qty: qty, + avgPrice: avgUsd, + available: available, + targetPrice: row.target_price, + threshold: thresholdUsd, + passFail: pass ? 'PASS' : 'FAIL', + profit: pass ? parseFloat(((row.target_price - avgUsd) * available).toFixed(2)) : null, + images: JSON.stringify(initialImages), + detail_response: null, + seller_username: item.seller?.username || null, + seller_feedback_score: item.seller?.feedbackScore || null, + seller_feedback_percent: item.seller?.feedbackPercentage || null + }; +} + +// ─── MAIN SEARCH LOOP ──────────────────────────────────────────────────────── +async function processRow(token, row, rowIndex, totalRows, globalResultsMap, profile, onProgress) { + // Use the keywords array from the DB row + const queries = row.keywords.map(kw => ({ label: 'Keyword', query: kw })); + if (row.part_number) { + queries.unshift({ label: 'PartNumber', query: row.part_number }); + } + + log(`[${rowIndex + 1}/${totalRows}] Processing: ${row.part_number || row.keywords[0]}`); + + for (const site of EBAY_SITES) { + for (const { label, query } of queries) { + log(` [${rowIndex + 1}] [${site.id}] [${label}] Searching: "${query}"`); + const items = await searchEbay(token, query, site); + + let skipped = 0, cnSkipped = 0, dbSkipped = 0; + for (const item of items) { + const itemId = (item.itemWebUrl || '').match(/\/itm\/(\d+)/)?.[1] || item.itemId; + if (!itemId) continue; + + const dbItem = db.getItem(itemId); + if (dbItem && (dbItem.review_status === 'done' || dbItem.review_status === 'skip')) { + dbSkipped++; continue; + } + + if (isDefectiveListing(item)) { skipped++; continue; } + + if (item.itemGroupHref) { + log(` [${rowIndex + 1}] [${site.id}] [${label}] Skipping group product: ${itemId}`, 'DEBUG'); + continue; + } + + const locationCountry = item.itemLocation?.country; + if (locationCountry === 'CN') { cnSkipped++; continue; } + + const priority = (locationCountry === site.country) ? 2 : 1; + + const existing = globalResultsMap.get(itemId); + if (!existing || existing._priority < priority) { + const processedRow = compareItem(item, row, label, site, profile); + processedRow._priority = priority; + globalResultsMap.set(itemId, processedRow); + } + } + + const notes = []; + if (skipped) notes.push(`${skipped} defective`); + if (cnSkipped) notes.push(`${cnSkipped} CN-located`); + if (dbSkipped) notes.push(`${dbSkipped} DB skipped (done/skip)`); + log(` [${rowIndex + 1}] [${site.id}] [${label}] → ${items.length} raw results${notes.length ? `, skipped: ${notes.join(', ')}` : ''}`); + await sleep(CFG.requestDelay); + } + } + if (onProgress) onProgress(); +} + +async function runSearch(token, rows, profile, onProgress) { + logSection(`SEARCHING EBAY — ${rows.length} rows for Profile: ${profile.name}`); + const batchSize = CFG.rowBatchSize; + const totalBatch = Math.ceil(rows.length / batchSize); + + const globalResultsMap = new Map(); + + for (let b = 0; b < rows.length; b += batchSize) { + const batch = rows.slice(b, b + batchSize); + const batchNum = Math.floor(b / batchSize) + 1; + log(`\n── Batch ${batchNum}/${totalBatch} (rows ${b + 1}–${Math.min(b + batchSize, rows.length)}) ──`); + + await Promise.all( + batch.map((row, idx) => processRow(token, row, b + idx, rows.length, globalResultsMap, profile, onProgress)) + ); + } + + // Save map to DB - ONLY PASS ITEMS + let savedCount = 0; + for (const [id, r] of globalResultsMap) { + if (r.passFail === 'PASS') { + delete r._priority; + db.saveItem(r); + savedCount++; + } + } + + log(`Saved ${savedCount} PASS items to database.`); +} + +// ─── ITEM DETAIL API ───────────────────────────────────────────────────── +async function fetchItemDetail(token, itemId) { + const headers = { + Authorization: `Bearer ${token}`, + 'X-EBAY-C-MARKETPLACE-ID': CFG.marketplace, + 'X-EBAY-C-ENDUSERCTX': `zip=${CFG.shipZip},country=${CFG.shipCountry}`, + }; + try { + const res = await axios.get( + `https://${BASE_URL}/buy/browse/v1/item/v1|${itemId}|0`, + { headers } + ); + return res.data; + } catch (e) { + return null; + } +} + +async function enrichPassItems(token, profileId) { + // get all pass + waiting items for this profile that don't have detail_response yet + let passRows = db.getWaitingPassItems(profileId).filter(r => !r.detail_response); + if (!passRows.length) { log('No PASS items to enrich.'); return; } + + logSection(`ENRICHING ${passRows.length} PASS ITEMS — fetching Item Details`); + + const batchSize = 10; + for (let b = 0; b < passRows.length; b += batchSize) { + const batch = passRows.slice(b, b + batchSize); + await Promise.all(batch.map(async row => { + const itemId = String(row.id); + const detail = await fetchItemDetail(token, itemId); + if (detail) { + const est = detail.estimatedAvailabilities?.[0]; + row.available = est?.estimatedAvailableQuantity ?? detail.quantity ?? 1; + + // Re-read price from detail in case it's different and convert to USD + const priceDataDetail = { + value: parseFloat(detail.price?.value || 0), + currency: detail.price?.currency || 'USD' + }; + const priceUsdDetail = convertToUsd(priceDataDetail.value, priceDataDetail.currency); + + // Shipping in detail might be structured differently + const shipCostDetail = parseFloat(detail.shippingOptions?.[0]?.shippingCost?.value || 0); + const shipCurrDetail = detail.shippingOptions?.[0]?.shippingCost?.currency || 'USD'; + const shipUsdDetail = convertToUsd(shipCostDetail, shipCurrDetail); + + row.price = priceUsdDetail; + row.shipping = shipUsdDetail; + row.total = parseFloat((priceUsdDetail + shipUsdDetail).toFixed(2)); + row.avgPrice = row.qty > 1 ? parseFloat((row.total / row.qty).toFixed(2)) : row.total; + + row.profit = parseFloat(((row.targetPrice - row.avgPrice) * row.available).toFixed(2)); + + const images = [detail.image?.imageUrl, ...(detail.additionalImages?.map(i => i.imageUrl) || [])].filter(Boolean); + row.images = JSON.stringify(images); + row.detail_response = JSON.stringify(detail); + row.seller_username = detail.seller?.username; + row.seller_feedback_score = detail.seller?.feedbackScore; + row.seller_feedback_percent = detail.seller?.feedbackPercentage; + + STATS.quoteRequests++; + + // Re-save specific fields (since saveItem uses whole object, we fetch full item first) + const currentDbItem = db.getItem(itemId); + db.saveItem({ ...currentDbItem, ...row }); + log(` Item ${itemId} → Available Qty: ${row.available}`); + } else { + log(` Item ${itemId} → Failed to fetch details`); + } + })); + if (b + batchSize < passRows.length) await sleep(100); + } +} + +// ─── MAIN ──────────────────────────────────────────────────────────────────── +async function runScannerCore(profileId, onProgress) { + startTime = Date.now(); + const runId = Date.now(); + logSection(`eBay Price Scanner — Run ${runId}`); + + let profileIds = []; + if (profileId === 'all') { + profileIds = db.getProfiles().map(p => p.id); + } else if (Array.isArray(profileId)) { + profileIds = profileId; + } else if (profileId) { + profileIds = [profileId]; + } + + if (!profileIds.length) { + log('No profiles targeted for scanning.', 'ERROR'); + return; + } + + log('Getting eBay token...'); + const token = await getEbayToken(); + log('eBay token acquired'); + + await fetchExchangeRates(); + + for (const id of profileIds) { + const profile = db.getProfile(id); + if (!profile) { + log(`Profile ID ${id} not found, skipping.`, 'WARN'); + continue; + } + + const keywords = db.getKeywords(id); + if (!keywords.length) { + log(`No keywords found for profile ${profile.name}, skipping.`, 'WARN'); + continue; + } + + log(`\n>>> SCANNING PROFILE: ${profile.name} (ID: ${id}) <<<`); + + let currentProcessed = 0; + const totalKeywords = keywords.length; + const report = () => { + currentProcessed++; + if (onProgress) onProgress(currentProcessed, totalKeywords, profile.name); + }; + + await runSearch(token, keywords, profile, report); + await enrichPassItems(token, id); + + // Update last scan time for this profile + db.updateProfileScanTime(id); + log(`Profile ${profile.name} scan complete.`); + } + + // AI suggestions for missing items (global) + const tokens = await ai.runAiSuggestions(); + STATS.aiTokens += (tokens || 0); + + logSection('DONE SCANNING'); + log(`Total elapsed : ${((Date.now() - startTime) / 1000).toFixed(1)}s`); + log(`\n─── USAGE SUMMARY ───`); + log(`Total Quote Requests: ${STATS.quoteRequests}`); + log(`Total AI Tokens: ${STATS.aiTokens}`); + log(`─────────────────────\n`); +} + +module.exports = { + runScannerCore +}; + +// Standalone mode is now tricky because it needs a profileId +// but I'll keep it for testing with ID 1 +if (require.main === module) { + runScannerCore(1).catch(err => { + log(`FATAL: ${err.stack || err.message}`, 'ERROR'); + process.exit(1); + }); +} \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 0000000..9bd51f5 --- /dev/null +++ b/server.js @@ -0,0 +1,224 @@ +const express = require('express'); +const cors = require('cors'); +const path = require('path'); +const fs = require('fs'); +const db = require('./db'); +const scanner = require('./scanner'); +const ai = require('./ai'); + +const app = express(); +const PORT = process.env.PORT || 4000; + +// Middleware +app.use(cors()); +app.use(express.json()); + +// Serve static files from public directory +app.use(express.static(path.join(__dirname, 'public'))); + +// Create public directory if it doesn't exist +const publicDir = path.join(__dirname, 'public'); +if (!fs.existsSync(publicDir)) { + fs.mkdirSync(publicDir, { recursive: true }); +} + +// Track scanning state +let lastRunTime = null; +let scanProgress = { current: 0, total: 0, profileName: '' }; + +// API Routes + +// --- PROFILES --- +app.get('/api/profiles', (req, res) => { + try { + let profiles = db.getProfiles(); + if (profiles.length === 0) { + // Create a default profile if none exists + db.addProfile('Default Profile', 0.85); + profiles = db.getProfiles(); + } + res.json(profiles); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +app.post('/api/profiles', (req, res) => { + try { + const { name, price_ratio } = req.body; + db.addProfile(name, price_ratio || 0.85); + res.json({ success: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +app.put('/api/profiles/:id', (req, res) => { + try { + const { name, price_ratio } = req.body; + db.updateProfile(req.params.id, name, price_ratio); + res.json({ success: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +app.delete('/api/profiles/:id', (req, res) => { + try { + db.deleteProfile(req.params.id); + res.json({ success: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +// --- KEYWORDS --- +app.get('/api/profiles/:id/keywords', (req, res) => { + try { + const keywords = db.getKeywords(req.params.id); + res.json(keywords); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +app.post('/api/profiles/:id/keywords', (req, res) => { + try { + const { part_number, keywords, target_price } = req.body; + db.addKeyword(req.params.id, part_number, keywords, target_price); + res.json({ success: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +app.put('/api/keywords/:id', (req, res) => { + try { + const { part_number, keywords, target_price } = req.body; + db.updateKeyword(req.params.id, part_number, keywords, target_price); + res.json({ success: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +app.post('/api/profiles/:id/keywords/bulk', (req, res) => { + try { + const { items } = req.body; // Array of {part_number, keywords, target_price} + for (const item of items) { + db.addKeyword(req.params.id, item.part_number, item.keywords, item.target_price); + } + res.json({ success: true, count: items.length }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +app.delete('/api/keywords/:id', (req, res) => { + try { + db.deleteKeyword(req.params.id); + res.json({ success: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +// --- ITEMS --- +// Get scan status +app.get('/api/status', (req, res) => { + res.json({ isScanning, lastRunTime, scanProgress }); +}); + +// Get all "waiting" PASS items for a profile +app.get('/api/items', (req, res) => { + try { + const { profile_id } = req.query; + const items = db.getWaitingPassItems(profile_id); + res.json(items); + } catch (err) { + console.error('Error fetching items:', err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + +// Update item review status +app.put('/api/items/:id/status', (req, res) => { + try { + const { id } = req.params; + const { status } = req.body; + + if (!['waiting', 'done', 'skip'].includes(status)) { + return res.status(400).json({ error: 'Invalid status' }); + } + + db.updateReviewStatus(id, status); + res.json({ success: true, message: `Status updated to ${status}` }); + } catch (err) { + console.error(`Error updating status for item ${req.params.id}:`, err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + +// Trigger a new scan +app.post('/api/scan', async (req, res) => { + if (isScanning) { + return res.status(400).json({ error: 'Scan is already running' }); + } + + const { profile_id } = req.body; + if (!profile_id) { + return res.status(400).json({ error: 'profile_id is required' }); + } + + isScanning = true; + res.json({ success: true, message: 'Scan started in background' }); + + try { + console.log(`--- STARTING BACKGROUND SCAN FOR PROFILE ${profile_id} ---`); + scanProgress = { current: 0, total: 0, profileName: '' }; + + await scanner.runScannerCore(profile_id, (current, total, profileName) => { + scanProgress = { current, total, profileName }; + }); + + console.log('--- BACKGROUND SCAN FINISHED ---'); + } catch (err) { + console.error('Error running scan:', err); + } finally { + isScanning = false; + lastRunTime = new Date().toISOString(); + scanProgress = { current: 0, total: 0, profileName: '' }; + } +}); + +// Trigger AI on specific item +app.post('/api/items/:id/ai', async (req, res) => { + try { + const { id } = req.params; + const item = db.getItem(id); + if (!item) { + return res.status(404).json({ error: 'Item not found' }); + } + + // Convert JSON strings back to objects for AI prompt + item.detail_response = item.detail_response ? JSON.parse(item.detail_response) : null; + + const suggestion = await ai.getAiSuggestion(item); + db.updateAiSuggestion(id, suggestion); + + res.json({ success: true, ai_suggestion: suggestion }); + } catch (err) { + console.error(`Error requesting AI for item ${req.params.id}:`, err); + res.status(500).json({ error: 'Internal server error' }); + } +}); + +// Default catch-all to index.html for SPA feel +app.use((req, res) => { + res.sendFile(path.join(__dirname, 'public', 'index.html')); +}); + +// Start server +app.listen(PORT, () => { + console.log(`Server is running on http://localhost:${PORT}`); +}); diff --git a/test_access.js b/test_access.js new file mode 100644 index 0000000..c6135c3 --- /dev/null +++ b/test_access.js @@ -0,0 +1,58 @@ +require('dotenv').config(); +const axios = require('axios'); + +async function testOpenAI() { + const API_KEY = process.env.OPENAI_API_KEY; + const MODEL = process.env.OPENAI_MODEL || 'gpt-4o-mini'; + + console.log('=== OpenAI API Access Test ==='); + console.log(`Model : ${MODEL}`); + console.log(`API Key : ${API_KEY ? API_KEY.slice(0, 7) + '...' + API_KEY.slice(-4) : '(not set)'}`); + console.log(''); + + if (!API_KEY) { + console.log('❌ OPENAI_API_KEY not set in .env'); + process.exit(1); + } + + try { + const res = await axios.post( + 'https://api.openai.com/v1/chat/completions', + { + model: MODEL, + max_tokens: 16, + messages: [{ role: 'user', content: 'Reply with: OK' }], + }, + { + headers: { + Authorization: `Bearer ${API_KEY}`, + 'Content-Type': 'application/json', + }, + timeout: 15000, + } + ); + + const reply = res.data.choices?.[0]?.message?.content?.trim(); + const usage = res.data.usage; + const model = res.data.model; + + console.log(`✅ Connected`); + console.log(` Model : ${model}`); + console.log(` Response : ${reply}`); + console.log(` Tokens used : ${usage?.total_tokens} (prompt ${usage?.prompt_tokens} + completion ${usage?.completion_tokens})`); + console.log(` Est. cost : $${((usage?.prompt_tokens / 1_000_000) * 0.15 + (usage?.completion_tokens / 1_000_000) * 0.60).toFixed(6)}`); + + } catch (err) { + const status = err.response?.status; + const msg = err.response?.data?.error?.message || err.message; + const code = err.response?.data?.error?.code || ''; + console.log(`❌ FAILED — HTTP ${status} ${code}: ${msg}`); + } + + console.log('\n=== Done ==='); +} + +testOpenAI().catch(err => { + console.error('Fatal:', err.message); + process.exit(1); +}); \ No newline at end of file