codebee 0.1.7 → 0.1.9
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 +20 -0
- package/README.md +236 -252
- package/app/core/catalog.py +24 -5
- package/app/core/errorlog.py +179 -0
- package/app/core/flows.py +6 -2
- package/app/core/gitmod.py +45 -1
- package/app/core/health.py +48 -11
- package/app/core/jobs.py +104 -9
- package/app/core/manager.py +21 -0
- package/app/core/modelhub.py +80 -11
- package/app/core/paths.py +1 -0
- package/app/core/pipeline.py +420 -88
- package/app/core/runner.py +122 -10
- package/app/core/settings.py +9 -2
- package/app/core/step_runner.py +28 -4
- package/app/core/store.py +180 -139
- package/app/core/telemetry.py +291 -0
- package/app/core/token_meter.py +18 -0
- package/app/main.py +162 -16
- package/app/pick_dialog.py +78 -0
- package/app/ui/app.js +1012 -604
- package/app/ui/i18n.js +79 -6
- package/app/ui/index.html +161 -80
- package/app/ui/style.css +838 -67
- package/package.json +1 -1
package/app/ui/style.css
CHANGED
|
@@ -2068,6 +2068,16 @@ html[data-theme="light"] .seg-btn.active { box-shadow: 0 1px 3px rgba(0, 0, 0, .
|
|
|
2068
2068
|
.ti-check { flex: none; width: 15px; height: 15px; color: var(--accent); visibility: hidden; }
|
|
2069
2069
|
.type-item.on { background: var(--panel2); }
|
|
2070
2070
|
.type-item.on .ti-check { visibility: visible; }
|
|
2071
|
+
/* 菜单底部固定入口(管理任务类型…):sticky 钉在滚动区底部,不随选项滚走 */
|
|
2072
|
+
.type-menu-foot {
|
|
2073
|
+
position: sticky; bottom: -5px;
|
|
2074
|
+
margin: 4px -5px -5px; padding: 3px 5px 4px;
|
|
2075
|
+
background: var(--panel); border-top: 1px solid var(--border);
|
|
2076
|
+
}
|
|
2077
|
+
.type-menu-foot .type-item { min-height: 30px; color: var(--muted); }
|
|
2078
|
+
.type-menu-foot .type-item:hover { color: var(--text); }
|
|
2079
|
+
.type-menu-foot .ti-ico .ico { width: 15px; height: 15px; }
|
|
2080
|
+
.type-menu-foot .ti-name { font-weight: 550; font-size: 12px; }
|
|
2071
2081
|
@media (max-width: 720px) {
|
|
2072
2082
|
/* iOS Safari 聚焦输入控件 ≥16px 才不自动放大页面 */
|
|
2073
2083
|
.type-pick { font-size: 16px; }
|
|
@@ -3363,9 +3373,8 @@ body::before {
|
|
|
3363
3373
|
#mainwrap { background: transparent; }
|
|
3364
3374
|
.topbar {
|
|
3365
3375
|
min-height: 64px; padding: 12px 24px;
|
|
3366
|
-
background:
|
|
3376
|
+
background: var(--bg);
|
|
3367
3377
|
border-bottom: 1px solid var(--border);
|
|
3368
|
-
backdrop-filter: blur(18px);
|
|
3369
3378
|
position: sticky; top: 0; z-index: 10;
|
|
3370
3379
|
}
|
|
3371
3380
|
.page-title { font-family: var(--font-display); font-size: 16px; letter-spacing: .02em; }
|
|
@@ -4024,8 +4033,21 @@ body.inspector-open #run-detail #rd-log.rd-logdrawer {
|
|
|
4024
4033
|
新建任务像一个工作台入口:只突出上下文、目标和发送动作,
|
|
4025
4034
|
详细参数继续留在「更多选项」里,不让配置表单抢走第一视线。
|
|
4026
4035
|
================================================================ */
|
|
4036
|
+
/* 首页高度不再自算视口(旧 min-height: calc(100vh - 64px) 与 main 自身上下
|
|
4037
|
+
内边距相加恒定溢出 → 页面永远多出一条滚动条)。改为 main 挂 flex 把内容区
|
|
4038
|
+
原样让给子页,composer 在其中垂直居中;内容超高(矮窗口)时 flex 不压缩,
|
|
4039
|
+
main 照常滚动,其它子页不受影响。 */
|
|
4040
|
+
main:has(> #page-settings > #sub-tasks:not(.hidden)) {
|
|
4041
|
+
display: flex;
|
|
4042
|
+
flex-direction: column;
|
|
4043
|
+
padding-bottom: 36px;
|
|
4044
|
+
}
|
|
4045
|
+
main:has(> #page-settings > #sub-tasks:not(.hidden)) > #page-settings { flex: 1 0 auto; }
|
|
4046
|
+
/* 运行记录/详情子页:详情面板定高一屏(顶距 92 + 底距 28 与其 height 公式对齐),
|
|
4047
|
+
底部内边距收紧——否则文档高出一截,窗口滚动条又会回来 */
|
|
4048
|
+
main:has(> #page-settings > #sub-runs:not(.hidden)) { padding-bottom: 28px; }
|
|
4027
4049
|
#sub-tasks {
|
|
4028
|
-
|
|
4050
|
+
flex: 1 0 auto;
|
|
4029
4051
|
display: flex;
|
|
4030
4052
|
align-items: center;
|
|
4031
4053
|
justify-content: center;
|
|
@@ -4042,87 +4064,112 @@ body.inspector-open #run-detail #rd-log.rd-logdrawer {
|
|
|
4042
4064
|
justify-content: center;
|
|
4043
4065
|
text-align: center;
|
|
4044
4066
|
position: relative;
|
|
4067
|
+
margin-bottom: 16px;
|
|
4045
4068
|
}
|
|
4069
|
+
/* 问候语克制:一行轻量招呼即可,不抢输入框的第一视线 */
|
|
4046
4070
|
#sub-tasks .hero {
|
|
4047
|
-
font-size:
|
|
4048
|
-
font-weight:
|
|
4049
|
-
letter-spacing: -.
|
|
4071
|
+
font-size: 20px;
|
|
4072
|
+
font-weight: 550;
|
|
4073
|
+
letter-spacing: -.01em;
|
|
4050
4074
|
}
|
|
4051
|
-
#sub-tasks .hero-sub {
|
|
4052
|
-
max-width: 560px;
|
|
4053
|
-
margin: 8px auto 25px;
|
|
4054
|
-
text-align: center;
|
|
4055
|
-
font-size: 12.5px;
|
|
4056
|
-
color: var(--muted);
|
|
4057
|
-
}
|
|
4058
|
-
#sub-tasks #btn-wizard {
|
|
4059
|
-
position: absolute;
|
|
4060
|
-
right: 0;
|
|
4061
|
-
top: 1px;
|
|
4062
|
-
opacity: .7;
|
|
4063
|
-
}
|
|
4064
|
-
#sub-tasks #btn-wizard:hover { opacity: 1; }
|
|
4065
4075
|
#sub-tasks .form { gap: 10px; }
|
|
4076
|
+
/* 工作目录=框内首行上下文(.cmp-pills 已移入 .cmp-box);
|
|
4077
|
+
git 仓库场景下分支选择以小胶囊挂同一条上下文条(#row-git 移入) */
|
|
4066
4078
|
#sub-tasks .cmp-pills {
|
|
4067
4079
|
display: flex;
|
|
4068
4080
|
align-items: center;
|
|
4081
|
+
flex-wrap: wrap;
|
|
4082
|
+
gap: 2px 8px;
|
|
4069
4083
|
width: 100%;
|
|
4070
|
-
min-height:
|
|
4084
|
+
min-height: 0;
|
|
4071
4085
|
margin: 0;
|
|
4072
|
-
padding:
|
|
4086
|
+
padding: 6px 12px;
|
|
4073
4087
|
border-bottom: 1px solid var(--border);
|
|
4074
4088
|
}
|
|
4075
|
-
#sub-tasks .cmp-wd {
|
|
4076
|
-
|
|
4077
|
-
|
|
4089
|
+
#sub-tasks .cmp-pills .cmp-wd {
|
|
4090
|
+
flex: 1 1 200px;
|
|
4091
|
+
display: flex;
|
|
4092
|
+
align-items: center;
|
|
4093
|
+
gap: 6px;
|
|
4094
|
+
width: auto;
|
|
4095
|
+
min-width: 0;
|
|
4096
|
+
min-height: 28px;
|
|
4078
4097
|
padding: 0;
|
|
4079
4098
|
border: 0;
|
|
4080
|
-
background: transparent;
|
|
4081
4099
|
border-radius: 0;
|
|
4100
|
+
background: transparent;
|
|
4082
4101
|
}
|
|
4083
|
-
#sub-tasks .cmp-wd > .ico { width: 14px; height: 14px; color: var(--muted); }
|
|
4102
|
+
#sub-tasks .cmp-wd > .ico { flex: none; width: 14px; height: 14px; color: var(--muted); }
|
|
4103
|
+
#sub-tasks .cmp-wd .input-row { display: flex; align-items: center; gap: 4px; flex: 1; min-width: 0; }
|
|
4084
4104
|
#sub-tasks .cmp-wd input {
|
|
4105
|
+
flex: 1;
|
|
4106
|
+
min-width: 0;
|
|
4085
4107
|
min-height: 28px;
|
|
4086
|
-
padding: 3px
|
|
4108
|
+
padding: 3px 2px;
|
|
4087
4109
|
background: transparent;
|
|
4110
|
+
border: 0;
|
|
4111
|
+
box-shadow: none;
|
|
4088
4112
|
color: var(--text);
|
|
4089
4113
|
font-size: 12px;
|
|
4114
|
+
text-overflow: ellipsis;
|
|
4090
4115
|
}
|
|
4091
4116
|
#sub-tasks .cmp-wd input::placeholder { color: var(--muted); }
|
|
4092
4117
|
#sub-tasks .cmp-wd .ghost.small {
|
|
4093
|
-
|
|
4118
|
+
flex: none;
|
|
4119
|
+
min-height: 24px;
|
|
4120
|
+
padding: 2px 7px;
|
|
4094
4121
|
border: 0;
|
|
4095
4122
|
background: transparent;
|
|
4096
4123
|
color: var(--muted);
|
|
4124
|
+
font-size: 11px;
|
|
4097
4125
|
}
|
|
4098
4126
|
#sub-tasks .cmp-wd .ghost.small:hover { color: var(--accent); background: var(--panel2); }
|
|
4099
|
-
|
|
4127
|
+
/* 分支胶囊:替换原整块「代码版本」表单;详情(当前分支/脏区/检出说明)走悬停 title */
|
|
4128
|
+
#sub-tasks #row-git {
|
|
4129
|
+
display: flex;
|
|
4130
|
+
align-items: center;
|
|
4131
|
+
flex: none;
|
|
4132
|
+
max-width: 46%;
|
|
4133
|
+
min-width: 0;
|
|
4134
|
+
margin: 0;
|
|
4135
|
+
padding: 0;
|
|
4136
|
+
border: 0;
|
|
4137
|
+
background: transparent;
|
|
4138
|
+
}
|
|
4139
|
+
#sub-tasks #row-git label { display: none; }
|
|
4140
|
+
#sub-tasks #row-git .hint { display: none; }
|
|
4141
|
+
#sub-tasks #f-git-rev {
|
|
4142
|
+
width: auto;
|
|
4143
|
+
max-width: 230px;
|
|
4144
|
+
min-height: 26px;
|
|
4145
|
+
padding: 2px 8px;
|
|
4146
|
+
border: 0;
|
|
4147
|
+
border-radius: 999px;
|
|
4148
|
+
background: var(--panel2);
|
|
4149
|
+
color: var(--text);
|
|
4150
|
+
font-size: 11.5px;
|
|
4151
|
+
text-overflow: ellipsis;
|
|
4152
|
+
}
|
|
4153
|
+
#sub-tasks .cmp-hint { margin: 5px 4px 0; font-size: 11px; text-align: left; }
|
|
4100
4154
|
#sub-tasks .cmp-box {
|
|
4101
4155
|
width: 100%;
|
|
4102
4156
|
margin-top: 0;
|
|
4103
4157
|
padding: 0 12px 9px;
|
|
4104
4158
|
border: 1px solid color-mix(in srgb, var(--border-strong) 72%, transparent);
|
|
4105
|
-
border-radius:
|
|
4159
|
+
border-radius: 16px;
|
|
4106
4160
|
background: color-mix(in srgb, var(--panel) 94%, transparent);
|
|
4107
|
-
box-shadow:
|
|
4161
|
+
box-shadow: none;
|
|
4108
4162
|
}
|
|
4109
4163
|
#sub-tasks .cmp-box:focus-within {
|
|
4110
4164
|
border-color: color-mix(in srgb, var(--accent) 68%, var(--border-strong));
|
|
4111
|
-
box-shadow: 0
|
|
4112
|
-
}
|
|
4113
|
-
#sub-tasks .cmp-context-note {
|
|
4114
|
-
display: flex;
|
|
4115
|
-
align-items: center;
|
|
4116
|
-
gap: 6px;
|
|
4117
|
-
min-height: 32px;
|
|
4118
|
-
padding: 7px 4px 0;
|
|
4119
|
-
color: var(--muted);
|
|
4120
|
-
font-size: 11px;
|
|
4165
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 9%, transparent);
|
|
4121
4166
|
}
|
|
4122
|
-
|
|
4167
|
+
/* 极简收敛:这行说明与顶部 hero 副标重复(同一句「自动拆解并执行」),
|
|
4168
|
+
元素保留在 DOM(i18n/锚点兼容),仅不再占一行视觉噪音。 */
|
|
4169
|
+
#sub-tasks .cmp-context-note { display: none; }
|
|
4123
4170
|
#sub-tasks .cmp-box textarea {
|
|
4124
4171
|
min-height: 112px;
|
|
4125
|
-
padding:
|
|
4172
|
+
padding: 14px 4px 12px;
|
|
4126
4173
|
font-size: 15px;
|
|
4127
4174
|
line-height: 1.65;
|
|
4128
4175
|
background: transparent;
|
|
@@ -4146,16 +4193,7 @@ body.inspector-open #run-detail #rd-log.rd-logdrawer {
|
|
|
4146
4193
|
font-size: 11.5px;
|
|
4147
4194
|
}
|
|
4148
4195
|
#sub-tasks .cmp-mode .type-pick:hover { background: color-mix(in srgb, var(--accent) 10%, var(--panel2)); }
|
|
4149
|
-
#sub-tasks .cmp-mode #btn-flows-mgr {
|
|
4150
|
-
min-height: 29px;
|
|
4151
|
-
padding: 4px 7px;
|
|
4152
|
-
border: 0;
|
|
4153
|
-
color: var(--muted);
|
|
4154
|
-
font-size: 11px;
|
|
4155
|
-
}
|
|
4156
|
-
#sub-tasks .cmp-mode #btn-flows-mgr:hover { color: var(--accent); background: var(--panel2); }
|
|
4157
4196
|
#sub-tasks .cmp-bar .att-strip { min-width: 0; flex: 1; margin: 0; }
|
|
4158
|
-
#sub-tasks .cmp-bar .att-strip .att-hint { font-size: 11px; color: var(--muted); }
|
|
4159
4197
|
#sub-tasks .cmp-bar .att-strip > .ghost.small {
|
|
4160
4198
|
min-height: 28px;
|
|
4161
4199
|
padding: 4px 8px;
|
|
@@ -4170,11 +4208,9 @@ body.inspector-open #run-detail #rd-log.rd-logdrawer {
|
|
|
4170
4208
|
height: 31px;
|
|
4171
4209
|
box-shadow: none;
|
|
4172
4210
|
}
|
|
4173
|
-
|
|
4174
|
-
|
|
4175
|
-
|
|
4176
|
-
margin: 13px 0 0;
|
|
4177
|
-
}
|
|
4211
|
+
/* 类型只留底部工具栏一个入口(胶囊+下拉菜单):下方快捷 chips 与其内容重复,
|
|
4212
|
+
不再展示;DOM 保留(测试做存在性计数,display:none 不影响)。 */
|
|
4213
|
+
#sub-tasks .cmp-quick { display: none; }
|
|
4178
4214
|
#sub-tasks .cmp-chip {
|
|
4179
4215
|
min-height: 28px;
|
|
4180
4216
|
padding: 4px 10px;
|
|
@@ -4257,18 +4293,17 @@ body.inspector-open #run-detail #rd-log.rd-logdrawer {
|
|
|
4257
4293
|
.rd-overview-actions { display: flex; justify-content: flex-end; gap: 6px; grid-column: 1 / -1; }
|
|
4258
4294
|
.rd-overview-actions button { padding: 5px 9px; font-size: 11.5px; }
|
|
4259
4295
|
|
|
4260
|
-
/*
|
|
4261
|
-
#run-detail.chat-mode #rd-overview { display:
|
|
4296
|
+
/* 直连详情把概览放进右上角信息面板;主区仍然只留对话。 */
|
|
4297
|
+
#run-detail.chat-mode .rd-meta-popover #rd-overview:not(.hidden) { display: grid !important; }
|
|
4262
4298
|
|
|
4263
|
-
/*
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
#run-detail.chat-mode #rd-log.rd-logdrawer pre { max-height: min(23vh, 220px); }
|
|
4299
|
+
/* 日志已停靠右栏卡片下方(见「详情页侧边栏重构」段),不再盖住对话区,
|
|
4300
|
+
旧的 chat-mode 悬浮定位与聊天区让位 padding 全部退役(chat-log-open
|
|
4301
|
+
类仍由 JS 维护,留作状态标记)。 */
|
|
4267
4302
|
|
|
4268
4303
|
@media (max-width: 760px) {
|
|
4269
|
-
|
|
4270
|
-
#sub-tasks
|
|
4271
|
-
#sub-tasks
|
|
4304
|
+
/* 高度交给 main→#page-settings→#sub-tasks 的 flex 链(见上方说明),不再自算 100vh */
|
|
4305
|
+
#sub-tasks { align-items: flex-start; }
|
|
4306
|
+
#sub-tasks .composer { margin-top: 6vh; padding-inline: 8px; }
|
|
4272
4307
|
#sub-tasks .hero-row { align-items: center; }
|
|
4273
4308
|
#sub-tasks .cmp-context-note { font-size: 10.5px; }
|
|
4274
4309
|
#sub-tasks .cmp-bar { flex-wrap: wrap; }
|
|
@@ -4278,3 +4313,739 @@ body.inspector-open #run-detail #rd-log.rd-logdrawer {
|
|
|
4278
4313
|
#run-detail .rd-overview { grid-template-columns: minmax(0, 1fr) auto; padding-inline: 12px; }
|
|
4279
4314
|
.rd-overview-title, .rd-overview-goal { white-space: normal; }
|
|
4280
4315
|
}
|
|
4316
|
+
|
|
4317
|
+
/* ================= 按需任务信息 + 新建任务图片附件 =================
|
|
4318
|
+
详情首屏只保留标题、状态和主要操作;运行次数、步骤、成本、tokens、
|
|
4319
|
+
错误与进度概览由右上角「···」按需展开,避免信息条把蜂巢/对话推远。 */
|
|
4320
|
+
#run-detail .detail-head { position: relative; }
|
|
4321
|
+
#run-detail .rd-more-toggle {
|
|
4322
|
+
flex: none; width: 30px; height: 30px; padding: 0; border: 0;
|
|
4323
|
+
border-radius: 8px; background: transparent; color: var(--muted);
|
|
4324
|
+
font: 700 18px/1 var(--font-body); letter-spacing: 2px; cursor: pointer;
|
|
4325
|
+
transition: background-color .15s, color .15s;
|
|
4326
|
+
}
|
|
4327
|
+
#run-detail .rd-more-toggle:hover,
|
|
4328
|
+
#run-detail .rd-more-toggle:focus-visible,
|
|
4329
|
+
#run-detail.rd-info-open .rd-more-toggle {
|
|
4330
|
+
color: var(--text); background: var(--panel2); outline: none;
|
|
4331
|
+
}
|
|
4332
|
+
#run-detail .rd-meta-popover {
|
|
4333
|
+
position: absolute; z-index: 30; top: calc(100% - 4px); right: 0;
|
|
4334
|
+
width: min(470px, calc(100vw - 42px)); box-sizing: border-box;
|
|
4335
|
+
padding: 12px 14px 14px; border: 1px solid var(--border-strong);
|
|
4336
|
+
border-radius: 14px; background: var(--panel);
|
|
4337
|
+
box-shadow: 0 16px 42px color-mix(in srgb, #000 26%, transparent);
|
|
4338
|
+
}
|
|
4339
|
+
#run-detail .rd-meta-popover.hidden { display: none !important; }
|
|
4340
|
+
.rd-meta-popover-head {
|
|
4341
|
+
display: flex; align-items: center; justify-content: space-between; gap: 10px;
|
|
4342
|
+
min-height: 25px; color: var(--text); font-size: 12px; font-weight: 650;
|
|
4343
|
+
}
|
|
4344
|
+
.rd-meta-popover-head button {
|
|
4345
|
+
width: 24px; height: 24px; padding: 0; border: 0; border-radius: 6px;
|
|
4346
|
+
color: var(--muted); background: transparent; font-size: 18px; line-height: 1;
|
|
4347
|
+
}
|
|
4348
|
+
.rd-meta-popover-head button:hover,
|
|
4349
|
+
.rd-meta-popover-head button:focus-visible { color: var(--text); background: var(--panel2); outline: none; }
|
|
4350
|
+
#run-detail .rd-meta-popover .rd-meta-strip {
|
|
4351
|
+
display: flex; align-items: center; gap: 6px 12px; margin: 8px 0 0;
|
|
4352
|
+
padding: 0 0 10px; border-bottom: 1px solid var(--border);
|
|
4353
|
+
}
|
|
4354
|
+
#run-detail .rd-meta-popover .rd-meta-strip .stat {
|
|
4355
|
+
min-height: 0; padding: 0; border: 0; border-radius: 0;
|
|
4356
|
+
background: transparent; font-size: 11.5px;
|
|
4357
|
+
}
|
|
4358
|
+
#run-detail .rd-meta-popover .rd-meta-strip .stat.err {
|
|
4359
|
+
flex-basis: 100%; max-width: 100%; padding-top: 6px;
|
|
4360
|
+
border-top: 1px solid var(--border); color: var(--bad);
|
|
4361
|
+
white-space: normal; overflow: visible; text-overflow: clip;
|
|
4362
|
+
}
|
|
4363
|
+
#run-detail .rd-meta-popover #rd-overview {
|
|
4364
|
+
grid-template-columns: minmax(0, 1fr) auto; gap: 9px 16px;
|
|
4365
|
+
margin: 10px 0 0; padding: 0; border: 0; background: transparent;
|
|
4366
|
+
}
|
|
4367
|
+
#run-detail .rd-meta-popover #rd-overview .rd-overview-kicker { display: none; }
|
|
4368
|
+
#run-detail .rd-meta-popover #rd-overview .rd-overview-title {
|
|
4369
|
+
font-size: 13px; line-height: 1.35;
|
|
4370
|
+
}
|
|
4371
|
+
#run-detail .rd-meta-popover #rd-overview .rd-overview-goal {
|
|
4372
|
+
margin-top: 3px; font-size: 11px; white-space: normal;
|
|
4373
|
+
}
|
|
4374
|
+
#run-detail .rd-meta-popover #rd-overview .rd-overview-state { min-width: 82px; }
|
|
4375
|
+
#run-detail .rd-meta-popover #rd-overview .rd-overview-state .state-value { font-size: 17px; }
|
|
4376
|
+
#run-detail .rd-meta-popover #rd-overview .rd-overview-facts { gap: 4px 12px; font-size: 11px; }
|
|
4377
|
+
#run-detail .rd-meta-popover #rd-overview .rd-overview-last {
|
|
4378
|
+
padding-top: 7px; font-size: 11px; border-top-color: var(--border);
|
|
4379
|
+
}
|
|
4380
|
+
#run-detail .rd-meta-popover #rd-overview .rd-overview-actions { justify-content: flex-start; }
|
|
4381
|
+
#run-detail .rd-meta-popover #rd-overview .rd-overview-actions button { padding: 4px 8px; font-size: 11px; }
|
|
4382
|
+
|
|
4383
|
+
/* 新建任务附件:图片有稳定的预览尺寸,普通文件继续使用轻量胶囊。 */
|
|
4384
|
+
#sub-tasks #att-chips {
|
|
4385
|
+
display: flex; align-items: flex-start; flex-wrap: wrap; gap: 8px;
|
|
4386
|
+
min-height: 0; margin: 3px 4px 0;
|
|
4387
|
+
}
|
|
4388
|
+
#sub-tasks #att-chips:empty { display: none; }
|
|
4389
|
+
#sub-tasks .att-chip.att-image {
|
|
4390
|
+
position: relative; width: 88px; height: 88px; max-width: none; padding: 0;
|
|
4391
|
+
overflow: visible; border-radius: 12px; background: var(--panel2);
|
|
4392
|
+
border-color: var(--border); box-shadow: 0 2px 10px color-mix(in srgb, #000 10%, transparent);
|
|
4393
|
+
}
|
|
4394
|
+
#sub-tasks .att-chip.att-image img {
|
|
4395
|
+
display: block; width: 100%; height: 100%; object-fit: cover;
|
|
4396
|
+
border-radius: inherit; background: var(--panel2);
|
|
4397
|
+
}
|
|
4398
|
+
#sub-tasks .att-chip.att-image .att-image-name {
|
|
4399
|
+
position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
|
|
4400
|
+
overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
|
|
4401
|
+
}
|
|
4402
|
+
#sub-tasks .att-chip.att-image .ax {
|
|
4403
|
+
position: absolute; z-index: 2; top: -6px; right: -6px;
|
|
4404
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
4405
|
+
width: 20px; height: 20px; padding: 0; border: 1px solid var(--panel);
|
|
4406
|
+
border-radius: 50%; background: var(--text); color: var(--panel);
|
|
4407
|
+
box-shadow: 0 2px 6px color-mix(in srgb, #000 18%, transparent);
|
|
4408
|
+
}
|
|
4409
|
+
#sub-tasks .att-chip.att-image .ax .ico { width: 11px; height: 11px; }
|
|
4410
|
+
#sub-tasks .att-chip.att-image .ax:hover,
|
|
4411
|
+
#sub-tasks .att-chip.att-image .ax:focus-visible { background: var(--bad); color: #fff; outline: none; }
|
|
4412
|
+
#sub-tasks .cmp-box > .att-chips + textarea { padding-top: 8px; }
|
|
4413
|
+
|
|
4414
|
+
@media (max-width: 700px) {
|
|
4415
|
+
#run-detail .rd-meta-popover {
|
|
4416
|
+
left: 8px; right: 8px; width: auto; top: calc(100% + 2px);
|
|
4417
|
+
}
|
|
4418
|
+
#run-detail .rd-meta-popover #rd-overview { grid-template-columns: minmax(0, 1fr) auto; }
|
|
4419
|
+
#sub-tasks .att-chip.att-image { width: 82px; height: 82px; }
|
|
4420
|
+
}
|
|
4421
|
+
|
|
4422
|
+
/* ================= 详情页侧边栏重构 =================
|
|
4423
|
+
右栏只有一张卡(#rd-rail):任务信息(返回/标题/状态/操作)在上,
|
|
4424
|
+
分区导航在下,中间发丝线分隔;主区只呈现当前工作内容。操作按钮
|
|
4425
|
+
统一等宽两列小尺寸,靠颜色区分主次,不再长短不一。 */
|
|
4426
|
+
#run-detail {
|
|
4427
|
+
display: grid;
|
|
4428
|
+
grid-template-columns: minmax(0, 1fr) clamp(260px, 23vw, 324px);
|
|
4429
|
+
grid-template-areas: "main rail";
|
|
4430
|
+
column-gap: clamp(22px, 3vw, 44px);
|
|
4431
|
+
align-items: stretch;
|
|
4432
|
+
/* 工作台定高:面板钉满一屏(顶距 92 = topbar 64 + main 上边距 28;底 28 呼吸),
|
|
4433
|
+
蜂巢/步骤等长内容在主区内滚——窗口级滚动条从详情页彻底退役 */
|
|
4434
|
+
height: calc(100vh - 120px);
|
|
4435
|
+
min-height: 460px;
|
|
4436
|
+
padding: 0 0 20px;
|
|
4437
|
+
}
|
|
4438
|
+
#rd-railcol {
|
|
4439
|
+
grid-area: rail;
|
|
4440
|
+
position: sticky;
|
|
4441
|
+
top: 16px;
|
|
4442
|
+
z-index: 8;
|
|
4443
|
+
display: flex;
|
|
4444
|
+
flex-direction: column;
|
|
4445
|
+
gap: 12px;
|
|
4446
|
+
min-width: 0;
|
|
4447
|
+
max-height: calc(100vh - 110px); /* 列最高一屏:内容少就缩回去,页面不滚进空白;
|
|
4448
|
+
减 110 = 未吸顶时的自然顶距(topbar 64 + main 上内边距 28) + 底部呼吸 16px */
|
|
4449
|
+
overflow: hidden; /* 超出部分在列内裁掉/内部滚动,不再撑出页面滚动条 */
|
|
4450
|
+
}
|
|
4451
|
+
#rd-rail {
|
|
4452
|
+
flex: 0 0 auto; /* 卡片=紧凑导航:永不缩、永不滚(内部滚动条是「到处滚动条」的元凶);
|
|
4453
|
+
列内空间不够时只让日志框收缩 */
|
|
4454
|
+
min-height: 0;
|
|
4455
|
+
overflow: hidden; /* 内容 1px 超宽也不冒横向滚动条;••• 弹层自带内滚 */
|
|
4456
|
+
padding: 14px 16px 12px;
|
|
4457
|
+
border: 1px solid var(--border);
|
|
4458
|
+
border-radius: 16px;
|
|
4459
|
+
background: color-mix(in srgb, var(--panel) 92%, transparent);
|
|
4460
|
+
}
|
|
4461
|
+
#rd-rail > .detail-head {
|
|
4462
|
+
position: relative;
|
|
4463
|
+
display: flex;
|
|
4464
|
+
min-width: 0;
|
|
4465
|
+
min-height: 0;
|
|
4466
|
+
flex-direction: column;
|
|
4467
|
+
align-items: stretch;
|
|
4468
|
+
gap: 8px;
|
|
4469
|
+
margin: 0;
|
|
4470
|
+
padding: 0;
|
|
4471
|
+
border: 0;
|
|
4472
|
+
background: transparent;
|
|
4473
|
+
}
|
|
4474
|
+
#rd-rail > .detail-head::before {
|
|
4475
|
+
content: "TASK DETAIL";
|
|
4476
|
+
display: block;
|
|
4477
|
+
margin-bottom: -2px;
|
|
4478
|
+
color: var(--muted);
|
|
4479
|
+
font: 600 10px/1 var(--mono);
|
|
4480
|
+
letter-spacing: .14em;
|
|
4481
|
+
}
|
|
4482
|
+
#rd-rail > .detail-head > #btn-back {
|
|
4483
|
+
order: 0;
|
|
4484
|
+
align-self: flex-start;
|
|
4485
|
+
min-height: 24px;
|
|
4486
|
+
padding: 2px 7px;
|
|
4487
|
+
border: 0;
|
|
4488
|
+
color: var(--muted);
|
|
4489
|
+
background: transparent;
|
|
4490
|
+
}
|
|
4491
|
+
#rd-rail > .detail-head > #btn-back:hover { color: var(--text); background: var(--panel2); }
|
|
4492
|
+
#rd-rail > .detail-head > #rd-title {
|
|
4493
|
+
order: 1;
|
|
4494
|
+
width: calc(100% - 26px);
|
|
4495
|
+
margin: 0;
|
|
4496
|
+
color: var(--text);
|
|
4497
|
+
font-size: 16px;
|
|
4498
|
+
line-height: 1.35;
|
|
4499
|
+
overflow-wrap: anywhere;
|
|
4500
|
+
}
|
|
4501
|
+
#rd-rail > .detail-head > #rd-status {
|
|
4502
|
+
order: 2;
|
|
4503
|
+
align-self: flex-start;
|
|
4504
|
+
}
|
|
4505
|
+
/* 操作按钮:全部等宽两列小尺寸;主操作只靠颜色区分,不再跨列 */
|
|
4506
|
+
#rd-rail > .detail-head > .rd-actions {
|
|
4507
|
+
order: 3;
|
|
4508
|
+
display: grid;
|
|
4509
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
4510
|
+
align-items: stretch;
|
|
4511
|
+
justify-content: stretch;
|
|
4512
|
+
gap: 6px;
|
|
4513
|
+
width: 100%;
|
|
4514
|
+
padding-top: 10px;
|
|
4515
|
+
border-top: 1px solid var(--border);
|
|
4516
|
+
}
|
|
4517
|
+
#rd-rail > .detail-head > .rd-actions button {
|
|
4518
|
+
min-width: 0;
|
|
4519
|
+
min-height: 27px;
|
|
4520
|
+
overflow: hidden;
|
|
4521
|
+
text-overflow: ellipsis;
|
|
4522
|
+
white-space: nowrap;
|
|
4523
|
+
padding: 3px 6px;
|
|
4524
|
+
border-radius: 8px;
|
|
4525
|
+
font-size: 11.5px;
|
|
4526
|
+
}
|
|
4527
|
+
#rd-rail > .detail-head > .rd-actions #rd-more-toggle {
|
|
4528
|
+
position: absolute;
|
|
4529
|
+
top: 12px;
|
|
4530
|
+
right: 0;
|
|
4531
|
+
width: 26px;
|
|
4532
|
+
min-height: 26px;
|
|
4533
|
+
padding: 0;
|
|
4534
|
+
}
|
|
4535
|
+
#rd-rail > .detail-head > .rd-meta-popover {
|
|
4536
|
+
position: static;
|
|
4537
|
+
order: 5;
|
|
4538
|
+
width: 100%;
|
|
4539
|
+
margin: 0;
|
|
4540
|
+
padding: 10px;
|
|
4541
|
+
border-radius: 10px;
|
|
4542
|
+
box-shadow: none;
|
|
4543
|
+
background: color-mix(in srgb, var(--panel2) 62%, transparent);
|
|
4544
|
+
max-height: min(44vh, 400px); /* 展开很长也不顶高卡片:弹层自己内滚 */
|
|
4545
|
+
overflow-y: auto;
|
|
4546
|
+
}
|
|
4547
|
+
#rd-rail > #rd-tabs,
|
|
4548
|
+
#rd-rail > #rd-chat-nav {
|
|
4549
|
+
min-width: 0;
|
|
4550
|
+
margin: 12px 0 0;
|
|
4551
|
+
padding: 10px 0 0;
|
|
4552
|
+
border: 0;
|
|
4553
|
+
border-top: 1px solid var(--border);
|
|
4554
|
+
border-radius: 0;
|
|
4555
|
+
background: transparent;
|
|
4556
|
+
box-shadow: none;
|
|
4557
|
+
}
|
|
4558
|
+
#rd-rail > #rd-tabs {
|
|
4559
|
+
display: flex;
|
|
4560
|
+
flex-direction: column;
|
|
4561
|
+
align-items: stretch;
|
|
4562
|
+
gap: 2px;
|
|
4563
|
+
overflow: visible;
|
|
4564
|
+
}
|
|
4565
|
+
#rd-rail > #rd-tabs .rd-tab {
|
|
4566
|
+
width: 100%;
|
|
4567
|
+
min-height: 30px;
|
|
4568
|
+
justify-content: flex-start;
|
|
4569
|
+
padding: 5px 8px;
|
|
4570
|
+
border-radius: 8px;
|
|
4571
|
+
text-align: left;
|
|
4572
|
+
font-size: 12px;
|
|
4573
|
+
}
|
|
4574
|
+
#rd-rail > #rd-tabs .rd-tab.active {
|
|
4575
|
+
background: color-mix(in srgb, var(--accent) 10%, transparent);
|
|
4576
|
+
border-color: color-mix(in srgb, var(--accent) 24%, var(--border));
|
|
4577
|
+
}
|
|
4578
|
+
#rd-rail > #rd-tabs .rd-tab.active::after {
|
|
4579
|
+
top: 6px;
|
|
4580
|
+
right: 4px;
|
|
4581
|
+
bottom: 6px;
|
|
4582
|
+
left: auto;
|
|
4583
|
+
width: 3px;
|
|
4584
|
+
height: auto;
|
|
4585
|
+
border-radius: 3px;
|
|
4586
|
+
}
|
|
4587
|
+
#rd-rail > #rd-tabs .rd-badge { margin-left: auto; }
|
|
4588
|
+
#rd-rail > #rd-chat-nav {
|
|
4589
|
+
display: flex;
|
|
4590
|
+
flex-direction: column;
|
|
4591
|
+
align-items: stretch;
|
|
4592
|
+
gap: 2px;
|
|
4593
|
+
}
|
|
4594
|
+
#rd-rail > #rd-chat-nav.hidden { display: none; }
|
|
4595
|
+
#rd-rail > #rd-chat-nav .cn-pills {
|
|
4596
|
+
display: flex;
|
|
4597
|
+
flex-direction: column;
|
|
4598
|
+
align-items: stretch;
|
|
4599
|
+
gap: 2px;
|
|
4600
|
+
margin: 0;
|
|
4601
|
+
}
|
|
4602
|
+
#rd-rail > #rd-chat-nav .cn-pill {
|
|
4603
|
+
width: 100%;
|
|
4604
|
+
justify-content: space-between;
|
|
4605
|
+
min-height: 30px;
|
|
4606
|
+
padding: 5px 8px;
|
|
4607
|
+
border: 0;
|
|
4608
|
+
border-radius: 8px;
|
|
4609
|
+
text-align: left;
|
|
4610
|
+
font-size: 12px;
|
|
4611
|
+
}
|
|
4612
|
+
#rd-rail > #rd-chat-nav .cn-pill:hover,
|
|
4613
|
+
#rd-rail > #rd-chat-nav .cn-pill.on { background: color-mix(in srgb, var(--accent) 10%, transparent); }
|
|
4614
|
+
#rd-rail > #rd-chat-nav .cn-back {
|
|
4615
|
+
width: 100%;
|
|
4616
|
+
justify-content: flex-start;
|
|
4617
|
+
min-height: 28px;
|
|
4618
|
+
padding: 4px 8px;
|
|
4619
|
+
border: 0;
|
|
4620
|
+
border-radius: 8px;
|
|
4621
|
+
background: transparent;
|
|
4622
|
+
font-size: 12px;
|
|
4623
|
+
}
|
|
4624
|
+
#run-detail > .rd-main {
|
|
4625
|
+
grid-area: main;
|
|
4626
|
+
align-self: stretch;
|
|
4627
|
+
min-width: 0;
|
|
4628
|
+
min-height: 0;
|
|
4629
|
+
position: relative;
|
|
4630
|
+
padding-top: 2px;
|
|
4631
|
+
overflow-y: auto; /* 长内容(蜂巢泳道/步骤列表/报告)在主区内滚 */
|
|
4632
|
+
scrollbar-width: thin;
|
|
4633
|
+
overscroll-behavior: contain;
|
|
4634
|
+
}
|
|
4635
|
+
#run-detail > .rd-main::-webkit-scrollbar { width: 8px; }
|
|
4636
|
+
#run-detail > .rd-main > .rd-pane { min-width: 0; }
|
|
4637
|
+
/* 日志控制台停靠右栏卡片下方(窄侧栏):不再横向盖住主区内容。
|
|
4638
|
+
position: static 让旧的 fixed/left/right 底部悬浮层全部失效。 */
|
|
4639
|
+
#run-detail #rd-log.rd-logdrawer {
|
|
4640
|
+
position: static;
|
|
4641
|
+
display: flex;
|
|
4642
|
+
flex-direction: column;
|
|
4643
|
+
flex: 0 1 40vh; /* 默认视口 40% 高(拖拽后为期望 px);空间不足自动收缩,永不顶出窗口 */
|
|
4644
|
+
min-height: 140px;
|
|
4645
|
+
max-height: none; /* 了断历史各层 max-height(42vh/30vh/32vh…),高度只听这里 */
|
|
4646
|
+
width: auto;
|
|
4647
|
+
margin: 0;
|
|
4648
|
+
padding: 0;
|
|
4649
|
+
border: 1px solid var(--border);
|
|
4650
|
+
border-top: 1px solid color-mix(in srgb, var(--accent) 30%, var(--border));
|
|
4651
|
+
border-radius: 14px;
|
|
4652
|
+
background: color-mix(in srgb, var(--panel) 96%, transparent);
|
|
4653
|
+
box-shadow: none;
|
|
4654
|
+
backdrop-filter: none;
|
|
4655
|
+
overflow: hidden;
|
|
4656
|
+
}
|
|
4657
|
+
#run-detail #rd-log.rd-logdrawer.hidden { display: none; }
|
|
4658
|
+
/* 顶边拖拽手柄:上拖变高、下拖变矮;双击复位为默认弹性高度 */
|
|
4659
|
+
.rd-log-grip {
|
|
4660
|
+
flex: none;
|
|
4661
|
+
height: 10px;
|
|
4662
|
+
display: flex;
|
|
4663
|
+
align-items: center;
|
|
4664
|
+
justify-content: center;
|
|
4665
|
+
cursor: ns-resize;
|
|
4666
|
+
touch-action: none;
|
|
4667
|
+
}
|
|
4668
|
+
.rd-log-grip::before {
|
|
4669
|
+
content: "";
|
|
4670
|
+
width: 44px;
|
|
4671
|
+
height: 4px;
|
|
4672
|
+
border-radius: 999px;
|
|
4673
|
+
background: color-mix(in srgb, var(--text) 16%, transparent);
|
|
4674
|
+
transition: background .15s;
|
|
4675
|
+
}
|
|
4676
|
+
.rd-log-grip:hover::before,
|
|
4677
|
+
.rd-log-grip:focus-visible::before { background: color-mix(in srgb, var(--accent) 60%, transparent); }
|
|
4678
|
+
body.rd-log-resizing { cursor: ns-resize; user-select: none; }
|
|
4679
|
+
#run-detail #rd-log.rd-logdrawer .log-live-bar {
|
|
4680
|
+
flex: none;
|
|
4681
|
+
flex-wrap: nowrap; /* 窄栏也单行排布,不再把「已结束」折成竖排 */
|
|
4682
|
+
min-height: 30px;
|
|
4683
|
+
padding: 4px 8px;
|
|
4684
|
+
gap: 6px;
|
|
4685
|
+
font-size: 11px;
|
|
4686
|
+
}
|
|
4687
|
+
#run-detail #rd-log.rd-logdrawer .log-live-bar > .ico { flex: none; }
|
|
4688
|
+
#run-detail #rd-log.rd-logdrawer .rd-log-step {
|
|
4689
|
+
flex: 0 1 auto;
|
|
4690
|
+
min-width: 0;
|
|
4691
|
+
overflow: hidden;
|
|
4692
|
+
text-overflow: ellipsis;
|
|
4693
|
+
white-space: nowrap;
|
|
4694
|
+
}
|
|
4695
|
+
#run-detail #rd-log.rd-logdrawer .log-live,
|
|
4696
|
+
#run-detail #rd-log.rd-logdrawer .log-at { flex: none; white-space: nowrap; }
|
|
4697
|
+
#run-detail #rd-log.rd-logdrawer .log-live-bar .hint { display: none; }
|
|
4698
|
+
#run-detail #rd-log.rd-logdrawer pre {
|
|
4699
|
+
flex: 1 1 auto;
|
|
4700
|
+
min-height: 0;
|
|
4701
|
+
max-height: none;
|
|
4702
|
+
margin: 0;
|
|
4703
|
+
padding: 8px 10px 10px;
|
|
4704
|
+
font-size: 11.5px;
|
|
4705
|
+
overflow: hidden auto; /* 长行已自动换行,横向滚动条永不出现 */
|
|
4706
|
+
scrollbar-width: thin;
|
|
4707
|
+
}
|
|
4708
|
+
#run-detail #rd-log.rd-logdrawer pre::-webkit-scrollbar { width: 8px; height: 0; }
|
|
4709
|
+
/* 递话面板(人工干预):运行中=入箱随下一步送达;已结束=自动断点续跑 */
|
|
4710
|
+
.rd-talk {
|
|
4711
|
+
order: 4; /* 排在操作按钮(order 3)之后;信息弹层顺延为 5 */
|
|
4712
|
+
display: flex;
|
|
4713
|
+
flex-direction: column;
|
|
4714
|
+
gap: 6px;
|
|
4715
|
+
width: 100%; /* 弹性列里显式占满,防内容把面板撑出卡片 */
|
|
4716
|
+
min-width: 0;
|
|
4717
|
+
max-width: 100%;
|
|
4718
|
+
box-sizing: border-box;
|
|
4719
|
+
margin-top: 10px;
|
|
4720
|
+
padding-top: 10px;
|
|
4721
|
+
border-top: 1px solid var(--border);
|
|
4722
|
+
}
|
|
4723
|
+
.rd-talk.hidden { display: none; }
|
|
4724
|
+
.rd-talk textarea {
|
|
4725
|
+
width: 100%;
|
|
4726
|
+
min-width: 0;
|
|
4727
|
+
box-sizing: border-box;
|
|
4728
|
+
flex: none; /* 面板内不被压缩成一条缝 */
|
|
4729
|
+
resize: vertical;
|
|
4730
|
+
height: 72px;
|
|
4731
|
+
min-height: 72px;
|
|
4732
|
+
font-size: 12px;
|
|
4733
|
+
line-height: 1.55;
|
|
4734
|
+
}
|
|
4735
|
+
.rd-talk-atts { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
|
|
4736
|
+
.rd-talk-atts:empty { display: none; }
|
|
4737
|
+
.rd-talk-bar { display: flex; align-items: center; gap: 8px; }
|
|
4738
|
+
.rd-talk-bar .hint { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 10.5px; }
|
|
4739
|
+
.rd-talk-bar .primary.small { min-height: 26px; padding: 3px 12px; font-size: 11.5px; flex: none; }
|
|
4740
|
+
/* 直连任务保持「对话先行」,但侧栏仍然承载标题、状态和其它入口。 */
|
|
4741
|
+
main.chat-fill #run-detail.chat-mode {
|
|
4742
|
+
display: grid;
|
|
4743
|
+
grid-template-columns: minmax(0, 1fr) clamp(260px, 23vw, 324px);
|
|
4744
|
+
grid-template-areas: "main rail";
|
|
4745
|
+
height: 100%;
|
|
4746
|
+
overflow: hidden;
|
|
4747
|
+
}
|
|
4748
|
+
main.chat-fill #run-detail.chat-mode > .rd-main { overflow: hidden; }
|
|
4749
|
+
|
|
4750
|
+
@media (max-width: 980px) {
|
|
4751
|
+
#run-detail,
|
|
4752
|
+
main.chat-fill #run-detail.chat-mode {
|
|
4753
|
+
display: flex;
|
|
4754
|
+
flex-direction: column;
|
|
4755
|
+
height: auto;
|
|
4756
|
+
max-height: none;
|
|
4757
|
+
overflow: visible;
|
|
4758
|
+
padding-bottom: 22px;
|
|
4759
|
+
}
|
|
4760
|
+
#rd-railcol {
|
|
4761
|
+
position: relative;
|
|
4762
|
+
top: auto;
|
|
4763
|
+
width: 100%;
|
|
4764
|
+
height: auto;
|
|
4765
|
+
max-height: none;
|
|
4766
|
+
margin-bottom: 12px;
|
|
4767
|
+
}
|
|
4768
|
+
#run-detail > .rd-main {
|
|
4769
|
+
width: 100%;
|
|
4770
|
+
overflow: visible;
|
|
4771
|
+
}
|
|
4772
|
+
main.chat-fill #run-detail.chat-mode > .rd-main { overflow: hidden; }
|
|
4773
|
+
}
|
|
4774
|
+
|
|
4775
|
+
@media (max-width: 560px) {
|
|
4776
|
+
#rd-rail { padding: 12px 13px 10px; border-radius: 12px; }
|
|
4777
|
+
#rd-rail > .detail-head > #rd-title { font-size: 15px; }
|
|
4778
|
+
#rd-rail > .detail-head > .rd-actions #rd-more-toggle { top: 10px; right: 0; }
|
|
4779
|
+
}
|
|
4780
|
+
|
|
4781
|
+
/* 已结束直连任务的续聊提示:只占一行,输入框仍是唯一主操作。 */
|
|
4782
|
+
.rd-chat-continue-note {
|
|
4783
|
+
display: flex; align-items: center; gap: 7px; min-height: 24px;
|
|
4784
|
+
padding: 0 6px 2px; color: var(--muted); font-size: 11.5px;
|
|
4785
|
+
}
|
|
4786
|
+
.rd-chat-continue-note.hidden { display: none !important; }
|
|
4787
|
+
.rd-chat-continue-note .continue-dot {
|
|
4788
|
+
width: 6px; height: 6px; flex: none; border-radius: 50%;
|
|
4789
|
+
background: var(--ok); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok) 12%, transparent);
|
|
4790
|
+
}
|
|
4791
|
+
.rd-chat-continue-note .ghost.small {
|
|
4792
|
+
margin-left: auto; padding: 3px 8px; border: 0; font-size: 11px;
|
|
4793
|
+
color: var(--accent); background: transparent;
|
|
4794
|
+
}
|
|
4795
|
+
.rd-chat-continue-note .ghost.small:hover { background: var(--panel2); }
|
|
4796
|
+
.rd-chat-tools .rd-hint {
|
|
4797
|
+
flex: 1; min-width: 120px; overflow: hidden; color: var(--muted);
|
|
4798
|
+
font-size: 10.5px; text-overflow: ellipsis; white-space: nowrap;
|
|
4799
|
+
}
|
|
4800
|
+
|
|
4801
|
+
/* 蜂巢过程行:保留阶段泳道和状态色,把每个智能体从「卡片」收敛为可扫描的行。
|
|
4802
|
+
点击区域仍覆盖整行,CLI 日志入口不变;这样蜂巢更接近 Codex 的留白和信息密度。 */
|
|
4803
|
+
#rd-hive-cells .lane-cells {
|
|
4804
|
+
grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
|
|
4805
|
+
gap: 0 18px;
|
|
4806
|
+
}
|
|
4807
|
+
#rd-hive-cells .hive-cell {
|
|
4808
|
+
min-height: 68px; padding: 9px 4px 9px 12px;
|
|
4809
|
+
border: 0; border-top: 1px solid var(--border); border-radius: 0;
|
|
4810
|
+
background: transparent; box-shadow: none;
|
|
4811
|
+
}
|
|
4812
|
+
#rd-hive-cells .hive-cell::before {
|
|
4813
|
+
top: 10px; bottom: 10px; left: 0; right: auto; width: 2px; height: auto;
|
|
4814
|
+
border-radius: 999px; background: var(--border-strong); opacity: .72;
|
|
4815
|
+
}
|
|
4816
|
+
#rd-hive-cells .hive-cell.st-done::before { background: var(--ok); }
|
|
4817
|
+
#rd-hive-cells .hive-cell.st-failed::before { background: var(--bad); }
|
|
4818
|
+
#rd-hive-cells .hive-cell.st-timeout::before { background: var(--accent2); }
|
|
4819
|
+
#rd-hive-cells .hive-cell.st-cancelled::before { background: var(--warn); }
|
|
4820
|
+
#rd-hive-cells .hive-cell.st-running {
|
|
4821
|
+
border-color: var(--border); background: color-mix(in srgb, var(--accent) 3%, transparent);
|
|
4822
|
+
}
|
|
4823
|
+
#rd-hive-cells .hive-cell:hover,
|
|
4824
|
+
#rd-hive-cells .hive-cell:focus-visible {
|
|
4825
|
+
transform: none; background: color-mix(in srgb, var(--accent) 6%, transparent);
|
|
4826
|
+
box-shadow: none; outline-offset: -2px;
|
|
4827
|
+
}
|
|
4828
|
+
#rd-hive-cells .hc-tail { background: transparent; padding: 2px 0 0; }
|
|
4829
|
+
#rd-hive-cells .hc-meta { margin-top: 5px; }
|
|
4830
|
+
|
|
4831
|
+
/* 直连对话「建议追问」芯片(借鉴 freebuff suggest_followups):挂在助手气泡尾部,
|
|
4832
|
+
* 点击回填输入框不直接发送,用户可改后再发 */
|
|
4833
|
+
.chat-fups { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
|
|
4834
|
+
.chat-fup-btn {
|
|
4835
|
+
border: 1px solid var(--border, #ccc); background: transparent; color: inherit;
|
|
4836
|
+
border-radius: 999px; padding: 4px 12px; font-size: 12.5px; cursor: pointer; opacity: .85;
|
|
4837
|
+
}
|
|
4838
|
+
.chat-fup-btn:hover { border-color: var(--accent, #888); color: var(--accent, inherit); opacity: 1; }
|
|
4839
|
+
|
|
4840
|
+
/* ============ 工作目录「最近文件夹」下拉(参考工作区选择器:默认选中 + ▾ 菜单) ============ */
|
|
4841
|
+
#sub-tasks .cmp-pills { position: relative; }
|
|
4842
|
+
#sub-tasks .wd-menu-btn {
|
|
4843
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
4844
|
+
flex: none; width: 22px; min-height: 24px; padding: 0; border: 0; border-radius: 6px;
|
|
4845
|
+
background: transparent; color: var(--muted);
|
|
4846
|
+
}
|
|
4847
|
+
#sub-tasks .wd-menu-btn:hover,
|
|
4848
|
+
#sub-tasks .wd-menu-btn:focus-visible { color: var(--text); background: var(--panel2); outline: none; }
|
|
4849
|
+
#sub-tasks .wd-menu-btn .ico { width: 12px; height: 12px; }
|
|
4850
|
+
#sub-tasks .wd-menu {
|
|
4851
|
+
position: absolute; z-index: 40; top: calc(100% + 6px); left: 8px;
|
|
4852
|
+
width: min(300px, calc(100vw - 48px)); box-sizing: border-box;
|
|
4853
|
+
padding: 5px; border: 1px solid var(--border-strong); border-radius: 12px;
|
|
4854
|
+
background: var(--panel);
|
|
4855
|
+
box-shadow: 0 14px 38px color-mix(in srgb, #000 22%, transparent);
|
|
4856
|
+
}
|
|
4857
|
+
#sub-tasks .wd-menu.hidden { display: none !important; }
|
|
4858
|
+
.wd-item {
|
|
4859
|
+
display: flex; align-items: center; gap: 8px; width: 100%;
|
|
4860
|
+
min-height: 32px; padding: 5px 9px; border: 0; border-radius: 8px;
|
|
4861
|
+
background: transparent; color: var(--text); font-size: 12.5px;
|
|
4862
|
+
text-align: left; cursor: pointer; font-family: inherit;
|
|
4863
|
+
}
|
|
4864
|
+
.wd-item:hover, .wd-item:focus-visible { background: var(--panel2); outline: none; }
|
|
4865
|
+
.wd-item .ico { flex: none; width: 14px; height: 14px; color: var(--muted); }
|
|
4866
|
+
.wd-item span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
4867
|
+
.wd-item.on { color: var(--accent); font-weight: 600; }
|
|
4868
|
+
.wd-item.on .ico { color: var(--accent); }
|
|
4869
|
+
.wd-item .wd-check { width: 13px; height: 13px; color: var(--accent); }
|
|
4870
|
+
.wd-item:disabled { opacity: .45; cursor: default; }
|
|
4871
|
+
.wd-item:disabled:hover { background: transparent; }
|
|
4872
|
+
.wd-sep { height: 1px; margin: 4px 6px; background: var(--border); }
|
|
4873
|
+
|
|
4874
|
+
/* ============ 分支胶囊:右停靠 + 「分支名 ▾」(点开原生下拉可换分支/标签/提交) ============ */
|
|
4875
|
+
#sub-tasks #row-git { margin-left: auto; }
|
|
4876
|
+
#sub-tasks #f-git-rev {
|
|
4877
|
+
appearance: none; -webkit-appearance: none;
|
|
4878
|
+
cursor: pointer; padding-right: 26px;
|
|
4879
|
+
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%23888a8f' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
|
|
4880
|
+
background-repeat: no-repeat;
|
|
4881
|
+
background-position: right 9px center;
|
|
4882
|
+
}
|
|
4883
|
+
#sub-tasks #f-git-rev:focus { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent); }
|
|
4884
|
+
|
|
4885
|
+
/* ============ 上下文条精修:首屏只读「路径 ←→ 分支」,操作键悬停/聚焦现身 ============ */
|
|
4886
|
+
/* 路径区作为一整块芯片:悬停或聚焦时给软底,操作键随之浮现 */
|
|
4887
|
+
#sub-tasks .cmp-pills .cmp-wd {
|
|
4888
|
+
min-height: 30px;
|
|
4889
|
+
padding: 0 4px 0 6px;
|
|
4890
|
+
border-radius: 10px;
|
|
4891
|
+
transition: background-color .15s;
|
|
4892
|
+
}
|
|
4893
|
+
#sub-tasks .cmp-pills .cmp-wd:hover,
|
|
4894
|
+
#sub-tasks .cmp-pills .cmp-wd:focus-within {
|
|
4895
|
+
background: color-mix(in srgb, var(--panel2) 62%, transparent);
|
|
4896
|
+
}
|
|
4897
|
+
/* 「选择…」默认隐去(功能在 ▾ 菜单和点击输入框里都有);触屏设备与键盘聚焦不隐藏 */
|
|
4898
|
+
#sub-tasks .cmp-wd .wd-pick-btn {
|
|
4899
|
+
opacity: 0;
|
|
4900
|
+
pointer-events: none;
|
|
4901
|
+
transition: opacity .15s;
|
|
4902
|
+
}
|
|
4903
|
+
#sub-tasks .cmp-wd:hover .wd-pick-btn,
|
|
4904
|
+
#sub-tasks .cmp-wd:focus-within .wd-pick-btn {
|
|
4905
|
+
opacity: 1;
|
|
4906
|
+
pointer-events: auto;
|
|
4907
|
+
}
|
|
4908
|
+
@media (hover: none) {
|
|
4909
|
+
#sub-tasks .cmp-wd .wd-pick-btn { opacity: 1; pointer-events: auto; }
|
|
4910
|
+
}
|
|
4911
|
+
/* 分支胶囊收紧:小一号、弱底色、悬停亮边 */
|
|
4912
|
+
#sub-tasks #f-git-rev {
|
|
4913
|
+
min-height: 24px;
|
|
4914
|
+
padding: 1px 24px 1px 10px;
|
|
4915
|
+
font-size: 11px;
|
|
4916
|
+
border: 1px solid transparent;
|
|
4917
|
+
border-radius: 999px;
|
|
4918
|
+
background-color: color-mix(in srgb, var(--panel2) 58%, transparent);
|
|
4919
|
+
transition: border-color .15s, background-color .15s;
|
|
4920
|
+
}
|
|
4921
|
+
#sub-tasks #f-git-rev:hover {
|
|
4922
|
+
border-color: color-mix(in srgb, var(--border-strong) 80%, transparent);
|
|
4923
|
+
background-color: var(--panel2);
|
|
4924
|
+
}
|
|
4925
|
+
|
|
4926
|
+
/* ---------------------------------------------------------- 手工添加模型行
|
|
4927
|
+
* 厂商列表接口调不通时的通路:填模型名直接进列表(后端打 manual 标记防刷新清掉)。 */
|
|
4928
|
+
.pm-add { display: flex; align-items: center; gap: 8px; margin: 0 0 8px; }
|
|
4929
|
+
.pm-add input[type="text"] { flex: 1; max-width: 460px; }
|
|
4930
|
+
.pm-add button { flex: none; }
|
|
4931
|
+
|
|
4932
|
+
/* ============ 「更多选项」面板精修:轻卡片 + 紧凑字段,向 composer 的克制看齐 ============ */
|
|
4933
|
+
#sub-tasks details#f-advanced .adv-body {
|
|
4934
|
+
gap: 10px;
|
|
4935
|
+
margin-top: 10px;
|
|
4936
|
+
padding: 12px 14px 14px;
|
|
4937
|
+
border: 1px solid var(--border);
|
|
4938
|
+
border-radius: 12px;
|
|
4939
|
+
background: color-mix(in srgb, var(--panel) 72%, transparent);
|
|
4940
|
+
}
|
|
4941
|
+
#sub-tasks details#f-advanced .field > label {
|
|
4942
|
+
min-height: 0;
|
|
4943
|
+
gap: 5px;
|
|
4944
|
+
font-size: 11px;
|
|
4945
|
+
font-weight: 550;
|
|
4946
|
+
color: var(--muted);
|
|
4947
|
+
}
|
|
4948
|
+
#sub-tasks details#f-advanced .field input,
|
|
4949
|
+
#sub-tasks details#f-advanced .field select,
|
|
4950
|
+
#sub-tasks details#f-advanced .field textarea {
|
|
4951
|
+
min-height: 0;
|
|
4952
|
+
padding: 6px 10px;
|
|
4953
|
+
font-size: 12.5px;
|
|
4954
|
+
line-height: 1.5;
|
|
4955
|
+
border-radius: 9px;
|
|
4956
|
+
background: color-mix(in srgb, var(--panel2) 45%, var(--panel));
|
|
4957
|
+
}
|
|
4958
|
+
#sub-tasks details#f-advanced .field textarea { min-height: 56px; }
|
|
4959
|
+
#sub-tasks details#f-advanced .grid-2,
|
|
4960
|
+
#sub-tasks details#f-advanced .grid-3 { gap: 10px 12px; }
|
|
4961
|
+
|
|
4962
|
+
/* 手工添加行并入 pm-tools 单行:过滤靠左、计数随后、添加靠右(同排等高)。
|
|
4963
|
+
* 不换行:面板窄时输入框收缩(min-width 兜底),换行会重现两行错排。
|
|
4964
|
+
* 字号钉死同档(12.5px):search/text 两种输入框继承链不同会渲染出大小差。 */
|
|
4965
|
+
.pm-tools input[type="search"],
|
|
4966
|
+
.pm-tools .pm-add input[type="text"],
|
|
4967
|
+
.pm-add > input[type="text"] { font-size: 12.5px; }
|
|
4968
|
+
.pm-tools .pm-add { flex: 0 1 auto; margin: 0 0 0 auto; }
|
|
4969
|
+
.pm-tools .pm-add input[type="text"] { flex: 0 1 auto; width: 300px; min-width: 140px; max-width: 42vw; }
|
|
4970
|
+
.pm-add button .ico { width: 14px; height: 14px; }
|
|
4971
|
+
|
|
4972
|
+
/* ================= 页面滚动条细化(2026-09-18) =================
|
|
4973
|
+
Windows 默认 17px 粗滚动条压在右栏边上很重;全局换成细圆角条。 */
|
|
4974
|
+
html { scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--accent) 32%, var(--border-strong)) transparent; }
|
|
4975
|
+
html::-webkit-scrollbar { width: 10px; height: 10px; }
|
|
4976
|
+
html::-webkit-scrollbar-thumb { border-radius: 999px; background: color-mix(in srgb, var(--accent) 30%, var(--border-strong)); }
|
|
4977
|
+
html::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--accent) 48%, var(--border-strong)); }
|
|
4978
|
+
html::-webkit-scrollbar-track { background: transparent; }
|
|
4979
|
+
|
|
4980
|
+
/* ---- 首次启动欢迎引导:左列上手三步 + 右列能力一览(渐变随皮肤 accent) ---- */
|
|
4981
|
+
.welcome-wrap { position: fixed; inset: 0; z-index: 195; display: flex; align-items: center; justify-content: center; padding: 24px; }
|
|
4982
|
+
.welcome-mask { position: absolute; inset: 0; background: rgba(0, 0, 0, .5); }
|
|
4983
|
+
.welcome-card {
|
|
4984
|
+
position: relative; display: flex; width: min(880px, 100%); max-height: calc(100vh - 48px);
|
|
4985
|
+
background: var(--bg); border: 1px solid var(--border-strong);
|
|
4986
|
+
border-radius: var(--r-lg); box-shadow: var(--shadow); overflow: hidden;
|
|
4987
|
+
}
|
|
4988
|
+
.welcome-x { position: absolute; top: 12px; right: 12px; z-index: 2; }
|
|
4989
|
+
.welcome-left {
|
|
4990
|
+
flex: 1.15; min-width: 0; overflow: auto; padding: 30px 30px 20px;
|
|
4991
|
+
display: flex; flex-direction: column; gap: 13px;
|
|
4992
|
+
}
|
|
4993
|
+
.welcome-badge {
|
|
4994
|
+
align-self: flex-start; font-size: 11.5px; color: var(--muted);
|
|
4995
|
+
border: 1px solid var(--border-strong); border-radius: 999px; padding: 3px 11px;
|
|
4996
|
+
}
|
|
4997
|
+
.welcome-brand { display: flex; align-items: center; gap: 10px; font-size: 23px; font-weight: 800; letter-spacing: .3px; }
|
|
4998
|
+
.welcome-brand .welcome-bee { width: 28px; height: 28px; color: var(--accent); stroke-width: 1.5; }
|
|
4999
|
+
.welcome-left h1 { margin: 0; font-size: 25px; line-height: 1.25; }
|
|
5000
|
+
.welcome-sub { margin: 0; color: var(--muted); font-size: 13px; line-height: 1.7; }
|
|
5001
|
+
.welcome-steps { display: flex; flex-direction: column; gap: 9px; margin-top: 2px; }
|
|
5002
|
+
.wstep { display: flex; gap: 10px; align-items: flex-start; font-size: 12.8px; line-height: 1.55; }
|
|
5003
|
+
.wstep b {
|
|
5004
|
+
flex: none; width: 20px; height: 20px; margin-top: 1px; border-radius: 50%;
|
|
5005
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
5006
|
+
font-size: 11.5px; color: var(--accent);
|
|
5007
|
+
background: var(--panel2); border: 1px solid var(--border-strong);
|
|
5008
|
+
}
|
|
5009
|
+
.welcome-acts { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
|
|
5010
|
+
.wl-btn {
|
|
5011
|
+
display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%;
|
|
5012
|
+
padding: 11px 14px; font-family: inherit; font-size: 13.5px; font-weight: 600;
|
|
5013
|
+
color: var(--text); background: var(--panel2);
|
|
5014
|
+
border: 1px solid var(--border-strong); border-radius: var(--r-md); cursor: pointer;
|
|
5015
|
+
transition: border-color .15s, filter .15s;
|
|
5016
|
+
}
|
|
5017
|
+
.wl-btn:hover { border-color: var(--accent); }
|
|
5018
|
+
.wl-btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
|
|
5019
|
+
.wl-btn.primary:hover { filter: brightness(1.07); }
|
|
5020
|
+
.wl-btn.ghost { justify-content: center; font-weight: 500; background: transparent; border-color: transparent; color: var(--muted); }
|
|
5021
|
+
.wl-btn.ghost:hover { color: var(--text); border-color: transparent; }
|
|
5022
|
+
.welcome-foot { margin: auto 0 0; padding-top: 12px; color: var(--muted); font-size: 11.5px; }
|
|
5023
|
+
.welcome-right {
|
|
5024
|
+
flex: .85; min-width: 0; padding: 30px 28px;
|
|
5025
|
+
display: flex; flex-direction: column; justify-content: center; gap: 7px;
|
|
5026
|
+
background: linear-gradient(160deg, color-mix(in srgb, var(--accent) 88%, #000), var(--accent2));
|
|
5027
|
+
color: #fff;
|
|
5028
|
+
}
|
|
5029
|
+
.welcome-right h2 { margin: 0; font-size: 20px; letter-spacing: .3px; }
|
|
5030
|
+
.wr-sub { margin: 0 0 12px; font-size: 12.5px; opacity: .85; }
|
|
5031
|
+
.wr-feats { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 11px; }
|
|
5032
|
+
.wr-feats li { display: flex; gap: 10px; align-items: flex-start; line-height: 1.5; }
|
|
5033
|
+
.wr-feats li .ico { flex: none; width: 17px; height: 17px; margin-top: 2px; opacity: .95; }
|
|
5034
|
+
.wr-feats b { display: block; font-size: 12.8px; }
|
|
5035
|
+
.wr-feats li div span { display: block; font-size: 12px; opacity: .82; }
|
|
5036
|
+
body.welcome-open { overflow: hidden; }
|
|
5037
|
+
@media (max-width: 720px) {
|
|
5038
|
+
.welcome-right { display: none; }
|
|
5039
|
+
.welcome-card { width: 100%; }
|
|
5040
|
+
}
|
|
5041
|
+
|
|
5042
|
+
/* 类型菜单项的成本/次数预估行(借鉴 omnigent pre-run estimate):小字弱化,
|
|
5043
|
+
* 挂在描述下方;无同类样本的类型不显示 */
|
|
5044
|
+
.ti-est { color: var(--muted); font-size: 10.5px; opacity: .85; }
|
|
5045
|
+
|
|
5046
|
+
/* 步骤卡「实际派发模型」小徽章(借鉴 gsd-pi routing provenance):换将/链回退时
|
|
5047
|
+
* 一眼看清这步到底打了哪个模型;老步骤无 model 字段不显示 */
|
|
5048
|
+
.step .st-model {
|
|
5049
|
+
font-size: 10.5px; color: var(--muted); opacity: .9;
|
|
5050
|
+
border: 1px solid var(--border); border-radius: 999px; padding: 0 7px; line-height: 16px;
|
|
5051
|
+
}
|