codebee 0.1.5 → 0.1.6

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/app/ui/style.css CHANGED
@@ -2966,141 +2966,195 @@ span.imgcap { cursor: pointer; user-select: none; }
2966
2966
  span.imgcap:not(.ok) { opacity: .45; }
2967
2967
  span.imgcap:hover { border-color: var(--accent); color: var(--accent); }
2968
2968
 
2969
- /* ================= 蜂巢工作台视觉 v3(Hermes Agent 终端街机风) =================
2970
- * 依 Hermes 官方 banner 实测设计语言(视觉模型分析):纯黑+琥珀金双色系、
2971
- * 像素方块造型、硬边无光晕、错位描边回声、CRT 扫描线、双色硬分割、街机纪念碑感。
2972
- * 整块蜂巢是「终端黑岛」:泳道/卡片用 --log-bg 深底(日夜两版都保持终端暗),
2973
- * 文字走 --log-text;金即 var(--accent)(墨金皮肤下为琥珀金)。
2969
+ /* ================= 蜂巢工作台视觉 v8(归行·蜂航) =================
2970
+ * 用户拍板:横向流程图不如原始的行排——布局回归纵向泳道行(容器横向布局、
2971
+ * 交错、双列芯片全部撤掉,行内角色/执行者/尾巴/计时全量展示交还基座),
2972
+ * 保留随肤精修:面板底泳道+顶部强调轨+六边形站序徽章+状态渐隐顶带+蜜光呼吸。
2973
+ * 行与行之间是纵向蜜线航线,活跃段的蜜蜂沿弧线俯冲向下一行(offset-path)。
2974
2974
  * 动画名(lane-in/cell-in/hc-breathe/bee-bob/flow-dot/ld-in)与 --d 级联不变——测试契约。 */
2975
2975
 
2976
- /* 蜂巢区标题:金色 mono + 拉宽字距,终端提示符气质 */
2977
- .rd-hive .sec-title { font-family: var(--mono); letter-spacing: .12em; }
2976
+ /* 区标题:正式无衬线,强调色只留给图标 */
2977
+ .rd-hive .sec-title { letter-spacing: .02em; }
2978
2978
  .rd-hive .sec-title .ico { color: var(--accent); }
2979
- .rd-hive .sec-title > span:not(.tag) { color: var(--accent); font-weight: 700; }
2979
+ .rd-hive .sec-title > span:not(.tag) { font-weight: 700; }
2980
2980
 
2981
- /* 泳道:终端黑面板 + CRT 扫描线 + 硬边金框 + 右下错位回声 */
2981
+ /* —— 泳道行:面板底 + 顶部悬浮强调轨(活跃轨呼吸),布局交还基座 —— */
2982
2982
  .hive-lane {
2983
- background: repeating-linear-gradient(0deg, rgba(0, 0, 0, .16) 0 1px, transparent 1px 3px),
2984
- var(--log-bg);
2985
- border: 1px solid color-mix(in srgb, var(--accent) 34%, transparent);
2986
- box-shadow: 4px 4px 0 0 color-mix(in srgb, var(--accent) 15%, transparent);
2987
- color: var(--log-text);
2983
+ position: relative;
2984
+ border-radius: 12px; padding: 10px 12px;
2985
+ background: linear-gradient(180deg,
2986
+ color-mix(in srgb, var(--accent) 3%, var(--panel)), var(--panel) 58%);
2987
+ }
2988
+ .hive-lane::before {
2989
+ content: ""; position: absolute; top: 0; left: 16px; right: 16px; height: 2px;
2990
+ border-radius: 2px; pointer-events: none;
2991
+ background: linear-gradient(90deg,
2992
+ color-mix(in srgb, var(--accent) 40%, transparent), transparent 78%);
2993
+ opacity: .5;
2988
2994
  }
2989
2995
  .hive-lane.lane-active {
2990
- border-color: color-mix(in srgb, var(--accent) 68%, transparent);
2991
- box-shadow: 4px 4px 0 0 color-mix(in srgb, var(--accent) 30%, transparent);
2996
+ border-color: color-mix(in srgb, var(--accent) 40%, var(--border));
2997
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 14%, transparent),
2998
+ 0 8px 22px color-mix(in srgb, var(--accent) 9%, transparent);
2992
2999
  }
