From bfe98de2d19f03427f1ecb7d28139d2dd28278a8 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 18 Dec 2025 23:08:12 +0000 Subject: [PATCH] faded --- .gitignore | 1 + ai/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 404 bytes ai/__pycache__/local_ai_api.cpython-311.pyc | Bin 0 -> 19874 bytes config/__pycache__/wsgi.cpython-311.pyc | Bin 679 -> 768 bytes config/wsgi.py | 2 + core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 739 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1970 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 1403 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 1576 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 10981 bytes core/admin.py | 7 +- core/forms.py | 27 + core/migrations/0001_initial.py | 26 + core/migrations/0002_post_intent.py | 18 + .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1419 bytes .../0002_post_intent.cpython-311.pyc | Bin 0 -> 807 bytes core/models.py | 12 +- core/templates/base.html | 57 +- core/templates/core/ad_generator.html | 52 + core/templates/core/ai_chat.html | 53 + core/templates/core/blog.html | 24 + core/templates/core/graphics_editor.html | 112 +++ core/templates/core/image_generator.html | 47 + core/templates/core/index.html | 182 +--- core/templates/core/landing_page.html | 29 + core/templates/core/login.html | 14 + core/templates/core/signup.html | 14 + core/urls.py | 15 +- core/views.py | 260 ++++- manage.py | 3 +- native_app/index.html | 82 ++ native_app/main.js | 71 ++ native_app/package-lock.json | 917 ++++++++++++++++++ native_app/package.json | 19 + native_app/preload.js | 0 requirements.txt | 1 + static/css/custom.css | 80 +- staticfiles/css/custom.css | 95 +- 38 files changed, 2039 insertions(+), 181 deletions(-) create mode 100644 ai/__pycache__/__init__.cpython-311.pyc create mode 100644 ai/__pycache__/local_ai_api.cpython-311.pyc create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/0002_post_intent.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_post_intent.cpython-311.pyc create mode 100644 core/templates/core/ad_generator.html create mode 100644 core/templates/core/ai_chat.html create mode 100644 core/templates/core/blog.html create mode 100644 core/templates/core/graphics_editor.html create mode 100644 core/templates/core/image_generator.html create mode 100644 core/templates/core/landing_page.html create mode 100644 core/templates/core/login.html create mode 100644 core/templates/core/signup.html create mode 100644 native_app/index.html create mode 100644 native_app/main.js create mode 100644 native_app/package-lock.json create mode 100644 native_app/package.json create mode 100644 native_app/preload.js diff --git a/.gitignore b/.gitignore index e427ff3..d387093 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ */node_modules/ */build/ +.env diff --git a/ai/__pycache__/__init__.cpython-311.pyc b/ai/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bcb2fbacced8a64c23d6a403697ca4fcbf18d9a GIT binary patch literal 404 zcma)(ze__g5XbX=w3XW8>=xX*yf^72LP5n+adGl3Atu*0^}Qq}d9?K(adQ>_0RNAU z@+QH_P3YFi1k~B%_}m@b_wL}H`~5ER_H?u>UVZ!s#jnLb$>zW(kBFlJ@rcJ|RK-PH zB}G!DMOw9rR)lzRjRxt%*#(pujKvdWu#gT6WlqQ`UI;hCZU*?gq^?v`!SHZ|wNc9z zo)}f((>aw>g_+`zeMWxYAZ@yriqUd78fww(F$2^AF<`Zl7MhNM`x>lk_BjL7X?UczE z%G_B^8RS&tga|1dA(>uncaAH?>k>{(&&$K<_R!-iiK6HYjn`=Wj&9cfa}%EN4X0ar Ad;kCd literal 0 HcmV?d00001 diff --git a/ai/__pycache__/local_ai_api.cpython-311.pyc b/ai/__pycache__/local_ai_api.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa9977d8c7f6a3dd70fe97b8027d3793d79129e6 GIT binary patch literal 19874 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 literal 0 HcmV?d00001 diff --git a/config/__pycache__/wsgi.cpython-311.pyc b/config/__pycache__/wsgi.cpython-311.pyc index 79ce690f602e05f6bfa8a8e253edcb377296b788..b807168c64f85b04dcc3548f12d6b37c992c9174 100644 GIT binary patch delta 299 zcmZ3^+Q7!UoR^o20SGw4T{1UKSWIBa4g>4xVP!|wG0N5l}RFk4OQka4nG})`JafJuFdnzR7=cQ$) zD@6t|=ldmzRa|r+?8G*RCbh0~>ticTixeKW10fXTMRP=y>yMeorw}rQX O_r~OMCLI<&pnd>r!9)iD delta 221 zcmZo*Th7Y6oR^o20SJseKV`H|UYwp;#5`GuDcy<>XaFM+7e@ez56p~=j31cT8CgCsfCwQ5My>`<5PZO3 RcmWkXn0$drhlK~I3jlulE=K?W diff --git a/config/wsgi.py b/config/wsgi.py index e2fbd58..0bd1abf 100644 --- a/config/wsgi.py +++ b/config/wsgi.py @@ -8,9 +8,11 @@ https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/ """ import os +from dotenv import load_dotenv from django.core.wsgi import get_wsgi_application +load_dotenv() os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') application = get_wsgi_application() diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index cd6f855b12f4883b1ba9de01c54245c53aacd714..5f1a58838300996a9aa21dbf386f48066aeddd25 100644 GIT binary patch literal 739 zcmZWm&2H2%5FXn}cDr<;qFscLK)nWu<^bFfQY9n~&;@5-IV++j-%2OIrIT~ z>l-XWeVHQlu=1%Ar{1<&PCemCno3p2_IPGI^NnZb*KjxhOFuV1Bz*$#7nP2@8(}fA z!U+fvB!!HGgn*!er8Hw9BS1lteWweOY-({%?P-a^M-a{t2-kYKops8rk3B6-?RDBI z5PHJ<3V!brEj}@BB(fyGL`17OUy4%4x6W4RQZ1fY>S(V=_>x zpJ$I>)}Ll;uj?&bYOV9%_Iu``*pKqPVgsvG$&SLY7|&KB(^BEYOkc@8TY&xTU<=Jn z3)`fth}6K1taROf*LL8&!eQWK$^*;hj1V$|^|QNs22aoK?hEp$9v!_ncK(pjIT_6< bBX8z#pB=mBE9+PI@DJG)1N!8?fAg{bT@YfuFAG)7HUi13$>vqsyUN7yWD#cK zzK06{`~O|N+4%#jH+S#A#!D^&DVG7(OBs0$JM##yBcPg8ehoAF0OOIf=*7VjznRWm zLJQYPzy>4y8sNf$g&PNJuL?JQGrD)b=@#f;1^TK$_t*NSZhfNl$<=t0_)q_bO_#=1 z$26D)2eyF(7;WUZ29w^f@DfEbgPFe=N7f+-;pI>aP*_KqNj;8=YJ$n6g`~1r7pT*{ zPN%#T3*l@w%S}ml%O9++I-8&jF3(@7`!2X;5c`a?vS>Q(@_P>Iv)pO95qGwNMjU<^ z#F21)UiJfj=#sAAEZ;uolTO5`DBoFK-JAcaMWb7x6Zp<<5KG5%eRl5{_p)Rtt06$4 zYN{l;gBmnxk@=9%dpb z7L{oPe#HFOh_w{+uJ~(QbSbR1!*N(er@^Z<;!Z$PA-$EId{KB zWg=#k{Sxv_;f#|dT=ptizlj9GG(6!?02kISt{m{^L2qW|Ab$RR-y};Ldhe|}y@kbo z#=KVS69mJa&7Tl}Q-pqz%*^%Yax?Y`0XRk2f7rjSTPs)wlYk|#f)y}Hr0U1G)=N{$ zX4}+n25Ge}rkx6ATe_PS8b_^4axh2}#;c{P_~gt9(*wvp?UC#jg& zpR?>oFayrBkL9~C8r2d00nj%zP3w_`?)cp!?{~-V9(kubeqWx|H!Tg1imS0Zck?8n ZPA?897B$G*Wq{rK;ROAsSCC0&{{>54*Pj3Y literal 0 HcmV?d00001 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 9aa598b9d5171b2bb0d207f045e07f9fbbb95a64..6e449471b9cfd8c8b42bd2e857a5de09b2c8a4bf 100644 GIT binary patch literal 1403 zcmZ`(y>Ht_6hBI&L`tL_8Au8wj-jCfEX0<8KnOepHUcXO(57wyyFtPZ2U>Tw=}=^H zBv{Q>MNnC7}`06Yt&o_}$%mzjx4E zO)DT6SNB_{ltJh(Zj6UCQZ8GdyhH>M!9ra@7X+?ntV}nnX9bi&4-m<|Kt!b3J#oDG zIE&CJ%yj4ykv32*ch1e45R2csl);+oI)qwoX9P=@@e!AQgZUCsqzeS;nGE{x@l*mU zH{Lc7jv@I|nCZ~-30fZ8Bs0h!3xI$*LMRC$DV}?XIFP0g#RQ>_HlSlrPR9n)wIo^^ zJ79lqYX8hs4tXLEl&L(gkirY3mq`)GQDgBN$Mt{}#j!EaLOpu^4lV#sp=%sqi`qNh z?k1ZjC9w(JHhjzLOo|6Dr;c~$@(~E= zt?&cd11%kU6Xa{?GejoDzL|7%jO8ntBKI}=RfK}X^&^>ARM|SL9Elajt{lnLCrj1t zQkB%iI0vckIxLobcnh}CrE#IdsNqq94KJ2mk8OKqmlr9z)Y^7=Qk4(&#;(()4S&nG zJ-+UPipHqvKRe|8w>F@}>cK2muq^^wK9>Mnukp=d^b_4zNi z!t3>5Mu+dL_50U z8&(=&{29lEHe_S&*k95^#;J?*Yxg$R?zQf-E8J4nb`91xsYPPRGd+vO%7*3dq#n@) zHC8t1ftNb+9mn>l?ZsLPSlR?`5eN9D{U#;$?!8)Bcq!me_`JDmugkoy)yZ}N+@ z`TnC&n}6k$+L1cfZ-?sKNj6Xyhw5UeF81z6#T)%QVe!VBW>8!h z78k=jO@m*^@w9 z9crtgw%Ti7h=TN;aDhH8(;9gC>$O~bo$ML*j#K9xFmtQUA5T4PbIPnT0+6kgdg&|v z*OHcBEJ?LUX~#--W0MJnv7-{+*xh{*%Ps J{|_QbLrWmp2~#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ?Wa(r=;c-`)M-W;!Md(%uCPLOGzqX21>4E_zY6>OHV%|KQ~psG^sSNq*On(A~m_R zB)>?%JijQrxF9h(RX;huC{-U~j9x+IFAf_ZyEG@&u80Guoe_wOWr4&8W=2NF8w@fR Ku%RM0pb7xTsWln^ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 1f807fae1897c89361c99c5e868a26d00799b73f..7e5f23d3ce352fc0e9ccb8ac7cfc62d3ab739c0f 100644 GIT binary patch literal 1576 zcmc&zzi-<{6h2BPQ4~eXw$$2*ojO|~H`2j~hc*y2$tlnlZGajLKolit-IZd(AHtDL zQcW2%daFlGX^VL1*nglv$74Vs2G>s63}kAi-W{#L3D~YVlE?SH@7=ra-Xni8j3(gY zp9f=iQ3c>{;Vj4Mh4G3h0Q?Lvz={Wa#Z(kwSGd~%6v$gc%zirB=FwK@`Q`_(z^V{S5B`!<@J5WpJL#x z(p=j-*RmtvKXPrIUVA6kNAKoxbaM^wd<%NlUyAK|N)BgsJmv4&1D8CEUJ4yOEpK^t zfZf2cX0}6eJqjnT?O8t(g7dcPbIfu`K&TyuG;i7XlGk>qJ)63d$RgMkbUkvNAerT= z?OKzm9p~CCjAF}kqd3>4iAij`UJhveLQ-J+WL`V+LI+WUWAim>4%UQkXhXn;jW1)G3|*@17b+1IKf=6WyM3V%(Ux%4LOPkSsGnmG{$BSpg#GiR~Oe`TiuSs&Q@>iI|hzDo^c@!7L6lpm6b#Fb_@jW|m!a+j4 zh>Cw9?_400Fo>ypG_aF+N}*ty!n94BO6js}vPQY~m5}`%?=Eja zBs1hqj&ThV)cNlG8;A)FqTj$Po(sIbfu^BPP;!(6ae~MrGD&zV(Zi75k7o9SAXx$- zdocUybz|sWY9u)(p7?o!J9o0q9d?)RW2Ml_ptW56Mb_=T=+Yr9an>FG^(ljgDLl;J;rT|ZU3sjFi(cdH{1<~uoZtWe delta 261 zcmZ3%bDODtIWI340}vcY|CNyiq#uJgFu)3Be6|5HrZc24q%h_%a(-aCqi*=iYN4bHDGLb3gO>>KNGm^Ug^8fA%uWzvD%DvzJc3EyBrtMq(s3 z!6exUHffu%CG8V-mXU1lF%uj-u_qi!=Y$jPaFQe8O1dZ9^xT>7BUhXYIu+N6f*gBIV)zOQ)+~F z1StrzOLC1f{Y`(wr~P)rN#v9y6T?kpDNf{=W;9I8T2z_51?N$PL=V4kI9AaL-r?Yn zZTIaS5ce6a>RA@r@KYO<41aTjl5E!(cE=PV4=2Qw6i-b@)8e!onbDGohb+O29s2r)N5%xzYYl;^gTGKyQ;**#QCxF>A0nVoRAT1pg+OMeJ0D?f}^=f z>}}dKUp2g{5{rw8=#(r=3jx|^Dl}y# zO?%(qrl3XpU4}C$Ycq;O8X$MF3xwg0tI<1RA}$%6D&CO^){G97emn8tc?eT+8C51K zmMjPY!4KVVn)#D9xCp>sO@p}06kPT1y}PpeiK|n0b*}qcR(c-{=KQ^RfA11k@cKVI z{lV$?&)z#*WNe;+LNIjy_(#Y8_T#=EEGM}i z*d$NZj>l;mj1>69HYd16N7k`Qr|0rp<)c(*O-cGJrBp_6)?rPz=*&7L?;VD?vrec3 zb_3l~eu=kSyK1hFcQabJoSI>J7&5r%(r^%!wpD-mtokVVvM%d%2UD@7q&EQ+7G3YU zQf~7&%g!=$_BWYXHfwvH@0De=uFVpqdTV`u^n2a2`R=X8^7(27a>{q`X#Lh#o2s9c z&n3UL{6%-xon@uK1KXlU8z`rub3;Scvt?dryiULFQJ6ZNF(sLdYlbVPq%=9DEj&D* z5)<ww9Xu$4l9B~ws^+zrsL9g` ziOcE<;kumBh?p1@#>FXlP`D^&w78NQ6y6X?3W|sbucQ+50+F>0NzrUdFV71pF)7o+ zQ;If&+QcDk4TXuzgfI z8!q_i{2B)=pQF=j|8CNZD&aIp+nwO2OK_N*YC54MW)x!Zv4kw9AWKQqM1q6E@SCLo zHmYeQrOJjKD1pJtbI_7N3N$z|oMtZ=o=bBvIgM>NmiIPlf$V*B}c*J5G<53G&l!$+1~Mb5Tslr7qshR`#fY1@}?eQ~3?v#@vQ@jkunJnV(N1CL#L z+d0^a4*Q;P(eBu_`y0Eft?@es#In2C$TYRxKlRb6RgYO-k#RK)t_%C~!qLa>oNzub zoL?R*gap0knjXTvuy1&Ud*EI1Zd6Y83@nd)eC7M^{}5~gIP>*wiuJ(m`}{||-hSbW z^SQuiJ}{~WMhhLi%iPD_<;w4S*Z}8zeRy;;zJ?FSJ{Wud%DpQ~S8Bj;jDNAlhyI(J0Hf%==~^9L^0F<;izjWG5voAz8hY5(%11J1Vx)<69@ zVEq|@8?rmPtyZX3`3@dysn8sC4U2eu)St{oUww;qCIQhA+2w^HZ52$0JPi)^VUIx#~t3Q0T#($qN$-B z-w0UsUv#icioJIz>mb2uiU~BaL2Ar8w$el?2oPI=auYP9rmSmg${kx~m$bX4Wu7xf zfcpwLpm6`vqFbxq91pAR&GXGODU@|v%L90>0#kTuB{KD_$cl~lYqUD9XSN${}4W(5;CdVDP=Y#(8q!ji)9EHe36AN z3+|fjQPKh63{khg&ID1kN=O6+_BRSpwT`#j*muATtYF1 ziMTlM2J$jqp9G;IYc3;K$&T@xRj)J%xejUYul~nY7%Mb1f86%8q3cOQ*J@v`VIbcy zu;eUq-JVHyJ=B#C9Vj}PuKq%|0yFQf-7xcla5Eh}kDPkbQP_)KXSlIg&xCt6n!+nr zigsIPV=>4dsxLAizG3)g|92>sE*INivi~sqL3U*<=iit2?<+EX-xOO2b>7c@lwBQN zyO0YF=R?EGT%o1?pPK)nd9@F2wG8K5hL@d%HeuOQXxjq{G;~n0JW>d?-kbKYs$YI5*DB^)MZHPf=y`ehTIFe{J~6Fdp2@Yw^R02cDZU}}ea8QiUwcD8 zax*84=Y{cQ-+HKhWm@mO@I_RAJ*JOHxsaR>$$CKk{ty0U&=eZ7TCVerA71_7s@`(y zv6$n}<@s|ue{Q|4bCv!3(FdbT*VcnzVCvmxzUb6%M)h;=F{fP@~&h3HO zBh^V>i3e!*f$a&$9c<3+VYUVW$u3JNo3`;5n=@sT{EJR0Ky__ET|eOf+P2rRPHHS^ z2sS7s4?(F(+6Clc_ZIR1*46XDHIa5q8QMY~JXy~Uxi)Vh4|M=Y-YhUMAP;<&-{HL$ zYtKpH3VGP+jaKU$i{Ly(@&GN_w&<<#GPQ#(@6Cd}41R=;2aZ~+5}>>axWRINY0;;l z%~RS|D?W+x9Xv{%S)Ub50m^ZbFKzJD3gz{+T1i5-zLu(#pxpPak3u;dtDxNKJ8QR= z4p81@Lb<^M`brtFve5iAg5@hoR%0Y?+F5?E)6hpNW~8{BipdKH%BU`YU7eN_3A7_c zu$q4RIBCybUQOP7E3g0DI1CC;<7^$kjow%9-t}!o&>9h{!IZq)qEy3Q`W=P~Zekx8Je-)24s3?}1Yf>^;wFfN4hs!|3R*b`WeWY?or%aW z=ClnPAy?r+zu#md)-sLyl4eopf3&g#}81E+G~)A{h}C4Z4S;fbobD8I zx>LyMx{%X#fr{-&>bjo#d!G1vR^QC|hx7j7BIEJxDTMl-h6bO62G?GHbTbz^mJc1< zp4WADFZ0jI>v{)1oBQS5BgZd({;Qv_@SD62T@AvXWgcn=6cotQ$wKR%f-s1C?}h4#jI#-J2LYEp|M$-VOrQnn8FX-!tdO+hj}PSd(|P{1&Y#{&(oQ~BzFyQ% zzm*HVoe#dP^R;`KqeU$oZ8MmpqTBB`Z6ghrBFtBjy3w=tua2D>Jz@X-VHVDRf5HLM zLd-ZwPl*{CSI-wcGfkvvBBp2JF*OQdI<(}_L?TEs2pX$q;LQB8{546*Tae)2FcBIr zm5A6T(WC(j@XGQpt4iu-$=wFm-k3_Jq7Z(A8NyNtES6TH4Zhax*(Ld}=irGo@h6OS zsljUIgw7V=Mvl*&wRj2akh)!f?bU%J#)Di6qFYsHzZuVvyxFbMhn<}$ycPS2zgnYg z4YwU8tTDL9kiA#%)YL>Hud%_R#5a=tK5 z4UgSUlMa&J=oIOr^18tiMQu z5fC^LGAh>L9f+(*%4~!tRe$=zTkk}KQJ_@voR~}};AK#u)Ibo9Q9#p_JWCsBP$=gK zj-svkM4$rDs7fj_L*yypw9q@FX=(Mu@bK*HY-CzdrW0}m2x{+1DDhPVVmi>Oko{yv z(=a0Q=QEd-SSAUfq6jP$AoJsL0+uHzq_4L-IX`6P(AyuOS@!jp3c%hJuq&};FlYn) zD<`DCq$HXR6a>-fjEq%G&I|OsTq)q?)Rl%Y5;`(LWeiY(3ZODp;4dk@lm#e&`Cl}H zXV98sQ?&Ka?}z@eNf|r3GCC#f#PX=A9+)^hYDOh|Ob~EaX+MgI(o+a~Z8`%@3!n$S zWpV{X{5$w|7g|gX3&RzHG%@@#adif|&=xvrfDIP}&<`G0d6*7L4Dx{+F8+7;@o#ao zy^RGRV42=FtE0`Nw$4pQ8$_|H6erZ}w&`KRXm&OCbd{7OF?jG5{8bTjxXWx*uM^nb zt>$C`;6h_P*V*-8=W0mbe^wXHeI3+;uuR}uK6p*%uNAp2&spGS?R$%yyJe9rx_k|d zMF^!d0@Vr&YY=xi1beYF&{n^6^;r+oya$|g8%?b%KLaY-(D;p=Yp(x}0RbL2;Ey#P zH_rDm`1QJ1FXuu-`OuIa7~0;a)xG-0T2k*h^~Jaz8q0;o@}V(3FlM^6Y@i@4b}&VS zDjj|V{;Xqp{+P}mqqY0z?ltk@zR&mR!hy%#dhkpxcqSh_qw}>pWl69&;w(C{Af(g0 z64Liv)SE}X9@o7$a^4$x?+u;1q2i$V*YoxZ{mgHfK9v1+7mwM0d+5Z)L-sF+SUCUk zkOQQJY+&cv;s5OiAb>G}EN?#+)u{<;V=h}ZSg{0sU$rcOttJr=zpw#NZ@0{ayH5Hc zw}pD@!G_s;+T>*Dwd;2fGEaU=iRq=t*U=214 zvMQ*PW%Un-Yos_ek(pj-rY$29Ee;{(s3dD*JYlxcQ79eO@?ef;L(!HgE$*4dyO_ed zw#Q4`$IOMyz~leMB)IGVDQ(*)udZ>rcPQr_%6o_Ij+C0@#mCMsxJR%yXEg5})wxlV z>h3WD(k(GHtwaEti3Y37RMUXwAU9Jhj7%9FrBsw*#3v&dF^@VI4El{gYLL8#&BUw9A;y~rlb+hPPA%0x-du)MzW+F&E8k)**r%pG5KX7z!ME zv~?dcw5_N~@q_ymR5Fv0&yZPo4&Mu--USJUDa#g^bNbGEkz-jjWJ_X$Ij&px0@JKp z_X5+aZ?_ki`n&X3U_5u}ufTZk(qDnut6TR1vro6~8=mk|DDMfc9Lsrn@}8c%5F>H3 zFa=h`?ibjjMW!OA*naj{5qN1y{1tnFR-;N@wz2rMBHRoMiu6?P1?I4B-8WdiXd7T} hg1w6J8#~15-)k-1nqY0HQ$@IK>`UmX*jCaW`d^qmOf&!h literal 1364 zcmZ`(&1)M+6ra_{dS%J>I!@|TuH%hUh$T{~CE!96oTjQ1oHkCdQ%ZHHPf-Q6#oP5Eq{V!1Q7#*Ku^61OfEk4%~~s}guETzy!YnKoA>c! z|CpMZL_mL+PRlpL2>m0JfI>sz+l$SscSs^=|k4VB6wxYJ2mwh>6 zP1s6a0Xh0B%Et_88>QrbMYzqB#N#E*3Oks3CUHQODRvA@K~k7$;|6iCE(zZu#bJlk z(8(RJK1WUTVt6pV9fEo^GQIeJgpqaJXHRNMhV;}glZK3tBN^en5Q~o7QAND#(>piA zMx+^HvEUS;@pC3}9#TaPq;a2SxGAxj;0&RP639l>kPjiNqhJ8&1AY_l`WecBvKL`< zK_mp-GGfihA=Gg+ss)BI*;w21yRNY^)~upqm`+Labc(T~)l62_EK-D_XmFxoXUC+( zv9ZH61GA!Od6`C{=(;tt(Wqy1VsquT>;5P-9=l@|nMF#b-iU4DnzqgA7Upvgw;tSE z&pj%9yS|;<+IaYA=m{Nfc9(G8LP76tKq2MQk+Efgahls~zxB^Y15iq2p ze1hU%s@P+67IZo#*hj*3LMINxyUY_2H9@DJWy{3I+3Mq}!>U=li}flaG+QI|spl4T zob~hDF>%eyxOE;8-gFVJ3n+TO18bo->ila}J65%hy4+QlU#ly}>PkmVchz)jqo<`_ z{(P+6Xlpn2)BEXH3$5?^ljojY`z`Y<)5;BG^zo;?`Q?6crISo|lj(kPxtsi=lf2$d zUhiF8=v}zfU%GryZ>QE?g*r>Q?ozJ5xODJS`|4MJebZUI)m^+bn2pWI0|cyf_w9L< zIJbYby>RVisS{uA##h^s)e}e(07x&wM(2TX`E06G0Q9V<>X{|ul?i3g0?%(HPYlgf z1`zb;;Me{qqL;+gPk@~&H*I26ExbmrfGYk1-VB%P=Gt0qP}4qgs~x5hq6N00Du3p!A*nVi(WlRF;1#!Ly#LoyL%ngvr!J8lOW=c(QOqLo5W?D^~qAGHTM>_}$&k#=MV&2gZ+t=ElV7*e=m5-6S;AwJncW9#s~0n(je2V^@}ar0Ez_ z5gb3Z9q6oVTN<>Jc!ctv4FVzZA|4uKfZcnw5|y;bv8GW))1ddG0RcLvX+Mng0aFGp zV_1d<;W(@%wB#P?!=c^*MNEdo!o=!M95!k6O7p?N*V=>q?eDeS`>pM}GcL9gFEr-GkNxV+lW|bJ`B%xWwrACLP;L8#oq6%9Us*r-BB-qYKK^48Z0-b` zd%@;I{}Blujr_`ZRv8DCv0pd}<#cH&OiQxz5&?R}P?%Dd#p7?;a%xG2HHlu03tY#Y zdi*n}CslT?gBr~)&S4Y}5LZ7=9b<5QLEKOt;zQW1S>eZwq?x z*jxWWRqT)OCsf$OGFMN%rEE_<`A&9IkvfySd7qj0<9TNCb!o{49Iv;!;U@y{TY-8s z7S3!Fog-ktNCYwQNUV7p0S%r3(>?>!IT`A8(lL5Ju8^lQ;}x_UXKK5xNjnY)BFMuu z$s~H{=oPVMo)i)_q^vzK?N5#L;j0{`(?` zRIEabk9fj((hqqi)Imyfi?OGwhAR5Gx<2|SC|0VBaVyzvN7|?G@cL8I W7NI3vH;4A*#{F}(aq*wss_!3_ip - {% block title %}Knowledge Base{% endblock %} + {% block title %}Cipher Shield{% endblock %} {% if project_description %} @@ -13,13 +13,64 @@ {% endif %} + {% load static %} {% block head %}{% endblock %} - - {% block content %}{% endblock %} + + +
+
+ {% block content %}{% endblock %} +
+
+ diff --git a/core/templates/core/ad_generator.html b/core/templates/core/ad_generator.html new file mode 100644 index 0000000..23bdf19 --- /dev/null +++ b/core/templates/core/ad_generator.html @@ -0,0 +1,52 @@ +{% extends 'base.html' %} +{% load static %} + +{% block content %} +
+

