feat: add a web UI server (#1345)

* update rdagent cmd

* fix log error message

* use multiProcessing.Process instead of subprocess.Popen

* add traces to gitignore

* add user interactor in RDLoop (finance scenarios)

* add interactor (feedback, hypothesis) for quant scens

* fix the test_end in qlib conf

* add features init config, general instruction to qlib scenarios

* set base features for based exp

* fix bug when combine factors

* move traces folder to git_ignore_folder

* fix bug in features init

* fix quant interact bug

* fix logger warning error

* bug fixes

* modify rdagent logger, now it can set file output

* adjust cli functions and fix logger bug

* fix server port transport problem

* update server_ui in cli

* add web code

* fix CI problem

* black fix

* update web ui README

* update README

* update readme
This commit is contained in:
XianBW
2026-03-18 14:04:52 +08:00
committed by GitHub
parent 7cd64a26fd
commit 14395488b9
141 changed files with 12852 additions and 279 deletions
+163
View File
@@ -0,0 +1,163 @@
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: "Source Code Pro", monospace;
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token {
/* background: transparent;
border: 0px;
color: inherit;
display: inline;
font-size: 1em;
line-height: inherit;
margin: 0px;
overflow-x: auto;
padding: 0px;
white-space: pre;
word-break: normal;
overflow-wrap: normal; */
font-family: "consolas", monospace;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: rgb(128, 132, 149);
font-style: italic;
}
.token.punctuation {
color: #999;
}
.token.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: rgb(9, 171, 59);
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: rgb(237, 111, 19);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: rgb(28, 131, 225);
}
.token.function,
.token.class-name {
color: rgb(28, 131, 225);
font-weight: 700;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
+137
View File
@@ -0,0 +1,137 @@
/**
* prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
* Based on https://github.com/chriskempson/tomorrow-theme
* @author Rose Pritchard
*/
code[class*="language-"],
pre[class*="language-"] {
color: #333;
/* 更改为深灰色,便于白色背景下的阅读 */
background: none;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
font-weight: 500;
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #ffffff;
/* 修改背景为白色 */
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.block-comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #6a737d;
/* 调整注释为更深的灰色,增加可读性 */
}
.token.punctuation {
color: #555;
/* 调整标点符号为更深的灰色 */
}
.token.tag,
.token.attr-name,
.token.namespace,
.token.deleted {
color: #e2777a;
/* 仍保留删除标签的红色 */
}
.token.function-name {
color: #3d5a80;
/* 修改函数名为蓝色系 */
}
.token.boolean,
.token.number,
.token.function {
color: #f08d49;
/* 保持橙色用于布尔值和数字 */
}
.token.property,
.token.class-name,
.token.constant,
.token.symbol {
color: #f8c555;
/* 修改为金黄色系,以便突出 */
}
.token.selector,
.token.important,
.token.atrule,
.token.keyword,
.token.builtin {
color: #6fa3f2;
/* 将关键词、选择器等修改为浅蓝色 */
}
.token.string,
.token.char,
.token.attr-value,
.token.regex,
.token.variable {
color: #7ec699;
/* 修改字符串为绿色 */
}
.token.operator,
.token.entity,
.token.url {
color: #67cdcc;
/* 将运算符和URL改为青绿色 */
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
.token.inserted {
color: #28a745;
/* 插入内容为绿色 */
}
+197
View File
@@ -0,0 +1,197 @@
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video,
textarea,
input {
margin: 0;
padding: 0;
border: 0;
}
/* HTML5 display-role reset for older browsers */
article,
aside,
details,
figcaption,
figure,
footer,
header,
menu,
nav,
section {
display: block;
}
body {
line-height: 1;
}
blockquote,
q {
quotes: none;
}
blockquote::before,
blockquote::after,
q::before,
q::after {
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
/* custom */
a {
color: #7e8c8d;
text-decoration: none;
backface-visibility: hidden;
}
li {
list-style: none;
}
::-webkit-scrollbar {
width: 5px;
height: 5px;
/* background-color: rgba(211, 208, 255, 0); */
opacity: 0;
}
:hover::-webkit-scrollbar {
opacity: 1;
}
::-webkit-scrollbar-track {
background-color: rgba(211, 208, 255, 0);
/* 滚动条轨道颜色 */
}
::-webkit-scrollbar-track-piece {
/* 滚动条背景色 */
background-color: rgba(211, 208, 255, 0);
border-radius: 6px;
}
::-webkit-scrollbar-thumb:vertical {
height: 5px;
/* 滚动条颜色 */
background-color: #E4E7FF;
/* background: linear-gradient( to bottom, #8D9AFF, #9D42FF); */
border-radius: 6px;
}
::-webkit-scrollbar-thumb:horizontal {
width: 5px;
background-color: #E4E7FF;
border-radius: 6px;
}
::-webkit-scrollbar-corner {
/* background-color: rgba(211, 208, 255, 0); */
/* color: rgba(211, 208, 255, 0); */
}
::-webkit-scrollbar-button {
/* background-color: rgba(211, 208, 255, 0); */
/* color: rgba(211, 208, 255, 0); */
}
html,
body {
width: 100%;
height: 100%;
}
body {
/* -webkit-user-select: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-touch-callout: none; */
}
* {
-webkit-text-size-adjust: none;
}