2993
- .hive-lane.lane-idle { opacity: .6; }
2994
- .hive-lane.lane-done { opacity: .88; }
2995
- .lane-name {
2996
- color: var(--log-text); font-weight: 800;
2997
- text-shadow: 2px 2px 0 color-mix(in srgb, var(--accent) 22%, transparent);
3000
+ .hive-lane.lane-active::before {
3001
+ background: linear-gradient(90deg, var(--accent),
3002
+ color-mix(in srgb, var(--accent) 45%, transparent) 62%, transparent);
3003
+ opacity: .9;
2998
3004
  }
2999
- .lane-n, .lane-prog { color: color-mix(in srgb, var(--log-text) 62%, transparent); }
3000
- .lane-head { gap: 8px; margin-bottom: 7px; }
3001
-
3002
- /* 站序徽章:金底黑字硬方块(像素字块),自带错位回声 */
3003
- .lane-idx {
3004
- background: var(--accent); color: var(--log-bg);
3005
- border: none; border-radius: 0; padding: 3px 5px;
3006
- font: 700 10px/1 var(--mono); letter-spacing: .1em; flex: none;
3007
- box-shadow: 2px 2px 0 0 color-mix(in srgb, var(--accent) 38%, transparent);
3005
+ @media (prefers-reduced-motion: no-preference) {
3006
+ .hive-lane.lane-active::before { animation: lane-rail 2.6s ease-in-out infinite; }
3008
3007
  }
3008
+ @keyframes lane-rail { 50% { opacity: .4; } }
3009
3009
 
3010
- /* 轨道:像素方块序列(settled=实心色块,run=终端光标式双色闪烁)+ 硬色点轨 */
3011
- .lane-track { position: relative; }
3012
- .lane-track::before {
3013
- content: ""; position: absolute; left: 4px; width: calc(100% - 8px); top: 50%; height: 2px;
3014
- background: color-mix(in srgb, var(--accent) 22%, transparent); opacity: 1;
3010
+ /* 泳道头:六边形站序徽章 + 名称 + 读数;「进行中」胶囊靠右 */
3011
+ .lane-head { flex-wrap: wrap; gap: 5px 8px; margin-bottom: 7px; }
3012
+ .lane-name {
3013
+ min-width: 0; font-weight: 700; letter-spacing: .01em;
3014
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
3015
3015
  }
3016
- .ld {
3017
- width: 8px; height: 8px; border-radius: 0; clip-path: none;
3018
- background: color-mix(in srgb, var(--accent) 75%, transparent);
3016
+ .lane-n { font-family: var(--mono); flex: none; }
3017
+ .lane-prog {
3018
+ font-family: var(--mono); font-size: 10.5px; color: var(--muted);
3019
+ border: 1px solid var(--border); border-radius: 999px; padding: 0 7px; line-height: 15px;
3019
3020
  }
3020
- .ld-done { background: var(--accent); }
3021
- .ld-fail { background: var(--bad, #e5484d); }
3022
- .ld-time { background: var(--accent2); }
3023
- .ld-cancel { background: var(--warn); }
3024
- .ld-run { animation: ld-blink .9s steps(1) infinite; }
3025
- @keyframes ld-blink {
3026
- 0%, 49% { background: var(--accent); }
3027
- 50%, 100% { background: var(--accent2); }
3021
+ .lane-idx {
3022
+ width: 30px; height: 26px; display: inline-flex; align-items: center; justify-content: center;
3023
+ background: color-mix(in srgb, var(--accent) 14%, var(--panel)); color: var(--accent);
3024
+ clip-path: polygon(50% 0, 100% 25%, 100% 75%, 50% 100%, 0 75%, 0 25%);
3025
+ border: none; border-radius: 0; padding: 0;
3026
+ font: 700 10px/1 var(--mono); letter-spacing: .06em; flex: none;
3027
+ }
3028
+ .hive-lane .lane-live {
3029
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
3030
+ border-radius: 999px; padding: 0 7px; line-height: 16px; font-size: 10.5px;
3031
+ background: color-mix(in srgb, var(--accent) 9%, transparent);
3028
3032
  }
3029
3033
 
3030
- /* 卡片:终端黑卡 + 金硬边 + 错位回声;悬停=街机按钮按压(回声收拢、位移吃进) */
3031
- .hive-cell {
3032
- background: color-mix(in srgb, var(--log-bg) 88%, transparent);
3033
- border: 1px solid color-mix(in srgb, var(--accent) 28%, transparent);
3034
- border-radius: 4px;
3035
- box-shadow: 3px 3px 0 0 color-mix(in srgb, var(--accent) 14%, transparent);
3036
- color: var(--log-text);
3037
- }
3038
- .hive-cell:hover {
3039
- transform: translate(2px, 2px);
3040
- box-shadow: 0 0 0 0 transparent;
3041
- border-color: color-mix(in srgb, var(--accent) 62%, transparent);
3034
+ /* 轨道:细连线铺底,圆点 position 抬到线上方(连线不穿过点) */
3035
+ .lane-track { position: relative; margin: 1px 0 8px; }
3036
+ .lane-track::before {
3037
+ content: ""; position: absolute; left: 5px; right: 5px; top: 50%; height: 1px;
3038
+ background: var(--border);
3042
3039
  }
3043
- /* 顶部状态带:双色硬分割(Hermes 签名的水平断裂色带,55% 处硬切) */
3040
+ .ld { position: relative; }
3041
+
3042
+ /* 卡片:皮肤面板底 + 状态渐隐顶带;悬停轻抬 + 柔和强调影(不做街机按压) */
3044
3043
  .hive-cell::before {
3045
3044
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px;
3046
- border-radius: 0; background: transparent;
3045
+ border-radius: 10px 10px 0 0; pointer-events: none;
3046
+ background: linear-gradient(90deg, var(--accent), color-mix(in srgb, var(--accent) 25%, transparent));
3047
+ opacity: .9;
3047
3048
  }
3048
- .hive-cell.st-running::before {
3049
- background: linear-gradient(90deg, var(--accent) 0 55%, var(--accent2) 55% 100%); }
3050
3049
  .hive-cell.st-done::before {
3051
- background: linear-gradient(90deg, var(--ok) 0 55%,
3052
- color-mix(in srgb, var(--ok) 50%, var(--log-bg)) 55% 100%); }
3050
+ background: linear-gradient(90deg, var(--ok), color-mix(in srgb, var(--ok) 25%, transparent));
3051
+ }
3053
3052
  .hive-cell.st-failed::before {
3054
- background: linear-gradient(90deg, var(--bad, #e5484d) 0 55%,
3055
- color-mix(in srgb, var(--bad, #e5484d) 50%, var(--log-bg)) 55% 100%); }
3053
+ background: linear-gradient(90deg, var(--bad, #e5484d),
3054
+ color-mix(in srgb, var(--bad, #e5484d) 25%, transparent));
3055
+ }
3056
3056
  .hive-cell.st-timeout::before {
3057
- background: linear-gradient(90deg, var(--accent2) 0 55%, var(--warn) 55% 100%); }
3057
+ background: linear-gradient(90deg, var(--accent2, var(--warn)), transparent);
3058
+ }
3058
3059
  .hive-cell.st-cancelled::before {
3059
- background: linear-gradient(90deg, var(--warn) 0 55%,
3060
- color-mix(in srgb, var(--warn) 50%, var(--log-bg)) 55% 100%); }
3061
- .hc-role { color: var(--log-text); font-family: var(--mono); font-size: 12px; }
3062
- .hc-who { color: color-mix(in srgb, var(--log-text) 55%, transparent); }
3063
- .hc-meta { color: color-mix(in srgb, var(--log-text) 55%, transparent); }
3064
- .hc-tail {
3065
- color: color-mix(in srgb, var(--log-text) 78%, transparent);
3066
- background: rgba(0, 0, 0, .32);
3067
- border: 1px solid color-mix(in srgb, var(--accent) 12%, transparent);
3068
- border-radius: 0; padding: 3px 6px; margin-top: 6px;
3060
+ background: linear-gradient(90deg, var(--warn, #d97706), transparent);
3061
+ }
3062
+ .hive-cell.st-running {
3063
+ background: linear-gradient(180deg,
3064
+ color-mix(in srgb, var(--accent) 5%, var(--panel)), var(--panel) 72%);
3065
+ border-color: color-mix(in srgb, var(--accent) 42%, var(--border));
3066
+ }
3067
+ .hive-cell:hover {
3068
+ transform: translateY(-2px);
3069
+ box-shadow: 0 6px 16px color-mix(in srgb, var(--accent) 15%, transparent),
3070
+ 0 1px 3px color-mix(in srgb, var(--text) 10%, transparent);
3069
3071
  }
3070
- .hive-cell.st-done { opacity: .78; }
3071
3072
 
3072
- /* 呼吸重定义:无光晕的硬边呼吸(动画名不变,测试契约) */
3073
+ /* 呼吸重定义:细环 + 环境蜜光一涨一收(动画名不变,测试契约) */
3073
3074
  @keyframes hc-breathe {
3074
- 0%, 100% {
3075
- border-color: color-mix(in srgb, var(--accent) 28%, transparent);
3076
- box-shadow: 3px 3px 0 0 color-mix(in srgb, var(--accent) 14%, transparent);
3077
- }
3075
+ 0%, 100% { box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 22%, transparent); }
3078
3076
  50% {
3079
- border-color: color-mix(in srgb, var(--accent) 72%, transparent);
3080
- box-shadow: 3px 3px 0 0 color-mix(in srgb, var(--accent) 30%, transparent);
3077
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 48%, transparent),
3078
+ 0 4px 18px color-mix(in srgb, var(--accent) 16%, transparent);
3081
3079
  }
3082
3080
  }
3083
- .hive-cell.st-running {
3084
- border-color: color-mix(in srgb, var(--accent) 45%, transparent);
3085
- box-shadow: 3px 3px 0 0 color-mix(in srgb, var(--accent) 20%, transparent);
3086
- }
3087
3081
 
3088
- /* 彗尾:方形光标像素 + 硬色回声拖尾(非光晕) */
3089
- .lane-flow::after {
3090
- width: 8px; height: 8px; margin-top: -4px; border-radius: 0;
3091
- background: var(--accent);
3092
- box-shadow: -4px 0 0 0 color-mix(in srgb, var(--accent2) 75%, transparent),
3093
- -8px 0 0 0 color-mix(in srgb, var(--accent2) 38%, transparent);
3082
+ /* 文本:正式无衬线标题;尾巴保持 mono(日志语义)收进软底胶囊 */
3083
+ .hc-role { font-size: 12.5px; letter-spacing: .01em; }
3084
+ .hc-tail {
3085
+ background: color-mix(in srgb, var(--text) 4%, transparent);
3086
+ border-radius: 6px; padding: 3px 7px; margin-top: 6px;
3087
+ color: color-mix(in srgb, var(--text) 76%, var(--muted));
3088
+ }
3089
+ .hive-cell .hc-live {
3090
+ background: color-mix(in srgb, var(--accent) 9%, transparent);
3094
3091
  }
3095
3092
 
3096
- /* 「工作中」胶囊:方角化,终端徽章感 */
3097
- .hive-cell .hc-live { border-radius: 2px; }
3093
+ /* —— 行间航线:纵向蜜线 + 箭尖;活跃段的蜜蜂俯冲向下一行 —— */
3094
+ .lane-flow {
3095
+ position: relative; height: 44px; width: 36px;
3096
+ margin: 2px 0 2px 10px;
3097
+ }
3098
+ .lane-flow::before { display: none; } /* 直线虚线由 SVG 蜜线替代 */
3099
+ .flow-line { position: absolute; inset: 0; width: 100%; height: 100%; }
3100
+ .flow-line-up { display: none; } /* 行排恒为下行线 */
3101
+ .flow-line .flow-path {
3102
+ fill: none; stroke: var(--border-strong); stroke-width: 1.5;
3103
+ stroke-dasharray: 5 6; stroke-linecap: round;
3104
+ }
3105
+ .flow-line .flow-tip {
3106
+ fill: none; stroke: var(--border-strong); stroke-width: 1.5;
3107
+ stroke-linecap: round; stroke-linejoin: round; opacity: .65;
3108
+ }
3109
+ .hive-lane.lane-active + .lane-flow .flow-path,
3110
+ .hive-lane.lane-active + .lane-flow .flow-tip {
3111
+ stroke: color-mix(in srgb, var(--accent) 62%, var(--border-strong));
3112
+ }
3113
+ .hive-lane.lane-active + .lane-flow .flow-tip { opacity: .95; }
3114
+ @media (prefers-reduced-motion: no-preference) {
3115
+ .hive-lane.lane-active + .lane-flow .flow-path { animation: lane-dash 1.2s linear infinite; }
3116
+ .hive-lane.lane-active + .lane-flow .flow-bee { animation: bee-fly 2s ease-in-out infinite; }
3117
+ }
3118
+ @keyframes lane-dash { to { stroke-dashoffset: -11; } }
3098
3119
 
3099
- /* 高对比皮肤:扫描线/回声按其设计意图关闭 */
3100
- html[data-skin="contrast"] .hive-lane { background: var(--log-bg); box-shadow: none; }
3101
- html[data-skin="contrast"] .hive-cell,
3102
- html[data-skin="contrast"] .lane-idx { box-shadow: none; }
3103
- .lane-cells { grid-template-columns: repeat(auto-fill, minmax(178px, 1fr)); }
3120
+ /* 彗尾:flow-dot 契约(名字 + box-shadow)——沿纵向弧线 offset-distance 俯冲 */
3121
+ .lane-flow::after {
3122
+ content: ""; position: absolute; top: 0; left: 0; margin: 0;
3123
+ width: 7px; height: 7px; border-radius: 50%;
3124
+ background: var(--accent); opacity: 0; offset-rotate: 0deg;
3125
+ offset-path: path("M14 2 C14 16 22 28 22 42");
3126
+ box-shadow: 0 -4px 6px 0 color-mix(in srgb, var(--accent) 50%, transparent),
3127
+ 0 -8px 9px 0 color-mix(in srgb, var(--accent) 22%, transparent);
3128
+ }
3129
+ @keyframes flow-dot {
3130
+ 0% { offset-distance: 0%; opacity: 0; }
3131
+ 10% { opacity: 1; } 60% { opacity: 1; } 92% { opacity: 1; }
3132
+ 100% { offset-distance: 100%; opacity: 0; }
3133
+ }
3134
+
3135
+ /* 蜜蜂:同一条弧线俯冲(图标朝向不依赖 offset-rotate,关键帧小幅摆动) */
3136
+ .flow-bee {
3137
+ position: absolute; top: 0; left: 0; margin: 0;
3138
+ width: 16px; height: 16px; opacity: 0; pointer-events: none;
3139
+ color: var(--accent); offset-rotate: 0deg;
3140
+ offset-path: path("M14 2 C14 16 22 28 22 42");
3141
+ filter: drop-shadow(0 2px 5px color-mix(in srgb, var(--accent) 35%, transparent));
3142
+ }
3143
+ .flow-bee img { width: 100%; height: 100%; }
3144
+ /* 写实小蜂(icons/bee.svg,自带扇翅动画):格内 15px + 主题色微光 */
3145
+ .hive-cell .hc-bee { width: 15px; height: 15px; flex: none; }
3146
+ .hive-cell.st-running .hc-bee {
3147
+ filter: drop-shadow(0 1px 3px color-mix(in srgb, var(--accent) 45%, transparent));
3148
+ }
3149
+ @keyframes bee-fly {
3150
+ 0% { offset-distance: 0%; opacity: 0; transform: rotate(-8deg); }
3151
+ 12% { opacity: 1; }
3152
+ 30% { transform: rotate(7deg); }
3153
+ 55% { transform: rotate(-6deg); }
3154
+ 80% { transform: rotate(6deg); }
3155
+ 90% { opacity: 1; }
3156
+ 100% { offset-distance: 100%; opacity: 0; transform: rotate(-4deg); }
3157
+ }
3104
3158
 
3105
3159
  /* 报告里的 md 围栏代码块走 codeBlockHTML(.code-block 行号表格):
3106
3160
  抵消 .report td 的表格边框/内距,避免代码格画成九宫格 */
@@ -3123,246 +3177,6 @@ html[data-skin="contrast"] .lane-idx { box-shadow: none; }
3123
3177
  border-color: var(--accent); color: var(--accent);
3124
3178
  }
3125
3179
 
3126
- /* ================= CodeBee 工作台重构 =================
3127
- * 这层只消费既有皮肤变量,保留 app.js 的换肤、状态、SSE 和详情结构。
3128
- * 目标是把原本偏终端化的视觉,收束为适合长期使用的正式工作台。 */
3129
- :root {
3130
- --cb-font: "Microsoft YaHei UI", "Microsoft YaHei", "PingFang SC", "Noto Sans CJK SC", sans-serif;
3131
- --cb-display: "Microsoft YaHei UI", "Microsoft YaHei", "PingFang SC", "Noto Sans CJK SC", sans-serif;
3132
- --cb-surface: color-mix(in srgb, var(--panel) 92%, transparent);
3133
- --cb-surface-soft: color-mix(in srgb, var(--panel2) 72%, transparent);
3134
- --cb-accent-soft: color-mix(in srgb, var(--accent) 10%, var(--panel));
3135
- --cb-accent-line: color-mix(in srgb, var(--accent) 34%, var(--border));
3136
- --cb-shadow: 0 10px 26px color-mix(in srgb, var(--text) 6%, transparent);
3137
- }
3138
-
3139
- body {
3140
- font-family: var(--cb-font);
3141
- font-size: 14px;
3142
- line-height: 1.7;
3143
- letter-spacing: 0;
3144
- background: var(--bg);
3145
- }
3146
- html[data-theme="light"] body {
3147
- background-color: color-mix(in srgb, var(--bg) 93%, var(--accent) 7%);
3148
- background-image: linear-gradient(180deg, color-mix(in srgb, var(--accent) 4%, transparent), transparent 240px);
3149
- }
3150
- html[data-skin="contrast"] body { background-image: none; }
3151
- html[data-skin="contrast"][data-theme="light"] body { background-color: #fff; }
3152
-
3153
- #app { grid-template-columns: 272px 1fr; }
3154
- #sidebar {
3155
- padding: 16px 13px 12px;
3156
- background: color-mix(in srgb, var(--sidebar) 94%, var(--accent) 6%);
3157
- border-right-color: color-mix(in srgb, var(--border) 80%, var(--accent) 20%);
3158
- }
3159
- .brand {
3160
- min-height: 43px;
3161
- margin: 0 3px 8px;
3162
- padding: 7px 8px 13px;
3163
- border-bottom-color: color-mix(in srgb, var(--accent) 22%, var(--border));
3164
- }
3165
- .brand-name { font-family: var(--cb-display); font-size: 17px; font-weight: 700; letter-spacing: .025em; }
3166
- .new-task {
3167
- min-height: 40px; padding: 9px 11px; margin: 0 0 6px;
3168
- background: var(--cb-accent-soft); border: 1px solid var(--cb-accent-line);
3169
- border-radius: 9px; color: var(--accent); font-weight: 600;
3170
- transition: transform .18s ease, background-color .18s ease, box-shadow .18s ease;
3171
- }
3172
- .new-task:hover { background: color-mix(in srgb, var(--accent) 16%, var(--panel)); box-shadow: 0 5px 14px color-mix(in srgb, var(--accent) 14%, transparent); }
3173
- .new-task:active { transform: translateY(1px); }
3174
- .side-search, .qitem, .stask, .sdir summary, .side-settings .set-item, .set-back { border-radius: 7px; }
3175
- .side-search, .qitem { color: var(--muted); }
3176
- .side-search:hover, .qitem:hover, .stask:hover, .sdir summary:hover,
3177
- .side-settings .set-item:hover, .set-back:hover { background: var(--cb-surface-soft); }
3178
- .stask { padding: 7px 8px; }
3179
- .stask.active, .side-settings .set-item.active {
3180
- background: var(--cb-accent-soft); color: var(--accent); box-shadow: inset 2px 0 0 var(--accent);
3181
- }
3182
- .stask.active .tm, .side-settings .set-item.active .ico { color: var(--accent); }
3183
- .side-label, .side-settings .set-group { font-size: 11px; font-weight: 700; letter-spacing: .08em; }
3184
- .side-foot { border-top-color: var(--border); padding-top: 12px; }
3185
-
3186
- .topbar {
3187
- min-height: 57px; padding: 11px 28px;
3188
- background: color-mix(in srgb, var(--bg) 88%, transparent);
3189
- border-bottom-color: color-mix(in srgb, var(--border) 86%, var(--accent) 14%);
3190
- backdrop-filter: blur(16px);
3191
- }
3192
- .page-title { font-family: var(--cb-display); font-size: 16px; font-weight: 700; letter-spacing: .02em; }
3193
- .icon-btn, .foot-btn { border-radius: 7px; }
3194
- .pill { background: var(--cb-surface); border-color: var(--border); box-shadow: 0 1px 2px color-mix(in srgb, var(--text) 4%, transparent); }
3195
- .pill:hover { border-color: var(--cb-accent-line); color: var(--accent); }
3196
-
3197
- main { padding: 30px 36px 88px; }
3198
- .page { max-width: 1480px; gap: 24px; }
3199
- .subpage { gap: 24px; }
3200
- main .panel.wide { padding: 0; }
3201
- .panel-head {
3202
- margin-bottom: 18px; padding: 0 0 14px;
3203
- border-bottom-color: color-mix(in srgb, var(--border) 84%, var(--accent) 16%);
3204
- }
3205
- .panel-head h2, h2 { font-family: var(--cb-display); font-size: 18px; font-weight: 700; letter-spacing: .02em; }
3206
- h3.sec-title, .sec-title { color: var(--muted); font-size: 11.5px; letter-spacing: .11em; }
3207
- .hint { line-height: 1.75; }
3208
-
3209
- input, select, textarea {
3210
- background: var(--cb-surface); border-color: var(--border);
3211
- border-radius: 8px; font-family: inherit;
3212
- transition: border-color .18s ease, box-shadow .18s ease, background-color .18s ease;
3213
- }
3214
- input:hover, select:hover, textarea:hover { background: var(--panel); border-color: var(--border-strong); }
3215
- input:focus, select:focus, textarea:focus {
3216
- border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 11%, transparent);
3217
- }
3218
- button { font-family: inherit; }
3219
- button.primary {
3220
- border-radius: 8px; font-weight: 600; letter-spacing: .01em;
3221
- box-shadow: 0 4px 12px color-mix(in srgb, var(--accent) 20%, transparent);
3222
- }
3223
- button.ghost, button.danger { border-radius: 8px; }
3224
- button.ghost:hover { border-color: var(--cb-accent-line); color: var(--accent); background: var(--cb-accent-soft); }
3225
-
3226
- /* 首页任务创建:保留原表单功能,将其组织成一个稳定的操作面。 */
3227
- .composer { max-width: 1180px; margin: 28px auto 0; }
3228
- .hero-row { align-items: flex-end; }
3229
- #cmp-greet { font-family: var(--cb-display); font-size: 26px; font-weight: 600; line-height: 1.4; letter-spacing: .015em; }
3230
- .hero-sub { font-size: 13px; max-width: 720px; }
3231
- .cmp-pills { gap: 9px; margin-top: 22px; }
3232
- .cmp-pills .type-pick, .cmp-wd { background: var(--cb-surface); border-color: var(--border); }
3233
- .cmp-pills .type-pick:hover, .cmp-wd:hover { border-color: var(--cb-accent-line); }
3234
- .cmp-box {
3235
- border-radius: 11px; padding: 8px 10px 9px; background: var(--cb-surface);
3236
- border-color: color-mix(in srgb, var(--border) 82%, var(--accent) 18%);
3237
- box-shadow: var(--cb-shadow);
3238
- }
3239
- .cmp-box:focus-within { box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 10%, transparent), var(--cb-shadow); }
3240
- .cmp-box textarea { min-height: 98px; font-size: 16px; }
3241
- .cmp-quick { margin-top: 14px; }
3242
- .cmp-chip { background: transparent; border-radius: 7px; }
3243
- .cmp-chip.on { background: var(--cb-accent-soft); }
3244
-
3245
- /* 全局数据面:运行记录、智能体、模型、自动化、市场和设置复用同一张工作卡。 */
3246
- .item, .card, .mcard, .opanel, .auto-tpl-card, .cs-preview, .skin-card, .bm-card {
3247
- background: var(--cb-surface); border-color: var(--border); border-radius: 10px;
3248
- box-shadow: 0 1px 2px color-mix(in srgb, var(--text) 3%, transparent);
3249
- transition: border-color .2s ease, box-shadow .2s ease, transform .2s ease, background-color .2s ease;
3250
- }
3251
- .item:hover, .card:hover, .mcard:hover, .opanel:hover, .auto-tpl-card:hover, .skin-card:hover, .bm-card:hover {
3252
- background: var(--panel); border-color: var(--cb-accent-line);
3253
- box-shadow: var(--cb-shadow); transform: translateY(-2px);
3254
- }
3255
- .item { padding: 14px 16px; }
3256
- .item .name, .card .name { font-weight: 700; }
3257
- .cards { gap: 16px; }
3258
- .card { padding: 17px; }
3259
- .mcard { background: var(--cb-surface-soft); }
3260
- .tag, .chip, .stat { border-radius: 6px; }
3261
- .chip { padding: 3px 10px; font-weight: 700; }
3262
- .chip.running { background: color-mix(in srgb, var(--accent) 13%, var(--panel)); }
3263
- .usage-kpis { gap: 14px; }
3264
- .usage-kpi, .usage-single, .usage-donut, .usage-heat, .usage-recent-wrap { background: var(--cb-surface); border: 1px solid var(--border); border-radius: 10px; }
3265
- .usage-table th { background: var(--cb-surface-soft); }
3266
- .usage-table tr:hover td { background: color-mix(in srgb, var(--accent) 5%, transparent); }
3267
- .seg { background: var(--cb-surface-soft); border: 1px solid var(--border); border-radius: 8px; padding: 3px; }
3268
- .seg-btn { border-radius: 6px; }
3269
- .seg-btn.active { background: var(--panel); color: var(--accent); box-shadow: 0 1px 4px color-mix(in srgb, var(--text) 8%, transparent); }
3270
- .skin-grid { gap: 14px; }
3271
- .skin-card.active { border-color: var(--accent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 13%, transparent); }
3272
-
3273
- /* 运行详情:头部、指标和页签建立固定层级,信息可扫读。 */
3274
- #run-detail {
3275
- max-width: 1240px; margin: 0 auto; padding: 0;
3276
- animation: cb-detail-in .38s cubic-bezier(.2, .8, .2, 1) both;
3277
- }
3278
- @keyframes cb-detail-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
3279
- #run-detail .detail-head {
3280
- position: sticky; top: -30px; z-index: 5; padding: 16px 0 13px;
3281
- background: color-mix(in srgb, var(--bg) 92%, transparent); backdrop-filter: blur(16px);
3282
- border-bottom: 1px solid color-mix(in srgb, var(--border) 84%, var(--accent) 16%);
3283
- }
3284
- #run-detail .detail-head h2 { font-family: var(--cb-display); font-size: 18px; font-weight: 700; line-height: 1.5; }
3285
- .rd-meta-strip { gap: 8px; margin: 17px 0 14px; }
3286
- .rd-meta-strip .stat { background: var(--cb-surface); border: 1px solid var(--border); padding: 5px 10px; }
3287
- .rd-tabs {
3288
- position: sticky; top: 61px; z-index: 4; margin: 0 -4px 18px; padding: 4px;
3289
- background: color-mix(in srgb, var(--bg) 90%, transparent); border-bottom: 1px solid var(--border);
3290
- backdrop-filter: blur(14px);
3291
- }
3292
- .rd-tab { min-height: 34px; padding: 7px 13px; border-radius: 7px; }
3293
- .rd-tab.active { background: var(--cb-accent-soft); }
3294
- .rd-tab.active::after { display: none; }
3295
- .rd-main { gap: 16px; }
3296
- .rd-pane { animation: cb-pane-in .28s ease both; }
3297
- @keyframes cb-pane-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }
3298
- .steps { gap: 10px; }
3299
- .step { background: var(--cb-surface); border-color: var(--border); border-radius: 9px; padding: 11px 13px; }
3300
- .step:hover { background: var(--panel); border-color: var(--cb-accent-line); }
3301
- .step .n { background: var(--cb-accent-soft); color: var(--accent); border-radius: 6px; }
3302
- .rd-direct, .rd-logdrawer, .rd-arts, .rd-git, .rd-bible, .report {
3303
- background: var(--cb-surface); border-color: var(--border); border-radius: 10px;
3304
- }
3305
- .report { padding: 16px 20px; }
3306
- .logbox, #run-detail #rd-log.rd-logdrawer { border-radius: 10px; overflow: hidden; }
3307
-
3308
- /* 蜂巢工作台:皮肤色作为状态语言,卡片和流程留在同一浅层空间。 */
3309
- .rd-hive { padding: 2px 0 8px; }
3310
- .rd-hive .sec-title { font-family: var(--cb-font); letter-spacing: .08em; }
3311
- .rd-hive .sec-title > span:not(.tag), .rd-hive .sec-title .ico { color: var(--accent); }
3312
- .hive-lane {
3313
- position: relative; overflow: hidden; padding: 13px 14px;
3314
- background: var(--cb-surface); border: 1px solid var(--border); border-radius: 10px;
3315
- box-shadow: none; color: var(--text);
3316
- }
3317
- .hive-lane::before {
3318
- content: ""; position: absolute; inset: 0 0 auto; height: 2px;
3319
- background: color-mix(in srgb, var(--accent) 42%, transparent); opacity: .7;
3320
- }
3321
- .hive-lane.lane-active {
3322
- border-color: var(--cb-accent-line); background: color-mix(in srgb, var(--accent) 5%, var(--panel));
3323
- box-shadow: 0 8px 20px color-mix(in srgb, var(--accent) 9%, transparent);
3324
- }
3325
- .hive-lane.lane-active::before { animation: cb-lane-live 2.2s ease-in-out infinite; }
3326
- @keyframes cb-lane-live { 50% { opacity: 1; background: var(--accent); } }
3327
- .lane-name, .hc-role { color: var(--text); text-shadow: none; }
3328
- .lane-n, .lane-prog, .hc-who, .hc-meta { color: var(--muted); }
3329
- .lane-idx { background: var(--cb-accent-soft); color: var(--accent); border: 1px solid var(--cb-accent-line); border-radius: 5px; box-shadow: none; }
3330
- .lane-track::before { height: 1px; background: var(--border); }
3331
- .ld { width: 7px; height: 7px; border-radius: 50%; background: var(--border-strong); }
3332
- .ld-done { background: var(--ok); }
3333
- .ld-run { border-radius: 50%; background: var(--accent); animation: cb-node-pulse 1.4s ease-in-out infinite; }
3334
- @keyframes cb-node-pulse { 50% { transform: scale(1.5); opacity: .45; } }
3335
- .lane-flow::after { width: 7px; height: 7px; margin-top: -3px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 12%, transparent); }
3336
- .hive-cell {
3337
- position: relative; overflow: hidden; padding: 12px;
3338
- background: var(--panel); border-color: var(--border); border-radius: 8px; box-shadow: none; color: var(--text);
3339
- }
3340
- .hive-cell::before { height: 2px; border-radius: 0; background: var(--border); }
3341
- .hive-cell.st-running { border-color: var(--cb-accent-line); box-shadow: 0 4px 14px color-mix(in srgb, var(--accent) 10%, transparent); }
3342
- .hive-cell.st-running::before { background: var(--accent); }
3343
- .hive-cell.st-done::before { background: var(--ok); }
3344
- .hive-cell.st-failed::before { background: var(--bad); }
3345
- .hive-cell:hover { transform: translateY(-2px); box-shadow: var(--cb-shadow); border-color: var(--cb-accent-line); }
3346
- .hc-tail { background: var(--cb-surface-soft); border-color: var(--border); border-radius: 5px; color: var(--muted); }
3347
- .hive-cell .hc-live { border-radius: 999px; }
3348
-
3349
- /* 动效在高负荷运行时有反馈,同时尊重系统的减少动态效果偏好。 */
3350
- @media (prefers-reduced-motion: no-preference) {
3351
- .page:not(.hidden) > .subpage:not(.hidden) { animation: cb-page-in .35s ease both; }
3352
- @keyframes cb-page-in { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: translateY(0); } }
3353
- }
3354
- @media (prefers-reduced-motion: reduce) {
3355
- *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
3356
- }
3357
- @media (max-width: 900px) {
3358
- #app { grid-template-columns: 1fr; }
3359
- main { padding: 22px 18px 72px; }
3360
- .topbar { padding: 10px 16px; }
3361
- .top-actions { gap: 5px; }
3362
- #run-detail .detail-head { top: -22px; }
3363
- .rd-tabs { top: 57px; }
3364
- }
3365
-
3366
3180
  /* 关于与更新:更新内容展示块(relnotes/whatsnew 共用) */
3367
3181
  .su-notes {
3368
3182
  white-space: pre-wrap;
@@ -3377,3 +3191,36 @@ button.ghost:hover { border-color: var(--cb-accent-line); color: var(--accent);
3377
3191
  max-height: 40vh;
3378
3192
  overflow: auto;
3379
3193
  }
3194
+
3195
+ /* —— 日志抽屉精修(点蜂巢格弹出/再点收起的逐步输出框):告别终端黑岛,随肤一体 ——
3196
+ * 契约不动:#rd-log/.hidden 开合、#rd-log-text pre 自动跟底、状态条各 id 原样 */
3197
+ #run-detail #rd-log.rd-logdrawer {
3198
+ border: 1px solid color-mix(in srgb, var(--border) 72%, var(--accent) 28%);
3199
+ border-bottom: none;
3200
+ border-radius: 12px 12px 0 0;
3201
+ background: var(--panel);
3202
+ box-shadow: 0 -10px 30px color-mix(in srgb, var(--text) 12%, transparent),
3203
+ 0 -2px 8px color-mix(in srgb, var(--accent) 8%, transparent);
3204
+ }
3205
+ #run-detail #rd-log.rd-logdrawer .log-live-bar {
3206
+ background: linear-gradient(180deg,
3207
+ color-mix(in srgb, var(--accent) 6%, var(--panel2)), var(--panel2));
3208
+ border-bottom: 1px solid var(--border);
3209
+ }
3210
+ #run-detail #rd-log.rd-logdrawer .log-live-bar > .ico { color: var(--accent); }
3211
+ #run-detail #rd-log.rd-logdrawer .rd-log-step { color: var(--accent); }
3212
+ #run-detail #rd-log.rd-logdrawer pre {
3213
+ color: color-mix(in srgb, var(--text) 88%, var(--muted));
3214
+ font-size: 12.5px;
3215
+ line-height: 1.65;
3216
+ background:
3217
+ linear-gradient(180deg, color-mix(in srgb, var(--accent) 3%, transparent), transparent 90px),
3218
+ var(--panel);
3219
+ }
3220
+ @media (prefers-reduced-motion: no-preference) {
3221
+ #run-detail #rd-log.rd-logdrawer:not(.hidden) { animation: cb-drawer-up .26s cubic-bezier(.22, .9, .3, 1); }
3222
+ }
3223
+ @keyframes cb-drawer-up {
3224
+ from { transform: translateY(16px); opacity: .35; }
3225
+ to { transform: translateY(0); opacity: 1; }
3226
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebee",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "CodeBee · 多智能体编排台 — 统一编排本机 AI 编码 CLI(Codex / Claude Code / QwenCode / OpenCode / Aider…):目标→拆解→路由→执行→验证→跨厂商评审→修复→报告。纯 Python 标准库实现,本地 Web UI。",
5
5
  "license": "MIT",
6
6
  "bin": {