Ad Generation Tool

+ +
+
+
+
+
Enter Product Details
+
+ {% csrf_token %} +
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+
+
+
Generated Ad Creative
+ {% if ad_copy and ad_image_url %} +
+ Generated Ad Image +
+
Ad Copy
+

{{ ad_copy }}

+
+
+ {% else %} +

Your generated ad creative will appear here.

+ {% endif %} +
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/ai_chat.html b/core/templates/core/ai_chat.html new file mode 100644 index 0000000..8200205 --- /dev/null +++ b/core/templates/core/ai_chat.html @@ -0,0 +1,53 @@ +{% extends 'base.html' %} + +{% block content %} +
+

AI Chat

+
+
+ {% csrf_token %} +
+ + +
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/blog.html b/core/templates/core/blog.html new file mode 100644 index 0000000..29f69ae --- /dev/null +++ b/core/templates/core/blog.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} + +{% block content %} +
+

Blog

+
+ {% for post in posts %} +
+
+
+

{{ post.title }}

+

{{ post.content|truncatewords:50 }}

+ Read More → +
+ +
+
+ {% endfor %} +
+
+{% endblock %} diff --git a/core/templates/core/graphics_editor.html b/core/templates/core/graphics_editor.html new file mode 100644 index 0000000..52f925a --- /dev/null +++ b/core/templates/core/graphics_editor.html @@ -0,0 +1,112 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Cipher Shield Graphics

