codebee 0.1.66 → 0.1.67

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/i18n.js CHANGED
@@ -11,6 +11,32 @@
11
11
  // 字典:键 = 中文原文;值 = 英文译文。未命中即回落中文。
12
12
  const EN = {
13
13
  // —— 短片段(拼接用)——
14
+ "检查中…": "Checking…",
15
+ "已安装 ": "Installed ",
16
+ "…等 ": "…and ",
17
+ "…等共 ": "…plus ",
18
+ "文件": "File",
19
+ "体量": "Size",
20
+ "包含技能:": "Skills included: ",
21
+ "确认安装": "Confirm install",
22
+
23
+ // —— 市场安装预览(先看后装)——
24
+ "安装前确认": "Pre-install confirmation",
25
+ "正在下载插件包做安装前检查,包较大时需要约一分钟…": "Downloading the plugin package for a pre-install check; large packages may take about a minute…",
26
+ "sha256 已校验": "sha256 verified",
27
+ "无哈希(HTTPS 传输 + 纯技能白名单兜底)": "No hash (HTTPS transport + pure-skill whitelist as backstop)",
28
+ "按 git ref 锁定": "Pinned by git ref",
29
+ "跟随仓库 HEAD": "Tracks repository HEAD",
30
+ "将自动剥离(不写入、不执行):": "Will be stripped automatically (never written or executed): ",
31
+ "安装后运行任务时自动注入提示词;可到「经验库」启停或卸载。": "After install, content is injected into matching task prompts automatically; enable/disable/uninstall it in \"Skill library\".",
32
+ "只看已安装的外部插件": "Show only installed external plugins",
33
+ "还没有从外部目录安装过插件;退出过滤后逛逛目录,安装前会先给你看包内容。": "No external plugins installed yet; clear this filter to browse the catalog — installs always show package contents first.",
34
+ "渲染中…": "Rendering…",
35
+ "docx 预览不可用(渲染器需联网首次加载);可下载后查看。": "docx preview unavailable (renderer needs network on first load); download to view instead.",
36
+ "PDF 预览不可用(渲染器需联网首次加载);可下载后查看。": "PDF preview unavailable (renderer needs network on first load); download to view instead.",
37
+ "表格预览不可用(渲染器需联网首次加载);可下载后查看。": "Spreadsheet preview unavailable (renderer needs network on first load); download to view instead.",
38
+ "仅渲染前 {0} 页(共 {1} 页),完整内容请下载。": "Rendering first {0} of {1} pages only; download for the full document.",
39
+ "已截断:仅显示前 {0} 行 × {1} 列;完整内容请下载。": "Truncated: showing first {0} rows × {1} columns only; download for the full sheet.",
14
40
 
15
41
  // —— 用量统计图表 ——
16
42
 
@@ -860,6 +886,7 @@
860
886
  "大纲 → 逐章起草评审 → 合并(可续跑)": "Outline → per-chapter draft & review → merge (resumable)",
861
887
  "≈{0} tokens · {1}次": "≈{0} tokens · {1} runs",
862
888
  "实际派发模型": "Dispatched model",
889
+ "实际用上游(厂商@网关)": "Actual upstream (provider@gateway)",
863
890
  "大纲": "Outline",
864
891
  "修复": "Fix",
865
892
  "验证": "Verify",
@@ -1638,8 +1665,18 @@
1638
1665
  "评分点覆盖": "Scoring coverage",
1639
1666
  "商务清晰度": "Commercial clarity",
1640
1667
  "扫榜选材": "Rank Scan for Topics",
1641
- "抓取七猫+番茄排行榜公开数据 → AI 提炼跨平台热门题材/人设/差异化切入点(快档直出报告)": "Grabs public Qimao + Fanqie ranking data → AI distills cross-platform hot genres / character archetypes / differentiation angles (fast lane, report straight out)",
1668
+ "抓取七猫/番茄/起点/纵横四平台排行榜公开数据 → AI 提炼跨平台热门题材/人设/差异化切入点(快档直出报告)": "Grabs public rankings from Qimao / Fanqie / Qidian / Zongheng → AI distills cross-platform hot genres / character archetypes / differentiation angles (fast lane, report straight out)",
1642
1669
  "想写哪个方向(一句话,可留空默认分析总榜热门题材)": "Which direction to write (one sentence; leave empty to analyze the overall hot genres)",
1670
+ "缺陷复盘": "Defect Retrospective",
1671
+ "读取附带的缺陷导出数据 → AI 输出产品/开发/测试三视角复盘报告:整体画像、根因聚类、漏测分析、改进动作(快档直出报告)": "Reads the attached defect export → AI produces a Product/Dev/QA three-lens retrospective: overall profile, root-cause clusters, missed-test analysis, improvement actions (fast lane, report straight out)",
1672
+ "复盘哪个版本/时间段的缺陷(建议附带禅道或 Jira 导出 CSV)": "Which version/time window to retrospect (attaching a ZenTao or Jira CSV export is recommended)",
1673
+ "与上一版对比": "Diff vs previous run",
1674
+ "对比": "Diff",
1675
+ "两版内容一致。": "The two versions are identical.",
1676
+ "正在取两版内容…": "Fetching both versions…",
1677
+ "{0} 行相同(已折叠)": "{0} unchanged lines (collapsed)",
1678
+ "变更过大(旧 {0} 行 → 新 {1} 行),不逐行对齐;可分别打开两版查看。": "Change too large (old {0} → new {1} lines); no line-by-line alignment. Open each version separately to compare.",
1679
+ "文件过大,不在线对比;可分别打开两版查看。": "File too large for an online diff; open each version separately.",
1643
1680
 
1644
1681
  // —— 插件市场远程来源名(market_remote.py)——
1645
1682
  "ZCode 官方": "ZCode Official",
@@ -2211,6 +2248,19 @@
2211
2248
  "保存失败": "Save failed",
2212
2249
  "失败 ": "Failed ",
2213
2250
 
2251
+ // —— 任务总时限(任务信息弹层,空闲可改)——
2252
+ "任务总时限": "Task time limit",
2253
+ "30 分钟": "30 min",
2254
+ "1 小时": "1 hour",
2255
+ "2 小时": "2 hours",
2256
+ "3 小时": "3 hours",
2257
+ "4 小时": "4 hours",
2258
+ "6 小时": "6 hours",
2259
+ "12 小时": "12 hours",
2260
+ "24 小时": "24 hours",
2261
+ "自定义 ": "Custom · ",
2262
+ "单次运行的总时间预算;超时即中断(连载断点续跑,已完成章不重写)。空闲时可改,下次运行生效": "Total wall-clock budget per run; the run stops when it is exhausted (serial novels resume from finished chapters). Editable while idle, effective on the next run",
2263
+
2214
2264
  // —— 引擎调参(设置 v2,label 来自后端 schema description)——
2215
2265
  "编排引擎": "Orchestration engine",
2216
2266
  "预算": "Budget",
package/app/ui/index.html CHANGED
@@ -526,6 +526,10 @@
526
526
  <div id="rd-meta-popover" class="rd-meta-popover hidden" role="dialog" aria-label="任务信息" data-i18n-aria="任务信息">
527
527
  <div class="rd-meta-popover-head"><span data-i18n="任务信息">任务信息</span><button id="rd-more-close" type="button" class="ghost" aria-label="关闭" data-i18n-aria="关闭">×</button></div>
528
528
  <div id="rd-meta" class="stats rd-meta-strip"></div>
529
+ <div id="rd-timeout-row" class="rd-timeout-row hidden">
530
+ <label for="rd-timeout" data-i18n="任务总时限">任务总时限</label>
531
+ <select id="rd-timeout" data-i18n-title="单次运行的总时间预算;超时即中断(连载断点续跑,已完成章不重写)。空闲时可改,下次运行生效"></select>
532
+ </div>
529
533
  <div id="rd-overview" class="rd-overview hidden" aria-live="polite"></div>
530
534
  </div>
531
535
  </div>
@@ -911,6 +915,7 @@
911
915
  <input id="mkr-search" type="search" placeholder="搜索外部插件…" data-i18n-ph="搜索外部插件…" autocomplete="off">
912
916
  <button id="mkr-search-btn" class="ghost small" title="搜索" data-i18n-title="搜索" aria-label="搜索" data-i18n-aria="搜索"><svg class="ico" aria-hidden="true"><use href="#i-search"></use></svg><span data-i18n="搜索">搜索</span></button>
913
917
  <select id="mkr-source" aria-label="来源" data-i18n-aria="来源"></select>
918
+ <button id="mkr-installed" class="ghost small" title="只看已安装的外部插件" data-i18n-title="只看已安装的外部插件" aria-pressed="false">已安装</button>
914
919
  <button id="mkr-refresh" class="ghost small" data-i18n="拉取更新">拉取更新</button>
915
920
  </div>
916
921
  <div id="mkr-meta" class="hint mkr-meta"></div>
@@ -1330,6 +1335,7 @@
1330
1335
 
1331
1336
  <script src="qrcode.js"></script>
1332
1337
  <script src="i18n.js"></script>
1338
+ <script src="artdiff.js"></script>
1333
1339
  <script src="app.js"></script>
1334
1340
  </body>
1335
1341
  </html>
package/app/ui/style.css CHANGED
@@ -18,6 +18,7 @@
18
18
  --log-bg: #161616;
19
19
  --log-text: #c3c9d6;
20
20
  --shadow: 0 18px 48px rgba(7, 19, 38, .16);
21
+ --mask: rgba(0, 0, 0, .5);
21
22
  --mono: "Cascadia Code", Consolas, monospace;
22
23
  --font-ui: "Aptos", "Segoe UI", sans-serif;
23
24
  --font-display: "Aptos Display", "Trebuchet MS", sans-serif;
@@ -1134,7 +1135,7 @@ body.inspector-open #inspector { display: flex; }
1134
1135
  }
