codebee 0.1.49 → 0.1.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +4 -150
- package/app/core/aiflavor.py +14 -0
- package/app/core/builtin_agent.py +450 -32
- package/app/core/knowledge.py +432 -405
- package/app/core/manager.py +76 -3
- package/app/core/modelhub.py +53 -5
- package/app/core/pipeline.py +158 -66
- package/app/core/preview.py +293 -0
- package/app/core/runner.py +336 -144
- package/app/core/settings.py +7 -1
- package/app/core/store.py +74 -2
- package/app/core/zentao.py +63 -13
- package/app/main.py +66 -1
- package/app/ui/app.js +397 -102
- package/app/ui/i18n.js +41 -30
- package/app/ui/index.html +45 -2
- package/app/ui/style.css +206 -26
- package/package.json +1 -1
package/app/ui/style.css
CHANGED
|
@@ -2250,7 +2250,8 @@ html.code-wrap #file-pop .fp-ln { white-space: pre-wrap; word-break: break-word;
|
|
|
2250
2250
|
.ld-cancel { background: var(--warn); opacity: .85; }
|
|
2251
2251
|
.ld-time { background: var(--accent2); }
|
|
2252
2252
|
|
|
2253
|
-
/*
|
|
2253
|
+
/* 主侧栏快捷导航:概览 / 运行记录 / 自动化 一级直达(样式对齐设置导航行,
|
|
2254
|
+
* 2026-09-15 参考稿布局;2026-09-22 起这三页只在此处挂入口,左栏任务树不动) */
|
|
2254
2255
|
.side-quick { display: flex; flex-direction: column; gap: 1px; margin: 4px 0 2px; }
|
|
2255
2256
|
.qitem {
|
|
2256
2257
|
display: flex; align-items: center; gap: 9px; text-align: left;
|
|
@@ -2941,6 +2942,37 @@ main.chat-fill #run-detail.chat-mode {
|
|
|
2941
2942
|
@media (prefers-reduced-motion: reduce) {
|
|
2942
2943
|
.chat-typing i { animation: none; opacity: .5; }
|
|
2943
2944
|
}
|
|
2945
|
+
/* 思考过程块(2026-09-22 用户诉求「把思考过程打印出来」):内置智能体流式抓的
|
|
2946
|
+
* 模型思维链。运行中=常开实时块(呼吸点+逐句长出);结束后=折叠摘要可回看。
|
|
2947
|
+
* 正文位等宽缩一号、弱化——它是「过程」,不能盖过下面的正式回答。 */
|
|
2948
|
+
.chat-think { max-width: 1000px; margin: 0 0 6px; border: 1px dashed var(--border-strong);
|
|
2949
|
+
border-radius: 10px; background: color-mix(in srgb, var(--muted) 7%, transparent);
|
|
2950
|
+
font-size: 12.5px; }
|
|
2951
|
+
.chat-think .ct-body { max-height: 240px; overflow: auto; padding: 7px 10px 8px;
|
|
2952
|
+
white-space: pre-wrap; word-break: break-word; line-height: 1.55; opacity: .82; }
|
|
2953
|
+
.chat-think .ct-head { display: flex; align-items: center; gap: 6px;
|
|
2954
|
+
padding: 6px 10px 4px; font-weight: 600; opacity: .85; }
|
|
2955
|
+
.chat-think .ct-len { font-weight: 400; opacity: .6; margin-left: 6px; font-size: 11px; }
|
|
2956
|
+
.chat-think .ct-live { font-weight: 400; font-size: 10.5px; padding: 0 6px;
|
|
2957
|
+
border-radius: 8px; border: 1px solid var(--border-strong); opacity: .7; }
|
|
2958
|
+
.chat-think .ct-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--accent);
|
|
2959
|
+
animation: ct-breathe 1.6s ease-in-out infinite; }
|
|
2960
|
+
.chat-think .ct-acts { padding: 0 10px 8px; opacity: .62; font-size: 11.5px;
|
|
2961
|
+
font-family: var(--mono); }
|
|
2962
|
+
.chat-think.live { cursor: default; }
|
|
2963
|
+
details.chat-think > summary { cursor: pointer; padding: 6px 10px; user-select: none;
|
|
2964
|
+
display: flex; align-items: center; font-weight: 600; opacity: .85; list-style: none; }
|
|
2965
|
+
details.chat-think > summary::-webkit-details-marker { display: none; }
|
|
2966
|
+
details.chat-think > summary::before { content: "▸"; margin-right: 6px; opacity: .6;
|
|
2967
|
+
transition: transform .12s; }
|
|
2968
|
+
details.chat-think[open] > summary::before { transform: rotate(90deg); }
|
|
2969
|
+
details.chat-think[open] > summary { border-bottom: 1px dashed var(--border-strong); }
|
|
2970
|
+
.chat-live-text { opacity: .75; }
|
|
2971
|
+
.chat-live-text::after { content: "▍"; opacity: .5; animation: ct-breathe 1.2s infinite; }
|
|
2972
|
+
@keyframes ct-breathe { 0%, 100% { opacity: .35; } 50% { opacity: 1; } }
|
|
2973
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2974
|
+
.chat-think .ct-dot, .chat-live-text::after { animation: none; opacity: .6; }
|
|
2975
|
+
}
|
|
2944
2976
|
/* 底部输入条:整块圆角卡片,+ 在左、发送在右(flex 列布局天然钉底) */
|
|
2945
2977
|
.rd-chat-bar { flex: none; max-width: 1000px; width: calc(100% - 24px); margin: 8px auto 8px;
|
|
2946
2978
|
border: 1px solid var(--border-strong); border-radius: 18px; background: var(--panel);
|
|
@@ -5530,45 +5562,59 @@ button.request-busy > * { opacity: .18; }
|
|
|
5530
5562
|
.zt-prof .head .zt-p-product {
|
|
5531
5563
|
width: min(360px, 100%); min-width: 180px; flex: 1 1 240px;
|
|
5532
5564
|
}
|
|
5565
|
+
/* 禅道自动化开关行:四个开关做成并列胶囊(选中态用强调色淡染,一眼看出开了哪些),
|
|
5566
|
+
扫描间隔靠右成组「标签 + 圆角输入框(内嵌单位)」。窄屏自动换行、间隔独占一行。
|
|
5567
|
+
(此前 grid 版与 flex 版叠了两层,后者已全量覆盖前者,此处合并成单块) */
|
|
5533
5568
|
.zt-auto-options {
|
|
5534
|
-
|
|
5535
|
-
gap: 12px
|
|
5536
|
-
}
|
|
5537
|
-
@media (min-width: 901px) {
|
|
5538
|
-
.zt-auto-options { grid-template-columns: repeat(5, minmax(0, 1fr)); }
|
|
5569
|
+
display: flex; flex-wrap: wrap; align-items: center;
|
|
5570
|
+
gap: 10px 12px; grid-template-columns: none; margin: 8px 0 4px;
|
|
5539
5571
|
}
|
|
5540
5572
|
.zt-auto-options > .toggle {
|
|
5541
|
-
|
|
5542
|
-
|
|
5543
|
-
|
|
5544
|
-
|
|
5545
|
-
color: var(--muted);
|
|
5546
|
-
|
|
5547
|
-
.zt-auto-options .zt-interval-field input {
|
|
5548
|
-
width: 100%; max-width: none; box-sizing: border-box;
|
|
5573
|
+
display: inline-flex; align-items: center; gap: 8px;
|
|
5574
|
+
min-height: 0; margin: 0; align-self: auto;
|
|
5575
|
+
padding: 7px 13px; border: 1px solid var(--border); border-radius: 999px;
|
|
5576
|
+
background: color-mix(in srgb, var(--panel2) 58%, transparent);
|
|
5577
|
+
font-size: 12.5px; color: var(--muted); cursor: pointer;
|
|
5578
|
+
transition: border-color .15s, background-color .15s, color .15s;
|
|
5549
5579
|
}
|
|
5550
|
-
|
|
5551
|
-
|
|
5552
|
-
.zt-auto-options .zt-interval-field { grid-column: 1 / -1; }
|
|
5553
|
-
.zt-prof .head .zt-p-product { min-width: 0; }
|
|
5580
|
+
.zt-auto-options > .toggle:hover {
|
|
5581
|
+
color: var(--text); border-color: var(--border-strong);
|
|
5554
5582
|
}
|
|
5555
|
-
|
|
5556
|
-
|
|
5557
|
-
|
|
5558
|
-
|
|
5559
|
-
|
|
5560
|
-
gap: 8px 22px; grid-template-columns: none;
|
|
5583
|
+
/* 选中:底色与描边都染强调色(:has 兼容 Edge/Chromium 本轮目标) */
|
|
5584
|
+
.zt-auto-options > .toggle:has(input:checked) {
|
|
5585
|
+
color: var(--text);
|
|
5586
|
+
border-color: color-mix(in srgb, var(--accent) 42%, var(--border));
|
|
5587
|
+
background: color-mix(in srgb, var(--accent) 10%, transparent);
|
|
5561
5588
|
}
|
|
5562
|
-
.zt-auto-options > .toggle {
|
|
5589
|
+
.zt-auto-options > .toggle input { accent-color: var(--accent); }
|
|
5563
5590
|
.zt-auto-options .zt-interval-field {
|
|
5564
5591
|
display: inline-flex; align-items: center; gap: 8px;
|
|
5565
5592
|
grid-template-columns: none; min-width: 0;
|
|
5566
5593
|
margin-left: auto; color: var(--muted); font-size: 12.5px;
|
|
5567
5594
|
}
|
|
5568
|
-
.zt-auto-options .zt-
|
|
5595
|
+
.zt-auto-options .zt-iv-box {
|
|
5596
|
+
display: inline-flex; align-items: center;
|
|
5597
|
+
border: 1px solid var(--border); border-radius: 999px;
|
|
5598
|
+
background: var(--panel2); transition: border-color .15s;
|
|
5599
|
+
}
|
|
5600
|
+
.zt-auto-options .zt-iv-box:hover { border-color: var(--border-strong); }
|
|
5601
|
+
.zt-auto-options .zt-iv-box:focus-within { border-color: var(--accent); }
|
|
5602
|
+
.zt-auto-options .zt-iv-box input {
|
|
5603
|
+
width: 58px; border: 0; background: transparent; border-radius: 999px;
|
|
5604
|
+
padding: 7px 2px 7px 10px; text-align: center; box-sizing: border-box;
|
|
5605
|
+
-moz-appearance: textfield; appearance: textfield;
|
|
5606
|
+
}
|
|
5607
|
+
.zt-auto-options .zt-iv-box input:focus { border-color: transparent; }
|
|
5608
|
+
.zt-auto-options .zt-iv-unit { font-size: 12px; padding-right: 11px; }
|
|
5569
5609
|
@media (max-width: 900px) {
|
|
5570
5610
|
.zt-auto-options .zt-interval-field { margin-left: 0; }
|
|
5571
5611
|
}
|
|
5612
|
+
@media (max-width: 640px) {
|
|
5613
|
+
.zt-prof .head .zt-p-product { min-width: 0; }
|
|
5614
|
+
.zt-auto-options .zt-interval-field { width: 100%; }
|
|
5615
|
+
.zt-auto-options .zt-iv-box { flex: 1; }
|
|
5616
|
+
.zt-auto-options .zt-iv-box input { width: 100%; }
|
|
5617
|
+
}
|
|
5572
5618
|
|
|
5573
5619
|
/* 蜜蜂坞微信直连:Python 扫描候选列表(样式对齐 bee-cfg 卡片内风格) */
|
|
5574
5620
|
.bee-py-cands {
|
|
@@ -5885,3 +5931,137 @@ button.request-busy > * { opacity: .18; }
|
|
|
5885
5931
|
.pb-vol { margin: 8px 0 12px; }
|
|
5886
5932
|
.pb-vol-head { font-size: 12.5px; color: var(--muted); padding: 2px 2px 6px;
|
|
5887
5933
|
border-bottom: 1px solid var(--border, rgba(128,128,128,.22)); margin-bottom: 6px; }
|
|
5934
|
+
|
|
5935
|
+
/* 快捷导航(概览/运行记录/自动化)选中项:图标转强调色,与设置导航 .set-item.active
|
|
5936
|
+
* 同一套视觉语言(选中底色由上面 .qitem.active 那条给)。 */
|
|
5937
|
+
.qitem.active .ico { color: var(--accent); }
|
|
5938
|
+
.qitem.active:hover { transform: none; } /* 选中项不再右移,免得停在一片"漂着"的条目上 */
|
|
5939
|
+
|
|
5940
|
+
/* ==========================================================================
|
|
5941
|
+
侧栏常驻:用量条 + 计数徽章(2026-09-22)
|
|
5942
|
+
配色走变量,7 套皮肤与日间/夜间自动成立。
|
|
5943
|
+
========================================================================== */
|
|
5944
|
+
|
|
5945
|
+
/* 用量条:贴在最近任务区与底部工具条之间。整条是按钮,点了去用量统计页。 */
|
|
5946
|
+
.side-usage {
|
|
5947
|
+
display: flex; flex-direction: column; gap: 5px; width: 100%; flex: none;
|
|
5948
|
+
text-align: left; background: none; border: none; cursor: pointer;
|
|
5949
|
+
color: var(--text); font-family: inherit;
|
|
5950
|
+
padding: 9px 10px; margin-top: 8px; border-radius: 10px;
|
|
5951
|
+
border-top: 1px solid var(--border);
|
|
5952
|
+
transition: background-color .15s;
|
|
5953
|
+
}
|
|
5954
|
+
.side-usage:hover { background: var(--panel2); }
|
|
5955
|
+
.su-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
|
|
5956
|
+
.su-label { color: var(--muted); font-size: 11px; letter-spacing: .04em; flex: none; }
|
|
5957
|
+
.su-cost {
|
|
5958
|
+
flex: none; font-size: 12px; font-weight: 600; color: var(--accent);
|
|
5959
|
+
font-family: var(--mono); white-space: nowrap;
|
|
5960
|
+
}
|
|
5961
|
+
.su-mid { display: flex; align-items: flex-end; justify-content: space-between; gap: 8px; }
|
|
5962
|
+
.su-tok {
|
|
5963
|
+
min-width: 0; flex: 1 1 auto; font-size: 11.5px; color: var(--muted);
|
|
5964
|
+
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
5965
|
+
}
|
|
5966
|
+
.su-spark { flex: none; width: 56px; height: 20px; }
|
|
5967
|
+
.su-spark .kspark { display: block; width: 100%; height: 100%; overflow: visible; }
|
|
5968
|
+
.su-spark .ks-line { fill: none; stroke: var(--accent); stroke-width: 1.6;
|
|
5969
|
+
stroke-linejoin: round; stroke-linecap: round; }
|
|
5970
|
+
.su-spark .ks-area { stroke: none; fill: var(--accent); opacity: .16; }
|
|
5971
|
+
|
|
5972
|
+
/* 计数徽章:导航项右侧的灰底数字胶囊;0 时整块收起(不留空位) */
|
|
5973
|
+
.nav-badge {
|
|
5974
|
+
flex: none; margin-left: auto; min-width: 17px; height: 17px; padding: 0 5px;
|
|
5975
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
5976
|
+
border-radius: 999px; background: var(--accent); color: #fff;
|
|
5977
|
+
font-size: 10.5px; font-weight: 700; line-height: 1;
|
|
5978
|
+
font-family: var(--mono);
|
|
5979
|
+
}
|
|
5980
|
+
/* 快捷导航项是 flex 容器,徽章靠 margin-left:auto 贴右缘 */
|
|
5981
|
+
.qitem .nav-badge { margin-left: auto; }
|
|
5982
|
+
|
|
5983
|
+
|
|
5984
|
+
/* ---------------- 网页成品预览(借鉴对话式编程产品的预览窗) ----------------
|
|
5985
|
+
* 左「运行」x 右代码文件:与详情页签同构的一层子页签 + 一块填满高度的面板。
|
|
5986
|
+
* 面板吃满 .rd-pane 高度(独立滚动),iframe 白底——生成的页面多为浅色,
|
|
5987
|
+
* 深色皮肤下也不该透出暗底把内容染脏。 */
|
|
5988
|
+
.rd-preview { display: flex; flex-direction: column; gap: 10px; min-height: 420px; }
|
|
5989
|
+
.pv-head { display: flex; align-items: center; gap: 6px; flex-wrap: nowrap; }
|
|
5990
|
+
.pv-spacer { flex: 1 1 auto; }
|
|
5991
|
+
/* 子页签条:横向可滚,页签名是文件名(可很长),靠截断保条不换行 */
|
|
5992
|
+
.pv-tabs { display: flex; align-items: center; gap: 2px; min-width: 0;
|
|
5993
|
+
overflow-x: auto; scrollbar-width: none; flex: 0 1 auto; }
|
|
5994
|
+
.pv-tabs::-webkit-scrollbar { display: none; }
|
|
5995
|
+
.pv-tab {
|
|
5996
|
+
flex: none; max-width: 190px; background: none; border: 1px solid transparent;
|
|
5997
|
+
cursor: pointer; font: inherit; font-size: 12.5px; color: var(--muted);
|
|
5998
|
+
padding: 5px 11px; border-radius: 8px; white-space: nowrap;
|
|
5999
|
+
overflow: hidden; text-overflow: ellipsis; transition: color .15s, background-color .15s, border-color .15s;
|
|
6000
|
+
}
|
|
6001
|
+
.pv-tab:hover { color: var(--text); background: var(--panel2); }
|
|
6002
|
+
.pv-tab.on { color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, transparent);
|
|
6003
|
+
border-color: color-mix(in srgb, var(--accent) 34%, transparent); font-weight: 600; }
|
|
6004
|
+
.pv-head .ghost.small { flex: none; display: inline-flex; align-items: center; gap: 5px;
|
|
6005
|
+
font-size: 12.5px; text-decoration: none; }
|
|
6006
|
+
.pv-head .ghost.small .ico { width: 14px; height: 14px; }
|
|
6007
|
+
.pv-body { flex: 1 1 auto; min-height: 380px; display: flex; flex-direction: column;
|
|
6008
|
+
border: 1px solid var(--border); border-radius: 12px; overflow: hidden;
|
|
6009
|
+
background: var(--panel); }
|
|
6010
|
+
/* iframe 白底:生成的页面几乎都是浅色设计,透出深色皮肤反而更像坏了 */
|
|
6011
|
+
.pv-frame { flex: 1 1 auto; width: 100%; min-height: 380px; border: none; background: #fff; }
|
|
6012
|
+
.pv-code { flex: 1 1 auto; min-height: 0; display: flex; overflow: auto; padding: 4px 2px 8px; }
|
|
6013
|
+
.pv-code .fp-vp { flex: 1 1 auto; min-width: 0; }
|
|
6014
|
+
.pv-hint { display: flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--muted); }
|
|
6015
|
+
.pv-wd { font-family: var(--mono); cursor: pointer; overflow: hidden;
|
|
6016
|
+
text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
6017
|
+
/* 窄屏:页签条横行滚动,刷新/新窗口按钮保持可见(不折行挤掉页签) */
|
|
6018
|
+
@media (max-width: 760px) {
|
|
6019
|
+
.pv-tab { max-width: 118px; padding: 5px 9px; }
|
|
6020
|
+
.pv-head .ghost.small span { display: none; }
|
|
6021
|
+
.rd-preview { min-height: 340px; }
|
|
6022
|
+
.pv-body, .pv-frame { min-height: 300px; }
|
|
6023
|
+
}
|
|
6024
|
+
|
|
6025
|
+
/* ==========================================================================
|
|
6026
|
+
顶栏面包屑 + 运行记录行升级(2026-09-22)
|
|
6027
|
+
========================================================================== */
|
|
6028
|
+
|
|
6029
|
+
/* ---------- 面包屑:组名 / 页名(组名独立元素,page-title 本体保持纯页名) ---------- */
|
|
6030
|
+
.page-title-wrap { display: flex; align-items: center; gap: 7px; min-width: 0; }
|
|
6031
|
+
.crumb-root {
|
|
6032
|
+
flex: none; color: var(--muted); font-size: 12.5px; font-weight: 500;
|
|
6033
|
+
white-space: nowrap;
|
|
6034
|
+
}
|
|
6035
|
+
.crumb-root::after { content: "/"; margin-left: 7px; color: var(--muted); opacity: .55; }
|
|
6036
|
+
|
|
6037
|
+
/* ---------- 运行记录行:状态字形 + 主副标题竖排 + 右侧状态/相对时间 ----------
|
|
6038
|
+
* 只作用于 #run-list:通用 .item 样式被弹框列表共用,不能跟着动。 */
|
|
6039
|
+
#run-list .item { padding: 9px 10px; }
|
|
6040
|
+
#run-list .item .t { align-items: center; }
|
|
6041
|
+
#run-list .item .rglyph {
|
|
6042
|
+
flex: none; width: 14px; display: inline-flex;
|
|
6043
|
+
align-items: center; justify-content: center;
|
|
6044
|
+
}
|
|
6045
|
+
/* 主副标题块:吃掉富余宽度,两行各自省略号收尾 */
|
|
6046
|
+
#run-list .item .rt {
|
|
6047
|
+
flex: 1 1 auto; min-width: 0;
|
|
6048
|
+
display: flex; flex-direction: column; gap: 3px;
|
|
6049
|
+
}
|
|
6050
|
+
#run-list .item .rt .name {
|
|
6051
|
+
flex: none; font-weight: 600; font-size: 13px;
|
|
6052
|
+
display: flex; align-items: center; gap: 6px; min-width: 0;
|
|
6053
|
+
}
|
|
6054
|
+
#run-list .item .rt .name > :first-child {
|
|
6055
|
+
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
6056
|
+
}
|
|
6057
|
+
#run-list .item .rt .desc {
|
|
6058
|
+
margin: 0; font-size: 11.5px; color: var(--muted);
|
|
6059
|
+
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
6060
|
+
}
|
|
6061
|
+
#run-list .item .time { min-width: 48px; text-align: right; }
|
|
6062
|
+
@media (max-width: 900px) {
|
|
6063
|
+
/* 窄屏放不下双列:摘要躲进悬停,行回到单行 */
|
|
6064
|
+
#run-list .item .rt .desc { display: none; }
|
|
6065
|
+
#run-list .item .rt { gap: 0; }
|
|
6066
|
+
}
|
|
6067
|
+
|
package/package.json
CHANGED