+

Your personal graphics designing software

+ +
+
+

Tools

+
+ + +
+ + +
+ + +
+ + +
+ +
+ + +
+
+ +
+
+
+ + + +{% endblock %} diff --git a/core/templates/core/image_generator.html b/core/templates/core/image_generator.html new file mode 100644 index 0000000..ea36718 --- /dev/null +++ b/core/templates/core/image_generator.html @@ -0,0 +1,47 @@ +{% extends 'base.html' %} +{% load static %} + +{% block content %} +
+
+
+

Cipher Shield: Image Generation

+

Unleash your creativity. Describe the image you want to create, and let our AI bring it to life.

+ +
+
+
+ {% csrf_token %} +
+ +
+ +
+
+
+ +
+ + {% if image_url %} +

Your Masterpiece

+ Generated Image + {% endif %} + {% if error_message %} +
+ {{ error_message }} +
+ {% endif %} +
+ +
+
+
+ + +{% endblock %} diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..5db9952 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,57 @@ {% extends "base.html" %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} +{% block title %}Cipher Shield{% endblock %} {% block head %} +{{ block.super }} - - + + {% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+

Cipher Shield

+

The future of secure social networking.

+
+ +
+
+ {% csrf_token %} + {{ form.as_p }} + +
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + +
+ {% for post in posts %} +
+
+
+
+ {{ post.author.username.0|upper }} +
+
+
+

{{ post.author.username }}

+ +
+

{{ post.created_at|date:"F d, Y, P" }}

+
+
+

{{ post.content }}

+
+
+ {% empty %} +
+

No posts yet. Be the first to share something!

+
+ {% endfor %} +
+ +{% endblock %} diff --git a/core/templates/core/landing_page.html b/core/templates/core/landing_page.html new file mode 100644 index 0000000..484249c --- /dev/null +++ b/core/templates/core/landing_page.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Super Affiliate AI{% endblock %} + +{% block head %} +{{ block.super }} + + + + +{% endblock %} + +{% block content %} +
+
+

Promote HubSpot

+

The Ultimate All-in-One Platform for Your Business

+
+ +
+
+

Why Promote HubSpot?

+

HubSpot offers a full platform of marketing, sales, customer service, and CRM software — plus the methodology, resources, and support to help businesses grow better. As a HubSpot affiliate, you'll earn a commission on every new customer you refer.

+ Get Started with HubSpot! +
+
+
+{% endblock %} diff --git a/core/templates/core/login.html b/core/templates/core/login.html new file mode 100644 index 0000000..4c204c6 --- /dev/null +++ b/core/templates/core/login.html @@ -0,0 +1,14 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+

Login

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
+{% endblock %} diff --git a/core/templates/core/signup.html b/core/templates/core/signup.html new file mode 100644 index 0000000..77c5034 --- /dev/null +++ b/core/templates/core/signup.html @@ -0,0 +1,14 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+

Sign Up

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..65974db 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,18 @@ from django.urls import path +from django.contrib.auth import views as auth_views -from .views import home +from .views import landing_page, social_feed, image_generator, ad_generator, graphics_editor, signup, ai_chat, post_list, post_detail urlpatterns = [ - path("", home, name="home"), + path("", landing_page, name="landing_page"), + path("blog/", post_list, name="post_list"), + path("blog//", post_detail, name="post_detail"), + path("social/", social_feed, name="social_feed"), + path("image-generator/", image_generator, name="image_generator"), + path("ad-generator/", ad_generator, name="ad_generator"), + path("graphics-editor/", graphics_editor, name="graphics_editor"), + path("ai-chat/", ai_chat, name="ai_chat"), + path("signup/", signup, name="signup"), + path("login/", auth_views.LoginView.as_view(template_name="core/login.html"), name="login"), + path("logout/", auth_views.LogoutView.as_view(next_page="login"), name="logout"), ] diff --git a/core/views.py b/core/views.py index c9aed12..76e1764 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,249 @@ +from django.shortcuts import render, redirect, get_object_or_404 + +def landing_page(request): + return render(request, 'core/landing_page.html') +from django.contrib.auth.decorators import login_required +from .models import Post +from .forms import PostForm, SignUpForm +import logging import os -import platform +import json +from django.contrib.auth import login +from ai.local_ai_api import LocalAIApi -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +logger = logging.getLogger(__name__) + +def signup(request): + if request.method == 'POST': + form = SignUpForm(request.POST) + if form.is_valid(): + user = form.save() + return redirect('social_feed') + else: + form = SignUpForm() + return render(request, 'core/signup.html', {'form': form}) -def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() +def social_feed(request): + if request.method == 'POST': + form = PostForm(request.POST) + if form.is_valid(): + post = form.save(commit=False) + post.author = request.user + # AI Intent Analysis + try: + content = form.cleaned_data['content'] + prompt = ( + "Analyze the following post and classify its intent into one of " + "the following categories: Neutral, Safe, Caution, Warning. " + "Only return the category name and nothing else." + ) + + response = LocalAIApi.create_response( + { + "input": [ + {"role": "system", "content": prompt}, + {"role": "user", "content": content} + ], + }, + ) + + if response.get("success"): + ai_intent = LocalAIApi.extract_text(response) + if ai_intent in ["Neutral", "Safe", "Caution", "Warning"]: + post.intent = ai_intent + else: + post.intent = "Neutral" + else: + post.intent = "Neutral" + + except Exception as e: + logger.error("Error during AI intent analysis: %s", e) + post.intent = "Neutral" + + post.save() + return redirect('social_feed') + else: + form = PostForm() + + posts = Post.objects.all().order_by('-created_at') context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + 'posts': posts, + 'form': form, } - return render(request, "core/index.html", context) + return render(request, 'core/index.html', context) + + +def image_generator(request): + if request.method == 'POST': + prompt = request.POST.get('prompt') + + try: + response = LocalAIApi.create_response({ + "input": [ + { + "role": "system", + "content": "You are an AI image generator. Create an image based on the user's prompt." + }, + {"role": "user", "content": prompt} + ], + "model": "dall-e-3", + "parameters": { + "size": "1024x1024" + } + }) + + if response.get("success"): + data = response.get("data", {}) + output = data.get("output", []) + image_url = None + for item in output: + if item.get("type") == "image": + image_url = item.get("url") + break + if image_url: + return render(request, 'core/image_generator.html', {'image_url': image_url}) + else: + error_message = "Image URL not found in the response." + return render(request, 'core/image_generator.html', {'error_message': error_message}) + else: + error_message = response.get("error", "An unknown error occurred.") + return render(request, 'core/image_generator.html', {'error_message': error_message}) + + except Exception as e: + logger.error("Error during image generation: %s", e) + error_message = str(e) + return render(request, 'core/image_generator.html', {'error_message': error_message}) + + return render(request, 'core/image_generator.html') + + +def ad_generator(request): + if request.method == 'POST': + product_name = request.POST.get('product_name') + product_description = request.POST.get('product_description') + target_audience = request.POST.get('target_audience') + + try: + # Generate ad copy + ad_copy_prompt = f"Create a compelling ad copy for a product named '{product_name}'. " \ + f"The product is about: {product_description}. " \ + f"The target audience is {target_audience}." + + ad_copy_response = LocalAIApi.create_response({ + "input": [ + {"role": "system", "content": "You are an expert copywriter."}, + {"role": "user", "content": ad_copy_prompt} + ] + }) + if ad_copy_response.get("success"): + ad_copy = LocalAIApi.extract_text(ad_copy_response) + else: + ad_copy = "Could not generate ad copy." + + # Generate ad image + ad_image_prompt = f"Create a visually appealing image for an ad for '{product_name}'. " \ + f"{product_description}" + + ad_image_response = LocalAIApi.create_response({ + "input": [ + { + "role": "system", + "content": "You are an AI image generator. Create an image for an ad based on the user's prompt." + }, + {"role": "user", "content": ad_image_prompt} + ], + "model": "dall-e-3", + "parameters": { + "size": "1024x1024" + } + }) + + if ad_image_response.get("success"): + data = ad_image_response.get("data", {}) + output = data.get("output", []) + ad_image_url = None + for item in output: + if item.get("type") == "image": + ad_image_url = item.get("url") + break + else: + ad_image_url = "" + + + return render(request, 'core/ad_generator.html', { + 'ad_copy': ad_copy, + 'ad_image_url': ad_image_url, + 'product_name': product_name, + 'product_description': product_description, + 'target_audience': target_audience, + }) + + except Exception as e: + logger.error("Error during ad generation: %s", e) + error_message = str(e) + return render(request, 'core/ad_generator.html', {'error_message': error_message}) + + return render(request, 'core/ad_generator.html') + +def graphics_editor(request): + return render(request, 'core/graphics_editor.html') + + +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt + +@csrf_exempt +def ai_chat(request): + if request.method == 'POST': + prompt = request.POST.get('prompt') + + # Basic validation + if not prompt: + return JsonResponse({'error': 'Prompt is required.'}, status=400) + + try: + conversation = [ + { + "role": "system", + "content": ( + "You are a helpful assistant that can control a web browser. " + "You can perform tasks like navigating to web pages, filling out forms, and clicking on links. " + "When asked to perform a browser action, you should respond with a JavaScript code block to be executed in the browser. " + "The browser is displayed in an iframe, and you can access it using `window.frames[0]`. " + "For example, to navigate to a new page, you can use `window.frames[0].location.href = 'https://www.google.com';`. " + "To click a button, you can use `window.frames[0].document.querySelector('#my-button').click();`. " + "To fill out an input field, you can use `window.frames[0].document.querySelector('#my-input').value = 'my value';`. " + "To get the text content of an element, you can use `window.frames[0].document.querySelector('#my-element').textContent`. " + "If you are not being asked to do a browser action, you can respond with a conversational response." + ) + }, + {"role": "user", "content": prompt} + ] + + response = LocalAIApi.create_response( + { + "input": conversation, + } + ) + + if response.get("success"): + return JsonResponse(response) + else: + error_message = response.get("error", "An unknown error occurred.") + return JsonResponse({'error': error_message}, status=500) + + except Exception as e: + logger.error("Error in ai_chat view: %s", e) + return JsonResponse({'error': str(e)}, status=500) + + return JsonResponse({'error': 'Only POST requests are allowed.'}, status=405) + +def post_list(request): + posts = Post.objects.all().order_by('-created_at') + return render(request, 'core/blog.html', {'posts': posts}) + +def post_detail(request, slug): + post = get_object_or_404(Post, slug=slug) + return render(request, 'core/article_detail.html', {'post': post}) \ No newline at end of file diff --git a/manage.py b/manage.py index 8e7ac79..5dfbe21 100755 --- a/manage.py +++ b/manage.py @@ -2,10 +2,11 @@ """Django's command-line utility for administrative tasks.""" import os import sys - +from dotenv import load_dotenv def main(): """Run administrative tasks.""" + load_dotenv() os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') try: from django.core.management import execute_from_command_line diff --git a/native_app/index.html b/native_app/index.html new file mode 100644 index 0000000..da58aca --- /dev/null +++ b/native_app/index.html @@ -0,0 +1,82 @@ + + + + + + AI Chat + + + +

AI Chat

+
+ + +
+
+
+ + +
+ + + diff --git a/native_app/main.js b/native_app/main.js new file mode 100644 index 0000000..5f3a79f --- /dev/null +++ b/native_app/main.js @@ -0,0 +1,71 @@ +const { app, BrowserWindow, ipcMain, BrowserView } = require('electron'); +const fetch = require('node-fetch'); +const path = require('path'); + +let view; + +function createWindow () { + const win = new BrowserWindow({ + width: 1200, + height: 600, + webPreferences: { + preload: path.join(__dirname, 'preload.js'), + nodeIntegration: true, + contextIsolation: false, + } + }); + + win.loadFile('index.html'); + + view = new BrowserView(); + win.setBrowserView(view); + view.setBounds({ x: 400, y: 0, width: 800, height: 600 }); + view.webContents.loadURL('https://electronjs.org'); +} + +app.whenReady().then(() => { + createWindow(); + + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } + }); +}); + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +ipcMain.on('load-url', (event, url) => { + view.webContents.loadURL(url); +}); + +ipcMain.on('execute-js', (event, code) => { + view.webContents.executeJavaScript(code); +}); + +ipcMain.on('send-message', async (event, message) => { + try { + const response = await fetch('http://127.0.0.1:8000/ai_chat/', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + // Note: You'll need to handle CSRF tokens and authentication if your Django app requires it. + }, + body: `message=${encodeURIComponent(message)}` + }); + + if (response.ok) { + const data = await response.json(); + event.reply('ai-response', data.reply); + } else { + event.reply('ai-response', 'Error: Could not get a response from the AI.'); + } + } catch (error) { + console.error(error); + event.reply('ai-response', 'Error: Could not connect to the AI service.'); + } +}); \ No newline at end of file diff --git a/native_app/package-lock.json b/native_app/package-lock.json new file mode 100644 index 0000000..87e913a --- /dev/null +++ b/native_app/package-lock.json @@ -0,0 +1,917 @@ +{ + "name": "native_app", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "native_app", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "node-fetch": "^2.7.0" + }, + "devDependencies": { + "electron": "^39.2.7" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/electron": { + "version": "39.2.7", + "resolved": "https://registry.npmjs.org/electron/-/electron-39.2.7.tgz", + "integrity": "sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^22.7.7", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/native_app/package.json b/native_app/package.json new file mode 100644 index 0000000..a6f27b9 --- /dev/null +++ b/native_app/package.json @@ -0,0 +1,19 @@ +{ + "name": "native_app", + "version": "1.0.0", + "description": "", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "electron ." + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "electron": "^39.2.7" + }, + "dependencies": { + "node-fetch": "^2.7.0" + } +} diff --git a/native_app/preload.js b/native_app/preload.js new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt index e22994c..9055bc3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ Django==5.2.7 mysqlclient==2.2.7 python-dotenv==1.1.1 +openai==1.3.3 diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..6c3a8df 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,80 @@ -/* Custom styles for the application */ body { - font-family: system-ui, -apple-system, sans-serif; + background: linear-gradient(to right, #0F2027, #203A43, #2C5364); + font-family: 'Inter', sans-serif; + color: #fff; +} + +.font-poppins { + font-family: 'Poppins', sans-serif; +} + +.font-inter { + font-family: 'Inter', sans-serif; +} + +.glass-card { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-radius: 1rem; + border: 1px solid rgba(255, 255, 255, 0.15); + box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37); +} + +/* Redefine form styles from forms.py to avoid specificity issues */ +.glass-card form .w-full.bg-gray-800 { + background-color: rgba(31, 41, 55, 0.5) !important; + border-color: rgba(55, 65, 81, 0.5) !important; +} + +/* Intent Badge Styles */ +.intent-badge { + width: 10px; + height: 10px; + border-radius: 50%; + margin-left: 8px; + display: inline-block; +} + +.intent-neutral { + background-color: #9CA3AF; /* gray-400 */ +} + +.intent-safe { + background-color: #10B981; /* green-500 */ +} + +.intent-caution { + background-color: #F59E0B; /* yellow-500 */ +} + +.intent-warning { + background-color: #EF4444; /* red-500 */ +} + +/* Image Generator Styles */ +.btn-primary { + background-color: #4A90E2; + border-color: #4A90E2; + transition: background-color 0.3s ease; +} + +.btn-primary:hover { + background-color: #357ABD; + border-color: #357ABD; +} + +.form-control { + background-color: rgba(255, 255, 255, 0.2); + border: none; + color: #fff; +} + +.form-control::placeholder { + color: rgba(255, 255, 255, 0.7); +} + +.card { + background-color: rgba(0,0,0,0.2); + border: none; } diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..6c3a8df 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,80 @@ - -:root { - --bg-color-start: #6a11cb; - --bg-color-end: #2575fc; - --text-color: #ffffff; - --card-bg-color: rgba(255, 255, 255, 0.01); - --card-border-color: rgba(255, 255, 255, 0.1); -} body { - margin: 0; + background: linear-gradient(to right, #0F2027, #203A43, #2C5364); font-family: 'Inter', sans-serif; - background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end)); - color: var(--text-color); - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - text-align: center; - overflow: hidden; - position: relative; + color: #fff; +} + +.font-poppins { + font-family: 'Poppins', sans-serif; +} + +.font-inter { + font-family: 'Inter', sans-serif; +} + +.glass-card { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-radius: 1rem; + border: 1px solid rgba(255, 255, 255, 0.15); + box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37); +} + +/* Redefine form styles from forms.py to avoid specificity issues */ +.glass-card form .w-full.bg-gray-800 { + background-color: rgba(31, 41, 55, 0.5) !important; + border-color: rgba(55, 65, 81, 0.5) !important; +} + +/* Intent Badge Styles */ +.intent-badge { + width: 10px; + height: 10px; + border-radius: 50%; + margin-left: 8px; + display: inline-block; +} + +.intent-neutral { + background-color: #9CA3AF; /* gray-400 */ +} + +.intent-safe { + background-color: #10B981; /* green-500 */ +} + +.intent-caution { + background-color: #F59E0B; /* yellow-500 */ +} + +.intent-warning { + background-color: #EF4444; /* red-500 */ +} + +/* Image Generator Styles */ +.btn-primary { + background-color: #4A90E2; + border-color: #4A90E2; + transition: background-color 0.3s ease; +} + +.btn-primary:hover { + background-color: #357ABD; + border-color: #357ABD; +} + +.form-control { + background-color: rgba(255, 255, 255, 0.2); + border: none; + color: #fff; +} + +.form-control::placeholder { + color: rgba(255, 255, 255, 0.7); +} + +.card { + background-color: rgba(0,0,0,0.2); + border: none; }