Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
853095d951 | ||
|
|
99c95b87e5 | ||
|
|
39a6455e7b | ||
|
|
958c7ef201 | ||
|
|
542289a318 | ||
|
|
5c1bbe5bf7 | ||
|
|
f26abd4b5f | ||
|
|
2767f883fc | ||
|
|
e98651da2b | ||
|
|
84304eadb7 | ||
|
|
ab3739219e | ||
|
|
7cf4932f3a | ||
|
|
032f1eefef | ||
|
|
e35be94f7c | ||
|
|
e76e2ad85a | ||
|
|
cb19cd2476 | ||
|
|
c532732ce9 | ||
|
|
2bc10dbb2e | ||
|
|
b634a03ef9 | ||
|
|
ac64bb98ad | ||
|
|
aa49539210 | ||
|
|
1f5678f781 | ||
|
|
7adc089e94 | ||
|
|
6e1e9c07ee | ||
|
|
1d55382f3b | ||
|
|
e68bb0bc4e | ||
|
|
c8e14dade5 | ||
|
|
e4c1a3f5c2 | ||
|
|
cdd6ef9cb3 | ||
|
|
737d43fd16 | ||
|
|
9f5163531c | ||
|
|
df5cf0f4e5 | ||
|
|
e160b64697 | ||
|
|
7d36c6ac4a | ||
|
|
0820edf55f | ||
|
|
12e324893f | ||
|
|
4017c4dd33 | ||
|
|
17b65d80e1 | ||
|
|
47cb3321ab | ||
|
|
547b9f617b | ||
|
|
9e7bd78693 | ||
|
|
c53d60b628 | ||
|
|
9566e0cdb2 | ||
|
|
ed3e779d22 | ||
|
|
3e2133753d | ||
|
|
736a853192 | ||
|
|
08ef2ffa9a | ||
|
|
6cf512cccd | ||
|
|
6f56e614f3 | ||
|
|
8c06862705 | ||
|
|
48159171c2 | ||
|
|
d5d0749b72 | ||
|
|
dc4dd81e11 | ||
|
|
c736e2186d | ||
|
|
7a76bda484 | ||
|
|
778ea36a9d | ||
|
|
04e1e1e566 | ||
|
|
01f66085ab | ||
|
|
ddf723525a | ||
|
|
7b18a92388 | ||
|
|
b985dcee63 | ||
|
|
77e92432ed | ||
|
|
a7b33a928b | ||
|
|
1218c6d096 | ||
|
|
6337431ed4 | ||
|
|
2ba5118bc2 | ||
|
|
12649c7ccf | ||
|
|
5d96932870 | ||
|
|
e6cfa6cf77 | ||
|
|
55d16c5681 | ||
|
|
ab75685955 | ||
|
|
bd0bf0bf63 | ||
|
|
fd050b33d9 | ||
|
|
698090b17a | ||
|
|
6f96260993 | ||
|
|
98a6b19298 | ||
|
|
ded270ff25 | ||
|
|
c8860207e8 | ||
|
|
8d045ffd8b | ||
|
|
fd7437e74a | ||
|
|
807ba866d3 | ||
|
|
5e2808d7c4 | ||
|
|
a26a3ff8f9 | ||
|
|
a2e9f69b96 | ||
|
|
ac800a303a | ||
|
|
dd542a9f29 | ||
|
|
26ce456bde | ||
|
|
7ce1faaf6c | ||
|
|
878bdaa5a7 | ||
|
|
68a7e3f66a | ||
|
|
feccc81c5f | ||
|
|
620045d7a3 | ||
|
|
6dc28d61b0 | ||
|
|
754cc29793 | ||
|
|
ed525509ea | ||
|
|
2b6f26e6c8 | ||
|
|
09821aab85 | ||
|
|
636190b8e6 | ||
|
|
e420c22a45 | ||
|
|
993f6edcc4 | ||
|
|
bda8264788 | ||
|
|
ab8e792276 | ||
|
|
0e4be63b6b | ||
|
|
d3ebea9090 | ||
|
|
15a9e23243 | ||
|
|
eab7d9c77f | ||
|
|
4a86b71018 | ||
|
|
6350f7f11a | ||
|
|
ce6388253c | ||
|
|
d8f6064d5e | ||
|
|
9f5d95f565 | ||
|
|
0cabbeb81c | ||
|
|
76618aa3a1 | ||
|
|
b19db0f67d | ||
|
|
76f228bfe7 | ||
|
|
be40692773 | ||
|
|
42ac377c17 | ||
|
|
46f859cc3c | ||
|
|
f2bff0d1fb | ||
|
|
0bd98b9662 | ||
|
|
1ac2c02197 | ||
|
|
907187d53a | ||
|
|
faf6246fe6 | ||
|
|
0c16e2be7a | ||
|
|
3212882895 | ||
|
|
62f34ffcaf | ||
|
|
50601b0aff | ||
|
|
4c5d42cb13 | ||
|
|
85268b8917 | ||
|
|
973d2c4529 | ||
|
|
ab766b8c54 | ||
|
|
4945242c87 | ||
|
|
c4a72eb375 | ||
|
|
b12d11728d | ||
|
|
8f0e3a7576 | ||
|
|
4810ff2dbe | ||
|
|
a221b22be9 | ||
|
|
24b458530d | ||
|
|
caea43590a | ||
|
|
c3d7a0b85e | ||
|
|
5c6f28027d | ||
|
|
dc04529f5b | ||
|
|
2bb04a419d | ||
|
|
8e31b71668 | ||
|
|
f055453889 | ||
|
|
820a6cecdd | ||
|
|
c3a779e4c8 | ||
|
|
00008abf03 | ||
|
|
d9c6f2f780 | ||
|
|
9a4d77e869 | ||
|
|
2407416e33 | ||
|
|
234e42ccfa | ||
|
|
4426b8dc30 | ||
|
|
9541f49f39 | ||
|
|
9f7a99f370 | ||
|
|
12f0bb2f98 | ||
|
|
ac45a72e0e | ||
|
|
9705818b15 | ||
|
|
39374eafda | ||
|
|
110bc3205e | ||
|
|
57fec89f2d | ||
|
|
72e794c281 | ||
|
|
fadbcc3e44 | ||
|
|
9e30e964e6 | ||
|
|
fbb707d014 | ||
|
|
d2d82ee5ee | ||
|
|
9061fa08ba | ||
|
|
f29236518e | ||
|
|
6537de5224 | ||
|
|
0413d470a8 | ||
|
|
c01f4d3ce8 | ||
|
|
dd9d359bb0 | ||
|
|
b444c35643 | ||
|
|
abd0d52fad | ||
|
|
c8771dd3b9 | ||
|
|
6d16f56183 | ||
|
|
95ffe0350e | ||
|
|
e314f25a77 | ||
|
|
65ea65e9ae | ||
|
|
4ce975562e | ||
|
|
07e625f2bc | ||
|
|
d95fd8dc90 | ||
|
|
55028cf3a3 | ||
|
|
16a97772d3 | ||
|
|
d33167d070 | ||
|
|
f62e0ba372 | ||
|
|
1b6466ae78 | ||
|
|
29c5987bf1 | ||
|
|
fcd1d01e83 | ||
|
|
a80b889760 | ||
|
|
f71bf1b074 | ||
|
|
7e048ee537 | ||
|
|
34098e8950 | ||
|
|
faf0d4d605 | ||
|
|
85ade88d55 | ||
|
|
7d0b94330d | ||
|
|
5cff1298fc | ||
|
|
d3a3d4e96e | ||
|
|
f99621ec92 | ||
|
|
e47a9304f4 | ||
|
|
9488fc1251 | ||
|
|
b590aa746b | ||
|
|
ef61134b8b | ||
|
|
a9daa0b586 | ||
|
|
ae0ad25ed6 | ||
|
|
a4c48c1981 | ||
|
|
3497590d2e | ||
|
|
11cf1329c8 | ||
|
|
ba5b41cf3a | ||
|
|
1d70446cc4 | ||
|
|
f15d0ab243 | ||
|
|
34be4800d7 | ||
|
|
e40b0c2e07 | ||
|
|
45e0ad9e93 | ||
|
|
96e6ddfe8a | ||
|
|
6b47bacfac | ||
|
|
099b419e34 | ||
|
|
e343ec0a1e | ||
|
|
e3d6d08916 | ||
|
|
d0bc206c83 | ||
|
|
7287f8c81b | ||
|
|
1878753cde | ||
|
|
2f04e01f4f | ||
|
|
a51f44c135 | ||
|
|
7f14eb544c | ||
|
|
c6e34db329 | ||
|
|
acb90531b2 | ||
|
|
91c3d0b814 | ||
|
|
95e03d11c1 | ||
|
|
88ab927755 | ||
|
|
81c7e2ee61 | ||
|
|
b5ed64de51 | ||
|
|
921a2a0d81 | ||
|
|
5195b1e5fc | ||
|
|
f886422f91 | ||
|
|
27d57d7563 | ||
|
|
2ebb8f44b7 | ||
|
|
a0b408e8cb | ||
|
|
858e0dae09 | ||
|
|
7bee337554 | ||
|
|
7944b3f579 | ||
|
|
5e889563ca | ||
|
|
aad3b458c8 | ||
|
|
acef2ef89a | ||
|
|
d99c25dd03 | ||
|
|
f0a1dad48e | ||
|
|
1e334903dd | ||
|
|
342583f8d1 | ||
|
|
6af18275c4 | ||
|
|
9c519d937d | ||
|
|
4b14fa6ca8 | ||
|
|
dc69e51042 | ||
|
|
052d5aa474 | ||
|
|
0c55c1c1b4 | ||
|
|
6f896b4f94 | ||
|
|
e7a376db70 | ||
|
|
15cf4d89b7 | ||
|
|
c38fcc494a | ||
|
|
44e5b78d29 | ||
|
|
38107a67fe | ||
|
|
0274bcb8cd | ||
|
|
a91c1545f8 | ||
|
|
0b3884b1a5 | ||
|
|
bcea46fa8f | ||
|
|
abc3c2c25a | ||
|
|
db7a8a702d | ||
|
|
288bfebc13 | ||
|
|
c7996d3e14 | ||
|
|
0d9b6325f9 | ||
|
|
baf1508644 | ||
|
|
d04604abe5 | ||
|
|
bf09784fad | ||
|
|
67f5c794e1 | ||
|
|
55fbe118d5 | ||
|
|
ae8ec8572c | ||
|
|
38b91a558b | ||
|
|
a001f83abb | ||
|
|
87c8a3a64d | ||
|
|
c6e7075bf5 | ||
|
|
5d75cfdfc5 | ||
|
|
3f9852c932 | ||
|
|
9dfaf990fd | ||
|
|
1bef1637e0 | ||
|
|
451d5bfe47 | ||
|
|
faa1f935b7 | ||
|
|
c428fe175a | ||
|
|
9767c8bf39 | ||
|
|
96b50538ed | ||
|
|
2dae886fd1 | ||
|
|
beb74b3c47 | ||
|
|
d93ee98473 | ||
|
|
f081f0c1cf | ||
|
|
4e49c399d0 | ||
|
|
2527555945 | ||
|
|
5ef671f047 | ||
|
|
10781da086 | ||
|
|
c279a7f186 | ||
|
|
7dd1c9ac5e | ||
|
|
125a5be91f | ||
|
|
e25d48cc89 | ||
|
|
5f96f367a6 | ||
|
|
01fe2e66fb | ||
|
|
1b74285de9 | ||
|
|
b13ba0a229 | ||
|
|
9e0dd5b003 | ||
|
|
4128de61f9 | ||
|
|
fc900c8ce6 | ||
|
|
63ac4e0e75 | ||
|
|
7ee1635833 | ||
|
|
7d0cfeff77 | ||
|
|
7fa44644fd | ||
|
|
e9152e8725 | ||
|
|
7ea7f6666d | ||
|
|
3ae49dc826 | ||
|
|
75d7eff63b | ||
|
|
8618718b71 | ||
|
|
8d17000272 | ||
|
|
df53774628 | ||
|
|
68235e188a | ||
|
|
f37fad11b1 | ||
|
|
93fa277bdd | ||
|
|
ea7fa63079 | ||
|
|
d15db4b4dd | ||
|
|
ed06d57a31 | ||
|
|
168c55990f | ||
|
|
2889ba7c78 | ||
|
|
896b8ef326 | ||
|
|
f08d5c904c | ||
|
|
4be5fb4d3d | ||
|
|
a2d5d55518 | ||
|
|
e1b28b01df | ||
|
|
b6bbe880a0 | ||
|
|
65ad57fc4c | ||
|
|
469e63b898 | ||
|
|
d471233f83 | ||
|
|
01576212a3 | ||
|
|
898c7f1be2 | ||
|
|
705b33e307 | ||
|
|
2592f44bc2 | ||
|
|
9914db6b96 | ||
|
|
bb93ad37a1 | ||
|
|
93bc632088 | ||
|
|
ab89ddffc8 | ||
|
|
7794e57bb1 | ||
|
|
7c15bb6ef6 | ||
|
|
ac99156c90 | ||
|
|
c68f546be9 | ||
|
|
217285223c | ||
|
|
3144328874 | ||
|
|
26880b4612 | ||
|
|
e7aac14ef1 | ||
|
|
52211cd4ea | ||
|
|
331c59b7c1 | ||
|
|
b605b17561 | ||
|
|
33163ac96c | ||
|
|
757af11ab3 | ||
|
|
81a87ef362 | ||
|
|
0cb260f854 | ||
|
|
0ffc2ee924 | ||
|
|
e4992e8313 | ||
|
|
519020077a | ||
|
|
6fccee3711 | ||
|
|
597a86562a | ||
|
|
16449613e0 | ||
|
|
6c161c6ae7 | ||
|
|
48b357b1c6 | ||
|
|
a795544074 | ||
|
|
8711c27b78 | ||
|
|
d48aa99dcc | ||
|
|
5f3b9b88ff | ||
|
|
f566ea3b63 | ||
|
|
8ba77beeed | ||
|
|
128f59ed6f | ||
|
|
c92f56ec8f | ||
|
|
daa3d74500 | ||
|
|
ad7fc3a993 | ||
|
|
084822814d | ||
|
|
3a58bd1eef | ||
|
|
94d3fa356c | ||
|
|
7d75714662 | ||
|
|
b057d52499 | ||
|
|
2d726ded30 | ||
|
|
f45d9bda61 | ||
|
|
684c1ab600 | ||
|
|
3ac2720ba8 | ||
|
|
7b743f35b3 | ||
|
|
e1b2a4aee2 | ||
|
|
308c350582 | ||
|
|
41c9b86fd9 | ||
|
|
46b9855c87 | ||
|
|
c667de90ed | ||
|
|
cf13e3bed0 | ||
|
|
0956538b79 | ||
|
|
f2a4ab2654 | ||
|
|
aeabdab781 | ||
|
|
f04b5cdc27 | ||
|
|
b947e3a8b9 | ||
|
|
ae3148a86f | ||
|
|
78bf76e965 | ||
|
|
7beb5756f7 | ||
|
|
a2b0236ea3 | ||
|
|
144914110a | ||
|
|
c73609d155 | ||
|
|
53cd8ba00c | ||
|
|
1c09cc6c8c | ||
|
|
06160546a6 | ||
|
|
0b292829fa | ||
|
|
392c51fced | ||
|
|
144d5a6d5f | ||
|
|
43dfc7e1f0 | ||
|
|
adde7fba37 | ||
|
|
33fe180997 | ||
|
|
a95b7e9561 | ||
|
|
08330e0b82 | ||
|
|
c74118e913 | ||
|
|
bb3cef89c1 | ||
|
|
589936199c | ||
|
|
710e2e1996 | ||
|
|
aa794c7646 | ||
|
|
48779aed29 | ||
|
|
3907e1ac76 | ||
|
|
4d6af4fbf8 | ||
|
|
9c3b0efb30 | ||
|
|
8bcb7ffe4d | ||
|
|
77f0740ec9 | ||
|
|
8b5e407758 | ||
|
|
6c88a5554f | ||
|
|
d779ee06b1 | ||
|
|
f873d4e245 | ||
|
|
0a0e03dc68 | ||
|
|
f0e19c8934 | ||
|
|
a6af51dc32 | ||
|
|
fd1a079271 | ||
|
|
9840a48301 | ||
|
|
2dc7c9adf1 | ||
|
|
a86bfe7fd3 | ||
|
|
d99475bb80 | ||
|
|
194b7aff2e | ||
|
|
f6d5733183 | ||
|
|
0ca055b8e8 | ||
|
|
9aae2c7f50 | ||
|
|
c29ad1270b | ||
|
|
49a60c25af | ||
|
|
39bcc158bb | ||
|
|
4f02bcd40c | ||
|
|
556c4a434d | ||
|
|
d389b035b7 | ||
|
|
9447088f89 | ||
|
|
64955c26a7 | ||
|
|
68519223fa | ||
|
|
e72cacc4b2 | ||
|
|
ed4be2328f | ||
|
|
e241c6cb6f | ||
|
|
6e98fb4274 | ||
|
|
83f6f41787 | ||
|
|
18c10e5839 | ||
|
|
11de47c813 | ||
|
|
85ea619b18 | ||
|
|
3f57cf21f7 | ||
|
|
b75c773879 | ||
|
|
95070ae382 | ||
|
|
353ee3a9ae | ||
|
|
972e147fdf | ||
|
|
73e52fe334 | ||
|
|
cf521ad79e | ||
|
|
76a3e5cfcf | ||
|
|
200d63e5fc | ||
|
|
0aeefb1217 | ||
|
|
7dfeb859e2 | ||
|
|
5151f26b9e | ||
|
|
053e5cca86 | ||
|
|
89765c19c4 | ||
|
|
0824f0c13b | ||
|
|
04092c3fa5 | ||
|
|
d8258cf676 | ||
|
|
97d6eee5ba | ||
|
|
511297ed11 | ||
|
|
88aafbaf7b | ||
|
|
af9890b16c | ||
|
|
c67a8c4120 | ||
|
|
16c0e00b4f | ||
|
|
d1c1c5acf9 | ||
|
|
9cb7145b4e | ||
|
|
978d327bcd | ||
|
|
07664b5f22 | ||
|
|
b21fe0ac4c | ||
|
|
932c30cd7f | ||
|
|
59c19f3fae | ||
|
|
c9245f957e | ||
|
|
228cd4e664 | ||
|
|
289a651d52 | ||
|
|
1b8c17ce92 | ||
|
|
e66de732ac | ||
|
|
2ba94f7524 | ||
|
|
3f90642726 | ||
|
|
35ae7b9643 | ||
|
|
15d635322b | ||
|
|
c3d5234710 | ||
|
|
9b498d10d5 | ||
|
|
9418e5b635 | ||
|
|
8779b79bbf | ||
|
|
ba11689029 | ||
|
|
90e212a1b2 | ||
|
|
198a52e230 | ||
|
|
e7890dda3d | ||
|
|
83086c46e6 | ||
|
|
1314123ad7 | ||
|
|
cb13873098 | ||
|
|
fba430999d | ||
|
|
293c53d8dd | ||
|
|
33ce334bd7 | ||
|
|
379eeedde2 | ||
|
|
ec6f5d1ad3 | ||
|
|
f35ba8f8e5 | ||
|
|
21ffd2a564 | ||
|
|
3c5b095510 | ||
|
|
096227e3da | ||
|
|
4a582ec8b1 | ||
|
|
4132494a49 | ||
|
|
1bd31d2936 | ||
|
|
18ffeb82a2 | ||
|
|
da985871cc | ||
|
|
4ff5b3e05a | ||
|
|
7f3d6bb55f | ||
|
|
d54722609c | ||
|
|
2765d5edeb | ||
|
|
a1a7979fb3 | ||
|
|
4e8b5e26ae | ||
|
|
47596fdb1a | ||
|
|
332521a7f3 | ||
|
|
8690de00a9 | ||
|
|
7fd2b43704 | ||
|
|
05c05419fc | ||
|
|
5ad9ac277c | ||
|
|
42f24245b5 | ||
|
|
7548836b67 | ||
|
|
a2c33affcd | ||
|
|
11039a5c82 | ||
|
|
46969702a8 | ||
|
|
134827a0f7 | ||
|
|
f0390682ce | ||
|
|
2a6846d2c0 | ||
|
|
dc8b3b9210 | ||
|
|
dcda9be50b | ||
|
|
04c25ab0f7 | ||
|
|
051d9421b0 | ||
|
|
6d65797b4f | ||
|
|
497813eced | ||
|
|
26e3a1944b | ||
|
|
e188d788b9 | ||
|
|
d86d061f97 | ||
|
|
35918d2a00 | ||
|
|
51bab71291 | ||
|
|
6fd886b27a | ||
|
|
2211009cce | ||
|
|
eb65cee280 | ||
|
|
a3dd126931 | ||
|
|
0b2be1e54b | ||
|
|
337d93ff51 | ||
|
|
df5c2be7fa | ||
|
|
15cd9795d5 | ||
|
|
5fcdf4ea00 | ||
|
|
e8e982559d | ||
|
|
b2a8d27178 | ||
|
|
679e10abd6 | ||
|
|
34331063eb | ||
|
|
2dfdd4a0d9 | ||
|
|
cb5413c2ce | ||
|
|
9e7f2261f3 | ||
|
|
5efed8f193 | ||
|
|
0af7e95af2 | ||
|
|
cf3b225d3e | ||
|
|
32f95f5d7d | ||
|
|
9a5a1bf555 | ||
|
|
b7dfb0af0b | ||
|
|
4a71387098 | ||
|
|
f651ab7fd9 | ||
|
|
fc599a0637 | ||
|
|
9796233897 | ||
|
|
0849a2f114 | ||
|
|
043218937f | ||
|
|
7b4d60b576 | ||
|
|
f803b910b5 | ||
|
|
8d660b20aa | ||
|
|
1e298bbbc0 | ||
|
|
14eb54481d | ||
|
|
7a5c28228b | ||
|
|
f278716b7e | ||
|
|
b3e186fea4 | ||
|
|
f0cdefad90 | ||
|
|
507b0e44d5 | ||
|
|
56985be26b | ||
|
|
d3a0c6a330 | ||
|
|
0d5cd28d38 | ||
|
|
b6bd9cd7dd | ||
|
|
2dab5093dc | ||
|
|
4a4a02eb0d | ||
|
|
4000aacb2c | ||
|
|
a2be7f6b36 | ||
|
|
af6f90c228 | ||
|
|
3df2d23bf5 | ||
|
|
d173e2d49b | ||
|
|
5747cae87a | ||
|
|
667751dc5f | ||
|
|
577996f507 | ||
|
|
22e42e279c | ||
|
|
6c42b87c57 | ||
|
|
3fe63f836f | ||
|
|
1a2e82f079 | ||
|
|
8f2eea70f6 | ||
|
|
358df925e7 | ||
|
|
9ab8f233a2 | ||
|
|
fb0e45ebed | ||
|
|
37b814b70a | ||
|
|
8b282afb03 | ||
|
|
ec9a4b2607 | ||
|
|
d5f3158638 | ||
|
|
eb5e344b41 | ||
|
|
9d13b27c9e | ||
|
|
b4f69a4e2e | ||
|
|
3e359a69c7 | ||
|
|
9de4054851 | ||
|
|
9676e63b5e | ||
|
|
337cb67cd9 | ||
|
|
fe79258766 | ||
|
|
0a9cc1e17a | ||
|
|
6445061836 | ||
|
|
19df710a0d | ||
|
|
0d8333eac6 | ||
|
|
b1cb4bbe32 | ||
|
|
11b9430b15 | ||
|
|
1230c3bd28 | ||
|
|
2ee645b1ee | ||
|
|
84ce308d9d | ||
|
|
be631d021e | ||
|
|
a37458fd9e | ||
|
|
095b9478cc | ||
|
|
94fec52329 | ||
|
|
fc4d71139a | ||
|
|
c813344c7c | ||
|
|
f0bfbfe693 | ||
|
|
741cf07f2e | ||
|
|
5ff26e1ce8 | ||
|
|
342d977fe4 | ||
|
|
9c1011fbd8 | ||
|
|
daaf77a89f | ||
|
|
420600510d | ||
|
|
0ae9a7f42f | ||
|
|
a1cddfa18b | ||
|
|
89fe8e68f4 | ||
|
|
cd3b0607a5 | ||
|
|
0cde6f7dbc | ||
|
|
42943a33fe | ||
|
|
fc76822bdf | ||
|
|
05ad296b43 | ||
|
|
2e5b075d1b | ||
|
|
f47348106e | ||
|
|
f351447f09 | ||
|
|
10b2a8b4f9 | ||
|
|
afcd3e5693 | ||
|
|
7b5ce83cbd | ||
|
|
0cff804cd7 | ||
|
|
f4e6bf7fd5 | ||
|
|
ba4f277863 | ||
|
|
d35bd16543 | ||
|
|
065841530d | ||
|
|
28a73d2a6e | ||
|
|
bbf09c2ea9 | ||
|
|
8f9fae9210 | ||
|
|
0eba1da6c4 | ||
|
|
0ba8300959 | ||
|
|
f8ae7680ad | ||
|
|
d51f00d35d | ||
|
|
0f7a475ec9 | ||
|
|
d8b3331648 | ||
|
|
2816fedc36 | ||
|
|
17de9d98f4 | ||
|
|
b2f5eb8850 | ||
|
|
c821a2e463 | ||
|
|
66e8f83395 | ||
|
|
41ebceca8f | ||
|
|
632685672c | ||
|
|
bd2e4bb633 | ||
|
|
835633d44b | ||
|
|
75773e6b00 | ||
|
|
a21b9b5244 | ||
|
|
38bf76dc14 | ||
|
|
9461341104 | ||
|
|
5b5b2c6364 | ||
|
|
a006263e51 | ||
|
|
febdd38f7c | ||
|
|
1b4d335b09 | ||
|
|
725409a576 | ||
|
|
9b25cc51e4 | ||
|
|
9dcdb6b6e7 | ||
|
|
73b987358f | ||
|
|
84c2bf130c | ||
|
|
b25189feea | ||
|
|
a9b58a5564 | ||
|
|
530b20c633 | ||
|
|
fa0aeac10b | ||
|
|
1b661bb8cd | ||
|
|
530e8f7537 | ||
|
|
9e019a98f6 | ||
|
|
10c6cf9f7e | ||
|
|
480b238e44 | ||
|
|
32bdbc693a | ||
|
|
ab146b6b6b | ||
|
|
763929eafc | ||
|
|
711b3fee98 | ||
|
|
0d0592eee9 | ||
|
|
cc7948ba45 | ||
|
|
7e25b64689 | ||
|
|
d844cdadb5 | ||
|
|
e3b3f51e87 | ||
|
|
45efda7f1d | ||
|
|
db45c861e4 | ||
|
|
42f8e6a6d9 | ||
|
|
23a761226a | ||
|
|
6738dfe0d3 | ||
|
|
6e16b2eb0c | ||
|
|
707eb15465 | ||
|
|
8008099e71 | ||
|
|
79ccb96c95 | ||
|
|
bd76934e40 | ||
|
|
bb793a41fc | ||
|
|
ad048a92ed | ||
|
|
14d944ad2f | ||
|
|
e1b8b5696c | ||
|
|
78368e9979 | ||
|
|
e83bff6923 | ||
|
|
e6c12d81ea | ||
|
|
3a73d0c1b2 | ||
|
|
b524587a9a | ||
|
|
e4bd753355 | ||
|
|
30536cb04a | ||
|
|
da1efa9270 | ||
|
|
bd6f4b3f76 | ||
|
|
5e48d75ead | ||
|
|
bd46fcdc75 | ||
|
|
6968f9fa6b | ||
|
|
5225fd328d | ||
|
|
fa42474612 | ||
|
|
d2eda78af0 | ||
|
|
7a0ee6aac4 | ||
|
|
b327eedb45 | ||
|
|
a68e3ff9da | ||
|
|
0500dd2e35 | ||
|
|
cb43131ccb | ||
|
|
883e0ab115 | ||
|
|
b189160888 | ||
|
|
3dbb0de683 | ||
|
|
b38bc8a207 | ||
|
|
3328828da6 | ||
|
|
7fdabd90a5 | ||
|
|
d8452e98f5 | ||
|
|
dda2213593 | ||
|
|
04f995b80c | ||
|
|
a08f1e2512 | ||
|
|
af4849d6cc | ||
|
|
087675889f | ||
|
|
daa10617c0 | ||
|
|
c3b5c13cc5 | ||
|
|
1dd83645bd | ||
|
|
2df7c17bc1 | ||
|
|
a274349ace | ||
|
|
1c699fe307 | ||
|
|
f0a3e84e4f | ||
|
|
f87989d32e | ||
|
|
7355be9e3a | ||
|
|
d8f1e95e1a | ||
|
|
59eace702b | ||
|
|
8a24ba0252 | ||
|
|
03999a9d2c | ||
|
|
f335cb1775 | ||
|
|
b9c034469b | ||
|
|
ce3a82ddda | ||
|
|
5cbb38922c | ||
|
|
14f0afec08 | ||
|
|
769cc09906 | ||
|
|
306daf7591 | ||
|
|
d1c1132e6e | ||
|
|
962df859f1 | ||
|
|
97601280d1 | ||
|
|
ede42e99de | ||
|
|
47cae0134c | ||
|
|
33defab7df | ||
|
|
6b402e944b | ||
|
|
f8a6f4c5e5 | ||
|
|
adb999d3a9 | ||
|
|
f4ea23dd14 | ||
|
|
5bd0020e49 | ||
|
|
782e81568d | ||
|
|
2ecf83ddae | ||
|
|
de0982d590 | ||
|
|
e5755a2eec | ||
|
|
e755c34ab5 | ||
|
|
85e4f1a5ed | ||
|
|
3eb403a2c4 | ||
|
|
79442a6a6c | ||
|
|
f49001b742 | ||
|
|
e80ecfac8d | ||
|
|
ff67fba2c9 | ||
|
|
3f63831488 | ||
|
|
19babbc73d | ||
|
|
26a4d5474d | ||
|
|
af3e03230a | ||
|
|
551f04011a | ||
|
|
ea39a45f31 | ||
|
|
ebff5695ff | ||
|
|
9b63c1a515 | ||
|
|
de882dc62e | ||
|
|
8f9562d6a4 | ||
|
|
5d383ec39b | ||
|
|
2687fb187d | ||
|
|
ca43c0b4b2 | ||
|
|
71bbf59467 | ||
|
|
18f861f771 | ||
|
|
e85d59dfb0 | ||
|
|
78c8b60121 | ||
|
|
e22b5ed516 | ||
|
|
906f59a566 | ||
|
|
d1c3edfd9b | ||
|
|
e8a0f33bde | ||
|
|
825687f2a8 | ||
|
|
2852648a65 | ||
|
|
0f3f31ef45 | ||
|
|
864cf76c07 | ||
|
|
98e6c71bf8 | ||
|
|
aee9566bbb | ||
|
|
b61c0d6dee | ||
|
|
f963b3a000 | ||
|
|
03963b736a | ||
|
|
a34c375e2d | ||
|
|
e8eea9573e | ||
|
|
b7656d65e7 | ||
|
|
d1fa6dd03c | ||
|
|
2045bfaf78 | ||
|
|
653ada5f0f | ||
|
|
cbc000d35a | ||
|
|
11a676be83 | ||
|
|
7eedea8035 | ||
|
|
2d4ddea915 | ||
|
|
76d7a50fac | ||
|
|
84187eedc4 | ||
|
|
ee5c30934b | ||
|
|
b4b25d4300 | ||
|
|
9eb1dba4a1 | ||
|
|
285e274818 | ||
|
|
0077d109e7 | ||
|
|
9cd508a92a | ||
|
|
9ffd4def64 | ||
|
|
fdb6ac7575 | ||
|
|
64e2cfa35a | ||
|
|
39efca0d4c | ||
|
|
cd2942405a | ||
|
|
fadff34f5f | ||
|
|
7334bcdf83 | ||
|
|
e1e38f0404 | ||
|
|
38cc179068 | ||
|
|
5147d0d004 | ||
|
|
c237c9dbde | ||
|
|
34bd2c3031 | ||
|
|
6173f3b459 | ||
|
|
333b430b97 | ||
|
|
4c22d08da5 | ||
|
|
219f9871a7 | ||
|
|
80527d5985 | ||
|
|
7e5edd6387 | ||
|
|
4ca6a221e4 | ||
|
|
e5733a7f6e | ||
|
|
23b7936924 | ||
|
|
9be465a8cf | ||
|
|
4bbae673dc | ||
|
|
e66ee5d3f1 | ||
|
|
20872100d1 | ||
|
|
06f33ded10 | ||
|
|
adb5cd72b9 | ||
|
|
303429c52c | ||
|
|
1a92cc8543 | ||
|
|
d5cc617848 | ||
|
|
4af71b5b52 | ||
|
|
2dab89363d | ||
|
|
ab9f9a9679 | ||
|
|
c5166f07f1 | ||
|
|
86c2f8eda1 | ||
|
|
57d41e79c7 | ||
|
|
5cd9b8c22f | ||
|
|
56eba0d4fc | ||
|
|
7936d0063d | ||
|
|
3613fb3f69 | ||
|
|
608b2e31c7 | ||
|
|
2006827968 | ||
|
|
f6a3497b0c | ||
|
|
d7ef64746c | ||
|
|
b733b3615d | ||
|
|
e9fa3e3aa3 | ||
|
|
b77f796661 | ||
|
|
c077db1129 | ||
|
|
801c88a3e2 | ||
|
|
646d235c65 | ||
|
|
a86bed294e | ||
|
|
697f1f9c25 | ||
|
|
61065ee0b7 | ||
|
|
df65d3e2f6 | ||
|
|
6969cb0b9c | ||
|
|
7e81871118 | ||
|
|
ba80ade643 | ||
|
|
0401cf5fb9 | ||
|
|
53b431f100 | ||
|
|
1a082529c6 | ||
|
|
bf57290197 | ||
|
|
a815e71bfe | ||
|
|
cc0580301e | ||
|
|
5853bd1eeb | ||
|
|
ab93c53092 | ||
|
|
818c4fc9a2 | ||
|
|
fc7350b7e2 | ||
|
|
1e4018350f | ||
|
|
f017d609fb | ||
|
|
ccb6e72057 | ||
|
|
32ad9525a6 | ||
|
|
afedd4337b | ||
|
|
1f7acc7cf6 | ||
|
|
e6a5c19f0b | ||
|
|
8e07302ac3 | ||
|
|
0238431b96 | ||
|
|
3a7a4ccf30 | ||
|
|
9b843151fe | ||
|
|
19e275a17a | ||
|
|
49c6bb71a1 | ||
|
|
005295ac97 | ||
|
|
37a3aa75cc | ||
|
|
07243b206e | ||
|
|
f732f5c390 | ||
|
|
1da16a04fe | ||
|
|
e2da7c5f96 | ||
|
|
ca9ceda2f7 | ||
|
|
059416bb47 | ||
|
|
4196351e48 | ||
|
|
f02b972dc0 | ||
|
|
8398ac59a1 | ||
|
|
83403a1a1a | ||
|
|
620c113fae | ||
|
|
903500dcfa | ||
|
|
68d6993acd | ||
|
|
2c9f5062a9 | ||
|
|
d3f39ae06b | ||
|
|
f42f159785 | ||
|
|
bb7c8e9c85 | ||
|
|
663b6c7b4e | ||
|
|
1fa2124efd | ||
|
|
bcd1a339f9 | ||
|
|
c41e5d9c55 | ||
|
|
b5fa40047a | ||
|
|
caabeb065a | ||
|
|
d393f9ee9e | ||
|
|
eb509166ee | ||
|
|
0dfe77df37 | ||
|
|
46ecc2467b | ||
|
|
a5c1b8e15f | ||
|
|
54703c67c1 | ||
|
|
e863b84016 | ||
|
|
1a693f70ac | ||
|
|
a9de153c00 | ||
|
|
42217cf079 | ||
|
|
bca1e8140e | ||
|
|
ee95fabc47 | ||
|
|
67552c14af | ||
|
|
521bf211a2 | ||
|
|
8e77e19631 | ||
|
|
8b91a0546c | ||
|
|
715c71f9a5 | ||
|
|
1ec4a949b8 | ||
|
|
fc2388093d | ||
|
|
3a9bf17d7e | ||
|
|
a3002ce450 | ||
|
|
2515e8f598 | ||
|
|
dcc0db35b5 | ||
|
|
749adb56f8 | ||
|
|
f542ebecb4 | ||
|
|
b640963f65 | ||
|
|
8f5990c537 | ||
|
|
bf400547e1 | ||
|
|
4d9dec8511 | ||
|
|
1ac63e36df | ||
|
|
f36613227e | ||
|
|
d063dfd652 | ||
|
|
c9c9401b0b | ||
|
|
913f2f5077 | ||
|
|
336bafd6ce | ||
|
|
5e1a26b743 | ||
|
|
d9d5ca95df | ||
|
|
f1bb305cbc | ||
|
|
c467280170 | ||
|
|
deeee70807 | ||
|
|
07ade24ea1 | ||
|
|
8de272239e | ||
|
|
6e5a7035c8 | ||
|
|
632f206228 | ||
|
|
f04f1f828f | ||
|
|
4f91443957 | ||
|
|
0c1057d554 | ||
|
|
43936e21d9 | ||
|
|
949eded4ee | ||
|
|
84859d1b7c | ||
|
|
553ec724c2 | ||
|
|
207c90e26c | ||
|
|
64bbba7576 | ||
|
|
62dbd18ef8 | ||
|
|
55b0a20a4a | ||
|
|
29b74f85c5 | ||
|
|
ed49e03802 | ||
|
|
4711c848f8 | ||
|
|
33df825b73 | ||
|
|
89001dbb92 | ||
|
|
43e1dd0b0e | ||
|
|
f9cf111a86 | ||
|
|
99f8914830 | ||
|
|
6da877709d | ||
|
|
c4948dc11f | ||
|
|
3f243129a4 | ||
|
|
eb2cae7a77 | ||
|
|
a2bbcd3939 | ||
|
|
0650c4bc26 | ||
|
|
7c32bf97ae | ||
|
|
70aecc1f0c | ||
|
|
5bd5c7d2c5 | ||
|
|
d6dce4021d | ||
|
|
ccfdb99348 | ||
|
|
2ca712435a | ||
|
|
0af8e34a8f | ||
|
|
f2583e152a | ||
|
|
cf70bd2dc1 | ||
|
|
8f50af917f | ||
|
|
4bdde365cf | ||
|
|
7f1bc33eed | ||
|
|
d0d24aba4e | ||
|
|
0d68c0d683 | ||
|
|
e1ab735823 | ||
|
|
bb67a8cbbb | ||
|
|
c8a7ac7dc6 | ||
|
|
788a294200 | ||
|
|
f34935a634 | ||
|
|
a7331256fc | ||
|
|
8fa3941db9 | ||
|
|
ada120c1b9 | ||
|
|
72f7168893 | ||
|
|
75b70a26bd | ||
|
|
4433e5d8e5 | ||
|
|
351b2e1417 | ||
|
|
3c7dc5a49e | ||
|
|
9895231696 | ||
|
|
3fa3281c51 | ||
|
|
bbf11d0374 | ||
|
|
04ee696f6a | ||
|
|
ddbbe92a85 | ||
|
|
32ba5e1802 | ||
|
|
a1c6eb177a | ||
|
|
14d60264c7 | ||
|
|
f4d6abace7 | ||
|
|
a5e1717138 | ||
|
|
472a4d400b | ||
|
|
fda4786737 | ||
|
|
c3686579b2 | ||
|
|
f2dfb2f32d | ||
|
|
60ee9f1a15 | ||
|
|
f43d1af6a7 | ||
|
|
b631b4c7b7 | ||
|
|
e3aba0529f | ||
|
|
cf682feae9 | ||
|
|
03d798760c | ||
|
|
51450c2b02 | ||
|
|
751ddbb3f3 | ||
|
|
36b3620d0c | ||
|
|
fd3eb513ff | ||
|
|
af0aaddbfd | ||
|
|
b167170aa9 | ||
|
|
642ac3ebc4 | ||
|
|
69cceb4fc7 | ||
|
|
ac32e23e87 | ||
|
|
04de4ff606 | ||
|
|
27761566c9 | ||
|
|
3d93eda92d | ||
|
|
6943571a6d | ||
|
|
28994cb9da | ||
|
|
5866634b3f | ||
|
|
e3d91f1cc7 | ||
|
|
8ac06259f5 | ||
|
|
c8933a6669 | ||
|
|
6c2da264db | ||
|
|
993f01a301 | ||
|
|
9e29e7283c | ||
|
|
7da106798d | ||
|
|
b2e9cbb44a | ||
|
|
143f6df2c1 | ||
|
|
a64505fcc1 | ||
|
|
0aaf919827 | ||
|
|
bf8e988488 | ||
|
|
d26ea28028 | ||
|
|
abdd5e08a6 | ||
|
|
47a5ef915b | ||
|
|
5861508153 | ||
|
|
85754ccfb5 | ||
|
|
cbeea23295 | ||
|
|
e2d79a6802 | ||
|
|
c68d85096b | ||
|
|
fcafa83111 | ||
|
|
47d7418eb1 | ||
|
|
8751400ae3 | ||
|
|
3889c1fa71 | ||
|
|
a4d1d3b16c | ||
|
|
adfdf41e85 | ||
|
|
a6825f7ee3 | ||
|
|
830ee45161 | ||
|
|
5f7df3f871 | ||
|
|
34af730934 | ||
|
|
645801fe86 | ||
|
|
547f49a978 | ||
|
|
fd3d7a6f29 | ||
|
|
6be7140a47 | ||
|
|
ca7dc02d88 | ||
|
|
1924c45358 | ||
|
|
be92f92991 | ||
|
|
a9b909cca1 | ||
|
|
175b83dd68 | ||
|
|
df85284a60 | ||
|
|
17ffa93393 | ||
|
|
73c525127f | ||
|
|
3e76d7c321 | ||
|
|
9295f9cef3 | ||
|
|
9d1e6df8f0 | ||
|
|
0805d70c07 | ||
|
|
0133524f09 | ||
|
|
2c5100b2ed | ||
|
|
51296cdc15 | ||
|
|
f261bec248 | ||
|
|
97c7087f6c | ||
|
|
109906d083 | ||
|
|
81833c4938 | ||
|
|
1b6cfdbdc4 | ||
|
|
281d8bddc1 | ||
|
|
0eaa3aeeb7 | ||
|
|
4dcb0bcfed | ||
|
|
e69b7dfd6a | ||
|
|
38d63c71ee | ||
|
|
6880fd3f5f | ||
|
|
1771ca363a | ||
|
|
c896c88c23 | ||
|
|
5ef733729b | ||
|
|
f73e29937c | ||
|
|
8383547943 | ||
|
|
8070d3f1e6 | ||
|
|
a161fa953e | ||
|
|
471e1ae96f | ||
|
|
ed28bcdfb0 | ||
|
|
31ea81c211 | ||
|
|
283189a17c | ||
|
|
40020df865 | ||
|
|
aa6b5ec24f | ||
|
|
f53fe042a9 | ||
|
|
034a54bf4b | ||
|
|
894dd1e353 | ||
|
|
ca99db5a97 | ||
|
|
61e506010c | ||
|
|
4b4343a9fd | ||
|
|
9efacefba3 | ||
|
|
f288c9a9ad | ||
|
|
ec45f23485 | ||
|
|
1c11e73ff8 | ||
|
|
174f93fe11 | ||
|
|
6340f1fb54 | ||
|
|
febdc5b8e2 | ||
|
|
b5044b8753 | ||
|
|
00a60b8948 | ||
|
|
17ec70f839 | ||
|
|
ac03a93c64 | ||
|
|
5e8692eae5 | ||
|
|
2e56e93d83 | ||
|
|
11d0ff2ec3 | ||
|
|
8a59025132 | ||
|
|
5488a8ea82 | ||
|
|
18cb82a0fe | ||
|
|
f951358db4 | ||
|
|
a23162117c | ||
|
|
b13e7b89e2 | ||
|
|
2416fd1c71 | ||
|
|
2b7eb832ed | ||
|
|
1532f47da1 | ||
|
|
2fa20de631 | ||
|
|
b51e16bba8 | ||
|
|
8ae6c4fd7a | ||
|
|
53b51f0740 | ||
|
|
92b4be90d0 | ||
|
|
80a6658769 | ||
|
|
f0f4bd8bf2 | ||
|
|
e05b323489 | ||
|
|
7f198b64f1 | ||
|
|
1c87fef28d | ||
|
|
816c22979f | ||
|
|
42f9a27851 | ||
|
|
6a2d2dfdaf | ||
|
|
efd2088745 | ||
|
|
56e8e84eaf | ||
|
|
eccebae596 | ||
|
|
edc36283d9 | ||
|
|
2409cfefc9 | ||
|
|
fae73913de | ||
|
|
69f398c594 | ||
|
|
fe52238ac2 | ||
|
|
a3501e5417 | ||
|
|
52add26905 | ||
|
|
954b034b8b | ||
|
|
e5aa5ace15 | ||
|
|
a6c5ec8581 | ||
|
|
beb395ce32 | ||
|
|
bcfa80a2d5 | ||
|
|
96e5398ad1 | ||
|
|
4b748ee43a | ||
|
|
838e0f9910 | ||
|
|
548e1378f5 | ||
|
|
fb90d79eb3 | ||
|
|
3fb3381a19 | ||
|
|
60d0750695 | ||
|
|
ce9c31f368 | ||
|
|
d4d7148f16 | ||
|
|
b5aba6e007 | ||
|
|
2564fa7382 | ||
|
|
c07be7386c | ||
|
|
c400003ce9 | ||
|
|
d4ffd8e8e4 | ||
|
|
9a6b907c11 | ||
|
|
84d4c7a6f2 | ||
|
|
0497e2052d | ||
|
|
dc8e9e3fef | ||
|
|
518a593c2a | ||
|
|
f7168cc814 | ||
|
|
18217dadc3 | ||
|
|
559a4969c1 | ||
|
|
7bad6cd20a | ||
|
|
e3987c8aa3 | ||
|
|
a46286872d | ||
|
|
9bb7a125e3 | ||
|
|
3c196abccb | ||
|
|
2e8899dfef | ||
|
|
8337768c5a | ||
|
|
034b371ad4 | ||
|
|
1e68b75c68 | ||
|
|
ac1bf7c9bf | ||
|
|
d60e052f05 | ||
|
|
43b71c7532 | ||
|
|
8ee0a99323 | ||
|
|
50febc342c | ||
|
|
c98667245e | ||
|
|
76fdf8e501 | ||
|
|
6270226ead | ||
|
|
ed5afff5d7 | ||
|
|
5d8d38bdf0 | ||
|
|
88af879d31 | ||
|
|
91095f14fb | ||
|
|
65077088b6 | ||
|
|
47666b7193 | ||
|
|
353f73ed0b | ||
|
|
51ed9dab04 | ||
|
|
c8b0faf05d | ||
|
|
3d7609e3f5 | ||
|
|
d9611948d7 | ||
|
|
67053db9ba | ||
|
|
c831c19848 | ||
|
|
ced45bec65 | ||
|
|
13ded5595a | ||
|
|
dfc4a8d713 | ||
|
|
31b9bfa590 | ||
|
|
f93b3c7424 | ||
|
|
3d32ec7210 | ||
|
|
b108d4e287 | ||
|
|
d8ea86fde1 | ||
|
|
58e979bc45 | ||
|
|
d5acf92f8a | ||
|
|
ddd9b9ae97 | ||
|
|
f77bf37be8 | ||
|
|
fb8fcc5028 | ||
|
|
f80daf6cd4 | ||
|
|
092aeceb9d | ||
|
|
7542ac9d87 | ||
|
|
b27ebaaccf | ||
|
|
5b20a7edb8 | ||
|
|
48580cb5b0 | ||
|
|
7c79accda7 | ||
|
|
1182fdeb43 | ||
|
|
694ffb0a81 | ||
|
|
fe8ff2b180 | ||
|
|
ade1db5215 | ||
|
|
5269cbf862 | ||
|
|
d62e43790c | ||
|
|
5766a50bc2 | ||
|
|
c09503aad8 | ||
|
|
f6bc183972 | ||
|
|
a087677c6e | ||
|
|
529a2ecd81 | ||
|
|
3843d1bd3e | ||
|
|
6be7f6ad68 | ||
|
|
30c4fb8032 | ||
|
|
a7dee45720 | ||
|
|
f7c597d957 | ||
|
|
b89e7c6c3d | ||
|
|
0f7a619a34 | ||
|
|
5c1cb120e1 | ||
|
|
9f24e765be | ||
|
|
a23f9881ee | ||
|
|
80e85a571e | ||
|
|
82a412093e | ||
|
|
8986e84dfe | ||
|
|
b6136a092d | ||
|
|
939f46c7e6 | ||
|
|
dd8059693d | ||
|
|
afacd2a8a0 | ||
|
|
4755cf6a25 | ||
|
|
d3e58c85cf | ||
|
|
89a6d6a4c1 | ||
|
|
ecbfeb608b | ||
|
|
f8a8314476 | ||
|
|
b1d7bb9fd7 | ||
|
|
28a84a90cf | ||
|
|
067119eac7 | ||
|
|
3fa19cf977 | ||
|
|
5cbb5e7d40 | ||
|
|
f5c4749954 | ||
|
|
a3ee010286 | ||
|
|
7e8b5f1f63 | ||
|
|
eff88528d3 | ||
|
|
f83e49bd3d | ||
|
|
bd6c689d91 | ||
|
|
f9469a1ea3 | ||
|
|
c0d92fbdd5 | ||
|
|
2079fc1801 | ||
|
|
59d01a6bd9 | ||
|
|
4f29fe5040 | ||
|
|
455ae8aa05 | ||
|
|
db417e6a5f | ||
|
|
8d444f24f8 | ||
|
|
618cd667fc | ||
|
|
f4d5419ba1 | ||
|
|
0d80269e2d | ||
|
|
861e95673d | ||
|
|
997e4a1edd | ||
|
|
bfdf02f065 | ||
|
|
f658b9d6d9 | ||
|
|
671fce2961 | ||
|
|
93c9ffe109 | ||
|
|
17cd414dde | ||
|
|
3bc10291c4 | ||
|
|
8f6c1d0e47 | ||
|
|
f882fe2c32 | ||
|
|
b25644c590 | ||
|
|
626e29a001 | ||
|
|
dca7a6f270 | ||
|
|
05ef2b8eaa | ||
|
|
1819649a3a | ||
|
|
b8f58b2cc1 | ||
|
|
2ceefab18c | ||
|
|
254dd75cd0 | ||
|
|
6e87d66932 | ||
|
|
3a05d74a36 | ||
|
|
4b5f08ccc2 | ||
|
|
cc20050dc8 | ||
|
|
25cf439f03 | ||
|
|
2beae9ea5b | ||
|
|
64a1ab5c60 | ||
|
|
00ef7ab6ca | ||
|
|
08b3c9d1ac | ||
|
|
2287196746 | ||
|
|
9ac679d437 | ||
|
|
db0a5875fa | ||
|
|
38ff16f3cd | ||
|
|
ccbc36f991 | ||
|
|
b47b99bd28 | ||
|
|
55a922427b | ||
|
|
a5525c065c | ||
|
|
840b3c2a84 | ||
|
|
3cef5f0bff | ||
|
|
fa1463939e | ||
|
|
b31099c94d | ||
|
|
fc0899d9d3 | ||
|
|
a7170a4eee | ||
|
|
e04874d074 | ||
|
|
0fc570b138 | ||
|
|
5edbc1a7b5 | ||
|
|
a7cfa05504 | ||
|
|
c0988da176 | ||
|
|
12707793b1 | ||
|
|
06d6732ab2 | ||
|
|
ab6e98aae2 | ||
|
|
a2ef9d781d | ||
|
|
106ee43171 | ||
|
|
36d626c833 | ||
|
|
b0ac85d81d | ||
|
|
25d70b7b49 | ||
|
|
4c5946e8da | ||
|
|
4de1a38c00 | ||
|
|
caadc02fb4 | ||
|
|
3e691aa31f | ||
|
|
fd7ce9027a | ||
|
|
3fdde5f8c4 | ||
|
|
4c5eb721fb | ||
|
|
f3bdb03cae | ||
|
|
9b6112d206 | ||
|
|
beab0fa6f6 | ||
|
|
fa60cab587 | ||
|
|
05da6b3c50 | ||
|
|
0b12f4e6fd | ||
|
|
b9ddf29289 | ||
|
|
10e47b8305 | ||
|
|
0e1c9487f0 | ||
|
|
60f569dbf9 | ||
|
|
bdb803db21 | ||
|
|
634fab4d9f | ||
|
|
34a14865eb | ||
|
|
abcd3a30ce | ||
|
|
9f40bf6f5d | ||
|
|
8a98aef28c | ||
|
|
bb47b4475e | ||
|
|
1bb6c5fbfc | ||
|
|
35fe459420 | ||
|
|
d75ac45c33 | ||
|
|
9927da5088 | ||
|
|
295b4b3b72 | ||
|
|
8464e0ea3f | ||
|
|
4b73457f7f | ||
|
|
eedcf6f1fe | ||
|
|
5b130d9500 | ||
|
|
600f457bc2 | ||
|
|
e1959f74aa | ||
|
|
0f7d04e0b9 | ||
|
|
f91311144b | ||
|
|
529b3cb18f | ||
|
|
bcbefe29e7 | ||
|
|
1dd7037aa0 | ||
|
|
2c2e9396c4 | ||
|
|
69feb6a4f1 | ||
|
|
911b4b9138 | ||
|
|
21cd4b67f0 | ||
|
|
8c7eebe76c | ||
|
|
bb8b00e547 | ||
|
|
f8c7f88ac2 | ||
|
|
c6cc5810ca | ||
|
|
a89ff584fd | ||
|
|
11d824a88d | ||
|
|
f1ab927a7e | ||
|
|
9e0634f449 | ||
|
|
a9006f2954 | ||
|
|
3a021e7879 | ||
|
|
6ea8cc9986 | ||
|
|
4c77151877 | ||
|
|
ea34431cf7 | ||
|
|
7c546ed6b8 | ||
|
|
db53920153 | ||
|
|
c60015bd09 | ||
|
|
d2a3388058 | ||
|
|
384a75622f | ||
|
|
68a62d689c | ||
|
|
8f7968302d | ||
|
|
35a5733e82 | ||
|
|
f6bbbc56ba | ||
|
|
d1d601f028 | ||
|
|
bbb133d0f2 | ||
|
|
9671f57b65 | ||
|
|
d3212c8b49 | ||
|
|
1f01a5b1cc | ||
|
|
95f7f5535f | ||
|
|
8ae031dbbd | ||
|
|
4498f069f0 | ||
|
|
349b895ac5 | ||
|
|
794f27a3c8 | ||
|
|
1def9a6b19 | ||
|
|
cbf1e42c73 | ||
|
|
7c960bb899 | ||
|
|
1a1807df96 | ||
|
|
2d03f17bde | ||
|
|
8cbaa6b281 | ||
|
|
2c0ae66143 | ||
|
|
a54c160d83 | ||
|
|
61fb7b0d86 | ||
|
|
b3beae44df | ||
|
|
d1369e765a | ||
|
|
6185485c68 | ||
|
|
db733ac9ce | ||
|
|
f94fcf58a7 | ||
|
|
7487841385 | ||
|
|
289c4b497d | ||
|
|
c49bfb97dd | ||
|
|
4643dbce17 | ||
|
|
82e8c01b95 | ||
|
|
47ced11e03 | ||
|
|
04d35a3a83 | ||
|
|
1df3a0b8cb | ||
|
|
faa13f58e0 | ||
|
|
58fcc90417 | ||
|
|
0690612477 | ||
|
|
c0344b385a | ||
|
|
214c5998c6 | ||
|
|
b14c01f9f7 | ||
|
|
4a838e7bdb | ||
|
|
4a748e894d | ||
|
|
b576491156 | ||
|
|
17da790651 | ||
|
|
c599cab14a | ||
|
|
4240bad627 | ||
|
|
0017de7b21 | ||
|
|
53a4ebb66e | ||
|
|
5bfca0f86f | ||
|
|
9553aa944a | ||
|
|
35991ff5d6 | ||
|
|
42d703ca1d | ||
|
|
e089ddb223 | ||
|
|
c323b6a8a9 | ||
|
|
bf461f59de | ||
|
|
9974fa831c | ||
|
|
73e41b0de0 | ||
|
|
9aa297a804 | ||
|
|
5c1bcdbd74 | ||
|
|
8c4997fa37 | ||
|
|
d099a22bd9 | ||
|
|
0de0426f72 | ||
|
|
04d5b692b8 | ||
|
|
da6cdcef84 | ||
|
|
fbf2671eaf | ||
|
|
67e050bd6f | ||
|
|
8282f48cdb | ||
|
|
5d903de2a2 | ||
|
|
78deee2de3 | ||
|
|
a09403328e | ||
|
|
45e92e7b7a | ||
|
|
ebe8a40202 | ||
|
|
bd0747ff6f | ||
|
|
b37ec98e17 | ||
|
|
a93db0a038 | ||
|
|
08f9029bf8 | ||
|
|
fb9d2d99d4 | ||
|
|
a374d4d40f | ||
|
|
fb4666195c | ||
|
|
39b6c00c6d | ||
|
|
decb3ef2f1 | ||
|
|
2a9c501ee2 | ||
|
|
60d25a18fb | ||
|
|
39a71d51cf | ||
|
|
5c401f3858 | ||
|
|
cc45ec85fd | ||
|
|
1d66becff5 | ||
|
|
2a4ebcaf9c | ||
|
|
1a792254ca | ||
|
|
d9319f5734 | ||
|
|
81d96fe3a9 | ||
|
|
39fff0e57d | ||
|
|
95058f7890 | ||
|
|
472ef1a231 | ||
|
|
d7de302393 | ||
|
|
e4b1dfc77a | ||
|
|
aed7267253 | ||
|
|
a24b7433a5 | ||
|
|
0b423a6fe0 | ||
|
|
cb98812444 | ||
|
|
b4e30565d2 | ||
|
|
9f40e2c71e | ||
|
|
fb0a2798e7 | ||
|
|
9912b5037d | ||
|
|
bca56bfaad | ||
|
|
542f048a67 | ||
|
|
91c5e7e06c | ||
|
|
972ee69fac | ||
|
|
00c9ef47e9 | ||
|
|
dcad5f4b5f | ||
|
|
e74cda3c0f | ||
|
|
bafbb39883 | ||
|
|
02391e66dc | ||
|
|
762ab30c71 | ||
|
|
6ce6a932e1 | ||
|
|
e7de1896ea | ||
|
|
4391705c9a | ||
|
|
b40bf76270 | ||
|
|
f44aee0af4 | ||
|
|
57a1af9392 | ||
|
|
b16ae64105 | ||
|
|
0912d583c7 | ||
|
|
6eff89aca1 | ||
|
|
6e5e195a30 | ||
|
|
e3efda2764 | ||
|
|
5360c3dbaf | ||
|
|
f6427c50f2 | ||
|
|
22035d1383 | ||
|
|
85949c5927 | ||
|
|
dde746a5fe | ||
|
|
c2ae30575e | ||
|
|
cb5d9f626e | ||
|
|
c6d82409a8 | ||
|
|
fef5d0e688 | ||
|
|
f64e696f7a | ||
|
|
acf99a6a9e | ||
|
|
a76560c38a | ||
|
|
e1eec66e04 | ||
|
|
96d1ee2347 | ||
|
|
2a06463d07 | ||
|
|
899862dc57 | ||
|
|
c8d585889b | ||
|
|
d044423330 | ||
|
|
273a9a5e66 | ||
|
|
0294e0d2b3 | ||
|
|
38daa0826e | ||
|
|
b9e8dea5d9 | ||
|
|
241930cefe | ||
|
|
bed3684a0c | ||
|
|
e1bb684c4c | ||
|
|
4c75a5b421 | ||
|
|
20f809740c | ||
|
|
83294abaf0 | ||
|
|
687dabc777 | ||
|
|
605d6f0f9b | ||
|
|
b1d13f5a71 | ||
|
|
50c740d219 | ||
|
|
a7456d1182 | ||
|
|
804cbb8c56 | ||
|
|
cb13f66b3d | ||
|
|
ec2cd29096 | ||
|
|
412c6dadca | ||
|
|
1ac3768468 | ||
|
|
e622636686 | ||
|
|
2ddeca8f9d | ||
|
|
d1a80e1a64 | ||
|
|
4cfe41ca9e | ||
|
|
cd1d3005e9 | ||
|
|
435161854c | ||
|
|
890287ce72 | ||
|
|
0cc2a40f26 | ||
|
|
849150c9ab | ||
|
|
75ac74ca5e | ||
|
|
9822479d24 | ||
|
|
c456f63e8c | ||
|
|
51ae3a16bd | ||
|
|
bd418b23dc | ||
|
|
af789ee886 | ||
|
|
324bd57e3d | ||
|
|
146bcdcf1c | ||
|
|
60c92b8a98 | ||
|
|
230120fff5 | ||
|
|
ba76498acc | ||
|
|
5e0772fae9 | ||
|
|
7fcd005f06 | ||
|
|
961d420c95 | ||
|
|
a42df69a7f | ||
|
|
59d2c5ae3c | ||
|
|
a6f0f554f0 | ||
|
|
c8c22b3f22 | ||
|
|
67febd3e25 | ||
|
|
dde937f460 | ||
|
|
c3473673da | ||
|
|
f24aef300b | ||
|
|
84e0c46711 | ||
|
|
16e2ac5b6c | ||
|
|
01214077d3 | ||
|
|
1e3957bdd5 | ||
|
|
8e7fa486db | ||
|
|
a72088b7a8 | ||
|
|
419f1e07d1 | ||
|
|
e05ec3d2d5 | ||
|
|
22f90a505c | ||
|
|
66e506db07 | ||
|
|
fa4041e560 | ||
|
|
f8a8225b8c | ||
|
|
75636b2575 | ||
|
|
e44cc4c145 | ||
|
|
343ada135d | ||
|
|
93a6a77c2b | ||
|
|
8bc67b323c | ||
|
|
f684a3b0ae | ||
|
|
5f2115fff6 | ||
|
|
9d654bcd66 | ||
|
|
5f8e72c6ae | ||
|
|
5dde5cae50 | ||
|
|
f730548c8f | ||
|
|
a185bd9463 | ||
|
|
abdc78e123 | ||
|
|
ba49fa6c88 | ||
|
|
870ffa9dc1 | ||
|
|
8afaf1a60e | ||
|
|
6974ac8e14 | ||
|
|
9f274ee17e | ||
|
|
673bcde719 | ||
|
|
6eaf5bb463 | ||
|
|
b463eedb3f | ||
|
|
90350f99ad | ||
|
|
8576015633 | ||
|
|
f5edf39027 | ||
|
|
751781e3e5 | ||
|
|
bc9129bcbe | ||
|
|
c442a33d5e | ||
|
|
902bb06353 | ||
|
|
a0a1b8b3e8 | ||
|
|
eb5cf9da8d | ||
|
|
57386eeb55 | ||
|
|
33a21f2aaa | ||
|
|
d6fd498489 | ||
|
|
386f2969eb | ||
|
|
2fea3a4b40 | ||
|
|
b9c9fe7a97 | ||
|
|
594c4cd670 | ||
|
|
e10c5e28b5 | ||
|
|
fbefb2014d | ||
|
|
909da7edb5 | ||
|
|
349676d908 | ||
|
|
a47f7cc0ce | ||
|
|
8fbdb884c7 | ||
|
|
ec68ce082e | ||
|
|
2b61e3dfd3 | ||
|
|
4c3dddc486 | ||
|
|
ecc683a6bd | ||
|
|
7b2098cf33 | ||
|
|
3784d86344 | ||
|
|
2b22481443 | ||
|
|
c041d768b2 | ||
|
|
5df6154abe | ||
|
|
1fed02d23f | ||
|
|
2d34d07da4 | ||
|
|
ea25291d75 | ||
|
|
5f77a0082c | ||
|
|
3978ec683d | ||
|
|
458f467985 | ||
|
|
69ffdd4604 | ||
|
|
5c2503b2a8 | ||
|
|
bc921ff835 | ||
|
|
197488bff6 | ||
|
|
e48d21c8cb | ||
|
|
7e992fad99 | ||
|
|
49c0467428 | ||
|
|
7e985991cd | ||
|
|
cc7d2ded6c | ||
|
|
f813f56c1f | ||
|
|
a698c65a07 | ||
|
|
3cd96ba2e8 | ||
|
|
0652f850d6 | ||
|
|
3ab29f9e01 | ||
|
|
b041cdc766 | ||
|
|
c04b9342b8 | ||
|
|
1abaa164f5 | ||
|
|
4f4f00f0c8 | ||
|
|
2e5f0d9210 | ||
|
|
af077c4706 | ||
|
|
a5cebb88ef | ||
|
|
6baf8f08c8 |
@@ -1,2 +1,4 @@
|
|||||||
PORT=9000
|
PORT=9000
|
||||||
UMI_DEV_SERVER_COMPRESS=none
|
UMI_DEV_SERVER_COMPRESS=none
|
||||||
|
DID_YOU_KNOW=none
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
extends: require.resolve('@umijs/max/eslint'),
|
|
||||||
rules: {
|
|
||||||
'react/no-unstable-nested-components': 1,
|
|
||||||
'no-unused-vars': 'off',
|
|
||||||
'@typescript-eslint/no-unused-vars': 'off',
|
|
||||||
'@typescript-eslint/class-name-casing': 'off'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -4,14 +4,16 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- 'main'
|
- 'main'
|
||||||
|
- 'v*-dev'
|
||||||
tags:
|
tags:
|
||||||
- '*.*.*'
|
- '*.*.*'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- 'main'
|
- 'main'
|
||||||
|
- 'v*-dev'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
NODE_VERSION: '21'
|
NODE_VERSION: '22'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deps:
|
deps:
|
||||||
@@ -30,7 +32,7 @@ jobs:
|
|||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '${{ env.NODE_VERSION }}'
|
node-version-file: '.nvmrc'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
- name: Deps
|
- name: Deps
|
||||||
run: scripts/deps
|
run: scripts/deps
|
||||||
@@ -72,11 +74,6 @@ jobs:
|
|||||||
if: github.event_name == 'push'
|
if: github.event_name == 'push'
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
version: ['latest', '${{ github.ref_name }}']
|
|
||||||
exclude:
|
|
||||||
- version: 'main'
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -92,10 +89,23 @@ jobs:
|
|||||||
${{ github.workspace }}/node_modules
|
${{ github.workspace }}/node_modules
|
||||||
- name: Build
|
- name: Build
|
||||||
run: scripts/build
|
run: scripts/build
|
||||||
|
- name: Determine Version
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then
|
||||||
|
echo "version=latest" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then
|
||||||
|
echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
|
||||||
|
elif [[ "${GITHUB_REF}" == refs/heads/v*-dev ]]; then
|
||||||
|
echo "version=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "Not a publish target"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
- name: Package
|
- name: Package
|
||||||
run: scripts/package
|
run: scripts/package
|
||||||
env:
|
env:
|
||||||
VERSION: '${{ matrix.version }}'
|
VERSION: '${{ steps.version.outputs.version }}'
|
||||||
- name: Release
|
- name: Release
|
||||||
uses: TencentCloud/cos-action@b0aa648235fb35a1bdd6a77f529eb0ac4c2f1c25
|
uses: TencentCloud/cos-action@b0aa648235fb35a1bdd6a77f529eb0ac4c2f1c25
|
||||||
with:
|
with:
|
||||||
@@ -103,7 +113,7 @@ jobs:
|
|||||||
secret_key: ${{ secrets.CI_TECENTCOS_SECRET_KEY }}
|
secret_key: ${{ secrets.CI_TECENTCOS_SECRET_KEY }}
|
||||||
cos_bucket: ${{ secrets.COS_BUCKET }}
|
cos_bucket: ${{ secrets.COS_BUCKET }}
|
||||||
cos_region: ${{ secrets.COS_REGION }}
|
cos_region: ${{ secrets.COS_REGION }}
|
||||||
local_path: dist/${{ matrix.version }}.tar.gz
|
local_path: dist/${{ steps.version.outputs.version }}.tar.gz
|
||||||
remote_path: releases/${{ matrix.version }}.tar.gz
|
remote_path: releases/${{ steps.version.outputs.version }}.tar.gz
|
||||||
accelerate: true
|
accelerate: true
|
||||||
clean: false
|
clean: false
|
||||||
|
|||||||
@@ -12,3 +12,7 @@
|
|||||||
/.mfsu
|
/.mfsu
|
||||||
.swc
|
.swc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
.idea
|
||||||
|
.claude
|
||||||
|
/dist.zip
|
||||||
|
.cache
|
||||||
@@ -1 +1,2 @@
|
|||||||
npx --no-install lint-staged --quiet
|
|
||||||
|
npx lint-staged
|
||||||
|
|||||||
@@ -1,17 +1,11 @@
|
|||||||
{
|
{
|
||||||
"*.{md,json}": [
|
"*.{md,json}": ["prettier --cache --write"],
|
||||||
"prettier --cache --write"
|
"*.{js,jsx}": ["max lint --fix --eslint-only", "prettier --cache --write"],
|
||||||
],
|
"*.{css,less}": ["prettier --cache --write"],
|
||||||
"*.{js,jsx}": [
|
"!public/vs/**": [],
|
||||||
"max lint --fix --eslint-only",
|
|
||||||
"prettier --cache --write"
|
|
||||||
],
|
|
||||||
"*.{css,less}": [
|
|
||||||
"max lint --fix --stylelint-only",
|
|
||||||
"prettier --cache --write"
|
|
||||||
],
|
|
||||||
"*.ts?(x)": [
|
"*.ts?(x)": [
|
||||||
"max lint --fix --eslint-only",
|
"max lint --fix --eslint-only",
|
||||||
"prettier --cache --parser=typescript --write"
|
"prettier --cache --parser=typescript --write"
|
||||||
]
|
],
|
||||||
|
"src/locales/**/*.ts": ["node --import tsx src/locales/check.ts"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
node_modules
|
node_modules
|
||||||
.umi
|
.umi
|
||||||
.umi-production
|
.umi-production
|
||||||
|
public/static/*.js
|
||||||
|
public/static/*.css
|
||||||
|
src/components/iconfont/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,5 +2,6 @@ module.exports = {
|
|||||||
extends: require.resolve('@umijs/max/stylelint'),
|
extends: require.resolve('@umijs/max/stylelint'),
|
||||||
rules: {
|
rules: {
|
||||||
'selector-class-pattern': null
|
'selector-class-pattern': null
|
||||||
}
|
},
|
||||||
|
ignoreFiles: ['public/static/*.css', 'src/components/iconfont/iconfont.css']
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,265 @@
|
|||||||
|
# React State and Request Patterns
|
||||||
|
|
||||||
|
These guidelines define preferred patterns for request handling, state updates, and side-effect management in React applications.
|
||||||
|
|
||||||
|
The primary goal is to keep data flow explicit, predictable, maintainable, and performant while avoiding unnecessary rerenders and effect-driven logic.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Avoid Effect-Driven Requests
|
||||||
|
|
||||||
|
Do not use request functions themselves as dependencies in `useEffect`.
|
||||||
|
|
||||||
|
Avoid patterns like:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
useEffect(() => {
|
||||||
|
fetchData();
|
||||||
|
}, [fetchData]);
|
||||||
|
```
|
||||||
|
|
||||||
|
Requests should be triggered explicitly by user actions or lifecycle entry points.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Form Requests Should Be Action-Driven
|
||||||
|
|
||||||
|
For form-related requests (such as loading `Select` options):
|
||||||
|
|
||||||
|
- Fetch data when the form is opened for the first time.
|
||||||
|
- If later requests depend on user interactions, trigger them directly inside the interaction handler.
|
||||||
|
- Do not rely on `useEffect` dependency changes to trigger requests.
|
||||||
|
|
||||||
|
Recommended:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const handleOnChange = (value) => {
|
||||||
|
fetchData(value);
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Avoid:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
useEffect(() => {
|
||||||
|
fetchData(value);
|
||||||
|
}, [value]);
|
||||||
|
```
|
||||||
|
|
||||||
|
The action itself should control the request.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Update Related States Together
|
||||||
|
|
||||||
|
If a single action updates multiple related states:
|
||||||
|
|
||||||
|
- Do not synchronize them through `useEffect`
|
||||||
|
- Do not derive them indirectly through `useMemo`
|
||||||
|
|
||||||
|
Instead, update all related states directly inside the action handler.
|
||||||
|
|
||||||
|
Recommended:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const handleOnChange = (value) => {
|
||||||
|
setState1(...);
|
||||||
|
setState2(...);
|
||||||
|
buildState(...);
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Avoid implicit state synchronization chains.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Group Strongly Related State
|
||||||
|
|
||||||
|
If multiple states are always updated together:
|
||||||
|
|
||||||
|
- Do not split them into multiple `useState` calls.
|
||||||
|
- Prefer a single state object.
|
||||||
|
|
||||||
|
Recommended:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const [state, setState] = useState({
|
||||||
|
state1: ...,
|
||||||
|
state2: ...,
|
||||||
|
state3: ...,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
This reduces unnecessary rerenders and keeps state transitions predictable.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Prefer Explicit State Flow
|
||||||
|
|
||||||
|
Avoid chaining business logic through multiple `useEffect` hooks.
|
||||||
|
|
||||||
|
Keep:
|
||||||
|
|
||||||
|
- request execution
|
||||||
|
- state updates
|
||||||
|
- derived calculations
|
||||||
|
|
||||||
|
close to the triggering action whenever possible.
|
||||||
|
|
||||||
|
Prefer:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const handleAction = () => {
|
||||||
|
fetchData();
|
||||||
|
setTableData(...);
|
||||||
|
setSelectedRow(...);
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Over:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
useEffect(() => {
|
||||||
|
buildTable();
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
updateSelection();
|
||||||
|
}, [tableData]);
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Avoid Premature Memoization
|
||||||
|
|
||||||
|
Do not use `useMemo` or `useCallback` unless there is a confirmed rendering or computation bottleneck.
|
||||||
|
|
||||||
|
Overusing memoization:
|
||||||
|
|
||||||
|
- increases complexity
|
||||||
|
- makes state flow harder to understand
|
||||||
|
- may introduce stale dependency issues
|
||||||
|
|
||||||
|
Prefer simple and explicit logic first.
|
||||||
|
|
||||||
|
Optimize only when necessary.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Keep Request Logic Predictable
|
||||||
|
|
||||||
|
A user interaction should clearly show:
|
||||||
|
|
||||||
|
- what request is triggered
|
||||||
|
- which states are updated
|
||||||
|
- how the UI changes
|
||||||
|
|
||||||
|
Avoid indirect update chains caused by dependency-driven effects.
|
||||||
|
|
||||||
|
The code should make the request and update flow easy to trace.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Prefer Action-Driven Architecture
|
||||||
|
|
||||||
|
Prefer:
|
||||||
|
|
||||||
|
- action-driven updates
|
||||||
|
- explicit handlers
|
||||||
|
- localized state transitions
|
||||||
|
|
||||||
|
Over:
|
||||||
|
|
||||||
|
- effect-driven synchronization
|
||||||
|
- cross-hook implicit updates
|
||||||
|
- reactive chains between states
|
||||||
|
|
||||||
|
The triggering action should remain the primary source of truth for UI updates.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Form
|
||||||
|
|
||||||
|
Form-specific patterns that build on the rules above. The theme: keep cascading selections (pick A → derive B → write form) on a single, predictable path.
|
||||||
|
|
||||||
|
## 1. No Fallback for Derived Selection
|
||||||
|
|
||||||
|
When "pick A then auto-pick B", match by rule and return `undefined` if no match — let the corresponding form field stay empty.
|
||||||
|
|
||||||
|
Do not silently fall back to `list[0]` or another default. A fallback hides data issues and tricks the user into thinking they have a valid selection.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const findB = (key, list) =>
|
||||||
|
key ? list.find((x) => x.key === key) : undefined;
|
||||||
|
```
|
||||||
|
|
||||||
|
For form fields, prefer clearing with `undefined` over `''`. With Ant Design, `undefined` restores the placeholder; `''` is treated as a real value.
|
||||||
|
|
||||||
|
## 2. Async Race Protection
|
||||||
|
|
||||||
|
For fetches triggered by a lifecycle entry (e.g., modal open), tag each invocation with a session ref. Discard stale results if the session has rotated (the modal was closed and re-opened) by the time the response arrives.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const sessionRef = useRef(0);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!open) {
|
||||||
|
sessionRef.current += 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const session = ++sessionRef.current;
|
||||||
|
Promise.all([fetchA(), fetchB()]).then(([as, bs]) => {
|
||||||
|
if (sessionRef.current !== session) return;
|
||||||
|
applySelection(as.items[0], findB(as.items[0].key, bs.items));
|
||||||
|
});
|
||||||
|
}, [open]);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Reference Template
|
||||||
|
|
||||||
|
A typical form with two cascading selectors backed by a single shared state:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
type Selection = { a?: string; b?: number };
|
||||||
|
|
||||||
|
const [selection, setSelection] = useState<Selection>({});
|
||||||
|
const sessionRef = useRef(0);
|
||||||
|
|
||||||
|
const findB = (key, list) =>
|
||||||
|
key ? list.find((x) => x.key === key) : undefined;
|
||||||
|
|
||||||
|
// Single atomic write: state + form together.
|
||||||
|
const applySelection = (a, b) => {
|
||||||
|
setSelection({ a: a.name, b: b?.id });
|
||||||
|
form.current?.setFieldsValue({
|
||||||
|
field: b?.field,
|
||||||
|
spec: { ...currentSpec, ...b?.spec }
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Trigger 1: modal opened
|
||||||
|
useEffect(() => {
|
||||||
|
if (!open) {
|
||||||
|
sessionRef.current++;
|
||||||
|
setSelection({});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const session = ++sessionRef.current;
|
||||||
|
Promise.all([fetchA(), fetchB()]).then(([as, bs]) => {
|
||||||
|
if (sessionRef.current !== session) return;
|
||||||
|
const first = as.items[0];
|
||||||
|
applySelection(first, findB(first.key, bs.items));
|
||||||
|
});
|
||||||
|
}, [open]);
|
||||||
|
|
||||||
|
// Trigger 2: user picks A
|
||||||
|
const handleAChange = (a) => {
|
||||||
|
applySelection(a, findB(a.key, listB));
|
||||||
|
};
|
||||||
|
|
||||||
|
// Trigger 3: user picks B
|
||||||
|
const handleBChange = (b) => {
|
||||||
|
setSelection((prev) => ({ ...prev, b: b.id }));
|
||||||
|
form.current?.setFieldsValue({ ...b.fields });
|
||||||
|
};
|
||||||
|
```
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# Agent Instructions
|
||||||
|
|
||||||
|
This project keeps a single source of truth for agent/contributor conventions in [`CLAUDE.md`](./CLAUDE.md). **Read [`CLAUDE.md`](./CLAUDE.md) and follow it.**
|
||||||
|
|
||||||
|
@CLAUDE.md
|
||||||
|
|
||||||
|
## Downstream fork workflow
|
||||||
|
|
||||||
|
This repo is a **downstream fork** that customizes the product appearance on top of upstream `gpustack/gpustack-ui`. The mirror chain is:
|
||||||
|
|
||||||
|
```
|
||||||
|
upstream https://github.com/gpustack/gpustack-ui.git
|
||||||
|
| (fetch)
|
||||||
|
origin ssh://git@192.168.0.23:11022/root/gpustack-ui.git (private registry, also https://git.digiman.live)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Goal
|
||||||
|
|
||||||
|
Track upstream releases. When upstream changes, we pull it in, then apply our own appearance/customization changes on a dedicated branch so we keep our look-and-feel on top of the latest upstream product.
|
||||||
|
|
||||||
|
### Branch naming
|
||||||
|
|
||||||
|
Customization work lives on `v<upstream-version>-lofyer` branches (e.g. `v2.2.0-lofyer`). Each time upstream ships a new version we want to follow, create a new `v<version>-lofyer` branch from the corresponding upstream tag/branch and re-apply (or rebase) our customizations onto it.
|
||||||
|
|
||||||
|
### Syncing from upstream
|
||||||
|
|
||||||
|
`scripts/sync-github` mirrors upstream into the private `origin` (full mirror, force push of all branches + tags). It auto-configures the `upstream` remote on first run.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# preview only, no push
|
||||||
|
DRY_RUN=1 ./scripts/sync-github
|
||||||
|
|
||||||
|
# real sync (force-pushes every upstream branch + tag to origin)
|
||||||
|
./scripts/sync-github
|
||||||
|
|
||||||
|
# also delete origin branches that no longer exist upstream (true mirror, destructive)
|
||||||
|
PRUNE_BRANCHES=1 ./scripts/sync-github
|
||||||
|
```
|
||||||
|
|
||||||
|
Env knobs: `UPSTREAM_URL`, `ORIGIN_REMOTE`, `UPSTREAM_REMOTE`, `PRUNE_BRANCHES`, `DRY_RUN`. After syncing, branch a fresh `v<version>-lofyer` off the updated upstream ref and apply the appearance changes there.
|
||||||
|
|
||||||
|
### Re-applying brand customizations
|
||||||
|
|
||||||
|
`scripts/rebrand` swaps the standalone brand word `GPUStack` for our brand (`MesaStack`) across user-facing text. It is the first appearance change to re-apply on every new `v<version>-lofyer` branch.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# preview hits, no writes
|
||||||
|
DRY_RUN=1 ./scripts/rebrand
|
||||||
|
|
||||||
|
# apply (default GPUStack -> MesaStack)
|
||||||
|
./scripts/rebrand
|
||||||
|
|
||||||
|
# custom brand words
|
||||||
|
FROM=GPUStack TO=AcmeStack ./scripts/rebrand
|
||||||
|
```
|
||||||
|
|
||||||
|
It deliberately **does not** touch functional references — lowercase `gpustack` (npm pkg / URLs / paths / k8s namespace), ALL-CAPS `GPUSTACK_*` constants, JS identifiers like `getGPUStackPlugin`, and `X-*` HTTP headers — and carries a line-level skip list for backend-contract strings matched at runtime (see `SKIP_LINE_PATTERNS` in the script). Always review `git diff` afterwards. Logo images under `src/assets/images/` are NOT changed by the script — replace those PNGs separately when new brand assets are available.
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
## Create form table list
|
||||||
|
|
||||||
|
## Create a form
|
||||||
|
|
||||||
|
## StatusTag
|
||||||
|
|
||||||
|
Use `StatusTag` from `@gpustack/core-ui` for status display. Do not use `Tag` from `antd` directly.
|
||||||
|
|
||||||
|
1. Define the mapping from business status values to UI status values in the module's `config/index.ts`:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { StatusMaps } from '@/config';
|
||||||
|
import { StatusType } from '@/config/types';
|
||||||
|
|
||||||
|
export const XxxStatusValueMap = {
|
||||||
|
Running: 'running',
|
||||||
|
Pending: 'pending',
|
||||||
|
Failed: 'failed'
|
||||||
|
};
|
||||||
|
|
||||||
|
export const XxxStatusLabelMap: Record<string, string> = {
|
||||||
|
[XxxStatusValueMap.Running]: 'Running',
|
||||||
|
[XxxStatusValueMap.Pending]: 'Pending',
|
||||||
|
[XxxStatusValueMap.Failed]: 'Failed'
|
||||||
|
};
|
||||||
|
|
||||||
|
export const status: Record<string, StatusType> = {
|
||||||
|
[XxxStatusValueMap.Running]: StatusMaps.success,
|
||||||
|
[XxxStatusValueMap.Pending]: StatusMaps.transitioning,
|
||||||
|
[XxxStatusValueMap.Failed]: StatusMaps.error
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
2. In table columns, pass only the UI status value and display text required by `StatusTag`:
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
<StatusTag
|
||||||
|
statusValue={{
|
||||||
|
status: status[value],
|
||||||
|
text: XxxStatusLabelMap[value] || value,
|
||||||
|
message: record.state_message
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
|
`statusValue.status` must be a value mapped from `StatusMaps`, such as `success`, `transitioning`, `warning`, `error`, or `inactive`. Do not pass business status values such as `running` or `pending` directly.
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Copyright (c) 2024 The GPUStack authors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# MesaStack UI
|
||||||
|
|
||||||
|
UI for [MesaStack](https://github.com/gpustack/gpustack).
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
1. [Nodejs](https://nodejs.org/en) 16.0+(with NPM)
|
1. [Nodejs](https://nodejs.org/en) 16.0+(with NPM)
|
||||||
@@ -40,3 +44,12 @@ npm run dev
|
|||||||
```
|
```
|
||||||
npm run build
|
npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Bugs & Issues
|
||||||
|
|
||||||
|
- Please submit [bugs and issues](https://github.com/gpustack/gpustack/issues) with a label `ui`
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- Official website: https://gpustack.ai/
|
||||||
|
- Documents: https://docs.gpustack.ai/latest/overview/
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { defineConfig } from '@umijs/max';
|
import { defineConfig } from '@umijs/max';
|
||||||
|
import keepAlive from './keep-alive';
|
||||||
|
import { extraMfsuExclude } from './mfsu.extensions';
|
||||||
|
import { compressionPluginConfig, monacoPluginConfig } from './plugins';
|
||||||
import proxy from './proxy';
|
import proxy from './proxy';
|
||||||
import routes from './routes';
|
import routes from './routes';
|
||||||
import theme from './theme';
|
|
||||||
import { getBranchInfo } from './utils';
|
import { getBranchInfo } from './utils';
|
||||||
const CompressionWebpackPlugin = require('compression-webpack-plugin');
|
|
||||||
|
|
||||||
const versionInfo = getBranchInfo();
|
const versionInfo = getBranchInfo();
|
||||||
process.env.VERSION = JSON.stringify(versionInfo);
|
process.env.VERSION = JSON.stringify(versionInfo);
|
||||||
@@ -14,11 +15,26 @@ const isProduction = env === 'production';
|
|||||||
const t = Date.now();
|
const t = Date.now();
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
proxy: {
|
proxy: {
|
||||||
...proxy('http://192.168.50.166:8080')
|
...proxy(process.env.PROXY_HOST)
|
||||||
},
|
},
|
||||||
history: {
|
history: {
|
||||||
type: 'hash'
|
type: 'hash'
|
||||||
},
|
},
|
||||||
|
define: {
|
||||||
|
'process.env.ENABLE_ENTERPRISE': process.env.ENABLE_ENTERPRISE
|
||||||
|
},
|
||||||
|
analyze: {
|
||||||
|
analyzerMode: 'server',
|
||||||
|
analyzerPort: 8888,
|
||||||
|
openAnalyzer: true,
|
||||||
|
generateStatsFile: false,
|
||||||
|
statsFilename: 'stats.json',
|
||||||
|
logLevel: 'info',
|
||||||
|
defaultSizes: 'parsed' // stat // gzip
|
||||||
|
},
|
||||||
|
mfsu: {
|
||||||
|
exclude: ['lodash', 'ml-pca', ...extraMfsuExclude]
|
||||||
|
},
|
||||||
base: process.env.npm_config_base || '/',
|
base: process.env.npm_config_base || '/',
|
||||||
...(isProduction
|
...(isProduction
|
||||||
? {
|
? {
|
||||||
@@ -44,38 +60,33 @@ export default defineConfig({
|
|||||||
config.output
|
config.output
|
||||||
.filename(`js/[name].${t}.js`)
|
.filename(`js/[name].${t}.js`)
|
||||||
.chunkFilename(`js/[name].${t}.chunk.js`);
|
.chunkFilename(`js/[name].${t}.chunk.js`);
|
||||||
config
|
compressionPluginConfig(config);
|
||||||
.plugin('compression-webpack-plugin')
|
monacoPluginConfig(config);
|
||||||
.use(CompressionWebpackPlugin, [
|
|
||||||
{
|
|
||||||
filename: '[path][base].gz',
|
|
||||||
algorithm: 'gzip',
|
|
||||||
test: /\.(js|css|html|svg)$/,
|
|
||||||
threshold: 10240,
|
|
||||||
minRatio: 0.8
|
|
||||||
}
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
: {}),
|
: {
|
||||||
|
chainWebpack(config) {
|
||||||
|
monacoPluginConfig(config);
|
||||||
|
}
|
||||||
|
}),
|
||||||
favicons: ['/static/favicon.png'],
|
favicons: ['/static/favicon.png'],
|
||||||
jsMinifier: 'terser',
|
jsMinifier: 'terser',
|
||||||
cssMinifier: 'cssnano',
|
cssMinifier: 'cssnano',
|
||||||
presets: ['umi-presets-pro'],
|
presets: ['umi-presets-pro'],
|
||||||
clickToComponent: {},
|
clickToComponent: {},
|
||||||
antd: {
|
antd: {
|
||||||
style: 'less',
|
style: 'less'
|
||||||
configProvider: {
|
|
||||||
componentSize: 'large',
|
|
||||||
theme
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
title: 'MesaStack',
|
||||||
hash: true,
|
hash: true,
|
||||||
access: {},
|
access: {},
|
||||||
model: {},
|
model: {},
|
||||||
initialState: {},
|
initialState: {},
|
||||||
request: {},
|
request: {},
|
||||||
|
routePrefetch: {
|
||||||
|
defaultPrefetch: 'intent'
|
||||||
|
},
|
||||||
|
keepalive: keepAlive,
|
||||||
locale: {
|
locale: {
|
||||||
antd: true,
|
antd: true,
|
||||||
baseNavigator: true,
|
baseNavigator: true,
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
export const keepAliveRoutes = {
|
||||||
|
text2images: '/playground/text-to-image',
|
||||||
|
speech: '/playground/speech'
|
||||||
|
};
|
||||||
|
|
||||||
|
export default [keepAliveRoutes.text2images, keepAliveRoutes.speech];
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// Identity hook for build-time mfsu.exclude extensions. Tooling may
|
||||||
|
// overwrite this file to add package names that must skip MFSU's
|
||||||
|
// pre-bundling; the original is restored on cleanup. Mirrors
|
||||||
|
// `src/request.extensions.ts` / `src/access.extensions.ts`.
|
||||||
|
//
|
||||||
|
// MFSU bundles node_modules into immutable chunks at dev startup, so
|
||||||
|
// workspace-linked packages whose source you edit during dev must be
|
||||||
|
// excluded here or HMR won't pick up changes.
|
||||||
|
export const extraMfsuExclude: string[] = [];
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import MonacoWebpackPlugin from 'monaco-editor-webpack-plugin';
|
||||||
|
const CompressionWebpackPlugin = require('compression-webpack-plugin');
|
||||||
|
|
||||||
|
export function monacoPluginConfig(config: any) {
|
||||||
|
return config
|
||||||
|
.plugin('monaco-editor-webpack-plugin')
|
||||||
|
.use(MonacoWebpackPlugin, [
|
||||||
|
{
|
||||||
|
languages: ['yaml'],
|
||||||
|
customLanguages: [
|
||||||
|
{
|
||||||
|
label: 'yaml',
|
||||||
|
entry: 'monaco-yaml',
|
||||||
|
worker: {
|
||||||
|
id: 'monaco-yaml/yamlWorker',
|
||||||
|
entry: 'monaco-yaml/yaml.worker.js'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function compressionPluginConfig(config: any) {
|
||||||
|
return config
|
||||||
|
.plugin('compression-webpack-plugin')
|
||||||
|
.use(CompressionWebpackPlugin, [
|
||||||
|
{
|
||||||
|
filename: '[path][base].gz',
|
||||||
|
algorithm: 'gzip',
|
||||||
|
test: /\.(js|css|html|svg)$/,
|
||||||
|
threshold: 10240,
|
||||||
|
minRatio: 0.8
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
const proxyTableList = ['cli', 'v1', 'auth', 'v1-openai', 'version'];
|
const proxyTableList = [
|
||||||
|
'cli',
|
||||||
|
'v1',
|
||||||
|
'v2',
|
||||||
|
'auth',
|
||||||
|
'v1-openai',
|
||||||
|
'version',
|
||||||
|
'proxy',
|
||||||
|
'update',
|
||||||
|
'grafana'
|
||||||
|
];
|
||||||
|
|
||||||
// @ts-ingore
|
// @ts-ingore
|
||||||
export default function createProxyTable(target?: string) {
|
export default function createProxyTable(target?: string) {
|
||||||
@@ -10,6 +20,7 @@ export default function createProxyTable(target?: string) {
|
|||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
secure: false,
|
secure: false,
|
||||||
ws: true,
|
ws: true,
|
||||||
|
log: 'debug',
|
||||||
pathRewrite: (pth: string) => pth.replace(`/^/${api}`, `/${api}`),
|
pathRewrite: (pth: string) => pth.replace(`/^/${api}`, `/${api}`),
|
||||||
headers: {
|
headers: {
|
||||||
origin: newTarget,
|
origin: newTarget,
|
||||||
@@ -20,5 +31,6 @@ export default function createProxyTable(target?: string) {
|
|||||||
},
|
},
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
|
||||||
return proxyTable;
|
return proxyTable;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
// Identity hook for build-time route extensions. Tooling may overwrite
|
||||||
|
// this file to inject additional routes; the original is restored on cleanup.
|
||||||
|
export const applyRouteExtensions = <T>(base: T): T => base;
|
||||||
@@ -1,62 +1,418 @@
|
|||||||
export default [
|
import { keepAliveRoutes } from './keep-alive';
|
||||||
|
import { applyRouteExtensions } from './routes.extensions';
|
||||||
|
|
||||||
|
const baseRoutes = [
|
||||||
{
|
{
|
||||||
name: 'dashboard',
|
name: 'dashboard',
|
||||||
path: '/dashboard',
|
path: '/dashboard',
|
||||||
key: 'dashboard',
|
key: 'dashboard',
|
||||||
icon: 'AppstoreOutlined',
|
icon: 'icon-dashboard',
|
||||||
access: 'canSeeAdmin',
|
selectedIcon: 'icon-dashboard-filled',
|
||||||
component: './dashboard'
|
defaultIcon: 'icon-dashboard',
|
||||||
|
// `canSeeOrgAdmin` widens to anyone the access seam grants
|
||||||
|
// admin-ish visibility — by default platform admin, plus
|
||||||
|
// whatever the routes extension chooses to allow.
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
component: './dashboard',
|
||||||
|
routes: []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'playground',
|
name: 'playground',
|
||||||
title: 'Playground',
|
icon: 'icon-experiment',
|
||||||
|
selectedIcon: 'icon-experiment-filled',
|
||||||
|
defaultIcon: 'icon-experiment',
|
||||||
path: '/playground',
|
path: '/playground',
|
||||||
key: 'playground',
|
key: 'playground',
|
||||||
icon: 'Comment',
|
routes: [
|
||||||
component: './playground'
|
{
|
||||||
|
path: '/playground',
|
||||||
|
redirect: '/playground/chat'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'chat',
|
||||||
|
title: 'Chat',
|
||||||
|
path: '/playground/chat',
|
||||||
|
key: 'chat',
|
||||||
|
icon: 'icon-chat',
|
||||||
|
selectedIcon: 'icon-chat-filled',
|
||||||
|
defaultIcon: 'icon-chat',
|
||||||
|
component: './playground/chat/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'embedding',
|
||||||
|
title: 'embedding',
|
||||||
|
path: '/playground/embedding',
|
||||||
|
key: 'embedding',
|
||||||
|
icon: 'icon-embedding',
|
||||||
|
selectedIcon: 'icon-embedding-filled',
|
||||||
|
defaultIcon: 'icon-embedding',
|
||||||
|
component: './playground/embedding/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'rerank',
|
||||||
|
title: 'Rerank',
|
||||||
|
path: '/playground/rerank',
|
||||||
|
key: 'rerank',
|
||||||
|
icon: 'icon-reranker',
|
||||||
|
selectedIcon: 'icon-reranker-filled',
|
||||||
|
defaultIcon: 'icon-reranker',
|
||||||
|
component: './playground/rerank/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'text2images',
|
||||||
|
title: 'Text2Images',
|
||||||
|
path: keepAliveRoutes.text2images,
|
||||||
|
key: 'text2images',
|
||||||
|
icon: 'icon-image1',
|
||||||
|
selectedIcon: 'icon-image-filled',
|
||||||
|
defaultIcon: 'icon-image1',
|
||||||
|
component: './playground/images/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'speech',
|
||||||
|
title: 'Speech',
|
||||||
|
path: keepAliveRoutes.speech,
|
||||||
|
key: 'speech',
|
||||||
|
icon: 'icon-audio1',
|
||||||
|
selectedIcon: 'icon-audio-filled',
|
||||||
|
defaultIcon: 'icon-audio1',
|
||||||
|
component: './playground/speech/index'
|
||||||
|
}
|
||||||
|
// {
|
||||||
|
// name: 'video',
|
||||||
|
// title: 'Video',
|
||||||
|
// path: '/playground/video',
|
||||||
|
// key: 'video',
|
||||||
|
// icon: 'icon-video-outline',
|
||||||
|
// hideInMenu: false,
|
||||||
|
// selectedIcon: 'icon-video-filled02',
|
||||||
|
// defaultIcon: 'icon-video-outline',
|
||||||
|
// component: './playground/video'
|
||||||
|
// }
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'models',
|
name: 'models',
|
||||||
path: '/models',
|
path: '/models',
|
||||||
key: 'models',
|
key: 'models',
|
||||||
icon: 'Block',
|
routes: [
|
||||||
access: 'canSeeAdmin',
|
{
|
||||||
component: './llmodels'
|
path: '/models',
|
||||||
|
redirect: '/models/deployments'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'modelCatalog',
|
||||||
|
path: '/models/catalog',
|
||||||
|
key: 'modelsCatalog',
|
||||||
|
icon: 'icon-layers',
|
||||||
|
selectedIcon: 'icon-layers-filled',
|
||||||
|
defaultIcon: 'icon-layers',
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
component: './llmodels/catalog'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'userModels',
|
||||||
|
path: '/models/user-models',
|
||||||
|
key: 'userModels',
|
||||||
|
icon: 'icon-models',
|
||||||
|
selectedIcon: 'icon-models-filled',
|
||||||
|
defaultIcon: 'icon-models',
|
||||||
|
access: 'canSeeUser',
|
||||||
|
component: './llmodels/user-models'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'deployment',
|
||||||
|
path: '/models/deployments',
|
||||||
|
key: 'modelDeployments',
|
||||||
|
icon: 'icon-rocket-launch1',
|
||||||
|
selectedIcon: 'icon-rocket-launch-fill',
|
||||||
|
defaultIcon: 'icon-rocket-launch1',
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
component: './llmodels/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'routes',
|
||||||
|
path: '/models/routes',
|
||||||
|
key: 'routes',
|
||||||
|
icon: 'icon-captive_portal',
|
||||||
|
selectedIcon: 'icon-captive_portal',
|
||||||
|
defaultIcon: 'icon-captive_portal',
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
component: './model-routes/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'providers',
|
||||||
|
path: '/models/providers',
|
||||||
|
key: 'modelProviders',
|
||||||
|
icon: 'icon-extension-outline',
|
||||||
|
selectedIcon: 'icon-extension-filled',
|
||||||
|
defaultIcon: 'icon-extension-outline',
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
component: './maas-provider/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'benchmark',
|
||||||
|
path: '/models/benchmark',
|
||||||
|
key: 'benchmark',
|
||||||
|
icon: 'icon-speed',
|
||||||
|
selectedIcon: 'icon-speed-filled',
|
||||||
|
defaultIcon: 'icon-speed',
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
component: './benchmark/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'benchmarkDetail',
|
||||||
|
path: '/models/benchmark/detail',
|
||||||
|
key: 'benchmarkDetail',
|
||||||
|
icon: 'icon-speed',
|
||||||
|
selectedIcon: 'icon-speed-filled',
|
||||||
|
defaultIcon: 'icon-speed',
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
hideInMenu: true,
|
||||||
|
component: './benchmark/details'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'backendsList',
|
||||||
|
path: '/models/backends',
|
||||||
|
key: 'backendsList',
|
||||||
|
icon: 'icon-backend',
|
||||||
|
selectedIcon: 'icon-backend-filled',
|
||||||
|
defaultIcon: 'icon-backend',
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
component: './backends/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'modelfiles',
|
||||||
|
path: '/models/modelfiles',
|
||||||
|
key: 'modelfiles',
|
||||||
|
icon: 'icon-files',
|
||||||
|
selectedIcon: 'icon-files-filled',
|
||||||
|
defaultIcon: 'icon-files',
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
component: './resources/components/model-files'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'gpuService',
|
||||||
|
path: '/gpu-service',
|
||||||
|
key: 'gpuService',
|
||||||
|
access: 'canSeeGpuService',
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
path: '/gpu-service',
|
||||||
|
redirect: '/gpu-service/instances'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'instances',
|
||||||
|
path: '/gpu-service/instances',
|
||||||
|
key: 'gpuServiceList',
|
||||||
|
icon: 'icon-cloud-outlined',
|
||||||
|
selectedIcon: 'icon-cloud-filled',
|
||||||
|
defaultIcon: 'icon-cloud-outlined',
|
||||||
|
component: './gpu-service/instances'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'templates',
|
||||||
|
path: '/gpu-service/templates',
|
||||||
|
key: 'gpuServiceTemplates',
|
||||||
|
icon: 'icon-instance-template-outlined',
|
||||||
|
selectedIcon: 'icon-instance-template-filled',
|
||||||
|
defaultIcon: 'icon-instance-template-outlined',
|
||||||
|
component: './gpu-service/templates'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'storage',
|
||||||
|
path: '/gpu-service/storage',
|
||||||
|
key: 'gpuServiceStorage',
|
||||||
|
icon: 'icon-database-outlined',
|
||||||
|
selectedIcon: 'icon-database-filled',
|
||||||
|
defaultIcon: 'icon-database-outlined',
|
||||||
|
component: './gpu-service/storage'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'storageTypes',
|
||||||
|
path: '/gpu-service/storage-types',
|
||||||
|
key: 'gpuServiceStorageTypes',
|
||||||
|
icon: 'icon-storage-outlined',
|
||||||
|
// Storage types are tenant-scoped on the backend (Org owners
|
||||||
|
// can create/list their own), so the menu shouldn't be
|
||||||
|
// platform-admin-only. ``canSeeOrgAdmin`` keeps the gate at
|
||||||
|
// "admin or current-org owner" — Org members still don't see
|
||||||
|
// it, which matches the read/write model in the route.
|
||||||
|
access: 'canSeeOrgAdmin',
|
||||||
|
selectedIcon: 'icon-storage-filled',
|
||||||
|
defaultIcon: 'icon-storage-outlined',
|
||||||
|
component: './gpu-service/storage-types'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'publicKeys',
|
||||||
|
path: '/gpu-service/public-keys',
|
||||||
|
key: 'gpuServicePublicKeys',
|
||||||
|
icon: 'icon-ssh-outlined',
|
||||||
|
selectedIcon: 'icon-ssh-filled',
|
||||||
|
defaultIcon: 'icon-ssh-outlined',
|
||||||
|
component: './gpu-service/public-keys'
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'resources',
|
name: 'resources',
|
||||||
path: '/resources',
|
path: '/resources',
|
||||||
key: 'resources',
|
key: 'resources',
|
||||||
icon: 'CloudServer',
|
access: 'canSeeOrgAdmin',
|
||||||
access: 'canSeeAdmin',
|
routes: [
|
||||||
component: './resources'
|
{
|
||||||
|
path: '/resources',
|
||||||
|
redirect: '/resources/workers'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'clusters',
|
||||||
|
path: '/resources/clusters/list',
|
||||||
|
key: 'clusters',
|
||||||
|
icon: 'icon-cluster2-outline',
|
||||||
|
selectedIcon: 'icon-cluster2-filled',
|
||||||
|
defaultIcon: 'icon-cluster2-outline',
|
||||||
|
component: './cluster-management/clusters',
|
||||||
|
subMenu: ['/resources/clusters/detail', '/resources/clusters/create']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'workers',
|
||||||
|
path: '/resources/workers',
|
||||||
|
key: 'workers',
|
||||||
|
icon: 'icon-resources',
|
||||||
|
selectedIcon: 'icon-resources-filled',
|
||||||
|
defaultIcon: 'icon-resources',
|
||||||
|
component: './resources/components/workers'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'gpus',
|
||||||
|
path: '/resources/gpus',
|
||||||
|
key: 'gpus',
|
||||||
|
icon: 'icon-gpu1',
|
||||||
|
selectedIcon: 'icon-gpu-filled',
|
||||||
|
defaultIcon: 'icon-gpu1',
|
||||||
|
component: './resources/components/gpus'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'credentials',
|
||||||
|
path: '/resources/credentials',
|
||||||
|
key: 'credentials',
|
||||||
|
icon: 'icon-credential-outline',
|
||||||
|
selectedIcon: 'icon-credential-filled',
|
||||||
|
defaultIcon: 'icon-credential-outline',
|
||||||
|
component: './cluster-management/credentials'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'clusterDetail',
|
||||||
|
path: '/resources/clusters/detail',
|
||||||
|
key: 'clusterDetail',
|
||||||
|
icon: 'icon-cluster2-outline',
|
||||||
|
selectedIcon: 'icon-cluster2-filled',
|
||||||
|
defaultIcon: 'icon-cluster2-outline',
|
||||||
|
hideInMenu: true,
|
||||||
|
component: './cluster-management/cluster-detail'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Cross-resource consumption (tokens + GPU/CPU instances + storage).
|
||||||
|
// A folder so it matches the other top-level groups; more usage views can
|
||||||
|
// graduate in here later.
|
||||||
|
name: 'billingAndUsage',
|
||||||
|
path: '/usage',
|
||||||
|
key: 'usageGroup',
|
||||||
|
icon: 'icon-usage-outlined',
|
||||||
|
selectedIcon: 'icon-usage-filled',
|
||||||
|
defaultIcon: 'icon-usage-outlined',
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
path: '/usage',
|
||||||
|
redirect: '/usage/overview'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'usage',
|
||||||
|
path: '/usage/overview',
|
||||||
|
key: 'usage',
|
||||||
|
icon: 'icon-usage-outlined',
|
||||||
|
selectedIcon: 'icon-usage-filled',
|
||||||
|
defaultIcon: 'icon-usage-outlined',
|
||||||
|
component: './usage/index'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'billing',
|
||||||
|
path: '/usage/billing',
|
||||||
|
key: 'billing',
|
||||||
|
icon: 'icon-billing-outlined',
|
||||||
|
selectedIcon: 'icon-billing-filled',
|
||||||
|
defaultIcon: 'icon-billing-outlined',
|
||||||
|
hideInMenu: process.env.ENABLE_ENTERPRISE === 'true',
|
||||||
|
// OSS exposes the menu as a teaser for the enterprise billing
|
||||||
|
// module. The page itself just renders an upsell notice — the real
|
||||||
|
// billing UI lives in the enterprise plugin and shadows this route
|
||||||
|
// via `routes.extensions.ts`.
|
||||||
|
component: './billing'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'accessControl',
|
||||||
|
path: '/access-control',
|
||||||
|
key: 'accessControl',
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
path: '/access-control',
|
||||||
|
redirect: '/access-control/users'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'organizations',
|
||||||
|
path: '/access-control/organizations',
|
||||||
|
key: 'organizations',
|
||||||
|
icon: 'icon-org-outlined',
|
||||||
|
selectedIcon: 'icon-org-filled',
|
||||||
|
defaultIcon: 'icon-org-outlined',
|
||||||
|
// OSS exposes the menu to platform admins as a teaser for the
|
||||||
|
// enterprise multi-tenancy module. The page itself just renders
|
||||||
|
// an upsell notice — the real CRUD UI lives in the enterprise
|
||||||
|
// plugin and shadows this route via `routes.extensions.ts`.
|
||||||
|
access: 'canSeeAdmin',
|
||||||
|
component: './organizations'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'users',
|
||||||
|
path: '/access-control/users',
|
||||||
|
key: 'users',
|
||||||
|
icon: 'icon-users',
|
||||||
|
selectedIcon: 'icon-users-filled',
|
||||||
|
defaultIcon: 'icon-users',
|
||||||
|
access: 'canSeeAdmin',
|
||||||
|
component: './users'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'apikeys',
|
||||||
|
path: '/access-control/api-keys',
|
||||||
|
key: 'apikeys',
|
||||||
|
selectedIcon: 'icon-key-filled',
|
||||||
|
icon: 'icon-key',
|
||||||
|
defaultIcon: 'icon-key',
|
||||||
|
component: './api-keys'
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
// {
|
|
||||||
// name: 'usage',
|
|
||||||
// path: '/usage',
|
|
||||||
// key: 'usage',
|
|
||||||
// icon: 'BarChartOutlined',
|
|
||||||
// component: './usage'
|
|
||||||
// },
|
|
||||||
{
|
{
|
||||||
name: 'apikeys',
|
name: 'apikeys',
|
||||||
path: '/api-keys',
|
path: '/api-keys',
|
||||||
key: 'apikeys',
|
key: 'apikeys',
|
||||||
icon: 'LockOutlined',
|
hideInMenu: true,
|
||||||
|
selectedIcon: 'icon-key-filled',
|
||||||
|
icon: 'icon-key',
|
||||||
|
defaultIcon: 'icon-key',
|
||||||
component: './api-keys'
|
component: './api-keys'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: 'users',
|
|
||||||
path: '/users',
|
|
||||||
key: 'users',
|
|
||||||
icon: 'Team',
|
|
||||||
access: 'canSeeAdmin',
|
|
||||||
component: './users'
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: 'profile',
|
name: 'profile',
|
||||||
path: '/profile',
|
path: '/preferences',
|
||||||
key: 'profile',
|
key: 'preferences',
|
||||||
hideInMenu: true,
|
hideInMenu: true,
|
||||||
component: './profile',
|
component: './profile',
|
||||||
icon: 'User'
|
icon: 'User'
|
||||||
@@ -73,7 +429,9 @@ export default [
|
|||||||
name: '404',
|
name: '404',
|
||||||
path: '*',
|
path: '*',
|
||||||
key: '404',
|
key: '404',
|
||||||
layout: false,
|
hideInMenu: true,
|
||||||
component: './404'
|
component: './404'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
export default applyRouteExtensions(baseRoutes);
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
export default {
|
|
||||||
'root-entry-name': 'variable',
|
|
||||||
cssVar: true,
|
|
||||||
hashed: false,
|
|
||||||
components: {
|
|
||||||
Input: {
|
|
||||||
inputFontSize: 12
|
|
||||||
},
|
|
||||||
Table: {
|
|
||||||
cellFontSize: 12,
|
|
||||||
rowSelectedHoverBg: 'rgba(230, 230, 230, 0.88)',
|
|
||||||
rowSelectedBg: 'rgb(244, 245, 244)'
|
|
||||||
},
|
|
||||||
Menu: {
|
|
||||||
iconSize: 16,
|
|
||||||
iconMarginInlineEnd: 12,
|
|
||||||
itemHeight: 44,
|
|
||||||
itemColor: 'rgba(0,0,0,1)',
|
|
||||||
itemHoverBg: 'rgba(0,0,0,0.04)',
|
|
||||||
itemActiveBg: 'rgba(0,0,0,0.04)'
|
|
||||||
},
|
|
||||||
Progress: {
|
|
||||||
lineBorderRadius: 4
|
|
||||||
},
|
|
||||||
Select: {
|
|
||||||
itemSelectedBg: 'rgba(0,0,0,0.06)'
|
|
||||||
},
|
|
||||||
Message: {
|
|
||||||
contentPadding: '12px 16px'
|
|
||||||
},
|
|
||||||
Slider: {
|
|
||||||
handleSize: 8,
|
|
||||||
handleSizeHover: 8,
|
|
||||||
trackBg: 'rgba(0,0,0,0.15)',
|
|
||||||
handleColor: 'rgba(0,0,0,0.2)',
|
|
||||||
trackHoverBg: 'rgba(0,0,0,0.25)',
|
|
||||||
handleActiveColor: 'rgba(0,0,0,0.3)',
|
|
||||||
dotActiveBorderColor: 'rgba(0,0,0,0.25)',
|
|
||||||
handleActiveOutlineColor: 'rgba(0,0,0,0.25)',
|
|
||||||
dotBorderColor: 'rgba(0,0,0,0.25)'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
token: {
|
|
||||||
colorPrimary: '#007BFF',
|
|
||||||
borderRadius: 8,
|
|
||||||
fontSize: 12,
|
|
||||||
motion: true
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,13 +1,27 @@
|
|||||||
const child_process = require('child_process');
|
import { execSync } from 'child_process';
|
||||||
|
|
||||||
export const getBranchInfo = () => {
|
export const getBranchInfo = () => {
|
||||||
const latestCommit = child_process
|
// git may be absent (source archive, bare container) or this tree may
|
||||||
.execSync('git rev-parse HEAD')
|
// not be a git checkout. Swallow the failure and fall back to the env
|
||||||
.toString()
|
// overrides below — losing build info shouldn't fail the build.
|
||||||
.trim();
|
let latestCommit = '';
|
||||||
const versionTag = child_process
|
let versionTag = '';
|
||||||
.execSync(`git tag --contains ${latestCommit}`)
|
try {
|
||||||
.toString()
|
latestCommit = execSync('git rev-parse HEAD').toString().trim();
|
||||||
.trim();
|
versionTag = execSync(`git tag --contains ${latestCommit}`)
|
||||||
return { version: versionTag || '', commitId: latestCommit.slice(0, 7) };
|
.toString()
|
||||||
|
.trim();
|
||||||
|
} catch {
|
||||||
|
// Not a git checkout / git unavailable; rely on env overrides.
|
||||||
|
}
|
||||||
|
// Respect explicit GPUSTACK_UI_* overrides so a wrapping build that
|
||||||
|
// checks this source tree out as a sub-package can stamp its own
|
||||||
|
// release tag and commit id onto the UI (otherwise the panel reports
|
||||||
|
// the host tree's git HEAD, which the wrapper doesn't control).
|
||||||
|
const overrideVersion = process.env.GPUSTACK_UI_VERSION?.trim();
|
||||||
|
const overrideCommitId = process.env.GPUSTACK_UI_COMMIT_ID?.trim();
|
||||||
|
return {
|
||||||
|
version: overrideVersion || versionTag || '',
|
||||||
|
commitId: overrideCommitId || latestCommit.slice(0, 7)
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
import js from '@eslint/js';
|
||||||
|
import prettier from 'eslint-config-prettier';
|
||||||
|
import importPlugin from 'eslint-plugin-import';
|
||||||
|
import reactPlugin from 'eslint-plugin-react';
|
||||||
|
import reactHooks from 'eslint-plugin-react-hooks';
|
||||||
|
import unusedImports from 'eslint-plugin-unused-imports';
|
||||||
|
import { defineConfig, globalIgnores } from 'eslint/config';
|
||||||
|
import globals from 'globals';
|
||||||
|
import tseslint from 'typescript-eslint';
|
||||||
|
|
||||||
|
export default defineConfig([
|
||||||
|
globalIgnores([
|
||||||
|
'public/static/',
|
||||||
|
'dist',
|
||||||
|
'src/.umi/',
|
||||||
|
'src/.umi-production/',
|
||||||
|
'src/.umi-test/',
|
||||||
|
'src/components/iconfont/'
|
||||||
|
]),
|
||||||
|
{
|
||||||
|
files: ['**/*.{ts,tsx,js,jsx}'],
|
||||||
|
extends: [
|
||||||
|
js.configs.recommended,
|
||||||
|
tseslint.configs.recommended,
|
||||||
|
reactHooks.configs.flat.recommended,
|
||||||
|
prettier
|
||||||
|
],
|
||||||
|
plugins: {
|
||||||
|
react: reactPlugin,
|
||||||
|
import: importPlugin,
|
||||||
|
'unused-imports': unusedImports
|
||||||
|
},
|
||||||
|
settings: {
|
||||||
|
react: {
|
||||||
|
version: 'detect'
|
||||||
|
},
|
||||||
|
'import/resolver': {
|
||||||
|
node: true,
|
||||||
|
typescript: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
languageOptions: {
|
||||||
|
ecmaVersion: 2020,
|
||||||
|
globals: {
|
||||||
|
...globals.browser,
|
||||||
|
...globals.node,
|
||||||
|
Global: 'readonly',
|
||||||
|
React: 'readonly',
|
||||||
|
JSX: 'readonly'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
'react/no-unstable-nested-components': 'warn',
|
||||||
|
'no-unused-vars': 'off',
|
||||||
|
'no-undef': 'off',
|
||||||
|
'@typescript-eslint/no-unused-vars': 'off',
|
||||||
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
|
'@typescript-eslint/ban-ts-comment': 'off',
|
||||||
|
'@typescript-eslint/ban-types': 'off',
|
||||||
|
'@typescript-eslint/no-empty-object-type': 'off',
|
||||||
|
'@typescript-eslint/no-unnecessary-type-constraint': 'off',
|
||||||
|
'unused-imports/no-unused-imports': 'error',
|
||||||
|
'unused-imports/no-unused-vars': 'off',
|
||||||
|
'import/no-unresolved': 'off',
|
||||||
|
'import/no-duplicates': 'error',
|
||||||
|
'react-hooks/exhaustive-deps': 'off',
|
||||||
|
'react-hooks/preserve-manual-memoization': 'off',
|
||||||
|
'react-hooks/set-state-in-effect': 'off',
|
||||||
|
'react-hooks/refs': 'off',
|
||||||
|
'react-hooks/use-memo': 'off',
|
||||||
|
'react-hooks/immutability': 'off',
|
||||||
|
'no-unsafe-optional-chaining': 'off',
|
||||||
|
'no-empty': 'off',
|
||||||
|
'no-constant-condition': 'off',
|
||||||
|
'no-prototype-builtins': 'off',
|
||||||
|
'no-multiple-empty-lines': ['error', { max: 1, maxEOF: 0, maxBOF: 0 }]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
@@ -1 +1,28 @@
|
|||||||
// only for third party libraries styles
|
// only for third party libraries styles
|
||||||
|
|
||||||
|
.simplebar-scrollbar.simplebar-visible::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplebar-scrollbar::before {
|
||||||
|
background: var(--scrollbar-handle-bg);
|
||||||
|
width: var(--scrollbar-size);
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplebar-scrollbar.simplebar-visible.simplebar-hover {
|
||||||
|
&::before {
|
||||||
|
background: var(--scrollbar-handle-hover-bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplebar-scrollbar.scrollbar-handle-light {
|
||||||
|
&::before {
|
||||||
|
background-color: var(--scrollbar-handle-light-bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.simplebar-scrollbar.simplebar-visible.simplebar-hover.scrollbar-handle-light {
|
||||||
|
&::before {
|
||||||
|
background: var(--scrollbar-handle-light-bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,72 +1,129 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"author": "jialin <jialinkuang@126.com>",
|
"author": "gpustack",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "max build",
|
"build": "max build",
|
||||||
|
"check:locales": "node --import tsx ./src/locales/check.ts",
|
||||||
"dev": "max dev",
|
"dev": "max dev",
|
||||||
"format": "prettier --cache --write .",
|
"format": "prettier --cache --write .",
|
||||||
"postinstall": "max setup",
|
"postinstall": "max setup",
|
||||||
"prepare": "husky",
|
"prepare": "husky",
|
||||||
|
"preview": "max preview",
|
||||||
"setup": "max setup",
|
"setup": "max setup",
|
||||||
"start": "npm run dev"
|
"start": "npm run dev"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ant-design/icons": "^5.3.7",
|
"@ant-design/icons": "^6.1.0",
|
||||||
"@ant-design/pro-components": "^2.7.1",
|
"@ant-design/pro-components": "3.1.0-0",
|
||||||
|
"@antv/g6": "^5.0.51",
|
||||||
|
"@braintree/sanitize-url": "^7.1.1",
|
||||||
|
"@gpustack/core-ui": "^1.0.27",
|
||||||
"@huggingface/gguf": "^0.1.7",
|
"@huggingface/gguf": "^0.1.7",
|
||||||
"@huggingface/hub": "^0.15.1",
|
"@huggingface/hub": "^0.15.1",
|
||||||
"@huggingface/tasks": "^0.11.6",
|
"@huggingface/tasks": "^0.11.6",
|
||||||
"@monaco-editor/react": "^4.6.0",
|
"@monaco-editor/react": "^4.6.0",
|
||||||
|
"@orcid/bibtex-parse-js": "^0.0.25",
|
||||||
"@react-hook/resize-observer": "^2.0.2",
|
"@react-hook/resize-observer": "^2.0.2",
|
||||||
"@types/lodash": "^4.17.4",
|
"@types/lodash": "^4.17.4",
|
||||||
"@umijs/max": "^4.2.11",
|
"@umijs/max": "^4.6.15",
|
||||||
"@xterm/addon-fit": "^0.10.0",
|
"@xterm/addon-fit": "^0.10.0",
|
||||||
"@xterm/xterm": "^5.5.0",
|
"@xterm/xterm": "^5.5.0",
|
||||||
|
"ahooks": "^3.8.5",
|
||||||
"ansi-to-html": "^0.7.2",
|
"ansi-to-html": "^0.7.2",
|
||||||
"antd": "^5.18.3",
|
"antd": "^6.3.3",
|
||||||
"antd-style": "^3.6.2",
|
"antd-style": "^3.6.2",
|
||||||
"axios": "^1.7.2",
|
"axios": "^1.8.2",
|
||||||
"classnames": "^2.5.1",
|
"classnames": "^2.5.1",
|
||||||
"clipboard": "^2.0.11",
|
"clipboard": "^2.0.11",
|
||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
|
"culori": "^4.0.2",
|
||||||
"dayjs": "^1.11.11",
|
"dayjs": "^1.11.11",
|
||||||
|
"dompurify": "^3.2.6",
|
||||||
|
"driver.js": "^1.3.1",
|
||||||
"echarts": "^5.5.1",
|
"echarts": "^5.5.1",
|
||||||
|
"file-saver": "^2.0.5",
|
||||||
"has-ansi": "^5.0.1",
|
"has-ansi": "^5.0.1",
|
||||||
"highlight.js": "^11.10.0",
|
"highlight.js": "^11.10.0",
|
||||||
|
"jdenticon": "^3.3.0",
|
||||||
"jotai": "^2.8.4",
|
"jotai": "^2.8.4",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
|
"katex": "^0.16.21",
|
||||||
|
"lamejs": "github:zhuker/lamejs",
|
||||||
"localforage": "^1.10.0",
|
"localforage": "^1.10.0",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"marked": "^14.1.0",
|
"marked": "^14.1.0",
|
||||||
|
"minimatch": "^3.1.2",
|
||||||
|
"ml-dataset-iris": "^1.2.1",
|
||||||
|
"ml-pca": "^4.1.1",
|
||||||
|
"monaco-editor": "^0.30.1",
|
||||||
|
"monaco-yaml": "^4.0.0",
|
||||||
"numeral": "^2.0.6",
|
"numeral": "^2.0.6",
|
||||||
|
"overlayscrollbars": "^2.10.0",
|
||||||
|
"overlayscrollbars-react": "^0.5.6",
|
||||||
"query-string": "^9.0.0",
|
"query-string": "^9.0.0",
|
||||||
|
"rc-resize-observer": "^1.4.3",
|
||||||
|
"rc-virtual-list": "^3.14.8",
|
||||||
|
"re-resizable": "^6.10.1",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-hotkeys-hook": "^4.5.0",
|
"react-hotkeys-hook": "^4.5.0",
|
||||||
|
"react-intersection-observer": "^9.16.0",
|
||||||
|
"react-markdown": "^9.0.3",
|
||||||
|
"react-router-dom": "^6.30.3",
|
||||||
|
"rehype-katex": "^7.0.1",
|
||||||
|
"remark-breaks": "^4.0.0",
|
||||||
|
"remark-gfm": "^4.0.1",
|
||||||
|
"remark-math": "^6.0.0",
|
||||||
|
"semver": "^7.7.3",
|
||||||
"simplebar-react": "^3.2.6",
|
"simplebar-react": "^3.2.6",
|
||||||
"umi-presets-pro": "^2.0.3"
|
"styled-components": "^6.1.15",
|
||||||
|
"umi-presets-pro": "^2.0.3",
|
||||||
|
"wavesurfer.js": "^7.8.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/marked": "^6.0.0",
|
"@eslint/js": "^9.39.4",
|
||||||
|
"@types/node": "^25.0.3",
|
||||||
"@types/react": "^18.3.1",
|
"@types/react": "^18.3.1",
|
||||||
"@types/react-dom": "^18.3.0",
|
"@types/react-dom": "^18.3.0",
|
||||||
|
"@types/semver": "^7.7.1",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^8.58.1",
|
||||||
"@umijs/case-sensitive-paths-webpack-plugin": "^1.0.1",
|
"@umijs/case-sensitive-paths-webpack-plugin": "^1.0.1",
|
||||||
|
"@umijs/plugins": "^4.4.11",
|
||||||
"babel-plugin-named-asset-import": "^0.3.8",
|
"babel-plugin-named-asset-import": "^0.3.8",
|
||||||
"case-sensitive-paths-webpack-plugin": "^2.4.0",
|
"case-sensitive-paths-webpack-plugin": "^2.4.0",
|
||||||
"compression-webpack-plugin": "^11.1.0",
|
"compression-webpack-plugin": "^11.1.0",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
"css-loader": "^7.1.2",
|
"css-loader": "^7.1.2",
|
||||||
"eslint": "^8.56.0",
|
"eslint": "^9.39.4",
|
||||||
"eslint-plugin-unused-imports": "^3.2.0",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
|
"eslint-import-resolver-typescript": "^4.4.4",
|
||||||
|
"eslint-plugin-import": "^2.32.0",
|
||||||
|
"eslint-plugin-react": "^7.37.5",
|
||||||
|
"eslint-plugin-react-hooks": "^7.0.1",
|
||||||
|
"eslint-plugin-unused-imports": "^4.4.1",
|
||||||
"extract-css-loader": "^0.0.1",
|
"extract-css-loader": "^0.0.1",
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
|
"globals": "^17.4.0",
|
||||||
"husky": "^9.0.11",
|
"husky": "^9.0.11",
|
||||||
"less-loader": "^12.2.0",
|
"less-loader": "^12.2.0",
|
||||||
"lint-staged": "^15.2.2",
|
"lint-staged": "^15.2.2",
|
||||||
"mini-css-extract-plugin": "^2.9.0",
|
"mini-css-extract-plugin": "^2.9.0",
|
||||||
|
"monaco-editor-webpack-plugin": "^4.2.0",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^3.2.5",
|
||||||
"prettier-plugin-organize-imports": "^3.2.4",
|
"prettier-plugin-organize-imports": "^3.2.4",
|
||||||
"prettier-plugin-packagejson": "^2.5.0",
|
"prettier-plugin-packagejson": "^2.5.0",
|
||||||
"prettier-plugin-two-style-order": "^1.0.1",
|
"prettier-plugin-two-style-order": "^1.0.1",
|
||||||
|
"tsx": "^4.19.3",
|
||||||
"typescript": "^5.4.5",
|
"typescript": "^5.4.5",
|
||||||
"url-loader": "^4.1.1"
|
"typescript-eslint": "^8.58.0",
|
||||||
|
"url-loader": "^4.1.1",
|
||||||
|
"webpack-bundle-analyzer": "^4.10.2",
|
||||||
|
"worker-loader": "^3.0.8"
|
||||||
|
},
|
||||||
|
"packageManager": "pnpm@9.3.0",
|
||||||
|
"pnpm": {
|
||||||
|
"overrides": {
|
||||||
|
"elliptic": "^6.6.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,14 @@ export default (api: IApi) => {
|
|||||||
api.modifyHTML(($) => {
|
api.modifyHTML(($) => {
|
||||||
const info = JSON.parse(process.env.VERSION || '{}');
|
const info = JSON.parse(process.env.VERSION || '{}');
|
||||||
const env = process.env.NODE_ENV;
|
const env = process.env.NODE_ENV;
|
||||||
|
|
||||||
|
$('html').attr('lang', 'en');
|
||||||
|
|
||||||
|
$('html').attr('data-env', env);
|
||||||
|
|
||||||
$('html').attr(
|
$('html').attr(
|
||||||
'data-version',
|
'data-version',
|
||||||
env === 'production'
|
env === 'production' ? info.version || info.commitId : `${info.commitId}`
|
||||||
? info.version || info.commitId
|
|
||||||
: `dev-${info.commitId}`
|
|
||||||
);
|
);
|
||||||
if (env === 'production') {
|
if (env === 'production') {
|
||||||
$('script[src^="/js/umi"]').first?.().remove?.();
|
$('script[src^="/js/umi"]').first?.().remove?.();
|
||||||
|
|||||||
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
@@ -0,0 +1,102 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# rebrand: 把面向用户的品牌标识从 GPUStack 批量替换为 MesaStack(或自定义品牌)。
|
||||||
|
#
|
||||||
|
# 设计目标:上游每次更新后,在新的 v<version>-lofyer 分支上跑一次即可重新应用品牌定制。
|
||||||
|
#
|
||||||
|
# 只替换「独立的品牌词」FROM,并刻意跳过所有功能性引用:
|
||||||
|
# - 小写 `gpustack` —— npm 包名 (@gpustack/core-ui)、URL、路径、k8s 命名空间、author(大小写敏感,天然不匹配)
|
||||||
|
# - 全大写 `GPUSTACK` —— 常量/环境变量/全局 (GPUSTACK_API_BASE_URL, __GPUSTACK_*__, GPUSTACK_UI_*)(大小写敏感,不匹配)
|
||||||
|
# - 代码标识符 —— getGPUStackPlugin / GPUStackVersionAtom / GPUStackPluginManager / GPUStackLogo 等
|
||||||
|
# (FROM 紧邻字母时视为标识符的一部分,跳过)
|
||||||
|
# - HTTP 头 X-GPUStack-* —— 后端契约 (如 X-GPUStack-Model),跳过
|
||||||
|
#
|
||||||
|
# 匹配规则:FROM 前后都不是字母(独立单词),且不是 `X-` 前缀的头名。
|
||||||
|
#
|
||||||
|
# 环境变量:
|
||||||
|
# FROM 源品牌词(默认 GPUStack)
|
||||||
|
# TO 目标品牌词(默认 MesaStack)
|
||||||
|
# DRY_RUN 设为 1 时只预览将改动的行,不写文件
|
||||||
|
#
|
||||||
|
set -e
|
||||||
|
|
||||||
|
FROM="${FROM:-GPUStack}"
|
||||||
|
TO="${TO:-MesaStack}"
|
||||||
|
DRY_RUN="${DRY_RUN:-0}"
|
||||||
|
|
||||||
|
log() { echo -e "\033[1;34m[rebrand]\033[0m $*"; }
|
||||||
|
|
||||||
|
# 大小写敏感、单词边界、排除 X- 头前缀的 Perl 正则。
|
||||||
|
# (?<![A-Za-z]) 前面不是字母 (?<!X-) 不是 X- 头 (?![A-Za-z]) 后面不是字母
|
||||||
|
# FROM 为纯字母品牌词(无正则元字符),故直接拼接,不用 \Q\E
|
||||||
|
# —— \Q\E 在「经变量插值进正则」时不会被求值,反而会破坏匹配。
|
||||||
|
PATTERN="(?<![A-Za-z])(?<!X-)${FROM}(?![A-Za-z])"
|
||||||
|
|
||||||
|
# 行级排除:某些 FROM 出现在「与后端契约绑定的字符串」里,改了会破坏运行时逻辑,
|
||||||
|
# 即使是独立单词也必须整行跳过。命中下列任一正则的行不替换。
|
||||||
|
# 已知例外:
|
||||||
|
# - llmodels/hooks/index.ts 用 startsWith() 比对后端返回的英文兼容性消息
|
||||||
|
# ("... does not exist on the GPUStack server ..."),后端仍发 GPUStack,前端不能改。
|
||||||
|
SKIP_LINE_PATTERNS=(
|
||||||
|
'does not exist on the .*server. It'"'"'s recommended'
|
||||||
|
)
|
||||||
|
skip_line() {
|
||||||
|
local line="$1" pat
|
||||||
|
for pat in "${SKIP_LINE_PATTERNS[@]}"; do
|
||||||
|
if echo "$line" | grep -qP "$pat"; then return 0; fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 待处理的已跟踪文本文件(排除 lockfile 与本脚本自身)。
|
||||||
|
mapfile -t files < <(
|
||||||
|
git ls-files -- \
|
||||||
|
'*.ts' '*.tsx' '*.js' '*.jsx' '*.json' '*.less' '*.html' '*.md' \
|
||||||
|
| grep -v 'pnpm-lock.yaml'
|
||||||
|
)
|
||||||
|
|
||||||
|
log "品牌替换: '${FROM}' -> '${TO}'"
|
||||||
|
log "候选文件: ${#files[@]}"
|
||||||
|
|
||||||
|
# 把行级排除合并成一个 perl 正则,供预览与替换共用(经环境变量传入,免去转义)。
|
||||||
|
SKIP_RE=""
|
||||||
|
for pat in "${SKIP_LINE_PATTERNS[@]}"; do
|
||||||
|
SKIP_RE="${SKIP_RE:+${SKIP_RE}|}(?:${pat})"
|
||||||
|
done
|
||||||
|
export REBRAND_SKIP_RE="${SKIP_RE}"
|
||||||
|
export REBRAND_PATTERN="${PATTERN}"
|
||||||
|
export REBRAND_TO="${TO}"
|
||||||
|
|
||||||
|
# 统计命中行(预览/确认用),已扣除被行级排除的行。
|
||||||
|
log "命中行预览(最多 40 行):"
|
||||||
|
grep -rnP "${PATTERN}" "${files[@]}" 2>/dev/null \
|
||||||
|
| { [[ -n "${SKIP_RE}" ]] && grep -vP "${SKIP_RE}" || cat; } \
|
||||||
|
| head -40 || true
|
||||||
|
total=$(grep -rnP "${PATTERN}" "${files[@]}" 2>/dev/null \
|
||||||
|
| { [[ -n "${SKIP_RE}" ]] && grep -vP "${SKIP_RE}" || cat; } | wc -l)
|
||||||
|
log "命中总行数: ${total}"
|
||||||
|
if [[ -n "${SKIP_RE}" ]]; then
|
||||||
|
skipped=$(grep -rnP "${PATTERN}" "${files[@]}" 2>/dev/null | grep -cP "${SKIP_RE}" || true)
|
||||||
|
log "行级排除(后端契约,保留 ${FROM}): ${skipped} 行"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${DRY_RUN}" == "1" ]]; then
|
||||||
|
log "DRY_RUN=1:未写入任何文件。"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 实际替换(in-place)。命中行级排除的行整行跳过。
|
||||||
|
changed=0
|
||||||
|
for f in "${files[@]}"; do
|
||||||
|
if grep -qP "${PATTERN}" "$f" 2>/dev/null; then
|
||||||
|
perl -i -pe '
|
||||||
|
my $skip = $ENV{REBRAND_SKIP_RE};
|
||||||
|
next if length($skip) && /$skip/;
|
||||||
|
s/$ENV{REBRAND_PATTERN}/$ENV{REBRAND_TO}/g;
|
||||||
|
' "$f"
|
||||||
|
changed=$((changed + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
log "已修改文件数: ${changed}"
|
||||||
|
log "完成。请用 'git diff' 复核改动。"
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const { spawnSync } = require('child_process');
|
||||||
|
|
||||||
|
const pnpmDir = path.resolve(__dirname, '../../../node_modules/.pnpm');
|
||||||
|
|
||||||
|
function findDir(prefix) {
|
||||||
|
return fs.readdirSync(pnpmDir).find((name) => name.startsWith(prefix));
|
||||||
|
}
|
||||||
|
|
||||||
|
const stylelintDir = findDir('stylelint@14.8.2');
|
||||||
|
if (!stylelintDir) {
|
||||||
|
console.error('Compatible stylelint@14.8.2 not found in workspace node_modules/.pnpm');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const stylelintBin = path.join(
|
||||||
|
pnpmDir,
|
||||||
|
stylelintDir,
|
||||||
|
'node_modules/stylelint/bin/stylelint.js'
|
||||||
|
);
|
||||||
|
|
||||||
|
const result = spawnSync(process.execPath, [stylelintBin, ...process.argv.slice(2)], {
|
||||||
|
stdio: 'inherit',
|
||||||
|
cwd: process.cwd(),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result.error) {
|
||||||
|
console.error(result.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
process.exit(result.status ?? 1);
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# sync-github: 从上游 GitHub 拉取最新源码,并全量镜像同步到 192.168.0.23 私有源。
|
||||||
|
#
|
||||||
|
# 默认行为(全量镜像 / 强制):
|
||||||
|
# 1. 确保存在 upstream remote 指向 GitHub(不存在则自动添加,URL 不一致则更新)。
|
||||||
|
# 2. 从 upstream 抓取所有分支与 tag(--prune 清理已删除的远端引用)。
|
||||||
|
# 3. 将上游每个分支强制推送到私有源同名分支(force push)。
|
||||||
|
# 4. 将上游所有 tag 强制推送到私有源。
|
||||||
|
#
|
||||||
|
# 可用环境变量:
|
||||||
|
# UPSTREAM_URL 上游 GitHub 仓库地址(默认 https://github.com/gpustack/gpustack-ui.git)
|
||||||
|
# ORIGIN_REMOTE 私有源 remote 名称(默认 origin)
|
||||||
|
# UPSTREAM_REMOTE 上游 remote 名称(默认 upstream)
|
||||||
|
# PRUNE_BRANCHES 设为 1 时,删除私有源上「上游已不存在」的分支(真·镜像,破坏性,默认关闭)
|
||||||
|
# DRY_RUN 设为 1 时,仅打印将要执行的推送动作,不实际推送
|
||||||
|
#
|
||||||
|
set -e
|
||||||
|
|
||||||
|
UPSTREAM_URL="${UPSTREAM_URL:-https://github.com/gpustack/gpustack-ui.git}"
|
||||||
|
ORIGIN_REMOTE="${ORIGIN_REMOTE:-origin}"
|
||||||
|
UPSTREAM_REMOTE="${UPSTREAM_REMOTE:-upstream}"
|
||||||
|
PRUNE_BRANCHES="${PRUNE_BRANCHES:-0}"
|
||||||
|
DRY_RUN="${DRY_RUN:-0}"
|
||||||
|
|
||||||
|
log() { echo -e "\033[1;34m[sync-github]\033[0m $*"; }
|
||||||
|
warn() { echo -e "\033[1;33m[sync-github]\033[0m $*" >&2; }
|
||||||
|
|
||||||
|
run() {
|
||||||
|
if [[ "${DRY_RUN}" == "1" ]]; then
|
||||||
|
echo " (dry-run) git $*"
|
||||||
|
else
|
||||||
|
git "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 1. 确保 upstream remote 指向 GitHub。
|
||||||
|
if git remote get-url "${UPSTREAM_REMOTE}" >/dev/null 2>&1; then
|
||||||
|
current_url=$(git remote get-url "${UPSTREAM_REMOTE}")
|
||||||
|
if [[ "${current_url}" != "${UPSTREAM_URL}" ]]; then
|
||||||
|
log "更新 ${UPSTREAM_REMOTE} 地址: ${current_url} -> ${UPSTREAM_URL}"
|
||||||
|
git remote set-url "${UPSTREAM_REMOTE}" "${UPSTREAM_URL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "添加 upstream remote: ${UPSTREAM_REMOTE} -> ${UPSTREAM_URL}"
|
||||||
|
git remote add "${UPSTREAM_REMOTE}" "${UPSTREAM_URL}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
origin_url=$(git remote get-url "${ORIGIN_REMOTE}")
|
||||||
|
log "上游 (拉取): ${UPSTREAM_URL}"
|
||||||
|
log "私有源 (推送): ${origin_url}"
|
||||||
|
|
||||||
|
# 2. 抓取上游所有分支与 tag。
|
||||||
|
log "抓取上游分支与 tag..."
|
||||||
|
git fetch --prune --tags "${UPSTREAM_REMOTE}"
|
||||||
|
|
||||||
|
# 3. 逐个分支强制推送到私有源。
|
||||||
|
log "强制同步分支到私有源..."
|
||||||
|
upstream_branches=$(git for-each-ref --format='%(refname:strip=3)' "refs/remotes/${UPSTREAM_REMOTE}/" | grep -v '^HEAD$')
|
||||||
|
|
||||||
|
for branch in ${upstream_branches}; do
|
||||||
|
log " -> ${branch}"
|
||||||
|
run push --force "${ORIGIN_REMOTE}" \
|
||||||
|
"refs/remotes/${UPSTREAM_REMOTE}/${branch}:refs/heads/${branch}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# 4. 强制同步所有 tag。
|
||||||
|
log "强制同步 tag 到私有源..."
|
||||||
|
run push --force --tags "${ORIGIN_REMOTE}"
|
||||||
|
|
||||||
|
# 5. 可选:删除私有源上、上游已不存在的分支(真·镜像)。
|
||||||
|
if [[ "${PRUNE_BRANCHES}" == "1" ]]; then
|
||||||
|
warn "PRUNE_BRANCHES=1:将删除私有源上上游已不存在的分支"
|
||||||
|
origin_branches=$(git ls-remote --heads "${ORIGIN_REMOTE}" | sed 's@.*refs/heads/@@')
|
||||||
|
for branch in ${origin_branches}; do
|
||||||
|
if ! echo "${upstream_branches}" | grep -qx "${branch}"; then
|
||||||
|
warn " 删除私有源分支: ${branch}"
|
||||||
|
run push "${ORIGIN_REMOTE}" --delete "${branch}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "同步完成。"
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
// Identity hook for build-time access-predicate extensions. Tooling may
|
||||||
|
// overwrite this file to widen predicates; the original is restored on
|
||||||
|
// cleanup. Mirrors `config/routes.extensions.ts`.
|
||||||
|
export type AccessPredicates = {
|
||||||
|
canSeeAdmin: boolean;
|
||||||
|
canSeeOrgAdmin: boolean;
|
||||||
|
canManageCurrentOrg: boolean;
|
||||||
|
canSeeUser: boolean;
|
||||||
|
canDelete: boolean;
|
||||||
|
canLogin: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const applyAccessExtensions = <T extends AccessPredicates>(base: T): T =>
|
||||||
|
base;
|
||||||
@@ -1,12 +1,56 @@
|
|||||||
export default (initialState: { currentUser?: Global.UserInfo }) => {
|
import { applyAccessExtensions } from './access.extensions';
|
||||||
const canSeeAdmin = !!(
|
|
||||||
|
export default (initialState: {
|
||||||
|
currentUser?: Global.UserInfo;
|
||||||
|
hasKubernetesCluster?: boolean;
|
||||||
|
hasResourceEvents?: boolean;
|
||||||
|
}) => {
|
||||||
|
const isPlatformAdmin = !!(
|
||||||
initialState &&
|
initialState &&
|
||||||
initialState.currentUser &&
|
initialState.currentUser &&
|
||||||
initialState.currentUser.is_admin
|
initialState.currentUser.is_admin
|
||||||
);
|
);
|
||||||
return {
|
const canSeeUser = !!(
|
||||||
canSeeAdmin,
|
initialState &&
|
||||||
|
initialState.currentUser &&
|
||||||
|
!initialState.currentUser.is_admin
|
||||||
|
);
|
||||||
|
// GPU Service is Kubernetes-only. We only gate visibility down when
|
||||||
|
// the probe in `getInitialState` came back with a definitive answer;
|
||||||
|
// `undefined` (probe failed / not yet ready) collapses to the
|
||||||
|
// role-based default so a transient network blip can't lock anyone
|
||||||
|
// out of the menu.
|
||||||
|
const hasKubernetesCluster = initialState?.hasKubernetesCluster;
|
||||||
|
// Having run GPU/CPU instances or storage (any resource_events) also unlocks
|
||||||
|
// GPU Service / the full Usage page — a user who used it keeps seeing it even
|
||||||
|
// without a current cluster. MaaS-only users (no cluster, no events) don't.
|
||||||
|
const hasResourceEvents = !!initialState?.hasResourceEvents;
|
||||||
|
|
||||||
|
// Predicate roles, top-down by strictness:
|
||||||
|
// * `canSeeAdmin` — strictly platform admin (`users.is_admin`).
|
||||||
|
// Gates Users.
|
||||||
|
// * `canSeeOrgAdmin` — admin-style menus that work cross-org
|
||||||
|
// (Dashboard, Resources, Models, Cluster Management). Defaults
|
||||||
|
// to platform admin; extensions widen to include org admins.
|
||||||
|
// * `canSeeGpuService` — GPU Service menu. Anyone allowed to
|
||||||
|
// manage clusters (admins, Org owners) sees it; non-admins fall
|
||||||
|
// through to "show only if a Kubernetes cluster is actually
|
||||||
|
// reachable" so Org members without scheduling access don't see
|
||||||
|
// a dead-end menu item.
|
||||||
|
// * `canManageCurrentOrg` — pages that only make sense inside a
|
||||||
|
// specific org context (member / group management). Defaults to
|
||||||
|
// `false`; extensions widen when both an org is selected AND
|
||||||
|
// the caller is admin of it.
|
||||||
|
// Pass through `applyAccessExtensions` so build-time tooling can
|
||||||
|
// widen these without editing this file. Default is a no-op.
|
||||||
|
return applyAccessExtensions({
|
||||||
|
canSeeAdmin: isPlatformAdmin,
|
||||||
|
canSeeOrgAdmin: isPlatformAdmin,
|
||||||
|
canSeeGpuService:
|
||||||
|
isPlatformAdmin || hasKubernetesCluster !== false || hasResourceEvents,
|
||||||
|
canManageCurrentOrg: false,
|
||||||
|
canSeeUser,
|
||||||
canDelete: true,
|
canDelete: true,
|
||||||
canLogin: true
|
canLogin: true
|
||||||
};
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,29 +1,215 @@
|
|||||||
import { GPUStackVersionAtom } from '@/atoms/user';
|
import { userSettingsHelperAtom } from '@/atoms/settings';
|
||||||
|
import { GPUStackVersionAtom, UpdateCheckAtom, userAtom } from '@/atoms/user';
|
||||||
import { setAtomStorage } from '@/atoms/utils';
|
import { setAtomStorage } from '@/atoms/utils';
|
||||||
|
import { DEFAULT_ENTER_PAGE, GPUSTACK_API_BASE_URL } from '@/config/settings';
|
||||||
|
import { COLOR_PRIMARY } from '@/config/theme/constants';
|
||||||
|
import { queryClusterList } from '@/pages/cluster-management/apis';
|
||||||
|
import { ProviderValueMap } from '@/pages/cluster-management/config';
|
||||||
|
import { queryResourceEvents } from '@/pages/usage/apis/resource';
|
||||||
|
import { getGPUStackPlugin } from '@/plugins';
|
||||||
|
import { enterprisePluginReady } from '@/plugins/enterprise-ready';
|
||||||
|
import { GPUStackPluginManager } from '@/plugins/manager';
|
||||||
import { requestConfig } from '@/request-config';
|
import { requestConfig } from '@/request-config';
|
||||||
import {
|
import {
|
||||||
queryCurrentUserState,
|
queryCurrentUserState,
|
||||||
queryVersionInfo
|
queryVersionInfo,
|
||||||
|
updateCheck
|
||||||
} from '@/services/profile/apis';
|
} from '@/services/profile/apis';
|
||||||
import { RequestConfig, history } from '@umijs/max';
|
import { fetchSystemConfig } from '@/services/system/query-system-config';
|
||||||
|
import { isOnline } from '@/utils';
|
||||||
|
import { installTenantFetch } from '@/utils/install-fetch';
|
||||||
|
import {
|
||||||
|
IS_FIRST_LOGIN,
|
||||||
|
readState,
|
||||||
|
writeState
|
||||||
|
} from '@/utils/localstore/index';
|
||||||
|
import '@gpustack/core-ui/style.css';
|
||||||
|
import { RequestConfig, history, request as umiRequest } from '@umijs/max';
|
||||||
|
import { message } from 'antd';
|
||||||
|
|
||||||
const loginPath = '/login';
|
installTenantFetch();
|
||||||
|
|
||||||
|
// only for the first login and access from http://localhost
|
||||||
|
|
||||||
|
const checkDefaultPage = async (userInfo: any) => {
|
||||||
|
const isFirstLogin = await readState(IS_FIRST_LOGIN);
|
||||||
|
if (isFirstLogin === null && isOnline()) {
|
||||||
|
writeState(IS_FIRST_LOGIN, true);
|
||||||
|
if (userInfo && userInfo?.is_admin) {
|
||||||
|
history.push(DEFAULT_ENTER_PAGE.adminForFirst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Probes the caller's cluster list once so access predicates can gate
|
||||||
|
// GPU Service (Kubernetes-only). Cheap (one list request) and never
|
||||||
|
// blocks login — any failure just falls back to `undefined`, which
|
||||||
|
// the predicate treats as "unknown / don't restrict beyond role".
|
||||||
|
// The result is also mirrored into sessionStorage so access extensions
|
||||||
|
// that run without the initialState argument can read it (e.g. to
|
||||||
|
// override the admin shortcut in scopes where the menu shouldn't
|
||||||
|
// show even for admins).
|
||||||
|
const HAS_K8S_CLUSTER_KEY = 'hasKubernetesCluster';
|
||||||
|
const probeHasKubernetesCluster = async (): Promise<boolean | undefined> => {
|
||||||
|
try {
|
||||||
|
const res = await queryClusterList(
|
||||||
|
{ page: -1 },
|
||||||
|
{
|
||||||
|
skipErrorHandler: true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
const value = (res?.items ?? []).some(
|
||||||
|
(c) => c?.provider === ProviderValueMap.Kubernetes
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
window.sessionStorage.setItem(HAS_K8S_CLUSTER_KEY, JSON.stringify(value));
|
||||||
|
} catch {
|
||||||
|
// sessionStorage may be unavailable (Safari private mode); the
|
||||||
|
// access predicate already handles a missing value as "unknown".
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('probeHasKubernetesCluster error', error);
|
||||||
|
try {
|
||||||
|
window.sessionStorage.removeItem(HAS_K8S_CLUSTER_KEY);
|
||||||
|
} catch {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Probes whether the caller has ANY resource-usage events (GPU/CPU instance or
|
||||||
|
// storage lifecycle). Used alongside the cluster probe so a user who has run
|
||||||
|
// GPU instances still sees GPU Service / the full Usage page even if they
|
||||||
|
// currently have no Kubernetes cluster. Mirrored into sessionStorage for the
|
||||||
|
// access extensions; any failure → undefined ("unknown — don't restrict").
|
||||||
|
const HAS_RESOURCE_EVENTS_KEY = 'hasResourceEvents';
|
||||||
|
const probeHasResourceEvents = async (): Promise<boolean | undefined> => {
|
||||||
|
try {
|
||||||
|
// No date range = "ever"; scope is clamped to the caller server-side.
|
||||||
|
const res = await queryResourceEvents(
|
||||||
|
{ perPage: 1 },
|
||||||
|
{
|
||||||
|
skipErrorHandler: true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
const value = (res?.pagination?.total ?? 0) > 0;
|
||||||
|
try {
|
||||||
|
window.sessionStorage.setItem(
|
||||||
|
HAS_RESOURCE_EVENTS_KEY,
|
||||||
|
JSON.stringify(value)
|
||||||
|
);
|
||||||
|
} catch {
|
||||||
|
// sessionStorage may be unavailable; predicate treats missing as unknown.
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('probeHasResourceEvents error', error);
|
||||||
|
try {
|
||||||
|
window.sessionStorage.removeItem(HAS_RESOURCE_EVENTS_KEY);
|
||||||
|
} catch {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// runtime configuration
|
// runtime configuration
|
||||||
export async function getInitialState(): Promise<{
|
export async function getInitialState(): Promise<{
|
||||||
fetchUserInfo: () => Promise<Global.UserInfo>;
|
fetchUserInfo: () => Promise<Global.UserInfo>;
|
||||||
currentUser?: Global.UserInfo;
|
currentUser?: Global.UserInfo;
|
||||||
|
pluginData?: Record<string, any>;
|
||||||
|
hasKubernetesCluster?: boolean;
|
||||||
|
hasResourceEvents?: boolean;
|
||||||
}> {
|
}> {
|
||||||
const { location } = history;
|
const { location } = history;
|
||||||
|
|
||||||
const fetchUserInfo = async (): Promise<Global.UserInfo> => {
|
// In open-source builds the promise resolves immediately.
|
||||||
|
await enterprisePluginReady;
|
||||||
|
|
||||||
|
// initialize plugins and merge enterprise locales
|
||||||
|
let pluginData = {};
|
||||||
|
try {
|
||||||
|
pluginData = await GPUStackPluginManager.initialize({
|
||||||
|
request: umiRequest,
|
||||||
|
setUserSettings: (value) => setAtomStorage(userSettingsHelperAtom, value),
|
||||||
|
setStorageUserSettings: (value) =>
|
||||||
|
setAtomStorage(userSettingsHelperAtom, value),
|
||||||
|
defaultColorPrimary: COLOR_PRIMARY
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to initialize plugins:', error);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getUpdateCheck = async () => {
|
||||||
|
try {
|
||||||
|
const data = await updateCheck();
|
||||||
|
|
||||||
|
setAtomStorage(UpdateCheckAtom, {
|
||||||
|
...data
|
||||||
|
});
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('updateCheck error', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const fetchUserInfo = async (config?: {
|
||||||
|
skipErrorHandler?: boolean;
|
||||||
|
}): Promise<Global.UserInfo> => {
|
||||||
try {
|
try {
|
||||||
const data = await queryCurrentUserState({
|
const data = await queryCurrentUserState({
|
||||||
skipErrorHandler: true
|
skipErrorHandler: true
|
||||||
});
|
});
|
||||||
|
if (data.is_admin) {
|
||||||
|
getUpdateCheck();
|
||||||
|
fetchSystemConfig();
|
||||||
|
}
|
||||||
|
// Only commit a substantive user object. A truthy-but-empty
|
||||||
|
// `data` (e.g. server responded 200 with an empty body) would
|
||||||
|
// otherwise look like "logged in" to every `currentUser`
|
||||||
|
// reader and the access seam — break out instead and let the
|
||||||
|
// caller treat the request as failed.
|
||||||
|
if (data && typeof data === 'object' && Object.keys(data).length > 0) {
|
||||||
|
// Commit the identity to atom storage (and so to localStorage)
|
||||||
|
// before returning. The access function — memoized on
|
||||||
|
// `initialState` and run once per commit — reads identity from
|
||||||
|
// localStorage; without this preemptive write the predicate
|
||||||
|
// sees the prior session's identity on its first evaluation
|
||||||
|
// after login, and stays stale until the next identity change
|
||||||
|
// (which usually doesn't come without a manual refresh).
|
||||||
|
try {
|
||||||
|
setAtomStorage(userAtom, data);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('userAtom commit error:', err);
|
||||||
|
}
|
||||||
|
// Fire `onUserFetched` so plugins maintaining identity-scoped
|
||||||
|
// caches can seed them under the new identity before any
|
||||||
|
// caller commits this user to `initialState`. Errors here are
|
||||||
|
// swallowed and logged — fetchUserInfo must still return.
|
||||||
|
try {
|
||||||
|
await getGPUStackPlugin()?.login?.onUserFetched?.(data, {
|
||||||
|
request: umiRequest
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error('onUserFetched plugin hook error:', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
return data;
|
return data;
|
||||||
} catch (error) {
|
} catch (error: any) {
|
||||||
history.push(loginPath);
|
const data = error?.response?.data;
|
||||||
|
if (data?.code === 401 && data?.message.includes('deactivate')) {
|
||||||
|
message.error({
|
||||||
|
content: (
|
||||||
|
<div>
|
||||||
|
<span>{data?.message}</span>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
duration: 5
|
||||||
|
});
|
||||||
|
}
|
||||||
|
history.push(DEFAULT_ENTER_PAGE.login);
|
||||||
}
|
}
|
||||||
return {} as Global.UserInfo;
|
return {} as Global.UserInfo;
|
||||||
};
|
};
|
||||||
@@ -31,7 +217,16 @@ export async function getInitialState(): Promise<{
|
|||||||
const getAppVersionInfo = async () => {
|
const getAppVersionInfo = async () => {
|
||||||
try {
|
try {
|
||||||
const data = await queryVersionInfo();
|
const data = await queryVersionInfo();
|
||||||
setAtomStorage(GPUStackVersionAtom, data);
|
|
||||||
|
const isDev = data.version?.indexOf('0.0.0') > -1;
|
||||||
|
const isRc = data.version?.indexOf('rc') > -1;
|
||||||
|
|
||||||
|
setAtomStorage(GPUStackVersionAtom, {
|
||||||
|
...data,
|
||||||
|
isProd: !isDev && !isRc,
|
||||||
|
isDev,
|
||||||
|
isRc
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('queryVersionInfo error', error);
|
console.error('queryVersionInfo error', error);
|
||||||
}
|
}
|
||||||
@@ -39,20 +234,29 @@ export async function getInitialState(): Promise<{
|
|||||||
|
|
||||||
getAppVersionInfo();
|
getAppVersionInfo();
|
||||||
|
|
||||||
if (![loginPath].includes(location.pathname)) {
|
if (![DEFAULT_ENTER_PAGE.login].includes(location.pathname)) {
|
||||||
const userInfo = await fetchUserInfo();
|
const [userInfo, hasKubernetesCluster, hasResourceEvents] =
|
||||||
|
await Promise.all([
|
||||||
|
fetchUserInfo(),
|
||||||
|
probeHasKubernetesCluster(),
|
||||||
|
probeHasResourceEvents()
|
||||||
|
]);
|
||||||
|
checkDefaultPage(userInfo);
|
||||||
return {
|
return {
|
||||||
fetchUserInfo,
|
fetchUserInfo,
|
||||||
currentUser: userInfo
|
currentUser: userInfo,
|
||||||
|
pluginData,
|
||||||
|
hasKubernetesCluster,
|
||||||
|
hasResourceEvents
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
fetchUserInfo
|
fetchUserInfo,
|
||||||
|
pluginData
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export const request: RequestConfig = {
|
export const request: RequestConfig = {
|
||||||
baseURL: ' /v1',
|
baseURL: `/${GPUSTACK_API_BASE_URL}`,
|
||||||
...requestConfig
|
...requestConfig
|
||||||
};
|
};
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 726 B |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 118 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1755020187776" class="icon" viewBox="0 0 1105 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7392" xmlns:xlink="http://www.w3.org/1999/xlink" width="138.125" height="128"><path d="M507.2896 133.44768l130.98496-71.4496v820.9408l-130.97984 69.71392V133.44768z" fill="#F38019" p-id="7393"></path><path d="M479.39072 323.968a724.30592 724.30592 0 0 0-77.056 16.6144C118.35904 417.01376 37.77536 603.8016 67.95776 701.696c30.11584 97.8944 161.03424 263.2192 439.2704 250.19904 0.13824-27.41248 0.13824-57.73824 0-90.89536-200.49408-26.37824-302.67904-88.82688-306.55488-187.40736-5.74464-147.74272 134.1696-216.90368 217.87136-229.0176 16.82432-2.49344 37.66272-5.67808 61.19936-8.6528l-0.27648-111.9488h-0.07168z m185.12384 107.65312c52.1984 5.6832 103.57248 18.69312 147.0464 44.44672-10.65984 5.19168-34.26816 19.73248-70.82496 43.47904l290.49344 66.39104-16.54272-206.58176-78.37184 44.30336c-116.10112-57.8048-205.19936-91.0336-267.29984-99.6864l-4.50048 107.648z" fill="#ADAFB3" p-id="7394"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1f1f1f"><path d="M140-180v-88.92q0-29.39 15.96-54.43 15.96-25.03 42.66-38.49 59.3-29.08 119.65-43.62Q378.62-420 440-420q21.06 0 42.12 1.89 21.05 1.88 42.11 5.65-1.69 51.46 20.81 96.81Q567.54-270.31 609-240v60H140ZM753.85-72.31l-53.35-53.14v-164.73q-39.11-11.51-63.85-43.97-24.73-32.46-24.73-74.7 0-51.46 36.38-87.84t87.85-36.38q51.46 0 87.66 36.39Q860-460.28 860-408.79q0 39.94-22.42 70.71-22.43 30.77-57.2 44.23l44.23 44.23-53.07 53.2 53.07 53.19-70.76 70.92ZM440-484.62q-57.75 0-98.87-41.12Q300-566.86 300-624.61q0-57.75 41.13-98.88 41.12-41.12 98.87-41.12 57.75 0 98.87 41.12Q580-682.36 580-624.61q0 57.75-41.13 98.87-41.12 41.12-98.87 41.12Zm296.15 93.47q14.7 0 25.04-10.54 10.35-10.54 10.35-25.23 0-14.69-10.35-25.04-10.34-10.35-25.04-10.35-14.69 0-25.23 10.35-10.54 10.35-10.54 25.04t10.54 25.23q10.54 10.54 25.23 10.54Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 934 B |
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none">
|
||||||
|
␍<g fill="#C22E33">
|
||||||
|
␍<path d="M7.754 2l.463.41c.343.304.687.607 1.026.915C11.44 5.32 13.3 7.565 14.7 10.149c.072.132.137.268.202.403l.098.203-.108.057-.081-.115-.21-.299-.147-.214c-1.019-1.479-2.04-2.96-3.442-4.145a6.563 6.563 0 00-1.393-.904c-1.014-.485-1.916-.291-2.69.505-.736.757-1.118 1.697-1.463 2.653-.045.123-.092.245-.139.367l-.082.215-.172-.055c.1-.348.192-.698.284-1.049.21-.795.42-1.59.712-2.356.31-.816.702-1.603 1.093-2.39.169-.341.338-.682.5-1.025h.092z"/>
|
||||||
|
␍<path d="M8.448 11.822c-1.626.77-5.56 1.564-7.426 1.36C.717 11.576 3.71 4.05 5.18 2.91l-.095.218a4.638 4.638 0 01-.138.303l-.066.129c-.76 1.462-1.519 2.926-1.908 4.53a7.482 7.482 0 00-.228 1.689c-.01 1.34.824 2.252 2.217 2.309.67.027 1.347-.043 2.023-.114.294-.03.587-.061.88-.084.108-.008.214-.021.352-.039l.231-.028z"/>
|
||||||
|
␍<path d="M3.825 14.781c-.445.034-.89.068-1.333.108 4.097.39 8.03-.277 11.91-1.644-1.265-2.23-2.97-3.991-4.952-5.522.026.098.084.169.141.239l.048.06c.17.226.348.448.527.67.409.509.818 1.018 1.126 1.578.778 1.42.356 2.648-1.168 3.296-1.002.427-2.097.718-3.18.892-1.03.164-2.075.243-3.119.323z"/>
|
||||||
|
␍</g>
|
||||||
|
␍</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 393 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 286 64"><g><g><defs><path id="SVGID_1_" d="M47.5 17.6L25 4.8v52.6l9-5.2V37.4l6.8 3.9-.1-10.1-6.7-3.9v-5.9l13.5 7.9z"/></defs><clipPath id="SVGID_2_"><use xlink:href="#SVGID_1_" overflow="visible"/></clipPath><g clip-path="url(#SVGID_2_)"><linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-1.6" y1="335.05" x2="53.6" y2="335.05" gradientTransform="translate(0 -304)"><stop offset="0" stop-color="#ff6f00"/><stop offset="1" stop-color="#ffa800"/></linearGradient><path d="M-1.6 4.6h55.2v52.9H-1.6V4.6z" fill="url(#SVGID_3_)"/></g></g></g><g><g><defs><path id="SVGID_4_" d="M.5 17.6L23 4.8v52.6l-9-5.2V21.4L.5 29.3z"/></defs><clipPath id="SVGID_5_"><use xlink:href="#SVGID_4_" overflow="visible"/></clipPath><g clip-path="url(#SVGID_5_)"><linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-1.9" y1="335.05" x2="53.3" y2="335.05" gradientTransform="translate(0 -304)"><stop offset="0" stop-color="#ff6f00"/><stop offset="1" stop-color="#ffa800"/></linearGradient><path d="M-1.9 4.6h55.2v52.9H-1.9V4.6z" fill="url(#SVGID_6_)"/></g></g></g><path style="fill:#425066" d="M88.2 21.1h-10v27.7h-5.6V21.1h-10v-4.5h25.6v4.5z"/><path style="fill:#425066" d="M94.9 49.2c-3.4 0-6.2-1.1-8.3-3.2-2.1-2.1-3.2-5-3.2-8.6v-.7c0-2.2.4-4.4 1.4-6.4.9-1.8 2.2-3.3 3.9-4.4 1.7-1.1 3.6-1.6 5.6-1.6 3.3 0 5.8 1 7.6 3.1s2.7 5 2.7 8.8v2.2H88.9c.1 1.8.8 3.4 2 4.7 1.2 1.2 2.7 1.8 4.4 1.7 2.4.1 4.6-1.1 6-3l2.9 2.8c-1 1.4-2.3 2.6-3.8 3.3-1.8 1-3.6 1.4-5.5 1.3zm-.6-20.5c-1.4-.1-2.7.5-3.6 1.5-1 1.2-1.6 2.7-1.7 4.3h10.3v-.4c-.1-1.8-.6-3.2-1.4-4.1-1-.8-2.3-1.4-3.6-1.3zm19.4-3.9l.2 2.8c1.7-2.1 4.3-3.3 7-3.2 5 0 7.5 2.9 7.6 8.6v15.8h-5.4V33.3c0-1.5-.3-2.6-1-3.4-.7-.7-1.7-1.1-3.2-1.1-2.1-.1-4 1.1-4.9 2.9v17h-5.4v-24l5.1.1zm32.2 17.5c0-.9-.4-1.7-1.2-2.2-1.2-.7-2.6-1.1-3.9-1.3-1.6-.3-3.1-.8-4.6-1.5-2.7-1.3-4-3.2-4-5.6 0-2 1-4 2.6-5.2 1.7-1.4 4-2.1 6.6-2.1 2.9 0 5.2.7 6.9 2.1 1.7 1.3 2.7 3.4 2.6 5.5h-5.4c0-1-.4-1.9-1.2-2.6-.9-.7-1.9-1.1-3.1-1-1 0-2 .2-2.9.8-.7.5-1.1 1.3-1.1 2.2 0 .8.4 1.5 1 1.9.7.5 2.1.9 4.2 1.4 1.7.3 3.4.9 5 1.7 1.1.5 2 1.3 2.7 2.3.6 1 .9 2.1.9 3.3 0 2.1-1 4-2.7 5.2-1.8 1.3-4.1 2-7 2-1.8 0-3.6-.3-5.2-1.1-1.4-.6-2.7-1.6-3.6-2.9-.8-1.2-1.3-2.6-1.3-4h5.2c0 1.1.5 2.2 1.4 2.9 1 .7 2.3 1.1 3.5 1 1.4 0 2.5-.3 3.2-.8 1-.4 1.4-1.2 1.4-2zm8.1-5.7c0-2.2.4-4.4 1.4-6.3.9-1.8 2.2-3.3 3.9-4.3 1.8-1 3.8-1.6 5.8-1.5 3.2 0 5.9 1 7.9 3.1s3.1 4.8 3.3 8.3v1.3c0 2.2-.4 4.3-1.4 6.3-.8 1.8-2.2 3.3-3.9 4.3-1.8 1-3.8 1.6-5.9 1.5-3.4 0-6.1-1.1-8.1-3.4-2-2.2-3-5.2-3.1-9l.1-.3zm5.3.5c0 2.5.5 4.4 1.5 5.8 1.8 2.3 5.1 2.8 7.5 1 .4-.3.7-.6 1-1 1-1.4 1.5-3.5 1.5-6.2 0-2.4-.5-4.3-1.6-5.8-1.7-2.3-5-2.8-7.4-1.1-.4.3-.8.7-1.1 1-.8 1.4-1.4 3.5-1.4 6.3zm33.1-7.3c-.7-.1-1.5-.2-2.2-.2-2.5 0-4.1.9-5 2.8v16.4h-5.4v-24h5.1l.1 2.7c1.3-2.1 3.1-3.1 5.4-3.1.6 0 1.3.1 1.9.3l.1 5.1zm22.5 5.3h-13v13.7h-5.6V16.6h20.5v4.5h-14.9v9.6h13v4.4zm10.7 13.7h-5.4V16.5h5.4v32.3zm3.9-12.2c0-2.2.4-4.4 1.4-6.3.9-1.8 2.2-3.3 3.9-4.3 1.8-1 3.8-1.6 5.8-1.5 3.2 0 5.9 1 7.9 3.1s3.1 4.8 3.3 8.3v1.3c0 2.2-.4 4.3-1.3 6.3-.8 1.8-2.2 3.3-3.9 4.3-1.8 1-3.8 1.6-5.9 1.5-3.4 0-6.1-1.1-8.1-3.4-2-2.2-3.1-5.2-3.1-9v-.3zm5.4.5c0 2.5.5 4.4 1.5 5.8 1 1.4 2.6 2.2 4.3 2.1 1.7.1 3.3-.7 4.2-2.1 1-1.4 1.5-3.5 1.5-6.2 0-2.4-.5-4.3-1.6-5.8-1.7-2.3-5-2.8-7.4-1.1-.4.3-.8.7-1.1 1-.9 1.4-1.4 3.5-1.4 6.3zm41.2 4.3l3.8-16.5h5.2l-6.5 24h-4.4l-5.1-16.5-5.1 16.5h-4.4l-6.6-24h5.3l3.9 16.4 4.9-16.4h4.1l4.9 16.5z"/></svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>AI360</title><path clip-rule="evenodd" d="M12 0h.018c1.473-.002 2.88.261 4.179.754C20.755 2.456 24 6.85 24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0zm8.604 18.967A11.024 11.024 0 0023.07 12c0-1.717-.39-3.344-1.089-4.794a2.59 2.59 0 01-3.214.62 6.278 6.278 0 01-1.333-.992C16.283 5.73 15.109 4.66 13.696 3.9c-3.211-1.729-6.825-1.501-9.695.447A11.033 11.033 0 00.93 12c0 1.663.367 3.241 1.024 4.657.75-.973 2.131-1.346 3.232-.71.667.384 1.257.92 1.837 1.447l.176.16c1.365 1.234 2.794 2.355 4.558 2.965 3.053 1.053 6.356.437 8.847-1.552z" fill="url(#lobe-icons-ai-360-fill-0)" fill-rule="evenodd"></path><path d="M5.643 10.312c-.83.11-1.401.766-1.408 1.618a1.715 1.715 0 001.45 1.72c.805.128 1.64-.426 1.87-1.26.046-.167.076-.338.106-.51.025-.14.05-.282.084-.42.318-1.317 1.237-1.95 2.788-1.93 1.086.013 1.318.271 1.68 1.855.017.076.043.151.07.226.26.714.976 1.17 1.67 1.065a1.647 1.647 0 001.38-1.438c.083-.729-.348-1.264-1.122-1.575-.34-.136-.664-.158-.995-.141-.726.037-1.121-.36-1.339-.977a3.359 3.359 0 01-.134-.65c-.014-.093-.027-.186-.043-.278-.156-.887-.835-1.51-1.669-1.532-.791-.02-1.464.551-1.665 1.418l-.06.27-.025.117c-.355 1.636-.974 2.205-2.638 2.422z" fill="url(#lobe-icons-ai-360-fill-1)"></path><path d="M18.059 13.644c.989-.206 1.577-.838 1.592-1.697.015-.83-.624-1.582-1.46-1.724-.77-.13-1.599.383-1.844 1.18-.069.22-.117.448-.165.676-.06.29-.122.58-.225.854-.367.986-1.593 1.546-2.926 1.394-.824-.095-1.106-.446-1.342-1.674-.18-.938-.864-1.535-1.681-1.467-.85.07-1.515.829-1.468 1.673.05.892.678 1.44 1.705 1.489 1.375.064 1.75.396 1.926 1.787.067.531.267.967.685 1.288 1.02.783 2.407.208 2.66-1.108l.022-.114c.152-.796.3-1.577 1.04-2.101.36-.255.761-.326 1.166-.397.105-.019.21-.037.315-.06z" fill="url(#lobe-icons-ai-360-fill-2)"></path><path d="M13.83 7.961a.755.755 0 11-1.51 0 .755.755 0 011.51 0z" fill="url(#lobe-icons-ai-360-fill-3)"></path><path d="M10.809 16.678a.755.755 0 100-1.511.755.755 0 000 1.51z" fill="url(#lobe-icons-ai-360-fill-4)"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-0" x1="12" x2="12" y1="0" y2="24"><stop stop-color="#12B7FA"></stop><stop offset="1" stop-color="#006ffb"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-1" x1="11.943" x2="11.943" y1="6.085" y2="17.778"><stop stop-color="#006ffb"></stop><stop offset="1" stop-color="#12B7FA"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-2" x1="11.943" x2="11.943" y1="6.085" y2="17.778"><stop stop-color="#006ffb"></stop><stop offset="1" stop-color="#12B7FA"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-3" x1="11.943" x2="11.943" y1="6.085" y2="17.778"><stop stop-color="#006ffb"></stop><stop offset="1" stop-color="#12B7FA"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-4" x1="11.943" x2="11.943" y1="6.085" y2="17.778"><stop stop-color="#006ffb"></stop><stop offset="1" stop-color="#12B7FA"></stop></linearGradient></defs></svg>
|
||||||
|
After Width: | Height: | Size: 3.1 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>AlibabaCloud</title><path d="M14.752 4.64h5.274C22.242 4.64 24 6.475 24 8.691V15.8a3.947 3.947 0 01-3.974 3.975h-5.274l1.299-1.835 3.822-1.222c.688-.23 1.146-.918 1.146-1.605v-5.81c0-.687-.458-1.375-1.146-1.605L16.05 6.475l-1.3-1.835zM2.98 15.111c0 .688.46 1.376 1.147 1.606l3.822 1.146 1.3 1.835H3.974A3.947 3.947 0 010 15.723V8.69c0-2.216 1.758-4.05 3.975-4.05h5.273L7.95 6.474 4.127 7.697c-.688.23-1.146.918-1.146 1.606v5.808z" fill="#FF6A00"></path><path d="M16.051 11.213H8.025v1.835h8.026v-1.835z" fill="#FF6A00"></path></svg>
|
||||||
|
After Width: | Height: | Size: 656 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>AzureAI</title><path clip-rule="evenodd" d="M16.233 0c.713 0 1.345.551 1.572 1.329.227.778 1.555 5.59 1.555 5.59v9.562h-4.813L14.645 0h1.588z" fill="url(#lobe-icons-azure-ai-fill-0)" fill-rule="evenodd"></path><path d="M23.298 7.47c0-.34-.275-.6-.6-.6h-2.835a3.617 3.617 0 00-3.614 3.615v5.996h3.436a3.617 3.617 0 003.613-3.614V7.47z" fill="url(#lobe-icons-azure-ai-fill-1)"></path><path clip-rule="evenodd" d="M16.233 0a.982.982 0 00-.989.989l-.097 18.198A4.814 4.814 0 0110.334 24H1.6a.597.597 0 01-.567-.794l7-19.981A4.819 4.819 0 0112.57 0h3.679-.016z" fill="url(#lobe-icons-azure-ai-fill-2)" fill-rule="evenodd"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-azure-ai-fill-0" x1="18.242" x2="14.191" y1="16.837" y2=".616"><stop stop-color="#712575"></stop><stop offset=".09" stop-color="#9A2884"></stop><stop offset=".18" stop-color="#BF2C92"></stop><stop offset=".27" stop-color="#DA2E9C"></stop><stop offset=".34" stop-color="#EB30A2"></stop><stop offset=".4" stop-color="#F131A5"></stop><stop offset=".5" stop-color="#EC30A3"></stop><stop offset=".61" stop-color="#DF2F9E"></stop><stop offset=".72" stop-color="#C92D96"></stop><stop offset=".83" stop-color="#AA2A8A"></stop><stop offset=".95" stop-color="#83267C"></stop><stop offset="1" stop-color="#712575"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-azure-ai-fill-1" x1="19.782" x2="19.782" y1=".34" y2="23.222"><stop stop-color="#DA7ED0"></stop><stop offset=".08" stop-color="#B17BD5"></stop><stop offset=".19" stop-color="#8778DB"></stop><stop offset=".3" stop-color="#6276E1"></stop><stop offset=".41" stop-color="#4574E5"></stop><stop offset=".54" stop-color="#2E72E8"></stop><stop offset=".67" stop-color="#1D71EB"></stop><stop offset=".81" stop-color="#1471EC"></stop><stop offset="1" stop-color="#1171ED"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-azure-ai-fill-2" x1="18.404" x2="3.236" y1=".859" y2="25.183"><stop stop-color="#DA7ED0"></stop><stop offset=".05" stop-color="#B77BD4"></stop><stop offset=".11" stop-color="#9079DA"></stop><stop offset=".18" stop-color="#6E77DF"></stop><stop offset=".25" stop-color="#5175E3"></stop><stop offset=".33" stop-color="#3973E7"></stop><stop offset=".42" stop-color="#2772E9"></stop><stop offset=".54" stop-color="#1A71EB"></stop><stop offset=".68" stop-color="#1371EC"></stop><stop offset="1" stop-color="#1171ED"></stop></linearGradient></defs></svg>
|
||||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Baichuan</title><defs><linearGradient id="lobe-icons-baichuan-fill" x1="17.764%" x2="100%" y1="8.678%" y2="91.322%"><stop offset="0%" stop-color="#FEC13E"></stop><stop offset="100%" stop-color="#FF6933"></stop></linearGradient></defs><path d="M7.333 2h-3.2l-2 4.333V17.8L0 22h5.2l2.028-4.2L7.333 2zm7.334 0h-5.2v20h5.2V2zM16.8 7.733H22V22h-5.2V7.733zM22 2h-5.2v4.133H22V2z" fill="url(#lobe-icons-baichuan-fill)" fill-rule="nonzero"></path></svg>
|
||||||
|
After Width: | Height: | Size: 569 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>BaiduCloud</title><path d="M21.715 5.61l-3.983 2.31a.903.903 0 01-.896 0L12.44 5.384a.903.903 0 00-.897 0L7.156 7.92a.903.903 0 01-.896 0L2.276 5.617 12.002 0l9.713 5.61z" fill="#5BCA87"></path><path d="M18.641 9.467a.89.89 0 00-.438.77v5.072a.896.896 0 01-.445.77l-4.428 2.51a.884.884 0 00-.445.777v4.607l4.429-2.536 5.31-3.047V7.157l-3.983 2.31z" fill="#EC5D3E"></path><path d="M10.98 18.941a.936.936 0 00-.305-.352l-4.429-2.516a.903.903 0 01-.431-.764v-5.078a.89.89 0 00-.452-.757l-.451-.26L1.38 7.158V18.39l5.311 3.047L11.126 24v-4.608a.881.881 0 00-.146-.45z" fill="#2464F5"></path></svg>
|
||||||
|
After Width: | Height: | Size: 717 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>BaiLian</title><path d="M6.336 8.919v6.162l5.335-3.083L6.337 8.92z" fill="#1C54E3"></path><path d="M21.394 5.288s-.006-.006-.01-.006L17.01 2.754 6.336 8.92l5.335 3.082 9.701-5.6.016-.01a.635.635 0 00.006-1.1v-.003z" fill="#AA9AFF"></path><path d="M21.71 12.465a.62.62 0 00-.316.085s-.006 0-.009.003l-4.375 2.528 5.05 2.915h.006a2.06 2.06 0 00.28-1.04v-3.855a.637.637 0 00-.636-.636z" fill="#00EAD1"></path><path d="M22.06 17.996l-5.05-2.915L6.34 21.242l4.27 2.465s.016.006.022.012a2.102 2.102 0 002.093 0c.006-.003.016-.006.022-.012l8.538-4.93c.003 0 .006-.003.01-.006.321-.183.589-.45.775-.772h-.006l-.004-.003z" fill="#00CEC9"></path><path d="M11.672 11.998l-5.336 3.083-1.444.832-3.605 2.083H1.28c.173.303.416.555.709.738l.078.044.016.01.02.012 4.232 2.442 10.671-6.161-5.335-3.082z" fill="#00EAD1"></path><path d="M12.74.29c-.1-.06-.208-.107-.315-.148-.02-.006-.038-.016-.057-.022a2.121 2.121 0 00-.7-.12c-.233 0-.457.038-.668.11l-.031.01a2.196 2.196 0 00-.372.17L2.068 5.222s-.003 0-.006.003c-.324.183-.592.451-.781.773h.006l5.049 2.918L17.01 2.758 12.74.29z" fill="#7347FF"></path><path d="M1.287 6.001H1.28A2.06 2.06 0 001 7.041v9.915c0 .378.1.735.28 1.043h.007l5.049-2.918V8.919l-5.05-2.918z" fill="#0423DA"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Bedrock</title><defs><linearGradient id="lobe-icons-bedrock-fill" x1="80%" x2="20%" y1="20%" y2="80%"><stop offset="0%" stop-color="#6350FB"></stop><stop offset="50%" stop-color="#3D8FFF"></stop><stop offset="100%" stop-color="#9AD8F8"></stop></linearGradient></defs><path d="M13.05 15.513h3.08c.214 0 .389.177.389.394v1.82a1.704 1.704 0 011.296 1.661c0 .943-.755 1.708-1.685 1.708-.931 0-1.686-.765-1.686-1.708 0-.807.554-1.484 1.297-1.662v-1.425h-2.69v4.663a.395.395 0 01-.188.338l-2.69 1.641a.385.385 0 01-.405-.002l-4.926-3.086a.395.395 0 01-.185-.336V16.3L2.196 14.87A.395.395 0 012 14.555L2 14.528V9.406c0-.14.073-.27.192-.34l2.465-1.462V4.448c0-.129.062-.249.165-.322l.021-.014L9.77 1.058a.385.385 0 01.407 0l2.69 1.675a.395.395 0 01.185.336V7.6h3.856V5.683a1.704 1.704 0 01-1.296-1.662c0-.943.755-1.708 1.685-1.708.931 0 1.685.765 1.685 1.708 0 .807-.553 1.484-1.296 1.662v2.311a.391.391 0 01-.389.394h-4.245v1.806h6.624a1.69 1.69 0 011.64-1.313c.93 0 1.685.764 1.685 1.707 0 .943-.754 1.708-1.685 1.708a1.69 1.69 0 01-1.64-1.314H13.05v1.937h4.953l.915 1.18a1.66 1.66 0 01.84-.227c.931 0 1.685.764 1.685 1.707 0 .943-.754 1.708-1.685 1.708-.93 0-1.685-.765-1.685-1.708 0-.346.102-.668.276-.937l-.724-.935H13.05v1.806zM9.973 1.856L7.93 3.122V6.09h-.778V3.604L5.435 4.669v2.945l2.11 1.36L9.712 7.61V5.334h.778V7.83c0 .136-.07.263-.184.335L7.963 9.638v2.081l1.422 1.009-.446.646-1.406-.998-1.53 1.005-.423-.66 1.605-1.055v-1.99L5.038 8.29l-2.26 1.34v1.676l1.972-1.189.398.677-2.37 1.429V14.3l2.166 1.258 2.27-1.368.397.677-2.176 1.311V19.3l1.876 1.175 2.365-1.426.398.678-2.017 1.216 1.918 1.201 2.298-1.403v-5.78l-4.758 2.893-.4-.675 5.158-3.136V3.289L9.972 1.856zM16.13 18.47a.913.913 0 00-.908.92c0 .507.406.918.908.918a.913.913 0 00.907-.919.913.913 0 00-.907-.92zm3.63-3.81a.913.913 0 00-.908.92c0 .508.406.92.907.92a.913.913 0 00.908-.92.913.913 0 00-.908-.92zm1.555-4.99a.913.913 0 00-.908.92c0 .507.407.918.908.918a.913.913 0 00.907-.919.913.913 0 00-.907-.92zM17.296 3.1a.913.913 0 00-.907.92c0 .508.406.92.907.92a.913.913 0 00.908-.92.913.913 0 00-.908-.92z" fill="url(#lobe-icons-bedrock-fill)" fill-rule="nonzero"></path></svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Claude</title><path d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z" fill="#D97757" fill-rule="nonzero"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Cloudflare</title><path d="M16.493 17.4c.135-.52.08-.983-.161-1.338-.215-.328-.592-.519-1.05-.519l-8.663-.109a.148.148 0 01-.135-.082c-.027-.054-.027-.109-.027-.163.027-.082.108-.164.189-.164l8.744-.11c1.05-.054 2.153-.9 2.556-1.937l.511-1.31c.027-.055.027-.11.027-.164C17.92 8.91 15.66 7 12.942 7c-2.503 0-4.628 1.638-5.381 3.903a2.432 2.432 0 00-1.803-.491c-1.21.109-2.153 1.092-2.287 2.32-.027.328 0 .628.054.9C1.56 13.688 0 15.326 0 17.319c0 .19.027.355.027.545 0 .082.08.137.161.137h15.983c.08 0 .188-.055.215-.164l.107-.437" fill="#F38020"></path><path d="M19.238 11.75h-.242c-.054 0-.108.054-.135.109l-.35 1.2c-.134.52-.08.983.162 1.338.215.328.592.518 1.05.518l1.855.11c.054 0 .108.027.135.082.027.054.027.109.027.163-.027.082-.108.164-.188.164l-1.91.11c-1.05.054-2.153.9-2.557 1.937l-.134.355c-.027.055.026.137.107.137h6.592c.081 0 .162-.055.162-.137.107-.41.188-.846.188-1.31-.027-2.62-2.153-4.777-4.762-4.777" fill="#FCAD32"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Cohere</title><path clip-rule="evenodd" d="M8.128 14.099c.592 0 1.77-.033 3.398-.703 1.897-.781 5.672-2.2 8.395-3.656 1.905-1.018 2.74-2.366 2.74-4.18A4.56 4.56 0 0018.1 1H7.549A6.55 6.55 0 001 7.55c0 3.617 2.745 6.549 7.128 6.549z" fill="#39594D" fill-rule="evenodd"></path><path clip-rule="evenodd" d="M9.912 18.61a4.387 4.387 0 012.705-4.052l3.323-1.38c3.361-1.394 7.06 1.076 7.06 4.715a5.104 5.104 0 01-5.105 5.104l-3.597-.001a4.386 4.386 0 01-4.386-4.387z" fill="#D18EE2" fill-rule="evenodd"></path><path d="M4.776 14.962A3.775 3.775 0 001 18.738v.489a3.776 3.776 0 007.551 0v-.49a3.775 3.775 0 00-3.775-3.775z" fill="#FF7759"></path></svg>
|
||||||
|
After Width: | Height: | Size: 769 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Coze</title><path clip-rule="evenodd" d="M3.908 9.096A8.092 8.092 0 0111.998 1h.006c4.468 0 8.09 3.628 8.09 8.096v3.392h1.942c2.23 0 2.732 3.126.615 3.828l-2.556.85v1.466a1.947 1.947 0 01-2.818 1.742l-1.42-.707c-.067-.03-.149 0-.17.071-1.147 3.587-6.225 3.587-7.373 0a.123.123 0 00-.169-.07l-1.42.706c-1.29.65-2.817-.292-2.817-1.742v-1.466l-2.557-.85c-2.122-.697-1.614-3.828.615-3.828h1.942V9.096zm4.571 2.613a.784.784 0 00-.784.784v1.568a.784.784 0 101.568 0v-1.568a.784.784 0 00-.784-.784zm7.045.779a.784.784 0 100 1.568.784.784 0 000-1.568zm-6.186 3.415a.78.78 0 00.17.254 3.517 3.517 0 004.98 0 .782.782 0 10-1.106-1.107 1.958 1.958 0 01-2.767 0 .78.78 0 00-1.277.254.78.78 0 000 .6z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 866 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>DeepL</title><path d="M11.563 0c.24 0 .475.065.682.187l8.197 4.756a1.383 1.383 0 01.683 1.197v9.528c0 .495-.26.949-.683 1.196l-4.79 2.78.01-.002-.155.087-.23.133a.69.69 0 00-.3.563v.386l-.16-.683-2.572 1.493a1.35 1.35 0 01-1.366 0l-8.195-4.757A1.384 1.384 0 012 15.668V6.14c0-.482.26-.936.684-1.183l8.195-4.77c.207-.122.443-.187.684-.187zm-1.27 14.023a1.405 1.405 0 00-2.038-.073 1.43 1.43 0 00.984 2.464c.368 0 .722-.144.985-.401a1.428 1.428 0 00.396-1.384l3.674-2.137-.683-.386-3.317 1.917zM9.24 6.164c-.368 0-.72.145-.983.402a1.43 1.43 0 00-.326 1.592c.075.177.187.338.326.47a1.405 1.405 0 002.021-.055l3.745 2.173.013-.009a1.427 1.427 0 00.368 1.48 1.403 1.403 0 001.967 0 1.428 1.428 0 000-2.063 1.403 1.403 0 00-1.986.02l-3.77-2.201a1.427 1.427 0 00-.39-1.407 1.405 1.405 0 00-.985-.402z" fill="#0F2B46"></path><path clip-rule="evenodd" d="M14.978 24v-3.959l-4.781 1.182" fill="#0F2B46" fill-rule="evenodd"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>DeepSeek</title><path d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z" fill="#4D6BFE"></path></svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Dify</title><path d="M7.043 6.487c1.635 0 2.241-1.003 2.241-2.243S8.681 2 7.044 2C5.405 2 4.801 3.003 4.801 4.244c0 1.24.604 2.243 2.241 2.243z" fill="#03F"></path><path d="M14.883 6.97v1.443h-3.679v3.203h3.68v8.012H8.801V8.41h-8v3.203h4.48v8.012H0v3.203h24v-3.203h-5.6v-8.012H24V8.41h-5.6V5.206H24V2.003h-4.161a4.97 4.97 0 00-4.961 4.967h.005z" fill="#03F"></path></svg>
|
||||||
|
After Width: | Height: | Size: 495 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Doubao</title><path d="M5.31 15.756c.172-3.75 1.883-5.999 2.549-6.739-3.26 2.058-5.425 5.658-6.358 8.308v1.12C1.501 21.513 4.226 24 7.59 24a6.59 6.59 0 002.2-.375c.353-.12.7-.248 1.039-.378.913-.899 1.65-1.91 2.243-2.992-4.877 2.431-7.974.072-7.763-4.5l.002.001z" fill="#1E37FC"></path><path d="M22.57 10.283c-1.212-.901-4.109-2.404-7.397-2.8.295 3.792.093 8.766-2.1 12.773a12.782 12.782 0 01-2.244 2.992c3.764-1.448 6.746-3.457 8.596-5.219 2.82-2.683 3.353-5.178 3.361-6.66a2.737 2.737 0 00-.216-1.084v-.002z" fill="#37E1BE"></path><path d="M14.303 1.867C12.955.7 11.248 0 9.39 0 7.532 0 5.883.677 4.545 1.807 2.791 3.29 1.627 5.557 1.5 8.125v9.201c.932-2.65 3.097-6.25 6.357-8.307.5-.318 1.025-.595 1.569-.829 1.883-.801 3.878-.932 5.746-.706-.222-2.83-.718-5.002-.87-5.617h.001z" fill="#A569FF"></path><path d="M17.305 4.961a199.47 199.47 0 01-1.08-1.094c-.202-.213-.398-.419-.586-.622l-1.333-1.378c.151.615.648 2.786.869 5.617 3.288.395 6.185 1.898 7.396 2.8-1.306-1.275-3.475-3.487-5.266-5.323z" fill="#1E37FC"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Fireworks</title><path clip-rule="evenodd" d="M14.8 5l-2.801 6.795L9.195 5H7.397l3.072 7.428a1.64 1.64 0 003.038.002L16.598 5H14.8zm1.196 10.352l5.124-5.244-.699-1.669-5.596 5.739a1.664 1.664 0 00-.343 1.807 1.642 1.642 0 001.516 1.012L16 17l8-.02-.699-1.669-7.303.041h-.002zM2.88 10.104l.699-1.669 5.596 5.739c.468.479.603 1.189.343 1.807a1.643 1.643 0 01-1.516 1.012l-8-.018-.002.002.699-1.669 7.303.042-5.122-5.246z" fill="#5019C5" fill-rule="evenodd"></path></svg>
|
||||||
|
After Width: | Height: | Size: 592 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Gemini</title><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="#3186FF"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-0)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-1)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-2)"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-0" x1="7" x2="11" y1="15.5" y2="12"><stop stop-color="#08B962"></stop><stop offset="1" stop-color="#08B962" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-1" x1="8" x2="11.5" y1="5.5" y2="11"><stop stop-color="#F94543"></stop><stop offset="1" stop-color="#F94543" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-2" x1="3.5" x2="17.5" y1="13.5" y2="12"><stop stop-color="#FABC12"></stop><stop offset=".46" stop-color="#FABC12" stop-opacity="0"></stop></linearGradient></defs></svg>
|
||||||
|
After Width: | Height: | Size: 2.8 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Github</title><path d="M12 0c6.63 0 12 5.276 12 11.79-.001 5.067-3.29 9.567-8.175 11.187-.6.118-.825-.25-.825-.56 0-.398.015-1.665.015-3.242 0-1.105-.375-1.813-.81-2.181 2.67-.295 5.475-1.297 5.475-5.822 0-1.297-.465-2.344-1.23-3.169.12-.295.54-1.503-.12-3.125 0 0-1.005-.324-3.3 1.209a11.32 11.32 0 00-3-.398c-1.02 0-2.04.133-3 .398-2.295-1.518-3.3-1.209-3.3-1.209-.66 1.622-.24 2.83-.12 3.125-.765.825-1.23 1.887-1.23 3.169 0 4.51 2.79 5.527 5.46 5.822-.345.294-.66.81-.765 1.577-.69.31-2.415.81-3.495-.973-.225-.354-.9-1.223-1.845-1.209-1.005.015-.405.56.015.781.51.28 1.095 1.327 1.23 1.666.24.663 1.02 1.93 4.035 1.385 0 .988.015 1.916.015 2.196 0 .31-.225.664-.825.56C3.303 21.374-.003 16.867 0 11.791 0 5.276 5.37 0 12 0z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 907 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Grok</title><path d="M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815"></path></svg>
|
||||||
|
After Width: | Height: | Size: 756 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Groq</title><path d="M12.036 2c-3.853-.035-7 3-7.036 6.781-.035 3.782 3.055 6.872 6.908 6.907h2.42v-2.566h-2.292c-2.407.028-4.38-1.866-4.408-4.23-.029-2.362 1.901-4.298 4.308-4.326h.1c2.407 0 4.358 1.915 4.365 4.278v6.305c0 2.342-1.944 4.25-4.323 4.279a4.375 4.375 0 01-3.033-1.252l-1.851 1.818A7 7 0 0012.029 22h.092c3.803-.056 6.858-3.083 6.879-6.816v-6.5C18.907 4.963 15.817 2 12.036 2z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 568 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Hunyuan</title><circle cx="12" cy="12" fill="#0055E9" r="12"></circle><path d="M12 0c.518 0 1.028.033 1.528.096A6.188 6.188 0 0112.12 12.28l-.12.001c-2.99 0-5.242 2.179-5.554 5.11-.223 2.086.353 4.412 2.242 6.146C3.672 22.1 0 17.479 0 12 0 5.373 5.373 0 12 0z" fill="#A8DFF5"></path><path d="M5.286 5a2.438 2.438 0 01.682 3.38c-3.962 5.966-3.215 10.743 2.648 15.136C3.636 22.056 0 17.452 0 12c0-1.787.39-3.482 1.09-5.006.253-.435.525-.872.817-1.311A2.438 2.438 0 015.286 5z" fill="#0055E9"></path><path d="M12.98.04c.272.021.543.053.81.093.583.106 1.117.254 1.538.44 6.638 2.927 8.07 10.052 1.748 15.642a4.125 4.125 0 01-5.822-.358c-1.51-1.706-1.3-4.184.357-5.822.858-.848 3.108-1.223 4.045-2.441 1.257-1.634 2.122-6.009-2.523-7.506L12.98.039z" fill="#00BCFF"></path><path d="M13.528.096A6.187 6.187 0 0112 12.281a5.75 5.75 0 00-1.71.255c.147-.905.595-1.784 1.321-2.501.858-.848 3.108-1.223 4.045-2.441 1.27-1.651 2.14-6.104-2.676-7.554.184.014.367.033.548.056z" fill="#ECECEE"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="currentColor" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>LongCat</title><path clip-rule="evenodd" d="M.507 19.883a.507.507 0 01-.489-.642L4.29 3.745a1.013 1.013 0 011.533-.578l5.622 3.687a1.013 1.013 0 001.11 0L18.2 3.165a1.013 1.013 0 011.532.58l4.25 15.497a.506.506 0 01-.49.64H18.07a6.297 6.297 0 001.53-4.115v-.177a6.09 6.09 0 00-1.513-4.017l-.697-3.495a.438.438 0 00-.694-.266L14.07 9.781a.748.748 0 01-.654.121 5.156 5.156 0 00-2.833 0 .746.746 0 01-.653-.121L7.302 7.81a.435.435 0 00-.688.269l-.675 3.652a5.36 5.36 0 00-1.539 3.76v.333c0 1.474.527 2.9 1.488 4.02l.032.038H.507z" fill="#29E154" fill-rule="evenodd"></path><path d="M9.213 16.843h1.52v-3.546h-1.29l-.23 3.546zm5.573 0h-1.52v-3.546h1.29l.23 3.546z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 819 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Minimax</title><defs><linearGradient id="lobe-icons-minimax-fill" x1="0%" x2="100.182%" y1="50.057%" y2="50.057%"><stop offset="0%" stop-color="#E2167E"></stop><stop offset="100%" stop-color="#FE603C"></stop></linearGradient></defs><path d="M16.278 2c1.156 0 2.093.927 2.093 2.07v12.501a.74.74 0 00.744.709.74.74 0 00.743-.709V9.099a2.06 2.06 0 012.071-2.049A2.06 2.06 0 0124 9.1v6.561a.649.649 0 01-.652.645.649.649 0 01-.653-.645V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v7.472a2.037 2.037 0 01-2.048 2.026 2.037 2.037 0 01-2.048-2.026v-12.5a.785.785 0 00-.788-.753.785.785 0 00-.789.752l-.001 15.904A2.037 2.037 0 0113.441 22a2.037 2.037 0 01-2.048-2.026V18.04c0-.356.292-.645.652-.645.36 0 .652.289.652.645v1.934c0 .263.142.506.372.638.23.131.514.131.744 0a.734.734 0 00.372-.638V4.07c0-1.143.937-2.07 2.093-2.07zm-5.674 0c1.156 0 2.093.927 2.093 2.07v11.523a.648.648 0 01-.652.645.648.648 0 01-.652-.645V4.07a.785.785 0 00-.789-.78.785.785 0 00-.789.78v14.013a2.06 2.06 0 01-2.07 2.048 2.06 2.06 0 01-2.071-2.048V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v3.8a2.06 2.06 0 01-2.071 2.049A2.06 2.06 0 010 12.9v-1.378c0-.357.292-.646.652-.646.36 0 .653.29.653.646V12.9c0 .418.343.757.766.757s.766-.339.766-.757V9.099a2.06 2.06 0 012.07-2.048 2.06 2.06 0 012.071 2.048v8.984c0 .419.343.758.767.758.423 0 .766-.339.766-.758V4.07c0-1.143.937-2.07 2.093-2.07z" fill="url(#lobe-icons-minimax-fill)" fill-rule="nonzero"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Mistral</title><path d="M3.428 3.4h3.429v3.428H3.428V3.4zm13.714 0h3.43v3.428h-3.43V3.4z" fill="gold"></path><path d="M3.428 6.828h6.857v3.429H3.429V6.828zm10.286 0h6.857v3.429h-6.857V6.828z" fill="#FFAF00"></path><path d="M3.428 10.258h17.144v3.428H3.428v-3.428z" fill="#FF8205"></path><path d="M3.428 13.686h3.429v3.428H3.428v-3.428zm6.858 0h3.429v3.428h-3.429v-3.428zm6.856 0h3.43v3.428h-3.43v-3.428z" fill="#FA500F"></path><path d="M0 17.114h10.286v3.429H0v-3.429zm13.714 0H24v3.429H13.714v-3.429z" fill="#E10500"></path></svg>
|
||||||
|
After Width: | Height: | Size: 655 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>MoonshotAI</title><path d="M1.052 16.916l9.539 2.552a21.007 21.007 0 00.06 2.033l5.956 1.593a11.997 11.997 0 01-5.586.865l-.18-.016-.044-.004-.084-.009-.094-.01a11.605 11.605 0 01-.157-.02l-.107-.014-.11-.016a11.962 11.962 0 01-.32-.051l-.042-.008-.075-.013-.107-.02-.07-.015-.093-.019-.075-.016-.095-.02-.097-.023-.094-.022-.068-.017-.088-.022-.09-.024-.095-.025-.082-.023-.109-.03-.062-.02-.084-.025-.093-.028-.105-.034-.058-.019-.08-.026-.09-.031-.066-.024a6.293 6.293 0 01-.044-.015l-.068-.025-.101-.037-.057-.022-.08-.03-.087-.035-.088-.035-.079-.032-.095-.04-.063-.028-.063-.027a5.655 5.655 0 01-.041-.018l-.066-.03-.103-.047-.052-.024-.096-.046-.062-.03-.084-.04-.086-.044-.093-.047-.052-.027-.103-.055-.057-.03-.058-.032a6.49 6.49 0 01-.046-.026l-.094-.053-.06-.034-.051-.03-.072-.041-.082-.05-.093-.056-.052-.032-.084-.053-.061-.039-.079-.05-.07-.047-.053-.035a7.785 7.785 0 01-.054-.036l-.044-.03-.044-.03a6.066 6.066 0 01-.04-.028l-.057-.04-.076-.054-.069-.05-.074-.054-.056-.042-.076-.057-.076-.059-.086-.067-.045-.035-.064-.052-.074-.06-.089-.073-.046-.039-.046-.039a7.516 7.516 0 01-.043-.037l-.045-.04-.061-.053-.07-.062-.068-.06-.062-.058-.067-.062-.053-.05-.088-.084a13.28 13.28 0 01-.099-.097l-.029-.028-.041-.042-.069-.07-.05-.051-.05-.053a6.457 6.457 0 01-.168-.179l-.08-.088-.062-.07-.071-.08-.042-.049-.053-.062-.058-.068-.046-.056a7.175 7.175 0 01-.027-.033l-.045-.055-.066-.082-.041-.052-.05-.064-.02-.025a11.99 11.99 0 01-1.44-2.402zm-1.02-5.794l11.353 3.037a20.468 20.468 0 00-.469 2.011l10.817 2.894a12.076 12.076 0 01-1.845 2.005L.657 15.923l-.016-.046-.035-.104a11.965 11.965 0 01-.05-.153l-.007-.023a11.896 11.896 0 01-.207-.741l-.03-.126-.018-.08-.021-.097-.018-.081-.018-.09-.017-.084-.018-.094c-.026-.141-.05-.283-.071-.426l-.017-.118-.011-.083-.013-.102a12.01 12.01 0 01-.019-.161l-.005-.047a12.12 12.12 0 01-.034-2.145zm1.593-5.15l11.948 3.196c-.368.605-.705 1.231-1.01 1.875l11.295 3.022c-.142.82-.368 1.612-.668 2.365l-11.55-3.09L.124 10.26l.015-.1.008-.049.01-.067.015-.087.018-.098c.026-.148.056-.295.088-.442l.028-.124.02-.085.024-.097c.022-.09.045-.18.07-.268l.028-.102.023-.083.03-.1.025-.082.03-.096.026-.082.031-.095a11.896 11.896 0 011.01-2.232zm4.442-4.4L17.352 4.59a20.77 20.77 0 00-1.688 1.721l7.823 2.093c.267.852.442 1.744.513 2.665L2.106 5.213l.045-.065.027-.04.04-.055.046-.065.055-.076.054-.072.064-.086.05-.065.057-.073.055-.07.06-.074.055-.069.065-.077.054-.066.066-.077.053-.06.072-.082.053-.06.067-.074.054-.058.073-.078.058-.06.063-.067.168-.17.1-.098.059-.056.076-.071a12.084 12.084 0 012.272-1.677zM12.017 0h.097l.082.001.069.001.054.002.068.002.046.001.076.003.047.002.06.003.054.002.087.005.105.007.144.011.088.007.044.004.077.008.082.008.047.005.102.012.05.006.108.014.081.01.042.006.065.01.207.032.07.012.065.011.14.026.092.018.11.022.046.01.075.016.041.01L14.7.3l.042.01.065.015.049.012.071.017.096.024.112.03.113.03.113.032.05.015.07.02.078.024.073.023.05.016.05.016.076.025.099.033.102.036.048.017.064.023.093.034.11.041.116.045.1.04.047.02.06.024.041.018.063.026.04.018.057.025.11.048.1.046.074.035.075.036.06.028.092.046.091.045.102.052.053.028.049.026.046.024.06.033.041.022.052.029.088.05.106.06.087.051.057.034.053.032.096.059.088.055.098.062.036.024.064.041.084.056.04.027.062.042.062.043.023.017c.054.037.108.075.161.114l.083.06.065.048.056.043.086.065.082.064.04.03.05.041.086.069.079.065.085.071c.712.6 1.353 1.283 1.909 2.031L7.222.994l.062-.027.065-.028.081-.034.086-.035c.113-.045.227-.09.341-.131l.096-.035.093-.033.084-.03.096-.031c.087-.03.176-.058.264-.085l.091-.027.086-.025.102-.03.085-.023.1-.026L9.04.37l.09-.023.091-.022.095-.022.09-.02.098-.021.091-.02.095-.018.092-.018.1-.018.091-.016.098-.017.092-.014.097-.015.092-.013.102-.013.091-.012.105-.012.09-.01.105-.01c.093-.01.186-.018.28-.024l.106-.008.09-.005.11-.006.093-.004.1-.004.097-.002.099-.002.197-.002z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Nvidia</title><path d="M10.212 8.976V7.62c.127-.01.256-.017.388-.021 3.596-.117 5.957 3.184 5.957 3.184s-2.548 3.647-5.282 3.647a3.227 3.227 0 01-1.063-.175v-4.109c1.4.174 1.681.812 2.523 2.258l1.873-1.627a4.905 4.905 0 00-3.67-1.846 6.594 6.594 0 00-.729.044m0-4.476v2.025c.13-.01.259-.019.388-.024 5.002-.174 8.261 4.226 8.261 4.226s-3.743 4.69-7.643 4.69c-.338 0-.675-.031-1.007-.092v1.25c.278.038.558.057.838.057 3.629 0 6.253-1.91 8.794-4.169.421.347 2.146 1.193 2.501 1.564-2.416 2.083-8.048 3.763-11.24 3.763-.308 0-.603-.02-.894-.048V19.5H24v-15H10.21zm0 9.756v1.068c-3.356-.616-4.287-4.21-4.287-4.21a7.173 7.173 0 014.287-2.138v1.172h-.005a3.182 3.182 0 00-2.502 1.178s.615 2.276 2.507 2.931m-5.961-3.3c1.436-1.935 3.604-3.148 5.961-3.336V6.523C5.81 6.887 2 10.723 2 10.723s2.158 6.427 8.21 7.015v-1.166C5.77 16 4.25 10.958 4.25 10.958h-.002z" fill="#74B71B" fill-rule="nonzero"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Ollama</title><path d="M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 3.2 KiB |