1135
1136
  body.inspector-open #insp-mask {
1136
1137
  display: block; position: fixed; inset: 0; z-index: 55;
1137
- background: rgba(0, 0, 0, .45);
1138
+ background: var(--mask);
1138
1139
  }
1139
1140
  }
1140
1141
 
@@ -1155,7 +1156,7 @@ body.inspector-open #inspector { display: flex; }
1155
1156
  body:not(.side-collapsed) #sidebar { transform: none; }
1156
1157
  body:not(.side-collapsed) #drawer-mask {
1157
1158
  display: block; position: fixed; inset: 0; z-index: 55;
1158
- background: rgba(0, 0, 0, .45);
1159
+ background: var(--mask);
1159
1160
  }
1160
1161
  main { padding: 18px 14px 70px; }
1161
1162
  .panel { padding: 16px; }
@@ -1424,7 +1425,7 @@ details.prow-hidden[open] > summary { margin-bottom: 6px; }
1424
1425
 
1425
1426
  /* ---- 通用弹框 ---- */
1426
1427
  .modal-wrap { position: fixed; inset: 0; z-index: 200; display: flex; align-items: center; justify-content: center; padding: 24px; }
1427
- .modal-mask { position: absolute; inset: 0; background: rgba(0, 0, 0, .5); }
1428
+ .modal-mask { position: absolute; inset: 0; background: var(--mask); }
1428
1429
  .modal {
1429
1430
  position: relative; width: 100%; max-width: 620px; max-height: calc(100vh - 48px);
1430
1431
  display: flex; flex-direction: column; background: var(--bg);
@@ -1901,7 +1902,7 @@ html[data-theme="light"] .seg-btn.active { box-shadow: 0 1px 3px rgba(0, 0, 0, .
1901
1902
  * 层级 240:高于主 modal(200)、低于 #ask(250),Esc 逐层关 */
1902
1903
  #file-pop {
1903
1904
  position: fixed; inset: 0; z-index: 240; display: flex; align-items: center; justify-content: center;
1904
- padding: 4vh 4vw; background: rgba(0, 0, 0, 0.45);
1905
+ padding: 4vh 4vw; background: var(--mask);
1905
1906
  }
1906
1907
  #file-pop.hidden { display: none; }
1907
1908
  #file-pop .fp-panel {
@@ -2386,7 +2387,7 @@ html.code-wrap #file-pop .fp-ln { white-space: pre-wrap; word-break: break-word;
2386
2387
  /* ============ 命令面板(Ctrl+K / 侧栏搜索行唤起)============ */
2387
2388
  .cmdk-mask {
2388
2389
  position: fixed; inset: 0; z-index: 300;
2389
- background: rgba(0, 0, 0, .45); backdrop-filter: blur(2px);
2390
+ background: var(--mask); backdrop-filter: blur(2px);
2390
2391
  display: flex; align-items: flex-start; justify-content: center; padding-top: 11vh;
2391
2392
  }
2392
2393
  .cmdk-mask.hidden { display: none; }
@@ -2589,15 +2590,15 @@ details.sf-dir > summary i, a.sf-file i { font-style: normal; color: var(--muted
2589
2590
  user-select: none;
2590
2591
  }
2591
2592
  .health-banner.alerting {
2592
- background: rgba(220, 38, 38, 0.14);
2593
- color: #dc2626;
2594
- border: 1px solid rgba(220, 38, 38, 0.45);
2593
+ background: color-mix(in srgb, var(--bad) 14%, transparent);
2594
+ color: var(--bad);
2595
+ border: 1px solid color-mix(in srgb, var(--bad) 45%, transparent);
2595
2596
  animation: health-pulse 2s ease-in-out infinite;
2596
2597
  }
2597
2598
  .health-banner.recovered {
2598
- background: rgba(34, 197, 94, 0.12);
2599
- color: #16a34a;
2600
- border: 1px solid rgba(34, 197, 94, 0.4);
2599
+ background: color-mix(in srgb, var(--ok) 12%, transparent);
2600
+ color: var(--ok);
2601
+ border: 1px solid color-mix(in srgb, var(--ok) 40%, transparent);
2601
2602
  }
2602
2603
  @keyframes health-pulse {
2603
2604
  0%, 100% { opacity: 1; }
@@ -2612,15 +2613,15 @@ details.sf-dir > summary i, a.sf-file i { font-style: normal; color: var(--muted
2612
2613
 
2613
2614
  /* ---- 供应商健康告警弹框:禁用厂商的危险按钮 ---- */
2614
2615
  .modal-foot button.danger {
2615
- background: rgba(220, 38, 38, 0.12);
2616
- color: #dc2626;
2617
- border: 1px solid rgba(220, 38, 38, 0.45);
2616
+ background: color-mix(in srgb, var(--bad) 12%, transparent);
2617
+ color: var(--bad);
2618
+ border: 1px solid color-mix(in srgb, var(--bad) 45%, transparent);
2618
2619
  }
2619
- .modal-foot button.danger:hover { background: rgba(220, 38, 38, 0.22); }
2620
+ .modal-foot button.danger:hover { background: color-mix(in srgb, var(--bad) 22%, transparent); }
2620
2621
 
2621
2622
  /* 运行中指挥:未消费指令的撤回按钮(贴右侧,hover 提亮) */
2622
2623
  .rd-msg .m-retract { float: right; margin-left: 8px; padding: 0 7px; font-size: 11.5px; opacity: .8; }
2623
- .rd-msg .m-retract:hover { opacity: 1; color: #dc2626; border-color: rgba(220, 38, 38, .45); }
2624
+ .rd-msg .m-retract:hover { opacity: 1; color: var(--bad); border-color: color-mix(in srgb, var(--bad) 45%, transparent); }
2624
2625
 
2625
2626
  /* 外部目录滚动分页:续页提示行 + 哨兵(追加于文件尾,防并行重排) */
2626
2627
  .mkr-more { display: flex; align-items: center; justify-content: center; gap: 10px; padding: 10px 0 2px; }
@@ -5010,7 +5011,7 @@ html::-webkit-scrollbar-track { background: transparent; }
5010
5011
 
5011
5012
  /* ---- 帮助中心(首启欢迎引导升级版):左目录右内容,随皮肤 accent ---- */
5012
5013
  .welcome-wrap { position: fixed; inset: 0; z-index: 195; display: flex; align-items: center; justify-content: center; padding: 24px; }
5013
- .welcome-mask { position: absolute; inset: 0; background: rgba(0, 0, 0, .5); }
5014
+ .welcome-mask { position: absolute; inset: 0; background: var(--mask); }
5014
5015
  .welcome-card {
5015
5016
  position: relative; display: flex; width: min(920px, 100%); height: min(620px, calc(100vh - 48px));
5016
5017
  background: var(--bg); border: 1px solid var(--border-strong);
@@ -5338,7 +5339,7 @@ body.welcome-open { overflow: hidden; }
5338
5339
  flex-direction: column; gap: 10px; min-height: 46px; }
5339
5340
  .bee-digest { border: 1px solid var(--border); border-radius: var(--r-md); padding: 8px 10px; }
5340
5341
  .bee-digest-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 6px; }
5341
- .bee-tag { background: rgba(245, 185, 66, .16); color: var(--warn);
5342
+ .bee-tag { background: color-mix(in srgb, var(--warn) 16%, transparent); color: var(--warn);
5342
5343
  border-radius: 6px; padding: 1px 8px; font-size: 12px; font-weight: 600; }
5343
5344
  .bee-meta { font-size: 11.5px; color: var(--muted); }
5344
5345
  .bee-text { font-size: 12.5px; line-height: 1.55; white-space: pre-wrap;
@@ -5382,7 +5383,7 @@ body.welcome-open { overflow: hidden; }
5382
5383
  .bee-g { display: flex; align-items: center; gap: 8px; padding: 3px 6px;
5383
5384
  border-radius: 6px; cursor: pointer; font-size: 12.5px; }
5384
5385
  .bee-g:hover { background: var(--panel2); }
5385
- .bee-g.on { background: rgba(245, 185, 66, .12); }
5386
+ .bee-g.on { background: color-mix(in srgb, var(--warn) 12%, transparent); }
5386
5387
  .bee-g span:first-of-type { flex: 1; overflow: hidden; text-overflow: ellipsis;
5387
5388
  white-space: nowrap; }
5388
5389
  .bee-g input { flex: none; }
@@ -6091,10 +6092,10 @@ button.request-busy > * { opacity: .18; }
6091
6092
  .outcome-warn {
6092
6093
  margin-top: 8px;
6093
6094
  padding: 8px 10px;
6094
- border: 1px solid rgba(217, 119, 6, .45);
6095
+ border: 1px solid color-mix(in srgb, var(--warn) 45%, transparent);
6095
6096
  border-radius: 8px;
6096
- background: rgba(217, 119, 6, .08);
6097
- color: #b45309;
6097
+ background: color-mix(in srgb, var(--warn) 8%, transparent);
6098
+ color: var(--warn);
6098
6099
  font-size: 12px;
6099
6100
  line-height: 1.5;
6100
6101
  }
@@ -6102,6 +6103,77 @@ button.request-busy > * { opacity: .18; }
6102
6103
  /* 「完成·未达标」:跑完但评审未过——不用成功绿,用琥珀警告色(2026-09-23
6103
6104
  * 禅道双单实案:用户把未达标误读成修好了) */
6104
6105
  .chip.done.unqualified {
6105
- background: color-mix(in srgb, #d97706 16%, transparent);
6106
- color: #b45309;
6106
+ background: color-mix(in srgb, var(--warn) 16%, transparent);
6107
+ color: var(--warn);
6108
+ }
6109
+
6110
+ /* ---- 市场安装预览弹框(先看后装,两阶段确认;追加于文件尾防并行重排) ---- */
6111
+ .mkpv-name { font-size: 14px; font-weight: 700; margin-bottom: 4px; }
6112
+ .mkpv-meta { display: flex; flex-wrap: wrap; gap: 6px 14px; font-size: 12.5px; color: var(--muted); margin-bottom: 8px; }
6113
+ .mkpv-skills { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 0 0 8px; font-size: 12.5px; }
6114
+ .mkpv-sum { font-size: 12.5px; color: var(--muted); margin-bottom: 6px; }
6115
+ .mkpv-files { width: 100%; border-collapse: collapse; font-family: var(--mono); font-size: 11.5px; margin: 4px 0 10px; }
6116
+ .mkpv-files th { text-align: left; font-family: var(--font-ui); font-size: 11.5px; color: var(--muted); font-weight: 600; padding: 2px 10px 4px 0; border-bottom: 1px solid var(--border-strong); }
6117
+ .mkpv-files td { padding: 2px 10px 2px 0; border-bottom: 1px solid var(--border); max-width: 400px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
6118
+ .mkpv-files td.mkpv-chars { color: var(--muted); white-space: nowrap; text-align: right; }
6119
+ .mkpv-files td.mkpv-more, .mkpv-strip li.mkpv-more { color: var(--muted); list-style: none; }
6120
+ .mkpv-sec { font-size: 12.5px; color: var(--warn); margin: 6px 0 4px; }
6121
+ .mkpv-strip { margin: 2px 0 8px 16px; padding: 0; font-family: var(--mono); font-size: 11.5px; color: var(--muted); max-height: 110px; overflow: auto; }
6122
+ .mkpv-strip li { margin: 1px 0; }
6123
+
6124
+ /* 「已安装 N」过滤入口:active 时随 accent 提亮 */
6125
+ #mkr-installed.active { border-color: color-mix(in srgb, var(--accent) 55%, transparent); color: var(--accent); }
6126
+
6127
+ /* ---- docx 只读预览(渲染器注入的 .docx-wrapper 改随皮肤;纸面保持白——
6128
+ * 文档画布是内容不是 UI,白底是刻意的(令牌规则豁免项)) ---- */
6129
+ #file-pop .fp-docx { min-height: 100%; padding: 12px; }
6130
+ #file-pop .fp-docx .docx-wrapper { background: transparent; padding: 0; }
6131
+ #file-pop .fp-docx .docx-wrapper > section.docx {
6132
+ background: #fff; color: #000; margin-bottom: 14px;
6133
+ box-shadow: 0 2px 12px rgba(0, 0, 0, .3);
6134
+ }
6135
+ #file-pop .fp-docx-load { padding: 24px 18px; color: var(--muted); font-size: 12.5px; }
6136
+
6137
+ /* 步骤卡「实际用上游」小徽章(借鉴 WorkDSH ResolvedExecutionBinding,追加于文件尾
6138
+ * 防并行重排):与 st-model 同族但用独立类名——ui_hive_model_think 断言
6139
+ * .st-model 徽章数,复用类名会破锚点。虚线边框与模型徽章区分。 */
6140
+ .step .st-prov {
6141
+ font-size: 10.5px; color: var(--muted); opacity: .85;
6142
+ border: 1px dashed var(--border); border-radius: 999px; padding: 0 7px; line-height: 16px;
6143
+ max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
6144
+ }
6145
+
6146
+ /* PDF/xlsx 只读预览(成品弹窗,WorkDSH「真任务以可读产物收尾」切片;
6147
+ * 追加于文件尾防并行重排)。PDF 纸面白底与 docx 同理:文档画布是内容不是 UI */
6148
+ #file-pop .fp-pdf { padding: 12px; display: flex; flex-direction: column; align-items: center; gap: 12px; }
6149
+ #file-pop .fp-pdf canvas.fp-pdf-page {
6150
+ background: #fff; box-shadow: 0 2px 12px rgba(0, 0, 0, .3); max-width: 100%;
6151
+ }
6152
+ #file-pop .fp-xlsx { padding: 12px; overflow: auto; }
6153
+ .fp-xls-tabs { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
6154
+ .fp-xls-tabs .fp-xls-tab.active {
6155
+ border-color: color-mix(in srgb, var(--accent) 55%, transparent);
6156
+ color: var(--accent);
6107
6157
  }
6158
+ table.fp-xls { border-collapse: collapse; font-family: var(--mono); font-size: 11.5px; }
6159
+ .fp-xls th, .fp-xls td {
6160
+ border: 1px solid var(--border); padding: 2px 8px; white-space: nowrap;
6161
+ max-width: 320px; overflow: hidden; text-overflow: ellipsis;
6162
+ }
6163
+ .fp-xls th { color: var(--muted); font-weight: 600; font-family: var(--font-ui); }
6164
+
6165
+ /* ---------------- 成品两版对比(artdiff.js + artifactDiffBody) ----------------
6166
+ * 行色复用 insp-plus/insp-minus 同源变量(var(--ok)/var(--bad)),随皮肤走。 */
6167
+ .art-diff { margin: 0; padding: 6px 0 10px; font-family: var(--mono); font-size: 12px; line-height: 1.6; }
6168
+ .art-diff .dl-ln { display: flex; gap: 8px; padding: 0 14px; white-space: pre-wrap; word-break: break-word; }
6169
+ .art-diff .dl-ln i { flex: none; width: 12px; text-align: center; font-style: normal; opacity: .75; }
6170
+ .art-diff .dl-eq { color: var(--muted); }
6171
+ .art-diff .dl-add { color: var(--ok); background: color-mix(in srgb, var(--ok) 10%, transparent); }
6172
+ .art-diff .dl-del { color: var(--bad); background: color-mix(in srgb, var(--bad) 10%, transparent); text-decoration: none; }
6173
+ .art-diff .dl-gap { padding: 4px 14px; color: var(--muted); font-family: var(--font-ui); font-size: 11px; opacity: .85; }
6174
+
6175
+ /* 任务总时限行(任务信息弹层内,rd-meta 下方独立一行;不随轮询重建) */
6176
+ .rd-timeout-row { display: flex; align-items: center; gap: 8px; padding: 8px 14px; border-top: 1px solid var(--hairline, rgba(128,128,128,.18)); font-size: 12px; }
6177
+ .rd-timeout-row label { color: var(--muted); white-space: nowrap; }
6178
+ .rd-timeout-row select { flex: 0 0 auto; min-width: 96px; }
6179
+ .rd-timeout-row select:disabled { opacity: .55; cursor: not-allowed; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebee",
3
- "version": "0.1.66",
3
+ "version": "0.1.67",
4
4
  "description": "CodeBee · 多智能体编排台 — 统一编排本机 AI 编码 CLI(Codex / Claude Code / QwenCode / OpenCode / Aider…):目标→拆解→路由→执行→验证→跨厂商评审→修复→报告。纯 Python 标准库实现,本地 Web UI。",
5
5
  "license": "MIT",
6
6
  "bin": {