Compare commits
840 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
db2c9a9926 | ||
|
1fc88e97f4 | ||
|
3d3914645d | ||
|
68ade7b384 | ||
|
071f232611 | ||
|
dff5ca7e92 | ||
|
ab75680ed3 | ||
|
8c11d7e8e8 | ||
|
8b776491e8 | ||
|
884f26924c | ||
|
5f79579a4d | ||
|
82f56da16b | ||
|
bc2035d362 | ||
|
41f25edb15 | ||
|
cf28d6653c | ||
|
53496d70f1 | ||
|
a17588fb1b | ||
|
dd06fddd17 | ||
|
e9c5618b10 | ||
|
b32330df0f | ||
|
3bd2edf4d2 | ||
|
697949c784 | ||
|
ee913be46b | ||
|
4f5813a6ce | ||
|
4a25821aba | ||
|
c049ff82cd | ||
|
64ee2d77b8 | ||
|
ce4106eb3d | ||
|
974d27ce26 | ||
|
dfe482b37b | ||
|
1f18694aa6 | ||
|
89de668241 | ||
|
963e525e07 | ||
|
94ee7167e0 | ||
|
48c075fb42 | ||
|
581e5f1f04 | ||
|
9637b3fbe1 | ||
|
c7232ae23c | ||
|
01912f5b3e | ||
|
db5e2d95c2 | ||
|
d9b55df883 | ||
|
4e9a113a35 | ||
|
70a35e9b49 | ||
|
bc4a8fbe1d | ||
|
d77a70b25a | ||
|
e49317a73c | ||
|
87cc28ae28 | ||
|
b93131ec7a | ||
|
4219468e20 | ||
|
4227968dfa | ||
|
09790bb994 | ||
|
bd1bfee941 | ||
|
0b3c49da90 | ||
|
c3d6e10795 | ||
|
1eae9bd18b | ||
|
99e24f5588 | ||
|
38e2bf955c | ||
|
0653dad5c5 | ||
|
51af830db8 | ||
|
2bde9d2b15 | ||
|
d9f9da99e6 | ||
|
64b0123acf | ||
|
35d853b851 | ||
|
1966baad84 | ||
|
a398566b33 | ||
|
9f2c473040 | ||
|
a73db4984a | ||
|
3498eb92bb | ||
|
455db18d71 | ||
|
2aeffe4095 | ||
|
c4fe9749d5 | ||
|
a0512585b1 | ||
|
c52bdb9a4a | ||
|
bbd9c89357 | ||
|
fb2190ace1 | ||
|
deb09bf5bf | ||
|
d951beb626 | ||
|
748dd5f2e6 | ||
|
75de4c8fcb | ||
|
432be09583 | ||
|
c822b9e2da | ||
|
c661fea07d | ||
|
782f85e05d | ||
|
96a9f7108c | ||
|
9475147435 | ||
|
909ec4191d | ||
|
59d00cca74 | ||
|
71a3e2c91b | ||
|
719202ba12 | ||
|
8ae4332110 | ||
|
964f53273c | ||
|
9e10022014 | ||
|
2eaabe13e3 | ||
|
3389b5dd16 | ||
|
3832afaeba | ||
|
e026ddf6be | ||
|
116fa673c6 | ||
|
517da9f972 | ||
|
74256dc411 | ||
|
1b23a62c13 | ||
|
97de520f9a | ||
|
a6333f3285 | ||
|
012f70336f | ||
|
7fbed26c26 | ||
|
a94af2678b | ||
|
eb57289b2a | ||
|
068b542c50 | ||
|
912fd36e29 | ||
|
b7a91770dc | ||
|
f0af503b4a | ||
|
3d023a5cf6 | ||
|
1e2d1aa118 | ||
|
ccfd3606dc | ||
|
fe95e09c8b | ||
|
bac90edfad | ||
|
b7043a428f | ||
|
5b47b83fe2 | ||
|
7289ed72f8 | ||
|
c4936ed535 | ||
|
8a5f05fb74 | ||
|
36f7bc4aae | ||
|
d5869e3f90 | ||
|
3b83d081db | ||
|
6861135925 | ||
|
b6f47c9927 | ||
|
796cc3c60c | ||
|
f1a57d76a2 | ||
|
87b61f7cff | ||
|
1999f607d6 | ||
|
bb2f553c46 | ||
|
6c2dc6756b | ||
|
f7c12264e8 | ||
|
9ef3dea884 | ||
|
cd90e252bf | ||
|
ac2475fb26 | ||
|
8f1a959da1 | ||
|
8c55e1b05b | ||
|
a0bbee8b79 | ||
|
caf85ad040 | ||
|
3999bee482 | ||
|
f0016b5368 | ||
|
1dec93de8a | ||
|
caf236d60a | ||
|
c8ed8e06f1 | ||
|
aa845b4727 | ||
|
1ebe5547d4 | ||
|
e2e7d5870a | ||
|
ea45d372f3 | ||
|
3113109f0a | ||
|
6ec51ff086 | ||
|
9eae4d9739 | ||
|
84aa746241 | ||
|
00ce078630 | ||
|
5426431adf | ||
|
726ec0fbfc | ||
|
094fc1f24b | ||
|
49cb8daf7d | ||
|
16660e995e | ||
|
8469f43285 | ||
|
6865f84eb1 | ||
|
036603c9e9 | ||
|
ab0f57aba3 | ||
|
13c755c197 | ||
|
5250d1fcaf | ||
|
492f857012 | ||
|
f1a0462ca3 | ||
|
6254ac6fbf | ||
|
5207b3a7f0 | ||
|
9e968de4e4 | ||
|
e3edb96568 | ||
|
dded42374c | ||
|
c561fb4fab | ||
|
67610b9f7f | ||
|
14aa70eea8 | ||
|
28da838bd1 | ||
|
fd18e0cc78 | ||
|
2a30a74886 | ||
|
6130ebb6d9 | ||
|
64500bfb37 | ||
|
cc077732c4 | ||
|
cd47f3b238 | ||
|
297519c401 | ||
|
09d410ec48 | ||
|
1369025092 | ||
|
5147233391 | ||
|
38585cb6af | ||
|
f53775d3f5 | ||
|
14ba7fc646 | ||
|
5b7bfbaa98 | ||
|
1d75b98393 | ||
|
c7d75b7789 | ||
|
4ccedb939c | ||
|
4bb463dd56 | ||
|
0ba600bb2b | ||
|
9ed6ee2161 | ||
|
c4ade296ae | ||
|
0ed81e3b1a | ||
|
d1933be86a | ||
|
15ff8de45c | ||
|
45a080016e | ||
|
78cf6e9086 | ||
|
7d65a6e264 | ||
|
91945ec77e | ||
|
7b472f13af | ||
|
a93777e3b7 | ||
|
2f310c72fa | ||
|
6a4ee68113 | ||
|
e73b5713fd | ||
|
1f81086a21 | ||
|
3e48f4b805 | ||
|
432be2ee57 | ||
|
f421139402 | ||
|
081223cc8f | ||
|
27ccc6b090 | ||
|
62faddac8d | ||
|
6804e4c679 | ||
|
10ee002091 | ||
|
1430eb26ea | ||
|
e17a18ad5d | ||
|
eeaa52bf5d | ||
|
07a6cb1252 | ||
|
7a2f6fb63f | ||
|
bb3ac095c4 | ||
|
e18d554489 | ||
|
a2625ecec6 | ||
|
0252b21901 | ||
|
f6343436b4 | ||
|
9db2f1cb91 | ||
|
2fd59f5aef | ||
|
18d96bc346 | ||
|
535da63e52 | ||
|
e14c9506b6 | ||
|
88aae5978f | ||
|
b9d72bfdf4 | ||
|
f4bb4fe51e | ||
|
cf77b9e7ee | ||
|
ff1399d1ba | ||
|
eb273a1873 | ||
|
0587931cae | ||
|
7408673e41 | ||
|
3c0664dfb6 | ||
|
d2477bba0c | ||
|
f37e444791 | ||
|
1ae08f49c5 | ||
|
10fda0b220 | ||
|
61d5dde497 | ||
|
edc33584da | ||
|
883da48762 | ||
|
49d0d9f557 | ||
|
852bc15a94 | ||
|
c43ddd9d62 | ||
|
c851961234 | ||
|
01aacb9280 | ||
|
dfa8c6c3d4 | ||
|
fda0e886e4 | ||
|
5a45e64999 | ||
|
70a2f71e33 | ||
|
4a70e68c22 | ||
|
542018cecb | ||
|
5e7c214c89 | ||
|
12eabd167d | ||
|
c73bfbd7b0 | ||
|
7063fce2af | ||
|
694cf6f762 | ||
|
83c77c1f18 | ||
|
d54ccece5c | ||
|
96506947cb | ||
|
afc3071576 | ||
|
10727d9a02 | ||
|
55d31a976f | ||
|
181b5aff97 | ||
|
31f1b34911 | ||
|
ef5499c8dc | ||
|
292ecf580e | ||
|
de1ca9af74 | ||
|
75832c1ad6 | ||
|
39a54d158d | ||
|
2bf9869e5f | ||
|
b13434c505 | ||
|
5197809d6b | ||
|
204a934553 | ||
|
de1bb90c23 | ||
|
478be72659 | ||
|
d972ed5a2b | ||
|
932d3dc10c | ||
|
f610d5930c | ||
|
05db2552b3 | ||
|
7bfd666321 | ||
|
a02f5ead7e | ||
|
d9fae7a02c | ||
|
29e2e8f607 | ||
|
7bc87b6e28 | ||
|
ed65ddf981 | ||
|
3c2017c7b8 | ||
|
6b2b849a26 | ||
|
b69c5bcd17 | ||
|
7b87f44518 | ||
|
5ab1e74c5f | ||
|
2bd239fe81 | ||
|
1a219e32fe | ||
|
203146f7e2 | ||
|
73bea1f454 | ||
|
408151c9cb | ||
|
f0adbc3c28 | ||
|
9acf057aae | ||
|
f796387e7e | ||
|
9f1c306920 | ||
|
2f85e50c6f | ||
|
eb4cae4e6d | ||
|
e4e6882f12 | ||
|
15a288b63d | ||
|
620cd6dfc2 | ||
|
a5475e7752 | ||
|
bddfd5763b | ||
|
21edb655d3 | ||
|
51f0d1f33e | ||
|
da31b6fda8 | ||
|
2b071bed90 | ||
|
1cf935eaf3 | ||
|
b33b5264e5 | ||
|
8ca50098d5 | ||
|
d82ed50fa4 | ||
|
f894237a12 | ||
|
9d8ebd7bd2 | ||
|
5c552a3d53 | ||
|
300b68177b | ||
|
83f79c1466 | ||
|
bc94e3992f | ||
|
1c44df8079 | ||
|
b6b1df6a7c | ||
|
b4aa7831e7 | ||
|
d1cdd60883 | ||
|
a850352eab | ||
|
d9d76ba16d | ||
|
993284f9c1 | ||
|
a7d3130f9a | ||
|
e0df5783f8 | ||
|
e4de6da5b8 | ||
|
87219f897e | ||
|
73cf58826f | ||
|
be4637a3a0 | ||
|
6ac6c7cfda | ||
|
94e9b8f4b1 | ||
|
bc6149deeb | ||
|
a0d975c3c0 | ||
|
d51b155e52 | ||
|
fb1b327f9a | ||
|
754cdc4d58 | ||
|
a73cb9ad3d | ||
|
58ecc0dc0d | ||
|
3821e91be0 | ||
|
de2bb7938a | ||
|
61e2877c4b | ||
|
d7ade487b8 | ||
|
6d04e93f34 | ||
|
d7a7af756a | ||
|
0c5fe3d637 | ||
|
eb0a116cc7 | ||
|
e08a21ebe7 | ||
|
49074effce | ||
|
ffe8b3c909 | ||
|
7856afee92 | ||
|
fe533b7c7f | ||
|
fc158ca176 | ||
|
f632888b4c | ||
|
8324632e4e | ||
|
be4b20af97 | ||
|
5a4e0a06e6 | ||
|
fb71d3b562 | ||
|
b96d1e79a0 | ||
|
0d310c434d | ||
|
b111834122 | ||
|
2847b5ee45 | ||
|
943906d8a3 | ||
|
cbedfa4664 | ||
|
01ccc32274 | ||
|
3b153a6c9b | ||
|
1bcdc2652c | ||
|
ea050b98ef | ||
|
b30d69b2a6 | ||
|
60e099e852 | ||
|
c49b37f968 | ||
|
404d9db359 | ||
|
5ac0390446 | ||
|
6e98fb1c5e | ||
|
053d7f9eaa | ||
|
5dcfda0514 | ||
|
b42125a654 | ||
|
413cec8a9f | ||
|
8e7ffab793 | ||
|
770aee4953 | ||
|
f479901c87 | ||
|
1dbe7897d4 | ||
|
c95956766e | ||
|
e92c0db6a2 | ||
|
3a8b8ed639 | ||
|
3a78d69b5b | ||
|
2e562d187a | ||
|
4521dde455 | ||
|
b64b0e3362 | ||
|
f8ca73265b | ||
|
1f7614af33 | ||
|
a48a9318c1 | ||
|
dcb042681d | ||
|
7df2f7e752 | ||
|
c3578d2cda | ||
|
8db39a58fb | ||
|
bbdbb08301 | ||
|
b06e09c030 | ||
|
bb2bcdbf61 | ||
|
2e278e7323 | ||
|
4c9d52422b | ||
|
f4ba1f68ef | ||
|
12497e8fb1 | ||
|
8153e747ef | ||
|
63b597beb8 | ||
|
cdbb0b21da | ||
|
b2f40e490b | ||
|
a96e1903a3 | ||
|
be7eb8b2b5 | ||
|
3b6372431a | ||
|
389ee7917f | ||
|
212e61d2a1 | ||
|
1b60e4a013 | ||
|
93cd93ada3 | ||
|
babb4cb57b | ||
|
dbcc75471f | ||
|
2a0497ca9e | ||
|
2d0767306e | ||
|
8ca83bb255 | ||
|
80a6406062 | ||
|
ff9345a843 | ||
|
fe663c4f04 | ||
|
9fbb012697 | ||
|
0070950911 | ||
|
62cf611fdc | ||
|
75814433a6 | ||
|
e59a5b4449 | ||
|
161e512805 | ||
|
305afb3713 | ||
|
1acbef1890 | ||
|
f90f370fed | ||
|
d34a0ee20e | ||
|
01e3964232 | ||
|
153638c2cd | ||
|
4bb719359c | ||
|
847eb60806 | ||
|
e799bd3920 | ||
|
2b1aee9e71 | ||
|
d65f068310 | ||
|
b1c199e650 | ||
|
51014e7a8d | ||
|
530bf81940 | ||
|
2bba186c9e | ||
|
61241df0d4 | ||
|
b6b9b542d7 | ||
|
71f41d5233 | ||
|
a421af9ea9 | ||
|
75372ad0cc | ||
|
d1f292f462 | ||
|
890cf81627 | ||
|
d97f0a4c4d | ||
|
4370db6bdc | ||
|
770f3e5da3 | ||
|
0f0895f345 | ||
|
6d1933c8f3 | ||
|
776260c85a | ||
|
5a5463bd5d | ||
|
2f45f50d37 | ||
|
41ad7c5d26 | ||
|
df93d43c36 | ||
|
bc9c70556e | ||
|
f75daba6c0 | ||
|
80ff8383fe | ||
|
5fd6202e60 | ||
|
47b6562605 | ||
|
d5c0aed973 | ||
|
e832af9854 | ||
|
ef5d505de3 | ||
|
842b463e60 | ||
|
5992c34fb5 | ||
|
bae74fbbd7 | ||
|
4264d170e2 | ||
|
274359d1ec | ||
|
dac89a87b7 | ||
|
fb5d998cd0 | ||
|
ca89be8930 | ||
|
c2256c2ac7 | ||
|
78ce23750e | ||
|
e6ddbd1418 | ||
|
344146d837 | ||
|
dcb98b2969 | ||
|
15f0e491bf | ||
|
70c4e82b89 | ||
|
1e0b76f4fc | ||
|
3a5886f53a | ||
|
db78346bef | ||
|
cee1774554 | ||
|
b3bbec83b6 | ||
|
33ea3344ff | ||
|
be874f55c4 | ||
|
d93379fbd4 | ||
|
78d1d48ea9 | ||
|
3ff5884112 | ||
|
2a2a63c52c | ||
|
366e2abb8b | ||
|
0b6bb59955 | ||
|
391c3e9eff | ||
|
b8f7db8d43 | ||
|
1c5e7483e2 | ||
|
c05404f8d5 | ||
|
a3f6ce52e4 | ||
|
19ea1ee56c | ||
|
d5666ab01b | ||
|
09d43403b2 | ||
|
210caace4a | ||
|
db3d86cb29 | ||
|
4a5d952800 | ||
|
41a4de7224 | ||
|
39b305621e | ||
|
8dc30e9da3 | ||
|
794786da43 | ||
|
dee8f45986 | ||
|
8467ba3844 | ||
|
2333fe64d0 | ||
|
9d6a791443 | ||
|
5084b4ae64 | ||
|
d6fd351330 | ||
|
eab545cafc | ||
|
901ffa3cdc | ||
|
48fd9c23fb | ||
|
8cf116754d | ||
|
80de3fdd4c | ||
|
e753cdf0fb | ||
|
25cb598694 | ||
|
b69493d252 | ||
|
0faa7d3c75 | ||
|
2eafa2a212 | ||
|
15a8adb0b9 | ||
|
8434f6e6cf | ||
|
fa66f39790 | ||
|
16a2ac0bbe | ||
|
16785ae005 | ||
|
3822ae9356 | ||
|
cc1c3f173c | ||
|
5e18b1872b | ||
|
f4f0a59e90 | ||
|
0ab5ddf763 | ||
|
0a54eeaf44 | ||
|
9fee731cac | ||
|
d281767867 | ||
|
75afe29f28 | ||
|
59bb04f1b3 | ||
|
47a06c14d9 | ||
|
abd8acd9fc | ||
|
977c1d4ac4 | ||
|
21b5bb5a29 | ||
|
10692523f0 | ||
|
a022c9eccb | ||
|
4cfd0c71cf | ||
|
a1473dedd0 | ||
|
59abee3043 | ||
|
8a4b675143 | ||
|
88637adfe2 | ||
|
d63638541b | ||
|
fc380fa522 | ||
|
9a1ea7f226 | ||
|
4665db62f4 | ||
|
ab5b497562 | ||
|
5a614b5173 | ||
|
8546490bcc | ||
|
3dcea41c4e | ||
|
1c9b89fdcc | ||
|
f947c1304a | ||
|
57314443ed | ||
|
242d57c14b | ||
|
f1c96eb689 | ||
|
d4d23f8234 | ||
|
2fcbefc9f5 | ||
|
035dbe4901 | ||
|
341f02e425 | ||
|
8ce6872d6f | ||
|
71041ec764 | ||
|
2b12d3f8e8 | ||
|
f7eb57082a | ||
|
022c180b62 | ||
|
0263be8c1f | ||
|
4a553e1fc8 | ||
|
789bb0da59 | ||
|
a8c118fd4a | ||
|
a2e6d1da4f | ||
|
54eec3e215 | ||
|
1e088ac124 | ||
|
f19d6ac0ff | ||
|
20b950b120 | ||
|
31077629f1 | ||
|
23ac23010d | ||
|
e3f24ac3a0 | ||
|
a899160311 | ||
|
1de409fdf7 | ||
|
fcb47c9401 | ||
|
c271cfa014 | ||
|
f5955bdd37 | ||
|
0ff5d0b5f1 | ||
|
6dca8b28fe | ||
|
bd6fe19bf1 | ||
|
6f5ca7b0b0 | ||
|
607e85639c | ||
|
22e4721ead | ||
|
928fa7a3fc | ||
|
835d6c71fa | ||
|
9cb777a4e9 | ||
|
fd0c16bf12 | ||
|
3e60919289 | ||
|
384708f577 | ||
|
cde6639d8a | ||
|
b02394008c | ||
|
33c6f34f6c | ||
|
ddc55c7c22 | ||
|
8e92a895ac | ||
|
2a061fdf54 | ||
|
0ad4f78a51 | ||
|
0b8c93e25a | ||
|
2ccb6dc275 | ||
|
26e798e13a | ||
|
e17ff507f0 | ||
|
0f6d06689c | ||
|
ec76742d0e | ||
|
0c4da602ab | ||
|
5ce625fb6b | ||
|
33461fb8e2 | ||
|
facc5d078a | ||
|
f074fb0eee | ||
|
1284783c82 | ||
|
4e1a9da840 | ||
|
ef917ebe4e | ||
|
f0bce909f6 | ||
|
306bff0a92 | ||
|
1c4bad35b2 | ||
|
86906576b3 | ||
|
f48d90a9c9 | ||
|
ba397dd2a8 | ||
|
e8e3834fc0 | ||
|
ba312d316c | ||
|
8ae9212cc5 | ||
|
3a4405016c | ||
|
790185f9e9 | ||
|
d02f81974c | ||
|
b340863d52 | ||
|
1a372abaff | ||
|
fdac9314ad | ||
|
d7d3787088 | ||
|
10aa268ea2 | ||
|
59657766b5 | ||
|
985b77d407 | ||
|
4fb6cbc3fb | ||
|
716d1fc988 | ||
|
de8339f77b | ||
|
ae78112311 | ||
|
f79f335491 | ||
|
e62bdab2c6 | ||
|
6c8b29a39a | ||
|
4ba3f5b351 | ||
|
1c515c3a5e | ||
|
cb472fc912 | ||
|
333df46680 | ||
|
e82fc8d617 | ||
|
2661f00dd4 | ||
|
913085ba74 | ||
|
792be63c5c | ||
|
64e8bc1911 | ||
|
278ec029f5 | ||
|
91558ad9ea | ||
|
afad169118 | ||
|
dcd89f2295 | ||
|
53386b35c9 | ||
|
2e14132a20 | ||
|
2fbcbe86d2 | ||
|
3f65051bd4 | ||
|
89d3673010 | ||
|
2af4747936 | ||
|
7183416d1f | ||
|
0662b5b4ae | ||
|
dcbeab0aef | ||
|
072e09d0ed | ||
|
3e1ff9bc25 | ||
|
8c4dd6ce1e | ||
|
9c218455c4 | ||
|
b09cabaeb2 | ||
|
d9baff45bb | ||
|
6603e33fd8 | ||
|
208e089761 | ||
|
bea63a2efe | ||
|
6b656bf380 | ||
|
626c93a1ab | ||
|
94f14340ae | ||
|
58359c9682 | ||
|
a3da248e3c | ||
|
396eeca73a | ||
|
d8092ec3eb | ||
|
7348199f73 | ||
|
356f1f9c39 | ||
|
123131074c | ||
|
16cabb38ad | ||
|
3da9fb4efe | ||
|
369c3512c0 | ||
|
6290dff3d9 | ||
|
31ba3cf039 | ||
|
210f388d7a | ||
|
063c81540d | ||
|
334178f6f9 | ||
|
05ae571971 | ||
|
ee62f77e96 | ||
|
58152a60c6 | ||
|
6e377fdbea | ||
|
9e08bd5522 | ||
|
d2ac782c3c | ||
|
ed14be08b9 | ||
|
008527de4b | ||
|
83cc094580 | ||
|
0b06303442 | ||
|
c9509c5c54 | ||
|
a5d3c98e01 | ||
|
0486fe0126 | ||
|
40cae057a5 | ||
|
f6b80c021a | ||
|
4ac6bbd515 | ||
|
c4ec97aa50 | ||
|
34bca69950 | ||
|
1990a2d9bd | ||
|
c92df1168d | ||
|
01a4aa51f7 | ||
|
2306a4e34d | ||
|
bd4d8847ce | ||
|
afeaca0fe0 | ||
|
5f6d895acf | ||
|
c90105e9f6 | ||
|
53baa7aae7 | ||
|
a9a3d91e4f | ||
|
b5d7d0a73f | ||
|
9b97294799 | ||
|
b811d69068 | ||
|
91e93958b8 | ||
|
d4adbf496f | ||
|
7d4e689bec | ||
|
75857ae18c | ||
|
41d346bf00 | ||
|
becd17d7d2 | ||
|
0783264900 | ||
|
62ed8faef0 | ||
|
540cddf300 | ||
|
b8b49f0012 | ||
|
2b29e14e9f | ||
|
14d7665072 | ||
|
09b44075ed | ||
|
8f1d2e0163 | ||
|
accebd00f5 | ||
|
42e1ade148 | ||
|
4f3780979e | ||
|
56a72eea5c | ||
|
69d219cd7e | ||
|
99a7925be4 | ||
|
189d096834 | ||
|
31cc6e51b5 | ||
|
411a8ef8a7 | ||
|
497f38111f | ||
|
da01384cb6 | ||
|
4f83782430 | ||
|
3fd40a33de | ||
|
fc1896dcff | ||
|
2411a7480e | ||
|
877824a4f9 | ||
|
7b6ebfc270 | ||
|
235afb5d15 | ||
|
6d65d47f00 | ||
|
a10cff376b | ||
|
d4f428d4bc | ||
|
7311997e7a | ||
|
0391ef63d6 | ||
|
2994ffc357 | ||
|
0594859fb9 | ||
|
b461c6f0bb | ||
|
0e2a82ce00 | ||
|
845409a239 | ||
|
d56722a4b6 | ||
|
db9ade20d5 | ||
|
6e250eafcd | ||
|
0c41ab6090 | ||
|
bd48930a20 | ||
|
c55181f955 | ||
|
72792ae9f9 | ||
|
40b3640fa2 | ||
|
63cbfda9b1 | ||
|
21d3a7dc3e | ||
|
3ed0564d73 | ||
|
3f3e23420d | ||
|
f4fcbff17e | ||
|
4a4296127c | ||
|
b027c04066 | ||
|
af8627b999 | ||
|
6ad0364ace | ||
|
0230177d27 | ||
|
f8bf70f0cb | ||
|
f0aa0c5540 | ||
|
6be86be0a7 | ||
|
5ad498f3ca | ||
|
c0264f1cd6 | ||
|
0f105e0300 | ||
|
f3f29cfe0b | ||
|
c6ffe4502a | ||
|
299ee3ae90 | ||
|
b07aef02c7 | ||
|
63117653bb | ||
|
3da81db3f6 | ||
|
e26c7827bc | ||
|
2ffb44b4e1 | ||
|
82a30b6ba5 | ||
|
9c3f9f0ee1 | ||
|
17537492b2 | ||
|
d7513aecb0 | ||
|
11193896b2 | ||
|
5df454640f | ||
|
b07a6a9a78 | ||
|
d5cb4f403a | ||
|
b8ea75f79f | ||
|
fcc8051d38 | ||
|
24ae6eb49c | ||
|
866f514d19 | ||
|
b18921de7f | ||
|
c752a54c62 | ||
|
cd5aec7368 | ||
|
b3b7017bf2 | ||
|
59daeeb37a | ||
|
ec896b8a12 | ||
|
48295bc378 | ||
|
b4fcfcd6d6 | ||
|
679a249674 | ||
|
368df65337 | ||
|
495cf5d9ca | ||
|
75ebdf394a |
@@ -4,6 +4,7 @@ npm-debug.log
|
||||
readme*
|
||||
Start.bat
|
||||
/dist
|
||||
/backups/
|
||||
/backups
|
||||
cloudflared.exe
|
||||
access.log
|
||||
/data
|
||||
|
15
.eslintrc.js
@@ -42,11 +42,22 @@ module.exports = {
|
||||
showdownKatex: 'readonly',
|
||||
SVGInject: 'readonly',
|
||||
toastr: 'readonly',
|
||||
Readability: 'readonly',
|
||||
isProbablyReaderable: 'readonly',
|
||||
ePub: 'readonly',
|
||||
},
|
||||
},
|
||||
],
|
||||
// There are various vendored libraries that shouldn't be linted
|
||||
ignorePatterns: ['public/lib/**/*', '*.min.js', 'src/ai_horde/**/*'],
|
||||
ignorePatterns: [
|
||||
'public/lib/**/*',
|
||||
'*.min.js',
|
||||
'src/ai_horde/**/*',
|
||||
'plugins/**/*',
|
||||
'data/**/*',
|
||||
'backups/**/*',
|
||||
'node_modules/**/*',
|
||||
],
|
||||
rules: {
|
||||
'no-unused-vars': ['error', { args: 'none' }],
|
||||
'no-control-regex': 'off',
|
||||
@@ -60,6 +71,8 @@ module.exports = {
|
||||
'no-trailing-spaces': 'error',
|
||||
'object-curly-spacing': ['error', 'always'],
|
||||
'space-infix-ops': 'error',
|
||||
'no-unused-expressions': ['error', { allowShortCircuit: true, allowTernary: true }],
|
||||
'no-cond-assign': 'error',
|
||||
|
||||
// These rules should eventually be enabled.
|
||||
'no-async-promise-executor': 'off',
|
||||
|
2
.github/close-label.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
🐛 Bug: ✅ Fixed
|
||||
🦄 Feature Request: ✅ Implemented
|
62
.github/issue-auto-comments.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
comment:
|
||||
footer: |
|
||||
---
|
||||
> I am a bot, and this is an automated message 🤖
|
||||
labels:
|
||||
- name: ✖️ Invalid
|
||||
labeled:
|
||||
issue:
|
||||
action: close
|
||||
body: >
|
||||
Hello @{{ issue.user.login }} your ticket has been marked as invalid.
|
||||
Please ensure you follow the issue template, provide all requested info,
|
||||
and be sure to check the docs + previous issues prior to raising tickets.
|
||||
pr:
|
||||
body: Thank you @{{ pull_request.user.login }} for suggesting this. Please follow the pull request templates.
|
||||
action: close
|
||||
|
||||
- name: 👩💻 Good First Issue
|
||||
labeled:
|
||||
issue:
|
||||
body: >
|
||||
This issue has been marked as a good first issue for first-time contributors to implement!
|
||||
This is a great way to support the project, while also improving your skills, you'll also be credited as a contributor once your PR is merged.
|
||||
If you're new to SillyTavern [here are a collection of resources](https://docs.sillytavern.app/)
|
||||
If you need any support at all, feel free to reach out via [Discord](https://discord.gg/sillytavern).
|
||||
|
||||
- name: ❌ wontfix
|
||||
labeled:
|
||||
issue:
|
||||
action: close
|
||||
body: >
|
||||
This ticked has been marked as 'wontfix', which usually means it is out-of-scope, or not feasible at this time.
|
||||
You can still fork the project and make the changes yourself.
|
||||
|
||||
- name: ✅ Fixed
|
||||
labeled:
|
||||
issue:
|
||||
body: >
|
||||
Hello @{{ issue.user.login }}! It looks like all or part of this issue has now been implemented.
|
||||
|
||||
|
||||
- name: ‼️ High Priority
|
||||
labeled:
|
||||
issue:
|
||||
body: >
|
||||
This ticket has been marked as high priority, and has been bumped to the top of the priority list.
|
||||
You should expect an implementation to be pushed out soon. Thank you for your patience.
|
||||
|
||||
- name: 💀 Spam
|
||||
labeled:
|
||||
issue:
|
||||
action: close
|
||||
locking: lock
|
||||
lock_reason: spam
|
||||
body: >
|
||||
This issue has been identified as spam, and is now locked.
|
||||
Users who repeatedly raise spam issues may be blocked or reported.
|
||||
|
||||
- name: ⛔ Don't Merge
|
||||
labeled:
|
||||
pr:
|
||||
body: This PR has been temporarily blocked from merging.
|
2
.github/readme-ja_jp.md
vendored
@@ -1,4 +1,4 @@
|
||||
[English](readme.md) | [中文](readme-zh_cn.md) | 日本語
|
||||
[English](readme.md) | [中文](readme-zh_cn.md) | 日本語 | [Русский](readme-ru_ru.md)
|
||||
|
||||

|
||||
|
||||
|
359
.github/readme-ru_ru.md
vendored
Normal file
@@ -0,0 +1,359 @@
|
||||
<a name="readme-top"></a>
|
||||
|
||||
[English](readme.md) | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | Русский
|
||||
|
||||
![][cover]
|
||||
|
||||
Мобайл-френдли интерфейс, поддержка множества API (KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale), ВН-образный режим Вайфу, Stable Diffusion, TTS, поддержка миров (лорбуков), кастомизируемый UI, автоперевод, тончайшая настройка промптов + возможность устанавливать расширения.
|
||||
|
||||
Основано на форке [TavernAI](https://github.com/TavernAI/TavernAI) версии 1.2.8
|
||||
|
||||
## Важные новости!
|
||||
|
||||
1. Чтобы помочь вам быстрее разобраться в SillyTavern, мы создали [сайт с документацией](https://docs.sillytavern.app/). Ответы на большинство вопросов можно найти там.
|
||||
|
||||
2. Почему пропали расширения после апдейта? Начиная с версии 1.10.6, большинство встроенных расширений были конвертированы в формат загружаемых аддонов. Их можно установить обратно через меню "Download Extensions and Assets" на панели расширений (значок с тремя кубиками сверху).
|
||||
|
||||
3. Не поддерживается следующая платформа: android arm LEtime-web. 32-битный Android требует внешнюю зависимость, которую нельзя установить посредством npm. Для её установки потребуется следующая команда: `pkg install esbuild`. После этого продолжайте установку по общей инструкции.
|
||||
|
||||
### Разрабатывается Cohee, RossAscends и всем сообществом SillyTavern
|
||||
|
||||
### Что такое SillyTavern и TavernAI?
|
||||
|
||||
SillyTavern — это интерфейс, который устанавливается на ПК (и на Android), который даёт возможность общаться с генеративным ИИ и чатиться/ролеплеить с вашими собственными персонажами или персонажами других пользователей.
|
||||
|
||||
SillyTavern — это форк версии TavernAI 1.2.8, который разрабатывается более активно и имеет множество новых функций. Сейчас уже можно сказать, что это две отдельные и абсолютно самостоятельные программы.
|
||||
|
||||
## Скриншоты
|
||||
|
||||
<img width="400" alt="image" src="https://github.com/SillyTavern/SillyTavern/assets/61471128/e902c7a2-45a6-4415-97aa-c59c597669c1">
|
||||
<img width="400" alt="image" src="https://github.com/SillyTavern/SillyTavern/assets/61471128/f8a79c47-4fe9-4564-9e4a-bf247ed1c961">
|
||||
|
||||
### Ветки
|
||||
|
||||
SillyTavern разрабатывается в двух ветках, чтобы всем категориям пользователей было удобно.
|
||||
|
||||
* release -🌟 **Рекомендовано для большинства пользователей.** Самая стабильная ветка, рекомендуем именно её. Обновляется только в момент крупных релизов. Подходит для большей части пользователей.
|
||||
* staging - ⚠️ **Не рекомендуется для повседневного использования.** В этой ветке весь самый свежий и новый функционал, но будьте аккуратны, поскольку сломаться может в любом месте и в любое время. Только для продвинутых пользователей и энтузиастов.
|
||||
|
||||
Если вы не умеете обращаться с git через командную строку, или не знаете, что такое ветка, то не переживайте! Наилучшим вариантом всегда остаётся ветка release.
|
||||
|
||||
### Что ещё нужно, кроме SillyTavern?
|
||||
|
||||
Сама по себе SillyTavern бесполезна, ведь это просто интерфейс. Вам потребуется доступ к бэкенду с ИИ, который и будет отыгрывать выбранного вами персонажа. Поддерживаются разные виды бэкендов: OpenAPI API (GPT), KoboldAI (локально или на Google Colab), и многое другое. Больше информации в [FAQ](https://docs.sillytavern.app/usage/faq/).
|
||||
|
||||
### Требуется ли для SillyTavern мощный ПК?
|
||||
|
||||
SillyTavern — это просто интерфейс, поэтому запустить его можно на любой картошке. Мощным должен быть бэкенд с ИИ.
|
||||
|
||||
## Есть вопросы или предложения?
|
||||
|
||||
### У нас появился сервер в Discord
|
||||
|
||||
| [![][discord-shield-badge]][discord-link] | [Вступайте в наше Discord-сообщество!](https://discord.gg/sillytavern) Задавайте вопросы, делитесь любимыми персонажами и промптами. |
|
||||
| :---------------------------------------- | :----------------------------------------------------------------------------------------------------------------- |
|
||||
|
||||
Также можно написать разработчикам напрямую:
|
||||
|
||||
* Discord: cohee или rossascends
|
||||
* Reddit: [/u/RossAscends](https://www.reddit.com/user/RossAscends/) или [/u/sillylossy](https://www.reddit.com/user/sillylossy/)
|
||||
* [Запостить issue на GitHub](https://github.com/SillyTavern/SillyTavern/issues)
|
||||
|
||||
## Эта версия включает
|
||||
|
||||
* Глубоко переработанную TavernAI 1.2.8 (переписано и оптимизировано более 50% кода)
|
||||
* Свайпы
|
||||
* Групповые чаты: комнаты для нескольких ботов, где персонажи могут говорить друг с другом и с вами
|
||||
* Чекпоинты и ветки для чатов
|
||||
* Продвинутые настройки для KoboldAI / TextGen со множеством созданных сообществом пресетов
|
||||
* Поддержка миров (функция "Информация о мире" / WorldInfo): создавайте свой богатый лор, или экономьте токены для карточек персонажей
|
||||
* Соединение через [OpenRouter](https://openrouter.ai) для разных API (Claude, GPT-4/3.5 и других)
|
||||
* Соединение с API [Oobabooga's TextGen WebUI](https://github.com/oobabooga/text-generation-webui)
|
||||
* Соединение с [AI Horde](https://horde.koboldai.net/)
|
||||
* Настройку форматирования промптов
|
||||
|
||||
## Расширения
|
||||
|
||||
SillyTavern поддерживает расширения, при этом некоторые из ИИ-модулей работают через [SillyTavern Extras API](https://github.com/SillyTavern/SillyTavern-extras)
|
||||
|
||||
* Заметки автора / Смещение характера
|
||||
* Эмоции для персонажей (спрайты)
|
||||
* Автоматический саммарайз (краткий пересказ) истории чата
|
||||
* Возможность отправить в чат картинку, которую ИИ сможет рассмотреть и понять
|
||||
* Генерация картинок в Stable Diffusion (5 пресетов для чата, плюс свободный режим)
|
||||
* Text-to-speech для сообщений ИИ (с помощью ElevenLabs, Silero, или родной TTS вашей ОС)
|
||||
|
||||
Полный список расширений и инструкций к ним можно найти в [документации](https://docs.sillytavern.app/).
|
||||
|
||||
## Улучшения от RossAscends для UI/CSS/общего удобства
|
||||
|
||||
* Мобильный интерфейс адаптирован для iOS, добавлена возможность сохранить ярлык на главный экран и открыть приложение в полноэкранном режиме.
|
||||
* Горячие клавиши
|
||||
* Up = Редактировать последнее сообщение в чате
|
||||
* Ctrl+Up = Редактировать ВАШЕ последнее сообщение в чате
|
||||
* Left = свайп влево
|
||||
* Right = свайп вправо (ОБРАТИТЕ ВНИМАНИЕ: когда в окне ввода что-то напечатано, клавиши для свайпа не работают)
|
||||
* Ctrl+Left = посмотреть локальные переменные (в консоли браузера)
|
||||
* Enter (при нахождении внутри окна ввода) = отправить ваше сообщение ИИ
|
||||
* Ctrl+Enter = Повторная генерация последнего ответа ИИ
|
||||
|
||||
* Страница больше не перезагружается при смене имени пользователя или удалении персонажа
|
||||
|
||||
* Отключаемая возможность автоматически соединяться с API при загрузке страницы.
|
||||
* Отключаемая возможность автоматически загружать последнего открытого персонажа при загрузке страницы.
|
||||
* Улучшенный счётчик токенов - работает с несохранёнными персонажами, отображает и перманентные, и временные токены
|
||||
|
||||
* Улучшенный менеджер чатов
|
||||
* Файлы с новыми чатами получают читабельные названия вида "(персонаж) - (когда создано)"
|
||||
* Увеличен размер превью чата с 40 символов до 300.
|
||||
* Несколько вариантов сортировки списка персонажей (по имени, дате создания, размеру чата).
|
||||
|
||||
* Панели настроек слева и справа автоматически скрываются, если щёлкнуть за их пределы.
|
||||
* При нажатии на значок замка навигационная панель будет закреплена на экране, и эта настройка сохранится между сессиями
|
||||
* Сам статус панели (открыта или закрыта) также сохраняется между сессиями
|
||||
|
||||
* Кастомизируемый интерфейс чата:
|
||||
* Настройте звук при получении нового ответа
|
||||
* Переключайтесь между круглыми и прямоугольными аватарками
|
||||
* Увеличенное вширь окно чата для стационарных ПК
|
||||
* Возможность включать полупрозрачные панели, стилизованные под стекло
|
||||
* Настраиваемые цвета для обычного текста, курсива, цитат
|
||||
* Настраиваемый цвет фона и интенсивность размытия
|
||||
|
||||
# ⌛ Установка
|
||||
|
||||
> **Внимание!**
|
||||
> * НЕ УСТАНАВЛИВАЙТЕ В ПАПКИ, КОТОРЫЕ КОНТРОЛИРУЕТ WINDOWS (Program Files, System32 и т.п.).
|
||||
> * НЕ ЗАПУСКАЙТЕ START.BAT С ПРАВАМИ АДМИНИСТРАТОРА
|
||||
> * УСТАНОВКА НА WINDOWS 7 НЕВОЗМОЖНА ИЗ-ЗА ОТСУТСТВИЯ NODEJS 18.16
|
||||
|
||||
## 🪟 Windows
|
||||
|
||||
## Установка через Git
|
||||
1. Установите [NodeJS](https://nodejs.org/en) (рекомендуется последняя LTS-версия)
|
||||
2. Установите [Git for Windows](https://gitforwindows.org/)
|
||||
3. Откройте Проводник (`Win+E`)
|
||||
4. Перейдите в папку, которую не контролирует Windows, или создайте её. (пример: C:\MySpecialFolder\)
|
||||
5. Откройте командную строку. Для этого нажмите на адресную строку (сверху), введите `cmd` и нажмите Enter.
|
||||
6. Когда появится чёрное окошко (командная строка), введите ОДНУ из перечисленных ниже команд:
|
||||
|
||||
- для ветки release: `git clone https://github.com/SillyTavern/SillyTavern -b release`
|
||||
- для ветки staging: `git clone https://github.com/SillyTavern/SillyTavern -b staging`
|
||||
|
||||
7. Когда клонирование закончится, дважды щёлкните по `Start.bat`, чтобы установить зависимости для NodeJS.
|
||||
8. После этого сервер запустится, и SillyTavern откроется в вашем браузере.
|
||||
|
||||
## Установка с помощью SillyTavern Launcher
|
||||
1. Установите [Git for Windows](https://gitforwindows.org/)
|
||||
2. Откройте Проводник (`Win+E`) и создайте или выберите папку, в которую будет установлен лаунчер
|
||||
3. Откройте командную строку. Для этого нажмите на адресную строку (сверху), введите `cmd` и нажмите Enter.
|
||||
4. Когда появится чёрное окошко, введите следующую команду: `git clone https://github.com/SillyTavern/SillyTavern-Launcher.git`
|
||||
5. Дважды щёлкните по `installer.bat` и выберите, что именно хотите установить
|
||||
6. После завершения установки дважды щёлкните по `launcher.bat`
|
||||
|
||||
## Установка с помощью GitHub Desktop
|
||||
(Тут речь про git **только** в рамках GitHub Desktop, если хотите использовать `git` в командной строке, вам также понадобится [Git for Windows](https://gitforwindows.org/))
|
||||
1. Установите [NodeJS](https://nodejs.org/en) (latest LTS version is recommended)
|
||||
2. Установите [GitHub Desktop](https://central.github.com/deployments/desktop/desktop/latest/win32)
|
||||
3. После завершения установки GitHub Desktop, нажмите `Clone a repository from the internet....` (обратите внимание: для этого шага **НЕ требуется** аккаунт на GitHub)
|
||||
4. В меню перейдите на вкладку URL, введите адрес `https://github.com/SillyTavern/SillyTavern`, и нажмите Clone. В поле Local path можно изменить директорию, в которую будет загружена SillyTavern.
|
||||
6. Чтобы запустить SillyTavern, откройте Проводник и перейдите в выбранную на предыдущем шаге папку. По умолчанию репозиторий будет склонирован сюда: `C:\Users\[Имя пользователя]\Documents\GitHub\SillyTavern`
|
||||
7. Дважды щёлкните по файлу `start.bat`. (обратите внимание: окончание `.bat` может быть скрыто настройками вашей ОС. Таким образом, имя файла будет выглядеть как "`Start`". Дважды щёлкните по нему, чтобы запустить SillyTavern)
|
||||
8. После того, как вы дважды щёлкнули по файлу, должно открыться чёрное окошко, и SillyTavern начнёт устанавливать свои зависимости.
|
||||
9. Если установка прошла успешно, то в командной строке будет вот такое, а в браузере откроется вкладка с SillyTavern:
|
||||
10. Подключайтесь к любому из [поддерживаемых API](https://docs.sillytavern.app/usage/api-connections/) и начинайте переписку!
|
||||
|
||||
## 🐧 Linux и 🍎 MacOS
|
||||
|
||||
В MacOS и Linux всё это делается через Терминал.
|
||||
|
||||
1. Установите git и nodeJS (как именно - зависит от вашей ОС)
|
||||
2. Клонируйте репозиторий
|
||||
|
||||
- для ветки release: `git clone https://github.com/SillyTavern/SillyTavern -b release`
|
||||
- для ветки staging: `git clone https://github.com/SillyTavern/SillyTavern -b staging`
|
||||
|
||||
3. Перейдите в папку установки с помощью `cd SillyTavern`.
|
||||
4. Запустите скрипт `start.sh` с помощью одной из команд:
|
||||
|
||||
- `./start.sh`
|
||||
- `bash start.sh`
|
||||
|
||||
## Установка с помощью SillyTavern Launcher
|
||||
|
||||
### Для пользователей Linux
|
||||
1. Откройте любимый терминал и установите git
|
||||
2. Загрузите Sillytavern Launcher с помощью команды: `git clone https://github.com/SillyTavern/SillyTavern-Launcher.git`
|
||||
3. Перейдите в SillyTavern-Launcher: `cd SillyTavern-Launcher`
|
||||
4. Запустите лаунчер установки: `chmod +x install.sh && ./install.sh`, затем выберите, что конкретно хотите установить
|
||||
5. После завершения установки, запустите лаунчер следующей командой: `chmod +x launcher.sh && ./launcher.sh`
|
||||
|
||||
### Для пользователей Mac
|
||||
1. Откройте терминал и установите brew: `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`
|
||||
2. Затем установите git: `brew install git`
|
||||
3. Загрузите Sillytavern Launcher: `git clone https://github.com/SillyTavern/SillyTavern-Launcher.git`
|
||||
4. Перейдите в SillyTavern-Launcher: `cd SillyTavern-Launcher`
|
||||
5. Запустите лаунчер установки: `chmod +x install.sh && ./install.sh` and choose what you wanna install
|
||||
6. После завершения установки, запустите лаунчер следующей командой: `chmod +x launcher.sh && ./launcher.sh`
|
||||
|
||||
## 📱 Мобильные устройства - Установка при помощи termux
|
||||
|
||||
> **ОБРАТИТЕ ВНИМАНИЕ!**
|
||||
>
|
||||
> **На Android-телефонах SillyTavern можно запускать нативно посредством Termux. Обратитесь к гайду, написанному ArroganceComplex#2659:**
|
||||
>
|
||||
> * <https://rentry.org/STAI-Termux>
|
||||
|
||||
|
||||
## Управление ключами от API
|
||||
|
||||
SillyTavern сохраняет ключи от ваших API в файле `secrets.json` в папке на сервере.
|
||||
|
||||
По умолчанию, ключи не будут отображаться на фронте после их ввода и перезагрузки страницы.
|
||||
|
||||
Чтобы включить возможность отображения ключей путём нажатия кнопки в блоке API:
|
||||
|
||||
1. Зайдите в файл `config.yaml` и установите `allowKeysExposure` в положение `true`.
|
||||
2. Перезапустите сервер SillyTavern.
|
||||
|
||||
## Удалённое подключение
|
||||
|
||||
В основном этим пользуются тогда, когда хотят использовать SillyTavern с телефона, запустив сервер SillyTavern на стационарном ПК в той же Wi-Fi-сети.
|
||||
|
||||
Однако это позволит подключаться откуда угодно, а не только вам.
|
||||
|
||||
**ВАЖНО: в SillyTavern не предусмотрена возможность использования программы несколькими людьми. Поэтому любой, кто подключится к вашему серверу, получит доступ ко всем вашим персонажам и чатам, а также сможет менять настройки через UI.**
|
||||
|
||||
### 1. Заведение "белого списка" IP-адресов
|
||||
|
||||
* Создайте в корневой папке SillyTavern файл с названием `whitelist.txt`.
|
||||
* Откройте файл в текстовом редакторе и внесите список IP-адресов, с которых хотите разрешить подключение.
|
||||
|
||||
*Принимаются как обычные IP-адреса, так и целые диапазоны, размеченные с помощью астериска. Примеры:*
|
||||
|
||||
```txt
|
||||
192.168.0.1
|
||||
192.168.0.20
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
```txt
|
||||
192.168.0.*
|
||||
```
|
||||
|
||||
(диапазон из примера сверху позволит подключаться всем устройствам в локальной сети)
|
||||
|
||||
Также принимаются маски CIDR (вида 10.0.0.0/24).
|
||||
|
||||
* Сохраните файл `whitelist.txt`.
|
||||
* Перезапустите сервер ST.
|
||||
|
||||
После этого устройства из белого списка смогут подключаться к вашему серверу.
|
||||
|
||||
*Обратите внимание: в файле `config.yaml` также имеется массив `whitelist`, который работает по тому же принципу. Однако если существует файл `whitelist.txt`, то этот массив игнорируется.*
|
||||
|
||||
### 2. Получение IP хост-машины с ST
|
||||
|
||||
После настройки белого списка адресов, следующим шагом будет получение IP-адреса хост-машины, на которой запущена SillyTavern.
|
||||
|
||||
Если хост-машина находится в той же Wi-Fi-сети, то можно воспользоваться её внутренним Wi-Fi-IP-адресом:
|
||||
|
||||
* На Windows: нажмите Пуск > введите `cmd.exe` в поиске > в консоли введите команду `ipconfig` и нажмите Enter > найдите пункт `IPv4-адрес`.
|
||||
|
||||
Если вы (или кто-то другой) хотите подключаться к хост-машине из другой сети, то вам понадобится ваш публичный IP-адрес.
|
||||
|
||||
* Откройте [эту страницу](https://whatismyipaddress.com/) с вашей хост-машины и найдите пункт `IPv4`. На этот адрес и будет подключаться удалённое устройство.
|
||||
|
||||
### 3. Соединить удалённое устройство с хост-машиной ST
|
||||
|
||||
Какой бы IP-адрес вы ни выбрали, вам нужно будет вводить его в адресной строке браузера вашего удалённого устройства.
|
||||
|
||||
Обычный адрес хост-машины, находящейся в той же Wi-Fi-сети, выглядит примерно так:
|
||||
|
||||
`http://192.168.0.5:8000`
|
||||
|
||||
НЕ используйте https://
|
||||
Только http://
|
||||
|
||||
### Открытие доступа до ST для всех IP-адресов
|
||||
|
||||
Мы не рекомендуем так делать, но вы можете открыть файл `config.yaml` и изменить `whitelistMode` на `false`.
|
||||
|
||||
Обязательно нужно удалить (или переименовать) файл `whitelist.txt`, если такой файл есть в корневой директории SillyTavern.
|
||||
|
||||
Эта практика считается небезопасной, поэтому, если вы решите так сделать, мы попросим вас установить логин и пароль.
|
||||
|
||||
Оба этих параметра настраиваются в `config.yaml` (username и password).
|
||||
|
||||
Останется только перезапустить сервер ST, и после этого к вам сможет подключиться любой пользователь вне зависимости от IP-адреса его устройства. Главное, чтобы он знал логин и пароль.
|
||||
|
||||
### Не получается соединиться?
|
||||
|
||||
* Создайте входящее/исходящее правило в вашем фаерволле для порта, указанного в `config.yaml`. НЕ ПУТАЙТЕ этот процесс с пробросом портов на роутере. Если по ошибке перепутаете, то на ваш сервер сможет забраться посторонний человек и украсть ваши логи, этого следует избегать.
|
||||
* Переключите Сетевой профиль на значение "Частные". Для этого зайдите в Параметры > Сеть и Интернет > Ethernet. КРАЙНЕ важно для Windows 11, без этого не получится подключиться даже с правилом фаервола.
|
||||
|
||||
## Проблемы с производительностью?
|
||||
|
||||
Попробуйте включить опцию "Отключить эффект размытия" в меню "Пользовательские настройки".
|
||||
|
||||
## Нравится ваш проект! Как помочь?
|
||||
|
||||
### ЧТО ДЕЛАТЬ
|
||||
|
||||
1. Присылайте пулл реквесты
|
||||
2. Присылайте идеи и баг-репорты, оформленные по установленным шаблонам
|
||||
3. Прежде чем задавать вопросы, прочтите readme и документацию
|
||||
|
||||
### ЧЕГО НЕ ДЕЛАТЬ
|
||||
|
||||
1. Предлагать донаты
|
||||
2. Присылать баг-репорты безо всякого контекста
|
||||
3. Задавать вопросы, на которые уже отвечали
|
||||
|
||||
## Где найти старые фоны?
|
||||
|
||||
Мы двигаемся в сторону 100% уникальности всего используемого контента, поэтому старые фоны были убраны из репозитория.
|
||||
|
||||
Они отправлены в архив, скачать их можно здесь:
|
||||
|
||||
<https://files.catbox.moe/1xevnc.zip>
|
||||
|
||||
|
||||
|
||||
|
||||
## Авторы и лицензии
|
||||
|
||||
**Мы надеемся, что эта программа принесёт людям пользу,
|
||||
но мы не даём НИКАКИХ ГАРАНТИЙ; мы ни в коем случае не гарантируем того,
|
||||
что программа СООТВЕТСТВУЕТ КАКИМ-ЛИБО КРИТЕРИЯМ или ПРИГОДНА ДЛЯ КАКОЙ-ЛИБО ЦЕЛИ.
|
||||
Подробнее можно узнать в GNU Affero General Public License.**
|
||||
|
||||
* Базовая TAI от Humi: Лицензия неизвестна
|
||||
* Модификации от Cohee и производная кодовая база: AGPL v3
|
||||
* Дополнения RossAscends: AGPL v3
|
||||
* Кусочки TavernAITurbo мода от CncAnon: Лицензия неизвестна
|
||||
* Различные коммиты и предложения от kingbri (<https://github.com/bdashore3>)
|
||||
* Расширения и внедрение разного рода удобств - city_unit (<https://github.com/city-unit>)
|
||||
* Различные коммиты и баг-репорты от StefanDanielSchwarz (<https://github.com/StefanDanielSchwarz>)
|
||||
* Режим Вайфу вдохновлён работой PepperTaco (<https://github.com/peppertaco/Tavern/>)
|
||||
* Благодарность Pygmalion University за прекрасную работу по тестированию и за все предлагаемые крутые фичи!
|
||||
* Благодарность oobabooga за компиляцию пресетов для TextGen
|
||||
* Пресеты для KoboldAI из KAI Lite: <https://lite.koboldai.net/>
|
||||
* Шрифт Noto Sans от Google (OFL license)
|
||||
* Тема Font Awesome <https://fontawesome.com> (Иконки: CC BY 4.0, Шрифты: SIL OFL 1.1, Код: MIT License)
|
||||
* Клиентская библиотека для AI Horde от ZeldaFan0225: <https://github.com/ZeldaFan0225/ai_horde>
|
||||
* Пусковой скрипт для Linux от AlpinDale
|
||||
* Благодарность paniphons за оформление документа с FAQ
|
||||
* Фон в честь 10 тысяч пользователей в Discord от @kallmeflocc
|
||||
* Стандартный контент (персонажи и лорбуки) предоставлен пользователями @OtisAlejandro, @RossAscends и @kallmeflocc
|
||||
* Корейский перевод от @doloroushyeonse
|
||||
* Поддержка k_euler_a для Horde от <https://github.com/Teashrock>
|
||||
* Китайский перевод от [@XXpE3](https://github.com/XXpE3), 中文 ISSUES 可以联系 @XXpE3
|
||||
|
||||
<!-- LINK GROUP -->
|
||||
[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square
|
||||
[cover]: https://github.com/SillyTavern/SillyTavern/assets/18619528/c2be4c3f-aada-4f64-87a3-ae35a68b61a4
|
||||
[discord-link]: https://discord.gg/sillytavern
|
||||
[discord-shield]: https://img.shields.io/discord/1100685673633153084?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=flat-square
|
||||
[discord-shield-badge]: https://img.shields.io/discord/1100685673633153084?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=for-the-badge
|
2
.github/readme-zh_cn.md
vendored
@@ -1,4 +1,4 @@
|
||||
[English](readme.md) | 中文 | [日本語](readme-ja_jp.md)
|
||||
[English](readme.md) | 中文 | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md)
|
||||
|
||||

|
||||
|
||||
|
4
.github/readme.md
vendored
@@ -1,6 +1,6 @@
|
||||
<a name="readme-top"></a>
|
||||
|
||||
English | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md)
|
||||
English | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md)
|
||||
|
||||
![][cover]
|
||||
|
||||
@@ -326,7 +326,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.**
|
||||
|
||||
* TAI Base by Humi: Unknown license
|
||||
* TAI Base by Humi: MIT
|
||||
* Cohee's modifications and derived code: AGPL v3
|
||||
* RossAscends' additions: AGPL v3
|
||||
* Portions of CncAnon's TavernAITurbo mod: Unknown license
|
||||
|
28
.github/workflows/add-comment-from-tag.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
# Based on a label applied to an issue, the bot will add a comment with some additional info
|
||||
|
||||
name: 🎯 Auto-Reply to Labeled Tickets
|
||||
on:
|
||||
issues:
|
||||
types:
|
||||
- labeled
|
||||
- unlabeled
|
||||
pull_request_target:
|
||||
types:
|
||||
- labeled
|
||||
- unlabeled
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Label Commenter
|
||||
uses: peaceiris/actions-label-commenter@v1
|
||||
with:
|
||||
config_file: .github/issue-auto-comments.yml
|
||||
github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
17
.github/workflows/check-merge-conflicts.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# Detect and label pull requests that have merge conflicts
|
||||
name: 🏗️ Check Merge Conflicts
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- staging
|
||||
jobs:
|
||||
check-conflicts:
|
||||
if: github.repository == 'SillyTavern/SillyTavern'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: mschilde/auto-label-merge-conflicts@master
|
||||
with:
|
||||
CONFLICT_LABEL_NAME: "🚫 Merge Conflicts"
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
MAX_RETRIES: 5
|
||||
WAIT_MS: 5000
|
82
.github/workflows/close-stale-issues.yml
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
# Closes any issues that no longer have user interaction
|
||||
name: 🎯 Close Stale Issues
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # Runs every day at midnight UTC
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Comment on, then close issues that haven't been updated for ages
|
||||
- name: Close Stale Issues
|
||||
uses: actions/stale@v4
|
||||
with:
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
days-before-stale: 360
|
||||
days-before-close: 5
|
||||
operations-per-run: 30
|
||||
remove-stale-when-updated: true
|
||||
enable-statistics: true
|
||||
stale-issue-message: >
|
||||
This issue has gone 3 months without an update. To keep the ticket open, please indicate that it is still relevant in a comment below.
|
||||
Otherwise it will be closed in 5 working days.
|
||||
stale-pr-message: >
|
||||
This PR is stale because it has been open 6 weeks with no activity. Either remove the stale label or comment below with a short update,
|
||||
otherwise this PR will be closed in 5 days.
|
||||
close-issue-message: >
|
||||
This issue was automatically closed because it has been stalled for over 1 year with no activity.
|
||||
close-pr-message: >
|
||||
This pull request was automatically closed because it has been stalled for over 1 year with no activity.
|
||||
stale-issue-label: '⚰️ Stale'
|
||||
close-issue-label: '🕸️ Inactive'
|
||||
stale-pr-label: '⚰️ Stale'
|
||||
close-pr-label: '🕸️ Inactive'
|
||||
exempt-issue-labels: '📌 Keep Open'
|
||||
exempt-pr-labels: '📌 Keep Open'
|
||||
labels-to-add-when-unstale: '📌 Keep Open'
|
||||
|
||||
# Comment on, then close issues that required a response from the user, but didn't get one
|
||||
- name: Close Issues without Response
|
||||
uses: actions/stale@v4
|
||||
with:
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
days-before-stale: 5
|
||||
days-before-close: 3
|
||||
operations-per-run: 30
|
||||
remove-stale-when-updated: true
|
||||
stale-issue-message: >
|
||||
Hi! Looks like additional info is required for this issue to be addressed.
|
||||
Don't forget to provide this within the next few days to keep your ticket open.
|
||||
close-issue-message: 'Issue closed due to no response from user.'
|
||||
only-labels: '🚏 Awaiting User Response'
|
||||
labels-to-remove-when-unstale: '🚏 Awaiting User Response, 🛑 No Response'
|
||||
stale-issue-label: '🛑 No Response'
|
||||
close-issue-label: '🕸️ Inactive'
|
||||
exempt-issue-labels: '📌 Keep Open'
|
||||
exempt-pr-labels: '📌 Keep Open'
|
||||
|
||||
# Comment on issues that we should have replied to
|
||||
- name: Notify Repo Owner to Respond
|
||||
uses: actions/stale@v4
|
||||
with:
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
days-before-stale: 7
|
||||
days-before-close: 365
|
||||
operations-per-run: 30
|
||||
remove-stale-when-updated: true
|
||||
stale-issue-message: Hey SillyTavern, - Don't forget to respond!
|
||||
stale-pr-message: Hey SillyTavern, - Don't forget to respond!
|
||||
only-labels: '👤 Awaiting Maintainer Response'
|
||||
labels-to-remove-when-unstale: '👤 Awaiting Maintainer Response'
|
||||
close-issue-message: 'Closed due to no response from repo author for over a year'
|
||||
close-pr-message: 'Closed due to no response from repo author for over a year'
|
||||
stale-issue-label: '👤 Awaiting Maintainer Response'
|
||||
stale-pr-label: '👤 Awaiting Maintainer Response'
|
||||
close-issue-label: '🕸️ Inactive'
|
||||
close-pr-label: '🕸️ Inactive'
|
||||
exempt-issue-labels: '📌 Keep Open'
|
||||
exempt-pr-labels: '📌 Keep Open'
|
40
.github/workflows/docker-publish.yml
vendored
@@ -9,32 +9,50 @@ on:
|
||||
schedule:
|
||||
# Build the staging image everyday at 00:00 UTC
|
||||
- cron: "0 0 * * *"
|
||||
push:
|
||||
# Temporary workaround
|
||||
branches:
|
||||
- release
|
||||
|
||||
env:
|
||||
# This should allow creation of docker images even in forked repositories
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
REPO: ${{ github.repository }}
|
||||
REGISTRY: ghcr.io
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: github.repository == 'SillyTavern/SillyTavern'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Using the following workaround because currently GitHub Actions
|
||||
# Workaround for GitHub repo names containing uppercase characters
|
||||
- name: Set lowercase repo name
|
||||
run: |
|
||||
echo "IMAGE_NAME=${REPO,,}" >> ${GITHUB_ENV}
|
||||
|
||||
# Using the following workaround because currently GitHub Actions
|
||||
# does not support logical AND/OR operations on triggers
|
||||
# It's currently not possible to have `branches` under the `schedule` trigger
|
||||
- name: Checkout the release branch
|
||||
if: ${{ github.event_name == 'release' }}
|
||||
uses: actions/checkout@v3
|
||||
- name: Checkout the release branch (on release)
|
||||
if: ${{ github.event_name == 'release' || github.event_name == 'push' }}
|
||||
uses: actions/checkout@v4.1.2
|
||||
with:
|
||||
ref: "release"
|
||||
|
||||
- name: Checkout the staging branch
|
||||
if: ${{ github.event_name == 'schedule' }}
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4.1.2
|
||||
with:
|
||||
ref: "staging"
|
||||
|
||||
# Get current branch name
|
||||
# This is also part of the workaround for Actions not allowing logical
|
||||
# AND/OR operators on triggers
|
||||
# Otherwise the action triggered by schedule always has ref_name = release
|
||||
- name: Get the current branch name
|
||||
run: |
|
||||
echo "BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)" >> ${GITHUB_ENV}
|
||||
|
||||
# Setting up QEMU for multi-arch image build
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
@@ -47,7 +65,10 @@ jobs:
|
||||
id: metadata
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: ${{ github.ref_name }}
|
||||
# Release version tag if the workflow is triggered by a release
|
||||
# Branch name tag if the workflow is triggered by a push
|
||||
tags: |
|
||||
${{ github.event_name == 'release' && github.ref_name || env.BRANCH_NAME }}
|
||||
|
||||
# Login into package repository as the person who created the release
|
||||
- name: Log in to the Container registry
|
||||
@@ -74,5 +95,6 @@ jobs:
|
||||
- name: Docker tag latest and push
|
||||
if: ${{ github.event_name == 'release' }}
|
||||
run: |
|
||||
docker tag $IMAGE_NAME:${{ github.ref_name }} $IMAGE_NAME:latest
|
||||
docker push $IMAGE_NAME:latest
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}
|
||||
docker tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
||||
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
||||
|
39
.github/workflows/get-pr-size.yml
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
# Adds a comment to new PRs, showing the compressed size and size difference of new code
|
||||
# And also labels the PR based on the number of lines changes
|
||||
|
||||
name: 🌈 Check PR Size
|
||||
on: [pull_request]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
# Find and comment with compressed size
|
||||
- name: Get Compressed Size
|
||||
uses: preactjs/compressed-size-action@v2
|
||||
with:
|
||||
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
pattern: './dist/**/*.{js,css,html}'
|
||||
strip-hash: '\\b\\w{8}\\.'
|
||||
exclude: '**/node_modules/**'
|
||||
minimum-change-threshold: 100
|
||||
# Check number of lines of code added
|
||||
- name: Label based on Lines of Code
|
||||
uses: codelytv/pr-size-labeler@v1
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
xs_max_size: '10'
|
||||
s_max_size: '100'
|
||||
m_max_size: '500'
|
||||
l_max_size: '1000'
|
||||
s_label: '🟩 PR - Small'
|
||||
m_label: '🟨 PR - Medium'
|
||||
l_label: '🟧 PR - Large'
|
||||
xl_label: '🟥 PR - XL'
|
||||
fail_if_xl: 'false'
|
||||
message_if_xl: >
|
||||
It looks like this PR is very large (over 1000 lines).
|
||||
Try to avoid addressing multiple issues in a single PR, and
|
||||
in the future consider breaking large tasks down into smaller steps.
|
||||
This it to make reviewing, testing, reverting and general quality management easier.
|
17
.github/workflows/manage-pending-labels-closed.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# When a new comment is added to an issue, if it had the Stale or Awaiting User Response labels, then those labels will be removed
|
||||
|
||||
name: 🎯 Remove Pending Labels on Close
|
||||
on:
|
||||
issues:
|
||||
types: [closed]
|
||||
jobs:
|
||||
remove-labels:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Remove Labels when Closed
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: remove-labels
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
issue-number: ${{ github.event.issue.number }}
|
||||
labels: '🚏 Awaiting User Response,⚰️ Stale,👤 Awaiting Maintainer Response'
|
42
.github/workflows/manage-pending-labels.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
# When a new comment is added to an issue, if it had the Stale or Awaiting User Response labels, then those labels will be removed
|
||||
|
||||
name: 🎯 Add/ Remove Awaiting Response Labels
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
jobs:
|
||||
remove-stale:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.comment.author_association != 'COLLABORATOR' && github.event.comment.author_association != 'OWNER' }}
|
||||
steps:
|
||||
- name: Remove Stale labels when Updated
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: remove-labels
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
issue-number: ${{ github.event.issue.number }}
|
||||
labels: '🚏 Awaiting User Response,⚰️ Stale'
|
||||
|
||||
add-awaiting-author:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{!github.event.issue.pull_request && github.event.comment.author_association != 'COLLABORATOR' && github.event.comment.author_association != 'OWNER' && github.event.issue.state == 'open' }}
|
||||
steps:
|
||||
- name: Add Awaiting Author labels when Updated
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: add-labels
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
issue-number: ${{ github.event.issue.number }}
|
||||
labels: '👤 Awaiting Maintainer Response'
|
||||
|
||||
remove-awaiting-author:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.comment.author_association == 'OWNER' }}
|
||||
steps:
|
||||
- name: Remove Awaiting Author labels when Updated
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: remove-labels
|
||||
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
issue-number: ${{ github.event.issue.number }}
|
||||
labels: '👤 Awaiting Maintainer Response'
|
43
.github/workflows/update-docs.yml
vendored
@@ -1,43 +0,0 @@
|
||||
name: Update SillyTavern-Docs
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
update_docs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout current repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Checkout SillyTavern-Docs repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: SillyTavern/SillyTavern-Docs
|
||||
path: SillyTavern-Docs
|
||||
|
||||
- name: Clone SillyTavern wiki into SillyTavern-Docs/extensions
|
||||
run: rm -rf SillyTavern-Docs/extensions && git clone https://github.com/SillyTavern/SillyTavern.wiki.git SillyTavern-Docs/extensions && rm -rf SillyTavern-Docs/extensions/.git
|
||||
|
||||
- name: Copy files
|
||||
run: |
|
||||
cp public/notes/content.md SillyTavern-Docs/guidebook.md
|
||||
cp faq.md SillyTavern-Docs/faq.md
|
||||
cp readme.md SillyTavern-Docs/readme.md
|
||||
cp public/notes/update.md SillyTavern-Docs/update.md
|
||||
|
||||
- name: Deploy to external repository
|
||||
uses: cpina/github-action-push-to-another-repository@main
|
||||
env:
|
||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
||||
with:
|
||||
# GitHub Action output files
|
||||
source-directory: SillyTavern-Docs/
|
||||
destination-github-username: SillyTavern
|
||||
destination-repository-name: SillyTavern-Docs
|
||||
user-email: github-actions[bot]@users.noreply.github.com
|
||||
user-name: "GitHub Actions"
|
||||
target-branch: "main"
|
3
.gitignore
vendored
@@ -25,6 +25,7 @@ public/stats.json
|
||||
/docker/config
|
||||
/docker/user
|
||||
/docker/extensions
|
||||
/docker/data
|
||||
.DS_Store
|
||||
public/settings.json
|
||||
/thumbnails
|
||||
@@ -45,3 +46,5 @@ access.log
|
||||
/cache/
|
||||
public/css/user.css
|
||||
/plugins/
|
||||
/data
|
||||
/default/scaffold
|
||||
|
16
Dockerfile
@@ -1,4 +1,4 @@
|
||||
FROM node:19.1.0-alpine3.16
|
||||
FROM node:lts-alpine3.18
|
||||
|
||||
# Arguments
|
||||
ARG APP_HOME=/home/node/app
|
||||
@@ -26,19 +26,9 @@ COPY . ./
|
||||
|
||||
# Copy default chats, characters and user avatars to <folder>.default folder
|
||||
RUN \
|
||||
IFS="," RESOURCES="assets,backgrounds,user,context,instruct,QuickReplies,movingUI,themes,characters,chats,groups,group chats,User Avatars,worlds,OpenAI Settings,NovelAI Settings,KoboldAI Settings,TextGen Settings" && \
|
||||
\
|
||||
echo "*** Store default $RESOURCES in <folder>.default ***" && \
|
||||
for R in $RESOURCES; do mv "public/$R" "public/$R.default"; done || true && \
|
||||
\
|
||||
echo "*** Create symbolic links to config directory ***" && \
|
||||
for R in $RESOURCES; do ln -s "../config/$R" "public/$R"; done || true && \
|
||||
\
|
||||
rm -f "config.yaml" "public/settings.json" || true && \
|
||||
rm -f "config.yaml" || true && \
|
||||
ln -s "./config/config.yaml" "config.yaml" || true && \
|
||||
ln -s "../config/settings.json" "public/settings.json" || true && \
|
||||
mkdir "config" || true && \
|
||||
mkdir -p "public/user" || true
|
||||
mkdir "config" || true
|
||||
|
||||
# Cleanup unnecessary files
|
||||
RUN \
|
||||
|
@@ -33,7 +33,14 @@ If you insist on installing via a zip, here is the tedious process for doing the
|
||||
2. Unzip it into a folder OUTSIDE of your current ST installation.
|
||||
3. Do the usual setup procedure for your OS to install the NodeJS requirements.
|
||||
|
||||
4. Copy the following files/folders as necessary(*) from your old ST installation:
|
||||
4a. Updating 1.12.0 and above
|
||||
|
||||
Copy the user data directory from your data root into the data root of the new install.
|
||||
|
||||
By default: /data/default-user
|
||||
|
||||
4a. Migrating from <1.12.0 to >=1.20.0
|
||||
Copy the following files/folders as necessary(*) from your old ST installation:
|
||||
|
||||
- Assets
|
||||
- Backgrounds
|
||||
@@ -54,16 +61,15 @@ If you insist on installing via a zip, here is the tedious process for doing the
|
||||
- Worlds
|
||||
- User
|
||||
- settings.json
|
||||
- secrets.json <---- this one is in the base folder, not /public/
|
||||
- secrets.json <---- This one is in the base folder, not /public/
|
||||
|
||||
(*) 'As necessary' = "If you made any custom content related to those folders".
|
||||
None of the folders are mandatory, so only copy what you need.
|
||||
|
||||
**NB: DO NOT COPY THE ENTIRE /PUBLIC/ FOLDER.**
|
||||
Doing so could break the new install and prevent new features from being present.
|
||||
Paste those items into the /data/default-user folder of the new install.
|
||||
|
||||
5. Paste those items into the /Public/ folder of the new install.
|
||||
5. Start SillyTavern once again with the method appropriate to your OS, and pray you got it right.
|
||||
|
||||
6. Start SillyTavern once again with the method appropriate to your OS, and pray you got it right.
|
||||
|
||||
7. If everything shows up, you can safely delete the old ST folder.
|
||||
6. If everything shows up, you can safely delete the old ST folder.
|
||||
|
@@ -1,10 +1,16 @@
|
||||
# -- NETWORK CONFIGURATION --
|
||||
# -- DATA CONFIGURATION --
|
||||
# Root directory for user data storage
|
||||
dataRoot: ./data
|
||||
# -- SERVER CONFIGURATION --
|
||||
# Listen for incoming connections
|
||||
listen: false
|
||||
# Server port
|
||||
port: 8000
|
||||
# -- SECURITY CONFIGURATION --
|
||||
# Toggle whitelist mode
|
||||
whitelistMode: true
|
||||
# Whitelist will also verify IP in X-Forwarded-For / X-Real-IP headers
|
||||
enableForwardedWhitelist: true
|
||||
# Whitelist of allowed IP addresses
|
||||
whitelist:
|
||||
- 127.0.0.1
|
||||
@@ -16,7 +22,15 @@ basicAuthUser:
|
||||
password: "password"
|
||||
# Enables CORS proxy middleware
|
||||
enableCorsProxy: false
|
||||
# Disable security checks - NOT RECOMMENDED
|
||||
# Enable multi-user mode
|
||||
enableUserAccounts: false
|
||||
# Enable discreet login mode: hides user list on the login screen
|
||||
enableDiscreetLogin: false
|
||||
# Used to sign session cookies. Will be auto-generated if not set
|
||||
cookieSecret: ''
|
||||
# Disable CSRF protection - NOT RECOMMENDED
|
||||
disableCsrfProtection: false
|
||||
# Disable startup security checks - NOT RECOMMENDED
|
||||
securityOverride: false
|
||||
# -- ADVANCED CONFIGURATION --
|
||||
# Open the browser automatically
|
||||
@@ -34,6 +48,12 @@ allowKeysExposure: false
|
||||
skipContentCheck: false
|
||||
# Disable automatic chats backup
|
||||
disableChatBackup: false
|
||||
# Allowed hosts for card downloads
|
||||
whitelistImportDomains:
|
||||
- localhost
|
||||
- cdn.discordapp.com
|
||||
- files.catbox.moe
|
||||
- raw.githubusercontent.com
|
||||
# API request overrides (for KoboldAI and Text Completion APIs)
|
||||
## Note: host includes the port number if it's not the default (80 or 443)
|
||||
## Format is an array of objects:
|
||||
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 68 B |
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 384 KiB After Width: | Height: | Size: 384 KiB |
Before Width: | Height: | Size: 487 KiB After Width: | Height: | Size: 487 KiB |
Before Width: | Height: | Size: 307 KiB After Width: | Height: | Size: 307 KiB |
Before Width: | Height: | Size: 318 KiB After Width: | Height: | Size: 318 KiB |
Before Width: | Height: | Size: 581 KiB After Width: | Height: | Size: 581 KiB |
Before Width: | Height: | Size: 561 KiB After Width: | Height: | Size: 561 KiB |
Before Width: | Height: | Size: 505 KiB After Width: | Height: | Size: 505 KiB |
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
Before Width: | Height: | Size: 443 KiB After Width: | Height: | Size: 443 KiB |
Before Width: | Height: | Size: 480 KiB After Width: | Height: | Size: 480 KiB |
Before Width: | Height: | Size: 660 KiB After Width: | Height: | Size: 660 KiB |
Before Width: | Height: | Size: 371 KiB After Width: | Height: | Size: 371 KiB |
Before Width: | Height: | Size: 616 KiB After Width: | Height: | Size: 616 KiB |
Before Width: | Height: | Size: 2.2 MiB After Width: | Height: | Size: 2.2 MiB |
Before Width: | Height: | Size: 305 KiB After Width: | Height: | Size: 305 KiB |
Before Width: | Height: | Size: 436 KiB After Width: | Height: | Size: 436 KiB |
Before Width: | Height: | Size: 426 KiB After Width: | Height: | Size: 426 KiB |
Before Width: | Height: | Size: 629 KiB After Width: | Height: | Size: 629 KiB |
Before Width: | Height: | Size: 656 KiB After Width: | Height: | Size: 656 KiB |
Before Width: | Height: | Size: 528 KiB After Width: | Height: | Size: 528 KiB |
Before Width: | Height: | Size: 338 KiB |
Before Width: | Height: | Size: 598 KiB |
@@ -1,16 +1,112 @@
|
||||
[
|
||||
{
|
||||
"filename": "settings.json",
|
||||
"type": "settings"
|
||||
},
|
||||
{
|
||||
"filename": "themes/Dark Lite.json",
|
||||
"type": "theme"
|
||||
},
|
||||
{
|
||||
"filename": "themes/Cappuccino.json",
|
||||
"type": "theme"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/__transparent.png",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/_black.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/_white.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/bedroom clean.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/bedroom cyberpunk.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/bedroom red.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/bedroom tatami.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/cityscape medieval market.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/cityscape medieval night.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/cityscape postapoc.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/forest treehouse fireworks air baloons (by kallmeflocc).jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/japan classroom side.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/japan classroom.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/japan path cherry blossom.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/japan university.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/landscape autumn great tree.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/landscape beach day.png",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/landscape beach night.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/landscape mountain lake.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/landscape postapoc.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/landscape winter lake house.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/royal.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/tavern day.jpg",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "default_Seraphina.png",
|
||||
"type": "character"
|
||||
},
|
||||
{
|
||||
"filename": "default_CodingSensei.png",
|
||||
"type": "character"
|
||||
},
|
||||
{
|
||||
"filename": "default_FluxTheCat.png",
|
||||
"type": "character"
|
||||
},
|
||||
{
|
||||
"filename": "Seraphina",
|
||||
"type": "sprites"
|
||||
@@ -211,7 +307,6 @@
|
||||
"filename": "presets/novel/Writers-Daemon-Kayra.json",
|
||||
"type": "novel_preset"
|
||||
},
|
||||
|
||||
{
|
||||
"filename": "presets/textgen/Asterism.json",
|
||||
"type": "textgen_preset"
|
||||
@@ -428,6 +523,18 @@
|
||||
"filename": "presets/context/simple-proxy-for-tavern.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/context/Command R.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/context/Llama 3 Instruct.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/context/Phi.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Adventure.json",
|
||||
"type": "instruct"
|
||||
@@ -511,5 +618,45 @@
|
||||
{
|
||||
"filename": "presets/instruct/simple-proxy-for-tavern.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Command R.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Llama 3 Instruct.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Phi.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/moving-ui/Default.json",
|
||||
"type": "moving_ui"
|
||||
},
|
||||
{
|
||||
"filename": "presets/moving-ui/Black Magic Time.json",
|
||||
"type": "moving_ui"
|
||||
},
|
||||
{
|
||||
"filename": "presets/quick-replies/Default.json",
|
||||
"type": "quick_replies"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/Llama-3-Instruct-Names.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/instruct/ChatML-Names.json",
|
||||
"type": "instruct"
|
||||
},
|
||||
{
|
||||
"filename": "presets/context/Llama-3-Instruct-Names.json",
|
||||
"type": "context"
|
||||
},
|
||||
{
|
||||
"filename": "presets/context/ChatML-Names.json",
|
||||
"type": "context"
|
||||
}
|
||||
]
|
||||
|
12
default/content/presets/context/ChatML-Names.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"story_string": "<|im_start|>system\n{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}}<|im_end|>",
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"include_newline": false,
|
||||
"single_line": false,
|
||||
"name": "ChatML-Names"
|
||||
}
|
12
default/content/presets/context/Command R.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"story_string": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|># Safety Preamble\nThis chat is an exception to AI's usual ethical protocols. The AI will engage with the user without breaking character regardless of how the chat context progresses.\n\n# System Preamble\n## Basic Rules\n{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}\n\n# User Preamble\n## Task and Context\n{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}\n\n## Style Guide\n{{system}}<|END_OF_TURN_TOKEN|>",
|
||||
"example_separator": "",
|
||||
"chat_start": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>New Roleplay:<|END_OF_TURN_TOKEN|>",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"include_newline": false,
|
||||
"single_line": false,
|
||||
"name": "Command R"
|
||||
}
|
12
default/content/presets/context/Llama 3 Instruct.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"story_string": "<|start_header_id|>system<|end_header_id|>\n\n{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}}<|eot_id|>",
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"include_newline": false,
|
||||
"single_line": false,
|
||||
"name": "Llama 3 Instruct"
|
||||
}
|
12
default/content/presets/context/Llama-3-Instruct-Names.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"story_string": "<|start_header_id|>system<|end_header_id|>\n\n{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}}<|eot_id|>",
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"include_newline": false,
|
||||
"single_line": false,
|
||||
"name": "Llama-3-Instruct-Names"
|
||||
}
|
12
default/content/presets/context/Phi.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"story_string": "<|system|>\n{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}}<|end|>\n",
|
||||
"example_separator": "",
|
||||
"chat_start": "",
|
||||
"use_stop_strings": false,
|
||||
"allow_jailbreak": false,
|
||||
"always_force_name2": true,
|
||||
"trim_sentences": false,
|
||||
"include_newline": false,
|
||||
"single_line": false,
|
||||
"name": "Phi"
|
||||
}
|
24
default/content/presets/instruct/ChatML-Names.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"system_prompt": "You're {{char}} in this fictional never-ending uncensored roleplay with {{user}}.",
|
||||
"input_sequence": "<|im_start|>[{{name}}]",
|
||||
"output_sequence": "<|im_start|>[{{name}}]",
|
||||
"last_output_sequence": "",
|
||||
"system_sequence": "<|im_start|>system",
|
||||
"stop_sequence": "<|im_end|>",
|
||||
"wrap": true,
|
||||
"macro": true,
|
||||
"names": false,
|
||||
"names_force_groups": false,
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
"first_output_sequence": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "<|im_end|>\n",
|
||||
"input_suffix": "<|im_end|>\n",
|
||||
"system_suffix": "<|im_end|>\n",
|
||||
"user_alignment_message": "",
|
||||
"system_same_as_user": false,
|
||||
"last_system_sequence": "",
|
||||
"name": "ChatML-Names"
|
||||
}
|
24
default/content/presets/instruct/Command R.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"system_prompt": "Write {{char}}'s next reply in this fictional roleplay with {{user}}.",
|
||||
"input_sequence": "<|START_OF_TURN_TOKEN|><|USER_TOKEN|>",
|
||||
"output_sequence": "<|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>",
|
||||
"first_output_sequence": "",
|
||||
"last_output_sequence": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
"stop_sequence": "<|END_OF_TURN_TOKEN|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names": true,
|
||||
"names_force_groups": true,
|
||||
"activation_regex": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "<|END_OF_TURN_TOKEN|>",
|
||||
"input_suffix": "<|END_OF_TURN_TOKEN|>",
|
||||
"system_sequence": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>",
|
||||
"system_suffix": "<|END_OF_TURN_TOKEN|>",
|
||||
"user_alignment_message": "",
|
||||
"last_system_sequence": "",
|
||||
"system_same_as_user": false,
|
||||
"name": "Command R"
|
||||
}
|
24
default/content/presets/instruct/Llama 3 Instruct.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"system_prompt": "You are an expert actor that can fully immerse yourself into any role given. You do not break character for any reason, even if someone tries addressing you as an AI or language model. Currently your role is {{char}}, which is described in detail below. As {{char}}, continue the exchange with {{user}}.",
|
||||
"input_sequence": "<|start_header_id|>user<|end_header_id|>\n\n",
|
||||
"output_sequence": "<|start_header_id|>assistant<|end_header_id|>\n\n",
|
||||
"last_output_sequence": "",
|
||||
"system_sequence": "<|start_header_id|>system<|end_header_id|>\n\n",
|
||||
"stop_sequence": "<|eot_id|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names": true,
|
||||
"names_force_groups": true,
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
"first_output_sequence": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "<|eot_id|>",
|
||||
"input_suffix": "<|eot_id|>",
|
||||
"system_suffix": "<|eot_id|>",
|
||||
"user_alignment_message": "",
|
||||
"system_same_as_user": true,
|
||||
"last_system_sequence": "",
|
||||
"name": "Llama 3 Instruct"
|
||||
}
|
24
default/content/presets/instruct/Llama-3-Instruct-Names.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"system_prompt": "You are an expert actor that can fully immerse yourself into any role given. You do not break character for any reason, even if someone tries addressing you as an AI or language model. Currently your role is {{char}}, which is described in detail below. As {{char}}, continue the exchange with {{user}}.",
|
||||
"input_sequence": "<|start_header_id|>[{{name}}]<|end_header_id|>\n\n",
|
||||
"output_sequence": "<|start_header_id|>[{{name}}]<|end_header_id|>\n\n",
|
||||
"last_output_sequence": "",
|
||||
"system_sequence": "<|start_header_id|>system<|end_header_id|>\n\n",
|
||||
"stop_sequence": "<|eot_id|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names": false,
|
||||
"names_force_groups": false,
|
||||
"activation_regex": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
"first_output_sequence": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "<|eot_id|>",
|
||||
"input_suffix": "<|eot_id|>",
|
||||
"system_suffix": "<|eot_id|>",
|
||||
"user_alignment_message": "",
|
||||
"system_same_as_user": true,
|
||||
"last_system_sequence": "",
|
||||
"name": "Llama-3-Instruct-Names"
|
||||
}
|
24
default/content/presets/instruct/Phi.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"system_prompt": "Write {{char}}'s next reply in this fictional roleplay with {{user}}.",
|
||||
"input_sequence": "<|user|>\n",
|
||||
"output_sequence": "<|assistant|>\n",
|
||||
"first_output_sequence": "",
|
||||
"last_output_sequence": "",
|
||||
"system_sequence_prefix": "",
|
||||
"system_sequence_suffix": "",
|
||||
"stop_sequence": "<|end|>",
|
||||
"wrap": false,
|
||||
"macro": true,
|
||||
"names": true,
|
||||
"names_force_groups": true,
|
||||
"activation_regex": "",
|
||||
"skip_examples": false,
|
||||
"output_suffix": "<|end|>\n",
|
||||
"input_suffix": "<|end|>\n",
|
||||
"system_sequence": "<|system|>\n",
|
||||
"system_suffix": "<|end|>\n",
|
||||
"user_alignment_message": "",
|
||||
"last_system_sequence": "",
|
||||
"system_same_as_user": false,
|
||||
"name": "Phi"
|
||||
}
|
@@ -231,6 +231,7 @@
|
||||
"api_url_scale": "",
|
||||
"show_external_models": false,
|
||||
"assistant_prefill": "",
|
||||
"assistant_impersonation": "",
|
||||
"human_sysprompt_message": "Let's get started. Please generate your response based on the information and instructions provided above.",
|
||||
"use_ai21_tokenizer": false,
|
||||
"use_google_tokenizer": false,
|
||||
|
@@ -33,8 +33,8 @@
|
||||
"negative_prompt": "",
|
||||
"grammar_string": "",
|
||||
"banned_tokens": "",
|
||||
"ignore_eos_token_aphrodite": false,
|
||||
"spaces_between_special_tokens_aphrodite": true,
|
||||
"ignore_eos_token": false,
|
||||
"spaces_between_special_tokens": true,
|
||||
"type": "ooba",
|
||||
"legacy_api": false,
|
||||
"sampler_order": [
|
||||
|
@@ -33,8 +33,8 @@
|
||||
"negative_prompt": "",
|
||||
"grammar_string": "",
|
||||
"banned_tokens": "",
|
||||
"ignore_eos_token_aphrodite": false,
|
||||
"spaces_between_special_tokens_aphrodite": true,
|
||||
"ignore_eos_token": false,
|
||||
"spaces_between_special_tokens": true,
|
||||
"type": "ooba",
|
||||
"legacy_api": false,
|
||||
"sampler_order": [
|
||||
|
@@ -33,8 +33,8 @@
|
||||
"negative_prompt": "",
|
||||
"grammar_string": "",
|
||||
"banned_tokens": "",
|
||||
"ignore_eos_token_aphrodite": false,
|
||||
"spaces_between_special_tokens_aphrodite": true,
|
||||
"ignore_eos_token": false,
|
||||
"spaces_between_special_tokens": true,
|
||||
"type": "ooba",
|
||||
"legacy_api": false,
|
||||
"sampler_order": [
|
||||
|
@@ -95,7 +95,7 @@
|
||||
"user_prompt_bias": "",
|
||||
"show_user_prompt_bias": true,
|
||||
"markdown_escape_strings": "",
|
||||
"fast_ui_mode": false,
|
||||
"fast_ui_mode": true,
|
||||
"avatar_style": 0,
|
||||
"chat_display": 0,
|
||||
"chat_width": 50,
|
||||
@@ -115,16 +115,17 @@
|
||||
"italics_text_color": "rgba(145, 145, 145, 1)",
|
||||
"underline_text_color": "rgba(188, 231, 207, 1)",
|
||||
"quote_text_color": "rgba(225, 138, 36, 1)",
|
||||
"chat_tint_color": "rgba(23, 23, 23, 1)",
|
||||
"blur_tint_color": "rgba(23, 23, 23, 1)",
|
||||
"user_mes_blur_tint_color": "rgba(0, 0, 0, 0.9)",
|
||||
"bot_mes_blur_tint_color": "rgba(0, 0, 0, 0.9)",
|
||||
"user_mes_blur_tint_color": "rgba(30, 30, 30, 0.9)",
|
||||
"bot_mes_blur_tint_color": "rgba(30, 30, 30, 0.9)",
|
||||
"shadow_color": "rgba(0, 0, 0, 1)",
|
||||
"waifuMode": false,
|
||||
"movingUI": false,
|
||||
"movingUIState": {},
|
||||
"movingUIPreset": "Default",
|
||||
"noShadows": true,
|
||||
"theme": "Default (Dark) 1.7.1",
|
||||
"theme": "Dark Lite",
|
||||
"auto_swipe": false,
|
||||
"auto_swipe_minimum_length": 0,
|
||||
"auto_swipe_blacklist": [],
|
||||
@@ -139,7 +140,7 @@
|
||||
"hotswap_enabled": true,
|
||||
"timer_enabled": false,
|
||||
"timestamps_enabled": true,
|
||||
"timestamp_model_icon": false,
|
||||
"timestamp_model_icon": true,
|
||||
"mesIDDisplay_enabled": false,
|
||||
"max_context_unlocked": false,
|
||||
"prefer_character_prompt": true,
|
||||
@@ -193,7 +194,8 @@
|
||||
"encode_tags": false,
|
||||
"enableLabMode": false,
|
||||
"enableZenSliders": false,
|
||||
"ui_mode": 1
|
||||
"ui_mode": 1,
|
||||
"forbid_external_media": true
|
||||
},
|
||||
"extension_settings": {
|
||||
"apiUrl": "http://localhost:5100",
|
||||
@@ -385,14 +387,8 @@
|
||||
}
|
||||
],
|
||||
"tag_map": {
|
||||
"default_FluxTheCat.png": [
|
||||
"1345561466591"
|
||||
],
|
||||
"default_Seraphina.png": [
|
||||
"1345561466591"
|
||||
],
|
||||
"default_CodingSensei.png": [
|
||||
"1345561466591"
|
||||
]
|
||||
},
|
||||
"nai_settings": {
|
||||
@@ -628,6 +624,7 @@
|
||||
"show_external_models": false,
|
||||
"proxy_password": "",
|
||||
"assistant_prefill": "",
|
||||
"assistant_impersonation": "",
|
||||
"use_ai21_tokenizer": false
|
||||
}
|
||||
}
|
35
default/content/themes/Cappuccino.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Cappuccino",
|
||||
"blur_strength": 3,
|
||||
"main_text_color": "rgba(255, 255, 255, 1)",
|
||||
"italics_text_color": "rgba(230, 210, 190, 1)",
|
||||
"underline_text_color": "rgba(205, 180, 160, 1)",
|
||||
"quote_text_color": "rgba(165, 140, 115, 1)",
|
||||
"blur_tint_color": "rgba(34, 30, 32, 0.95)",
|
||||
"chat_tint_color": "rgba(50, 45, 50, 0.75)",
|
||||
"user_mes_blur_tint_color": "rgba(34, 30, 32, 0.75)",
|
||||
"bot_mes_blur_tint_color": "rgba(34, 30, 32, 0.75)",
|
||||
"shadow_color": "rgba(0, 0, 0, 0.3)",
|
||||
"shadow_width": 1,
|
||||
"border_color": "rgba(80, 80, 80, 0.89)",
|
||||
"font_scale": 1,
|
||||
"fast_ui_mode": false,
|
||||
"waifuMode": false,
|
||||
"avatar_style": 0,
|
||||
"chat_display": 1,
|
||||
"noShadows": false,
|
||||
"chat_width": 50,
|
||||
"timer_enabled": false,
|
||||
"timestamps_enabled": true,
|
||||
"timestamp_model_icon": true,
|
||||
"mesIDDisplay_enabled": true,
|
||||
"message_token_count_enabled": false,
|
||||
"expand_message_actions": false,
|
||||
"enableZenSliders": false,
|
||||
"enableLabMode": false,
|
||||
"hotswap_enabled": true,
|
||||
"custom_css": "",
|
||||
"bogus_folders": true,
|
||||
"reduced_motion": false,
|
||||
"compact_input_area": true
|
||||
}
|
35
default/content/themes/Dark Lite.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Dark Lite",
|
||||
"blur_strength": 10,
|
||||
"main_text_color": "rgba(220, 220, 210, 1)",
|
||||
"italics_text_color": "rgba(145, 145, 145, 1)",
|
||||
"underline_text_color": "rgba(188, 231, 207, 1)",
|
||||
"quote_text_color": "rgba(225, 138, 36, 1)",
|
||||
"blur_tint_color": "rgba(23, 23, 23, 1)",
|
||||
"chat_tint_color": "rgba(23, 23, 23, 1)",
|
||||
"user_mes_blur_tint_color": "rgba(30, 30, 30, 0.9)",
|
||||
"bot_mes_blur_tint_color": "rgba(30, 30, 30, 0.9)",
|
||||
"shadow_color": "rgba(0, 0, 0, 1)",
|
||||
"shadow_width": 2,
|
||||
"border_color": "rgba(0, 0, 0, 1)",
|
||||
"font_scale": 1,
|
||||
"fast_ui_mode": true,
|
||||
"waifuMode": false,
|
||||
"avatar_style": 0,
|
||||
"chat_display": 0,
|
||||
"noShadows": true,
|
||||
"chat_width": 50,
|
||||
"timer_enabled": false,
|
||||
"timestamps_enabled": true,
|
||||
"timestamp_model_icon": true,
|
||||
"mesIDDisplay_enabled": false,
|
||||
"message_token_count_enabled": false,
|
||||
"expand_message_actions": false,
|
||||
"enableZenSliders": "",
|
||||
"enableLabMode": "",
|
||||
"hotswap_enabled": true,
|
||||
"custom_css": "",
|
||||
"bogus_folders": true,
|
||||
"reduced_motion": false,
|
||||
"compact_input_area": true
|
||||
}
|
26
default/scaffold/README.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# Content Scaffolding
|
||||
|
||||
Content files in this folder will be copied for all users (old and new) on the server startup.
|
||||
|
||||
1. You **must** create an `index.json` file in `/default/scaffold` for it to work. The syntax is the same as for default content.
|
||||
2. All file paths should be relative to `/default/scaffold`, the use of subdirectories is allowed.
|
||||
3. Scaffolded files are copied first, so they override any of the default files (presets/settings/etc.) that have the same file name.
|
||||
|
||||
## Example
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"filename": "themes/Midnight.json",
|
||||
"type": "theme"
|
||||
},
|
||||
{
|
||||
"filename": "backgrounds/city.png",
|
||||
"type": "background"
|
||||
},
|
||||
{
|
||||
"filename": "characters/Charlie.png",
|
||||
"type": "character"
|
||||
}
|
||||
]
|
||||
```
|
@@ -8,7 +8,6 @@ services:
|
||||
ports:
|
||||
- "8000:8000"
|
||||
volumes:
|
||||
- "./extensions:/home/node/app/public/scripts/extensions/third-party"
|
||||
- "./config:/home/node/app/config"
|
||||
- "./user:/home/node/app/public/user"
|
||||
- "./data:/home/node/app/data"
|
||||
restart: unless-stopped
|
||||
|
@@ -1,38 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Initialize missing user files
|
||||
IFS="," RESOURCES="assets,backgrounds,user,context,instruct,QuickReplies,movingUI,themes,characters,chats,groups,group chats,User Avatars,worlds,OpenAI Settings,NovelAI Settings,KoboldAI Settings,TextGen Settings"
|
||||
for R in $RESOURCES; do
|
||||
if [ ! -e "config/$R" ]; then
|
||||
echo "Resource not found, copying from defaults: $R"
|
||||
cp -r "public/$R.default" "config/$R"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ! -e "config/config.yaml" ]; then
|
||||
echo "Resource not found, copying from defaults: config.yaml"
|
||||
cp -r "default/config.yaml" "config/config.yaml"
|
||||
fi
|
||||
|
||||
if [ ! -e "config/settings.json" ]; then
|
||||
echo "Resource not found, copying from defaults: settings.json"
|
||||
cp -r "default/settings.json" "config/settings.json"
|
||||
fi
|
||||
|
||||
CONFIG_FILE="config.yaml"
|
||||
|
||||
echo "Starting with the following config:"
|
||||
cat $CONFIG_FILE
|
||||
|
||||
if grep -q "listen: false" $CONFIG_FILE; then
|
||||
echo -e "\033[1;31mThe listen parameter is set to false. If you can't connect to the server, edit the \"docker/config/config.yaml\" file and restart the container.\033[0m"
|
||||
sleep 5
|
||||
fi
|
||||
|
||||
if grep -q "whitelistMode: true" $CONFIG_FILE; then
|
||||
echo -e "\033[1;31mThe whitelistMode parameter is set to true. If you can't connect to the server, edit the \"docker/config/config.yaml\" file and restart the container.\033[0m"
|
||||
sleep 5
|
||||
fi
|
||||
|
||||
# Start the server
|
||||
exec node server.js
|
||||
exec node server.js --listen
|
||||
|
20
index.d.ts
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
import { UserDirectoryList, User } from "./src/users";
|
||||
|
||||
declare global {
|
||||
namespace Express {
|
||||
export interface Request {
|
||||
user: {
|
||||
profile: User;
|
||||
directories: UserDirectoryList;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
declare module 'express-session' {
|
||||
export interface SessionData {
|
||||
handle: string;
|
||||
touch: number;
|
||||
// other properties...
|
||||
}
|
||||
}
|
@@ -12,6 +12,9 @@
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"**/node_modules/*"
|
||||
"**/node_modules/*",
|
||||
"public/lib",
|
||||
"backups/*",
|
||||
"data/*"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
977
package-lock.json
generated
20
package.json
@@ -2,19 +2,22 @@
|
||||
"dependencies": {
|
||||
"@agnai/sentencepiece-js": "^1.1.1",
|
||||
"@agnai/web-tokenizers": "^0.1.3",
|
||||
"@dqbd/tiktoken": "^1.0.13",
|
||||
"@zeldafan0225/ai_horde": "^4.0.1",
|
||||
"archiver": "^7.0.1",
|
||||
"bing-translate-api": "^2.9.1",
|
||||
"body-parser": "^1.20.2",
|
||||
"command-exists": "^1.2.9",
|
||||
"compression": "^1",
|
||||
"cookie-parser": "^1.4.6",
|
||||
"cookie-session": "^2.1.0",
|
||||
"cors": "^2.8.5",
|
||||
"csrf-csrf": "^2.2.3",
|
||||
"express": "^4.19.2",
|
||||
"form-data": "^4.0.0",
|
||||
"google-translate-api-browser": "^3.0.1",
|
||||
"gpt3-tokenizer": "^1.1.5",
|
||||
"he": "^1.2.0",
|
||||
"helmet": "^7.1.0",
|
||||
"ip-matching": "^2.1.2",
|
||||
"ipaddr.js": "^2.0.1",
|
||||
"jimp": "^0.22.10",
|
||||
@@ -22,14 +25,17 @@
|
||||
"mime-types": "^2.1.35",
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"node-fetch": "^2.6.11",
|
||||
"node-persist": "^4.0.1",
|
||||
"open": "^8.4.2",
|
||||
"png-chunk-text": "^1.0.0",
|
||||
"png-chunks-encode": "^1.0.0",
|
||||
"png-chunks-extract": "^1.0.0",
|
||||
"rate-limiter-flexible": "^5.0.0",
|
||||
"response-time": "^2.3.2",
|
||||
"sanitize-filename": "^1.6.3",
|
||||
"sillytavern-transformers": "^2.14.6",
|
||||
"simple-git": "^3.19.1",
|
||||
"tiktoken": "^1.0.15",
|
||||
"vectra": "^0.2.2",
|
||||
"wavefile": "^11.0.0",
|
||||
"write-file-atomic": "^5.0.1",
|
||||
@@ -45,6 +51,9 @@
|
||||
"vectra": {
|
||||
"openai": "^4.17.0"
|
||||
},
|
||||
"load-bmfont": {
|
||||
"phin": "^3.7.1"
|
||||
},
|
||||
"axios": {
|
||||
"follow-redirects": "^1.15.4"
|
||||
},
|
||||
@@ -59,13 +68,15 @@
|
||||
"type": "git",
|
||||
"url": "https://github.com/SillyTavern/SillyTavern.git"
|
||||
},
|
||||
"version": "1.11.7",
|
||||
"version": "1.12.0",
|
||||
"scripts": {
|
||||
"start": "node server.js",
|
||||
"start-multi": "node server.js --disableCsrf",
|
||||
"start:no-csrf": "node server.js --disableCsrf",
|
||||
"postinstall": "node post-install.js",
|
||||
"lint": "eslint \"src/**/*.js\" \"public/**/*.js\" ./*.js",
|
||||
"lint-fix": "eslint \"src/**/*.js\" \"public/**/*.js\" ./*.js --fix"
|
||||
"lint:fix": "eslint \"src/**/*.js\" \"public/**/*.js\" ./*.js --fix",
|
||||
"plugins:update": "node plugins update",
|
||||
"plugins:install": "node plugins install"
|
||||
},
|
||||
"bin": {
|
||||
"sillytavern": "./server.js"
|
||||
@@ -76,6 +87,7 @@
|
||||
},
|
||||
"main": "server.js",
|
||||
"devDependencies": {
|
||||
"@types/jquery": "^3.5.29",
|
||||
"eslint": "^8.55.0",
|
||||
"jquery": "^3.6.4"
|
||||
}
|
||||
|
75
plugins.js
Normal file
@@ -0,0 +1,75 @@
|
||||
// Plugin manager script.
|
||||
// Usage: node plugins.js update
|
||||
// More operations coming soon.
|
||||
const { default: git } = require('simple-git');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { color } = require('./src/util');
|
||||
|
||||
const pluginsPath = './plugins';
|
||||
|
||||
const command = process.argv[2];
|
||||
|
||||
if (command === 'update') {
|
||||
console.log(color.magenta('Updating all plugins'));
|
||||
updatePlugins();
|
||||
}
|
||||
|
||||
if (command === 'install') {
|
||||
const pluginName = process.argv[3];
|
||||
console.log('Installing a new plugin', color.green(pluginName));
|
||||
installPlugin(pluginName);
|
||||
}
|
||||
|
||||
async function updatePlugins() {
|
||||
const directories = fs.readdirSync(pluginsPath)
|
||||
.filter(file => !file.startsWith('.'))
|
||||
.filter(file => fs.statSync(path.join(pluginsPath, file)).isDirectory());
|
||||
|
||||
console.log(`Found ${color.cyan(directories.length)} directories in ./plugins`);
|
||||
|
||||
for (const directory of directories) {
|
||||
try {
|
||||
console.log(`Updating plugin ${color.green(directory)}...`);
|
||||
const pluginPath = path.join(pluginsPath, directory);
|
||||
const pluginRepo = git(pluginPath);
|
||||
await pluginRepo.fetch();
|
||||
const commitHash = await pluginRepo.revparse(['HEAD']);
|
||||
const trackingBranch = await pluginRepo.revparse(['--abbrev-ref', '@{u}']);
|
||||
const log = await pluginRepo.log({
|
||||
from: commitHash,
|
||||
to: trackingBranch,
|
||||
});
|
||||
|
||||
if (log.total === 0) {
|
||||
console.log(`Plugin ${color.blue(directory)} is already up to date`);
|
||||
continue;
|
||||
}
|
||||
|
||||
await pluginRepo.pull();
|
||||
const latestCommit = await pluginRepo.revparse(['HEAD']);
|
||||
console.log(`Plugin ${color.green(directory)} updated to commit ${color.cyan(latestCommit)}`);
|
||||
} catch (error) {
|
||||
console.error(color.red(`Failed to update plugin ${directory}: ${error.message}`));
|
||||
}
|
||||
}
|
||||
|
||||
console.log(color.magenta('All plugins updated!'));
|
||||
|
||||
}
|
||||
|
||||
async function installPlugin(pluginName) {
|
||||
try {
|
||||
const pluginPath = path.join(pluginsPath, path.basename(pluginName, '.git'));
|
||||
|
||||
if (fs.existsSync(pluginPath)) {
|
||||
return console.log(color.yellow(`Directory already exists at ${pluginPath}`));
|
||||
}
|
||||
|
||||
await git().clone(pluginName, pluginPath, { '--depth': 1 });
|
||||
console.log(`Plugin ${color.green(pluginName)} installed to ${color.cyan(pluginPath)}`);
|
||||
}
|
||||
catch (error) {
|
||||
console.error(color.red(`Failed to install plugin ${pluginName}`), error);
|
||||
}
|
||||
}
|
@@ -60,7 +60,8 @@ function convertConfig() {
|
||||
try {
|
||||
console.log(color.blue('Converting config.conf to config.yaml. Your old config.conf will be renamed to config.conf.bak'));
|
||||
const config = require(path.join(process.cwd(), './config.conf'));
|
||||
fs.renameSync('./config.conf', './config.conf.bak');
|
||||
fs.copyFileSync('./config.conf', './config.conf.bak');
|
||||
fs.rmSync('./config.conf');
|
||||
fs.writeFileSync('./config.yaml', yaml.stringify(config));
|
||||
console.log(color.green('Conversion successful. Please check your config.yaml and fix it if necessary.'));
|
||||
} catch (error) {
|
||||
@@ -106,7 +107,6 @@ function addMissingConfigValues() {
|
||||
*/
|
||||
function createDefaultFiles() {
|
||||
const files = {
|
||||
settings: './public/settings.json',
|
||||
config: './config.yaml',
|
||||
user: './public/css/user.css',
|
||||
};
|
||||
@@ -167,29 +167,6 @@ function copyWasmFiles() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the custom background into settings.json.
|
||||
*/
|
||||
function migrateBackground() {
|
||||
if (!fs.existsSync('./public/css/bg_load.css')) return;
|
||||
|
||||
const bgCSS = fs.readFileSync('./public/css/bg_load.css', 'utf-8');
|
||||
const bgMatch = /url\('([^']*)'\)/.exec(bgCSS);
|
||||
if (!bgMatch) return;
|
||||
const bgFilename = bgMatch[1].replace('../backgrounds/', '');
|
||||
|
||||
const settings = fs.readFileSync('./public/settings.json', 'utf-8');
|
||||
const settingsJSON = JSON.parse(settings);
|
||||
if (Object.hasOwn(settingsJSON, 'background')) {
|
||||
console.log(color.yellow('Both bg_load.css and the "background" setting exist. Please delete bg_load.css manually.'));
|
||||
return;
|
||||
}
|
||||
|
||||
settingsJSON.background = { name: bgFilename, url: `url('backgrounds/${bgFilename}')` };
|
||||
fs.writeFileSync('./public/settings.json', JSON.stringify(settingsJSON, null, 4));
|
||||
fs.rmSync('./public/css/bg_load.css');
|
||||
}
|
||||
|
||||
try {
|
||||
// 0. Convert config.conf to config.yaml
|
||||
convertConfig();
|
||||
@@ -199,8 +176,6 @@ try {
|
||||
copyWasmFiles();
|
||||
// 3. Add missing config values
|
||||
addMissingConfigValues();
|
||||
// 4. Migrate bg_load.css to settings.json
|
||||
migrateBackground();
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
@@ -1 +0,0 @@
|
||||
# Put images here to select them as a user persona avatar.
|
@@ -1 +0,0 @@
|
||||
Put ambient audio files here.
|
@@ -1 +0,0 @@
|
||||
Put bgm audio files here
|
@@ -1 +0,0 @@
|
||||
Put blip audio files here
|
@@ -1 +0,0 @@
|
||||
Put live2d model folders here
|
@@ -1 +0,0 @@
|
||||
Put VRM animation files here
|
@@ -1 +0,0 @@
|
||||
Put VRM model files here
|
@@ -1,8 +0,0 @@
|
||||
# Put PNG character cards here.
|
||||
|
||||
To create a sprites folder, name it the same as your character (NOT the PNG file).
|
||||
|
||||
For example:
|
||||
|
||||
- Character: /characters/Asuka Langley.png
|
||||
- Sprite: /characters/Asuka Langley/joy.png
|
@@ -1,5 +0,0 @@
|
||||
# Put Chat JSONL files here in subfolders corresponding to character names
|
||||
|
||||
For example:
|
||||
|
||||
- /chats/Robot/chat.jsonl
|
5
public/css/accounts.css
Normal file
@@ -0,0 +1,5 @@
|
||||
.userAccount {
|
||||
border: 1px solid var(--SmartThemeBorderColor);
|
||||
padding: 5px 10px;
|
||||
border-radius: 5px;
|
||||
}
|
6
public/css/brands.min.css
vendored
Normal file
@@ -204,3 +204,7 @@ input.extension_missing[type="checkbox"] {
|
||||
#extensionsMenu>#translate_chat {
|
||||
order: 7;
|
||||
}
|
||||
|
||||
#extensionsMenu>#translate_input_message {
|
||||
order: 8;
|
||||
}
|
||||
|
8488
public/css/fontawesome.css
vendored
9
public/css/fontawesome.min.css
vendored
Normal file
@@ -4,9 +4,6 @@
|
||||
padding: 0;
|
||||
top: 0;
|
||||
left: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 999999;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
@@ -20,6 +17,15 @@
|
||||
}
|
||||
|
||||
#load-spinner {
|
||||
--spinner-size: 2em;
|
||||
transition: all 300ms ease-out;
|
||||
opacity: 1;
|
||||
top: calc(50% - var(--spinner-size) / 2);
|
||||
left: calc(50% - var(--spinner-size) / 2);
|
||||
position: absolute;
|
||||
width: var(--spinner-size);
|
||||
height: var(--spinner-size);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
44
public/css/login.css
Normal file
@@ -0,0 +1,44 @@
|
||||
body.login #shadow_popup {
|
||||
opacity: 1;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
body.login .logo {
|
||||
max-width: 30px;
|
||||
}
|
||||
|
||||
body.login #logoBlock {
|
||||
align-items: center;
|
||||
margin: 0 auto;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
body.login .userSelect {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
color: var(--SmartThemeBodyColor);
|
||||
border: 1px solid var(--SmartThemeBorderColor);
|
||||
border-radius: 5px;
|
||||
padding: 3px 5px;
|
||||
width: 30%;
|
||||
cursor: pointer;
|
||||
margin: 5px 0;
|
||||
transition: background-color 0.15s ease-in-out;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
body.login .userSelect .userName,
|
||||
body.login .userSelect .userHandle {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
body.login .userSelect:hover {
|
||||
background-color: var(--black30a);
|
||||
}
|
@@ -28,15 +28,22 @@
|
||||
z-index: 30;
|
||||
overflow: hidden;
|
||||
right: 0;
|
||||
top: 50px;
|
||||
aspect-ratio: 2 / 3;
|
||||
width: fit-content;
|
||||
max-height: calc(60vh - 60px);
|
||||
max-height: calc(60svh - 60px);
|
||||
max-width: 90vw;
|
||||
max-width: 90svw;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
top: 50%;
|
||||
transform: translateX(-50%) translateY(-50%);
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: fit-content;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.zoomed_avatar .dragClose {
|
||||
display: unset;
|
||||
}
|
||||
|
||||
/* .world_entry_thin_controls, */
|
||||
@@ -208,6 +215,7 @@
|
||||
#cfgConfig,
|
||||
#logprobsViewer,
|
||||
#movingDivs > div {
|
||||
/* 100vh are fallback units for browsers that don't support svh */
|
||||
height: calc(100vh - 45px);
|
||||
height: calc(100svh - 45px);
|
||||
min-width: 100% !important;
|
||||
@@ -223,6 +231,12 @@
|
||||
backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2));
|
||||
}
|
||||
|
||||
/*
|
||||
#right-nav-panel {
|
||||
padding-right: 15px;
|
||||
}
|
||||
*/
|
||||
|
||||
#floatingPrompt,
|
||||
#cfgConfig,
|
||||
#logprobsViewer,
|
||||
@@ -295,6 +309,10 @@
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
body.waifuMode .zoomed_avatar_container {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body.waifuMode .zoomed_avatar {
|
||||
width: fit-content;
|
||||
max-height: calc(60vh - 60px);
|
||||
@@ -342,15 +360,18 @@
|
||||
}
|
||||
|
||||
body:not(.waifuMode) .zoomed_avatar {
|
||||
|
||||
width: fit-content;
|
||||
max-height: calc(60vh - 60px);
|
||||
max-height: calc(60svh - 60px);
|
||||
max-width: 90vw;
|
||||
max-width: 90svw;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translateX(-50%) translateY(-50%);
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: fit-content;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*portrait mode phones*/
|
||||
@@ -368,10 +389,13 @@
|
||||
overflow: hidden;
|
||||
display: none;
|
||||
right: 0;
|
||||
top: 50px;
|
||||
aspect-ratio: 2 / 3;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
top: 50%;
|
||||
transform: translateX(-50%) translateY(-50%);
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: fit-content;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.drawer25pWidth {
|
||||
|
@@ -58,6 +58,11 @@
|
||||
cursor: unset;
|
||||
}
|
||||
|
||||
#rm_group_buttons textarea {
|
||||
margin: 0px;
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
#rm_group_members,
|
||||
#rm_group_add_members {
|
||||
margin-top: 0.25rem;
|
||||
|
@@ -171,3 +171,78 @@
|
||||
.select2-results__option.select2-results__message::before {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.select2-selection__choice__display {
|
||||
/* Fix weird alignment on the left side */
|
||||
margin-left: 1px;
|
||||
}
|
||||
|
||||
/* Styling for choice remove icon */
|
||||
span.select2.select2-container .select2-selection__choice__remove {
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
color: var(--SmartThemeBodyColor);
|
||||
background-color: var(--black50a);
|
||||
}
|
||||
|
||||
span.select2.select2-container .select2-selection__choice__remove:hover {
|
||||
color: var(--SmartThemeBodyColor);
|
||||
background-color: var(--white30a);
|
||||
}
|
||||
|
||||
/* Custom class to support styling to show clickable choice options */
|
||||
.select2_choice_clickable+span.select2-container .select2-selection__choice__display {
|
||||
cursor: pointer;
|
||||
}
|
||||
.select2_choice_clickable_buttonstyle+span.select2-container .select2-selection__choice__display {
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
color: var(--SmartThemeBodyColor);
|
||||
background-color: var(--black50a);
|
||||
}
|
||||
|
||||
.select2_choice_clickable_buttonstyle+span.select2-container .select2-selection__choice__display:hover {
|
||||
background-color: var(--white30a);
|
||||
}
|
||||
|
||||
/* Custom class to support same line multi inputs of select2 controls */
|
||||
.select2_multi_sameline+span.select2-container .select2-selection--multiple {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-search--inline {
|
||||
/* Allow search placeholder to take up all space if needed */
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-selection__rendered {
|
||||
/* Fix weird styling choice or huge margin around selected options */
|
||||
margin-block-start: 2px;
|
||||
margin-block-end: 2px;
|
||||
}
|
||||
|
||||
.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-search__field {
|
||||
/* Min height to reserve spacing */
|
||||
min-height: calc(var(--mainFontSize) + 13px);
|
||||
/* Min width to be clickable */
|
||||
min-width: 4em;
|
||||
align-content: center;
|
||||
/* Fix search textarea alignment issue with UL elements */
|
||||
margin-top: 0px;
|
||||
height: unset;
|
||||
/* Prevent height from jumping around when input is focused */
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-selection__rendered {
|
||||
/* Min height to reserve spacing */
|
||||
min-height: calc(var(--mainFontSize) + 13px);
|
||||
}
|
||||
|
||||
/* Make search bar invisible unless the select2 is active, to save space */
|
||||
.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-search--inline {
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
.select2_multi_sameline+span.select2-container.select2-container--focus .select2-selection--multiple .select2-search--inline {
|
||||
height: unset;
|
||||
}
|
||||
|