codebee 0.1.69 → 0.1.71

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.
Files changed (133) hide show
  1. package/CHANGELOG.md +589 -543
  2. package/LICENSE +21 -21
  3. package/README.md +509 -508
  4. package/app/.playwright-cli/console-2026-09-23T08-26-03-635Z.log +88 -0
  5. package/app/.playwright-cli/page-2026-09-23T08-26-03-845Z.yml +126 -0
  6. package/app/.playwright-cli/page-2026-09-23T08-29-44-203Z.png +0 -0
  7. package/app/.playwright-cli/page-2026-09-23T08-35-42-046Z.yml +210 -0
  8. package/app/.playwright-cli/page-2026-09-23T08-36-52-858Z.png +0 -0
  9. package/app/.playwright-cli/page-2026-09-23T08-37-33-938Z.png +0 -0
  10. package/app/.playwright-cli/run-detail-after.png +0 -0
  11. package/app/browser-final-1440.png +0 -0
  12. package/app/browser-final-390.png +0 -0
  13. package/app/browser-google-fallback.png +0 -0
  14. package/app/browser-google-test.png +0 -0
  15. package/app/browser-workbench-1440.png +0 -0
  16. package/app/browser-workbench-390.png +0 -0
  17. package/app/browser-workspace-google.png +0 -0
  18. package/app/browser-workspace-smoke.png +0 -0
  19. package/app/browser-workspace.png +0 -0
  20. package/app/core/acceptance.py +100 -100
  21. package/app/core/aiflavor.py +197 -197
  22. package/app/core/artifacts.py +148 -148
  23. package/app/core/assets.py +110 -110
  24. package/app/core/attachments.py +623 -623
  25. package/app/core/audit.py +30 -0
  26. package/app/core/automation.py +107 -12
  27. package/app/core/backup.py +470 -470
  28. package/app/core/beekeeper.py +183 -183
  29. package/app/core/benchstore.py +95 -0
  30. package/app/core/board.py +209 -209
  31. package/app/core/bookmeta.py +935 -930
  32. package/app/core/bookmeta_catalog.py +180 -180
  33. package/app/core/branching.py +137 -137
  34. package/app/core/builtin_agent.py +1673 -1234
  35. package/app/core/capability.py +144 -144
  36. package/app/core/catalog.py +7 -1
  37. package/app/core/chaptersafe.py +32 -32
  38. package/app/core/cleanup.py +303 -303
  39. package/app/core/compaction.py +201 -201
  40. package/app/core/covergen.py +356 -356
  41. package/app/core/defectretro.py +43 -43
  42. package/app/core/diagnostics.py +114 -114
  43. package/app/core/dispatch.py +190 -173
  44. package/app/core/dispatch_log.py +128 -128
  45. package/app/core/env_scrub.py +85 -85
  46. package/app/core/error_codes.py +11 -2
  47. package/app/core/errorlog.py +137 -137
  48. package/app/core/evalbench.py +720 -0
  49. package/app/core/evaluation.py +174 -174
  50. package/app/core/failure_notify.py +290 -290
  51. package/app/core/flows.py +234 -9
  52. package/app/core/goal_service.py +167 -167
  53. package/app/core/health.py +374 -374
  54. package/app/core/history.py +38 -38
  55. package/app/core/hooks.py +162 -162
  56. package/app/core/jobs.py +22 -1
  57. package/app/core/manager.py +2143 -2122
  58. package/app/core/market_remote.py +10 -0
  59. package/app/core/mcp_client.py +287 -0
  60. package/app/core/mocks.py +64 -64
  61. package/app/core/modelhub.py +185 -2
  62. package/app/core/notify.py +201 -106
  63. package/app/core/novel_quality.py +189 -0
  64. package/app/core/operations.py +228 -228
  65. package/app/core/paihang.py +138 -138
  66. package/app/core/paths.py +4 -0
  67. package/app/core/pipeline.py +426 -28
  68. package/app/core/planner.py +243 -22
  69. package/app/core/plugins.py +525 -0
  70. package/app/core/portguard.py +111 -111
  71. package/app/core/preview.py +293 -293
  72. package/app/core/publish/__init__.py +7 -7
  73. package/app/core/publish/auto.py +367 -367
  74. package/app/core/publish/browser.py +655 -539
  75. package/app/core/publish/fanqie.py +165 -159
  76. package/app/core/publish/flow.py +589 -440
  77. package/app/core/publish/flows-fanqie-calibrated.json +336 -332
  78. package/app/core/publish/ledger.py +229 -203
  79. package/app/core/publish/manager.py +824 -692
  80. package/app/core/publish/qimao.py +146 -141
  81. package/app/core/publish/ws.py +139 -139
  82. package/app/core/redact.py +38 -38
  83. package/app/core/remotesync.py +121 -0
  84. package/app/core/repeat_guard.py +129 -129
  85. package/app/core/router.py +398 -398
  86. package/app/core/runner.py +2142 -2067
  87. package/app/core/selfupdate.py +384 -384
  88. package/app/core/session_log.py +161 -161
  89. package/app/core/sessions.py +312 -312
  90. package/app/core/settings.py +42 -4
  91. package/app/core/settings_schema.py +270 -262
  92. package/app/core/share_page.py +114 -114
  93. package/app/core/skill_scan.py +122 -122
  94. package/app/core/skillpacks/fanqie-novel.md +80 -80
  95. package/app/core/skillpacks/market/character-bible.md +66 -66
  96. package/app/core/skillpacks/market/code-risk-checklist.md +58 -58
  97. package/app/core/skillpacks/market/git-workflow.md +57 -57
  98. package/app/core/skillpacks/market/release-notes.md +72 -72
  99. package/app/core/skillpacks/market/weekly-report.md +71 -71
  100. package/app/core/skillpacks/market/worldview-consistency.md +70 -70
  101. package/app/core/step_runner.py +132 -132
  102. package/app/core/store.py +30 -8
  103. package/app/core/task_compile.py +199 -199
  104. package/app/core/telemetry.py +292 -292
  105. package/app/core/tlsctx.py +64 -64
  106. package/app/core/token_meter.py +147 -147
  107. package/app/core/tracing.py +144 -144
  108. package/app/core/upstream.py +41 -41
  109. package/app/core/usage.py +1035 -862
  110. package/app/core/volumes.py +389 -389
  111. package/app/core/wxdigest.py +858 -858
  112. package/app/core/zentao.py +2614 -2465
  113. package/app/current-browser.png +0 -0
  114. package/app/main.py +316 -17
  115. package/app/mcp_server.py +175 -0
  116. package/app/pet.py +83 -22
  117. package/app/pick_dialog.py +110 -110
  118. package/app/plugins/code-review-helper/.codex-plugin/plugin.json +18 -0
  119. package/app/plugins/code-review-helper/skills/review.md +16 -0
  120. package/app/ui/app.js +1391 -77
  121. package/app/ui/artdiff.js +74 -74
  122. package/app/ui/board.html +162 -162
  123. package/app/ui/board.js +305 -305
  124. package/app/ui/i18n.js +249 -7
  125. package/app/ui/icons/bee.svg +79 -79
  126. package/app/ui/index.html +277 -13
  127. package/app/ui/manifest.json +16 -16
  128. package/app/ui/qrcode.js +2297 -2297
  129. package/app/ui/style.css +845 -12
  130. package/app//344/275/234/345/223/201/344/277/241/346/201/257-/344/270/203/347/214/253.md +18 -0
  131. package/bin/tutti.js +147 -147
  132. package/package.json +47 -46
  133. package/tools/wx_reader.py +261 -261
package/app/ui/index.html CHANGED
@@ -55,6 +55,10 @@
55
55
  <symbol id="i-workflow" viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="7" rx="1.5"/><rect x="14" y="14" width="7" height="7" rx="1.5"/><path d="M10 6.5h4a3 3 0 0 1 3 3V14"/></symbol>
56
56
  <symbol id="i-phone" viewBox="0 0 24 24"><rect x="5" y="2" width="14" height="20" rx="2.5"/><path d="M12 18h.01"/></symbol>
57
57
  <symbol id="i-arrow-left" viewBox="0 0 24 24"><path d="M19 12H5"/><path d="m12 19-7-7 7-7"/></symbol>
58
+ <symbol id="i-arrow-right" viewBox="0 0 24 24"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></symbol>
59
+ <symbol id="i-home" viewBox="0 0 24 24"><path d="m3 11 9-8 9 8"/><path d="M5 10v10h14V10"/><path d="M9 20v-6h6v6"/></symbol>
60
+ <symbol id="i-external" viewBox="0 0 24 24"><path d="M14 3h7v7"/><path d="m21 3-9 9"/><path d="M19 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h6"/></symbol>
61
+ <symbol id="i-browser" viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9h18"/><path d="M7 6.5h.01M10 6.5h.01M13 6.5h.01"/></symbol>
58
62
  <symbol id="i-menu" viewBox="0 0 24 24"><path d="M4 6h16"/><path d="M4 12h16"/><path d="M4 18h16"/></symbol>
59
63
  <symbol id="i-moon" viewBox="0 0 24 24"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></symbol>
60
64
  <symbol id="i-globe" viewBox="0 0 24 24"><path d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm0 2c1.9 0 3.6 2.8 4 6.5h-8c.4-3.7 2.1-6.5 4-6.5ZM4.3 10.5h2.7c-.1 1-.1 2 0 3H4.3a8 8 0 0 1 0-3Zm.8-2a8 8 0 0 1 4-4.2c-1 1.3-1.8 3-2.1 4.2H5.1Zm-1 7h2c.3 1.3 1 3 2.1 4.2a8 8 0 0 1-4-4.2Zm2-2a17 17 0 0 1 0-3h8a17 17 0 0 1 0 3h-8Zm2.9 6.2c-1-1.2-1.8-2.9-2.1-4.2h1.9c.3 1.2 1.1 3 2.1 4.2a8 8 0 0 1-1.9 0Zm3 0c-1-.5-2-2.6-2.4-4.2h4.8c-.4 1.6-1.4 3.7-2.4 4.2Zm1.9-.2c1-1.2 1.8-2.9 2.1-4.2h2a8 8 0 0 1-4.1 4.2Zm4.4-6.2h-2.7c.1-1 .1-2 0-3h2.7a8 8 0 0 1 0 3Zm-2.4-5a11 11 0 0 0-2-4.2 8 8 0 0 1 4 4.2h-2Z"/><path d="M7 10.5h10M7 13.5h10" fill="none" stroke="currentColor" stroke-width=".8" opacity=".45"/></symbol><symbol id="i-palette" viewBox="0 0 24 24"><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"/><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"/><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"/><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"/><path d="M12 2a10 10 0 0 0 0 20 2 2 0 0 0 2-2v-1a2 2 0 0 1 2-2h1.5A4.5 4.5 0 0 0 22 12.5C22 6.7 17.5 2 12 2Z"/></symbol>
@@ -102,18 +106,54 @@
102
106
  <div id="drawer-mask" aria-hidden="true"></div>
103
107
  <div id="app">
104
108
 
109
+ <!-- Codex 式一级导航:保留原有侧栏功能,增加一条可快速切换主视图的窄轨道。 -->
110
+ <nav class="side-rail" aria-label="主导航">
111
+ <button type="button" class="rail-btn active" data-rail-page="tasks" title="任务" aria-label="任务" data-i18n-title="任务" data-i18n-aria="任务" onclick="exitSettings()">
112
+ <svg class="ico" aria-hidden="true"><use href="#i-gauge"></use></svg>
113
+ </button>
114
+ <button type="button" class="rail-btn" data-rail-page="runs" title="运行记录" aria-label="运行记录" data-i18n-title="运行记录" data-i18n-aria="运行记录" onclick="switchTab('runs')">
115
+ <svg class="ico" aria-hidden="true"><use href="#i-history"></use></svg>
116
+ </button>
117
+ <button type="button" class="rail-btn" data-rail-page="automation" title="自动化" aria-label="自动化" data-i18n-title="自动化" data-i18n-aria="自动化" onclick="switchTab('automation')">
118
+ <svg class="ico" aria-hidden="true"><use href="#i-calendar-days"></use></svg>
119
+ </button>
120
+ <button type="button" class="rail-btn" id="btn-rail-browser" data-rail-page="browser" title="浏览器" aria-label="浏览器" data-i18n-title="浏览器" data-i18n-aria="浏览器" onclick="switchTab('browser', 'main')">
121
+ <svg class="ico" aria-hidden="true"><use href="#i-browser"></use></svg>
122
+ </button>
123
+ <span class="rail-spacer"></span>
124
+ <button type="button" class="rail-btn" title="设置" aria-label="设置" onclick="document.getElementById('btn-settings').click()">
125
+ <svg class="ico" aria-hidden="true"><use href="#i-gear"></use></svg>
126
+ </button>
127
+ </nav>
128
+
105
129
  <!-- ================= 侧栏 ================= -->
106
130
  <aside id="sidebar">
107
131
  <!-- 常规视图:任务树 -->
108
132
  <div class="side-main">
109
- <div class="brand" title="CodeBee · 多智能体编排台" data-i18n-title="CodeBee · 多智能体编排台">
110
- <span class="brand-name">CodeBee</span>
133
+ <div class="brand-row">
134
+ <button id="btn-brand" class="brand" type="button" title="切换工作区" aria-label="切换工作区" aria-haspopup="menu" aria-expanded="false" onclick="toggleBrandMenu()">
135
+ <span class="brand-name">CodeBee</span>
136
+ <svg class="ico brand-caret" aria-hidden="true"><use href="#i-chevron-r"></use></svg>
137
+ </button>
138
+ <button id="btn-notify-toggle" class="brand-tool" title="完成/待裁决提示音" aria-label="完成/待裁决提示音"
139
+ data-i18n-title="完成/待裁决提示音" data-i18n-aria="完成/待裁决提示音">
140
+ <svg class="ico" aria-hidden="true"><use href="#i-bell"></use></svg>
141
+ </button>
142
+ <button class="brand-tool side-search" id="btn-cmdk" title="搜索" aria-label="搜索" data-i18n-title="搜索">
143
+ <svg class="ico" aria-hidden="true"><use href="#i-search"></use></svg>
144
+ <span class="ss-label" data-i18n="搜索">搜索</span>
145
+ <span class="kbd" aria-hidden="true">Ctrl K</span>
146
+ </button>
147
+ </div>
148
+ <div id="brand-menu" class="brand-menu hidden" role="menu" aria-label="工作区">
149
+ <div class="brand-menu-item selected" role="menuitem">
150
+ <span><b>CodeBee</b><small>多智能体编排台</small></span>
151
+ <svg class="ico" aria-hidden="true"><use href="#i-check"></use></svg>
152
+ </div>
111
153
  </div>
112
- <button id="btn-new-task" class="new-task"><span class="nt-label" data-i18n="+ 新任务">+ 新任务</span><span class="kbd" aria-hidden="true">N</span></button>
113
- <button class="side-search" id="btn-cmdk" title="搜索" data-i18n-title="搜索">
114
- <svg class="ico" aria-hidden="true"><use href="#i-search"></use></svg>
115
- <span class="ss-label" data-i18n="搜索">搜索</span>
116
- <span class="kbd" aria-hidden="true">Ctrl K</span>
154
+ <button id="btn-new-task" class="new-task">
155
+ <svg class="ico" aria-hidden="true"><use href="#i-chat"></use></svg>
156
+ <span class="nt-label">新聊天</span><span class="kbd" aria-hidden="true">N</span>
117
157
  </button>
118
158
  <!-- 快捷导航:只放最常用的全局页(data-page 是页面 id 真源)。
119
159
  点它们只换主栏内容,左栏任务树原地不动(app.js switchTab 的 main 形态);
@@ -132,10 +172,14 @@
132
172
  <svg class="ico" aria-hidden="true"><use href="#i-calendar-days"></use></svg>
133
173
  <span data-i18n="自动化">自动化</span>
134
174
  </button>
175
+ <button class="qitem" id="btn-q-browser" data-page="browser" title="浏览器" data-i18n-title="浏览器">
176
+ <svg class="ico" aria-hidden="true"><use href="#i-browser"></use></svg>
177
+ <span data-i18n="浏览器">浏览器</span>
178
+ </button>
135
179
  </div>
136
180
  <div class="side-section tasks">
137
181
  <div class="side-label-row">
138
- <div data-i18n="任务" class="side-label">任务</div>
182
+ <div data-i18n="项目" class="side-label">项目</div>
139
183
  <button id="btn-side-expand" class="foot-btn notify-toggle" title="展开全部" aria-label="展开全部"
140
184
  data-i18n-title="展开全部" data-i18n-aria="展开全部">
141
185
  <svg class="ico" aria-hidden="true"><use href="#i-chevrons-d"></use></svg>
@@ -144,10 +188,6 @@
144
188
  data-i18n-title="显示已归档" data-i18n-aria="显示已归档">
145
189
  <svg class="ico" aria-hidden="true"><use href="#i-history"></use></svg>
146
190
  </button>
147
- <button id="btn-notify-toggle" class="foot-btn notify-toggle" title="完成/待裁决提示音" aria-label="完成/待裁决提示音"
148
- data-i18n-title="完成/待裁决提示音" data-i18n-aria="完成/待裁决提示音">
149
- <svg class="ico" aria-hidden="true"><use href="#i-bell"></use></svg>
150
- </button>
151
191
  </div>
152
192
  <div id="side-tasks" class="side-tasks"></div>
153
193
  </div>
@@ -212,6 +252,7 @@
212
252
  <button class="set-item" data-sub="knowledge" data-i18n="知识库"><svg class="ico" aria-hidden="true"><use href="#i-sigma"></use></svg>知识库</button>
213
253
  <button class="set-item" data-sub="market" data-i18n="插件市场"><svg class="ico" aria-hidden="true"><use href="#i-blocks"></use></svg>插件市场</button>
214
254
  <button class="set-item" data-sub="orch" data-i18n="编排设置"><svg class="ico" aria-hidden="true"><use href="#i-workflow"></use></svg>编排设置</button>
255
+ <button class="set-item" data-sub="evalbench" data-i18n="模型评测"><svg class="ico" aria-hidden="true"><use href="#i-gauge"></use></svg>模型评测</button>
215
256
  <div data-i18n="数据" class="set-group">数据</div>
216
257
  <button class="set-item" data-sub="data" data-i18n="数据与备份"><svg class="ico" aria-hidden="true"><use href="#i-library"></use></svg>数据与备份</button>
217
258
  <div data-i18n="外观" class="set-group">外观</div>
@@ -564,7 +605,7 @@
564
605
  </div>
565
606
  </div><!-- /rd-railcol -->
566
607
  <div class="rd-main">
567
- <!-- 对话分区(直连任务默认):用户消息与 CLI 输出混排的时间线 + 贴底追话框。
608
+ <!-- 对话分区(所有任务默认):用户消息与各智能体输出混排的时间线 + 贴底追话框。
568
609
  运行中发出去走信箱(下一步送达);已结束发出去走 /chat 自动续跑新一轮。 -->
569
610
  <div id="rd-pane-chat" class="rd-pane" role="tabpanel" aria-labelledby="rd-tab-chat" data-pane="chat">
570
611
  <div id="rd-chat" class="rd-chat hidden">
@@ -741,6 +782,7 @@
741
782
  <label class="toggle" title="修复任务评审通过后,自动到禅道 resolve(fixed)并回评论" data-i18n-title="修复任务评审通过后,自动到禅道 resolve(fixed)并回评论"><input id="zt-autoresolve" type="checkbox"><span data-i18n="自动 resolve Bug">自动 resolve Bug</span></label>
742
783
  <label class="toggle" title="把任务分支自动合并回基线分支(需配置基线分支;合并失败不 resolve 不转派,留人工)" data-i18n-title="把任务分支自动合并回基线分支(需配置基线分支;合并失败不 resolve 不转派,留人工)"><input id="zt-automerge" type="checkbox"><span data-i18n="自动合并代码">自动合并代码</span></label>
743
784
  <label class="toggle" title="按下面的间隔定时扫描;关掉后仍可手动「立即扫描」" data-i18n-title="按下面的间隔定时扫描;关掉后仍可手动「立即扫描」"><input id="zt-poll" type="checkbox"><span data-i18n="定时扫描">定时扫描</span></label>
785
+ <label class="toggle" title="法定休假日不认领新 Bug,扫描顺延到下一个工作日(对账照跑);调休补班的周末照常扫描" data-i18n-title="法定休假日不认领新 Bug,扫描顺延到下一个工作日(对账照跑);调休补班的周末照常扫描"><input id="zt-holiday" type="checkbox"><span data-i18n="跳过法定节假日">跳过法定节假日</span></label>
744
786
  <label class="zt-interval-field" for="zt-interval" title="定时扫描的间隔,最小 5 分钟" data-i18n-title="定时扫描的间隔,最小 5 分钟"><span class="zt-iv-label" data-i18n="扫描间隔">扫描间隔</span><span class="zt-iv-box"><input id="zt-interval" type="number" min="5" max="10080" step="5"><span class="zt-iv-unit" data-i18n="分钟">分钟</span></span></label>
745
787
  </div>
746
788
  <div class="ops"><button id="btn-zentao-save" class="primary small"><span data-i18n="保存配置">保存配置</span></button></div>
@@ -770,6 +812,9 @@
770
812
  <button data-i18n="近 30 天" class="seg-btn" data-days="30">近 30 天</button>
771
813
  <button data-i18n="全部" class="seg-btn" data-days="0">全部</button>
772
814
  </div>
815
+ <button id="btn-usage-export" class="ghost small" data-i18n-title="导出当前范围的台账明细(CSV,Excel 可开)" title="导出当前范围的台账明细(CSV,Excel 可开)">
816
+ <svg class="ico" aria-hidden="true"><use href="#i-arrow-up"></use></svg><span data-i18n="导出">导出</span>
817
+ </button>
773
818
  <button id="btn-usage-refresh" class="icon-btn" title="重新拉取" aria-label="重新拉取" data-i18n-aria="重新拉取" data-i18n-title="重新拉取">
774
819
  <svg class="ico" aria-hidden="true"><use href="#i-refresh"></use></svg>
775
820
  </button>
@@ -805,6 +850,7 @@
805
850
  <h2 data-i18n="智能体目录">智能体目录</h2>
806
851
  <button class="hhelp" data-help-topic="models" title="这是什么?点开看帮助" data-i18n-title="这是什么?点开看帮助" aria-label="帮助" data-i18n-aria="帮助"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button>
807
852
  <div class="actions">
853
+ <button data-i18n="一键升级全部" id="btn-catalog-upgrade-all" class="primary">一键升级全部</button>
808
854
  <button data-i18n="写入推荐默认模型(可选)" id="btn-catalog-autobind" class="ghost">写入推荐默认模型(可选)</button>
809
855
  <button data-i18n="重新加载 catalog" id="btn-reload-catalog" class="ghost">重新加载 catalog</button>
810
856
  <button data-i18n="恢复默认 catalog" id="btn-reset-catalog" class="ghost">恢复默认 catalog</button>
@@ -897,6 +943,11 @@
897
943
  <button data-i18n="经验包" class="seg-btn active" data-v="local">经验包</button>
898
944
  <button data-i18n="外部目录" class="seg-btn" data-v="remote">外部目录</button>
899
945
  </div>
946
+ <div class="plugin-section">
947
+ <h3 class="sec-title"><span data-i18n="本地插件">本地插件</span> <span class="tag" id="plugin-count"></span></h3>
948
+ <p class="hint" data-i18n="本地插件遵循统一 manifest 规范。技能会接入经验库;MCP 只在启用后合并到内置智能体工具,不执行插件脚本或钩子。">本地插件遵循统一 manifest 规范。技能会接入经验库;MCP 只在启用后合并到内置智能体工具,不执行插件脚本或钩子。</p>
949
+ <div id="plugin-grid" class="cards mk-grid"></div>
950
+ </div>
900
951
  <div id="mk-local">
901
952
  <div class="pm-tools mk-tools">
902
953
  <input id="mk-search" type="search" placeholder="搜索插件…" data-i18n-ph="搜索插件…" autocomplete="off">
@@ -956,11 +1007,90 @@
956
1007
  <label class="toggle" style="margin-top:6px"><input id="set-claude-sync" type="checkbox"> <span data-i18n="把绑定供应商写进 ~/.claude/settings.json(一键打开与每次运行前)">把绑定供应商写进 ~/.claude/settings.json(一键打开与每次运行前)</span></label>
957
1008
  <p data-i18n="开启后 CodeBee 会覆盖 cc-switch 等工具对交互 claude 的手选配置。关闭后交互 claude 配置归你手动管理;编排步骤改用一次性注入,模型路由不受影响。" class="hint">开启后 CodeBee 会覆盖 cc-switch 等工具对交互 claude 的手选配置。关闭后交互 claude 配置归你手动管理;编排步骤改用一次性注入,模型路由不受影响。</p>
958
1009
  </div>
1010
+ <h3 data-i18n="MCP 工具(内置智能体)" class="sec-title">MCP 工具(内置智能体)</h3>
1011
+ <div class="field"><label data-i18n="MCP 服务器清单(JSON 数组,stdio 形态,最多 4 个)">MCP 服务器清单(JSON 数组,stdio 形态,最多 4 个)</label>
1012
+ <textarea id="set-mcp-servers" rows="4" style="width:100%;font-family:var(--mono,monospace);font-size:12px" placeholder='[{"name":"fs","command":"npx","args":["-y","@modelcontextprotocol/server-fs","C:/data"]}]'></textarea>
1013
+ <div class="input-row" style="margin-top:6px" id="mcp-templates">
1014
+ <span class="hint" data-i18n="一键模板:">一键模板:</span>
1015
+ <button class="ghost small" onclick="mcpTemplate('fetch')" data-i18n="fetch 网页抓取">fetch 网页抓取</button>
1016
+ <button class="ghost small" onclick="mcpTemplate('memory')" data-i18n="memory 记忆">memory 记忆</button>
1017
+ <button class="ghost small" onclick="mcpTemplate('filesystem')" data-i18n="filesystem 文件">filesystem 文件</button>
1018
+ <button class="ghost small" onclick="mcpTemplate('playwright')" data-i18n="playwright 浏览器">playwright 浏览器</button>
1019
+ <button class="ghost small" onclick="mcpTemplate('context7')" data-i18n="context7 文档">context7 文档</button>
1020
+ </div>
1021
+ <div class="input-row" style="margin-top:6px">
1022
+ <button class="ghost small" onclick="saveMcpServers()" data-i18n="保存 MCP 配置">保存 MCP 配置</button>
1023
+ </div>
1024
+ <p data-i18n="内置智能体(直连对话/直接执行)会把服务器的工具并入工具循环(mcp__服务器__工具 名)。命令在你本机执行,与「执行命令」工具同一自主权级别;工具清单缓存 5 分钟。留空 = 不启用。" class="hint">内置智能体(直连对话/直接执行)会把服务器的工具并入工具循环(mcp__服务器__工具 名)。命令在你本机执行,与「执行命令」工具同一自主权级别;工具清单缓存 5 分钟。留空 = 不启用。</p>
1025
+ </div>
1026
+ <h3 data-i18n="推送通知" class="sec-title">推送通知</h3>
1027
+ <div class="field"><label data-i18n="群机器人 Webhook(钉钉 / 飞书 / 企业微信,按域名自动适配)">群机器人 Webhook(钉钉 / 飞书 / 企业微信,按域名自动适配)</label>
1028
+ <div class="input-row">
1029
+ <input id="set-notify-webhook" type="text" placeholder="https://oapi.dingtalk.com/robot/send?access_token=…" data-i18n-ph="https://oapi.dingtalk.com/robot/send?access_token=…">
1030
+ </div>
1031
+ <p data-i18n="任务收尾把结果摘要推到群里;也接受任意 https 地址(按钉钉 text 形状发,自建 n8n 等自选)。" class="hint">任务收尾把结果摘要推到群里;也接受任意 https 地址(按钉钉 text 形状发,自建 n8n 等自选)。</p>
1032
+ </div>
1033
+ <div class="field"><label data-i18n="个人推送(推到你的手机,配任意一条即可)">个人推送(推到你的手机,配任意一条即可)</label>
1034
+ <div class="grid-2">
1035
+ <div><input id="set-notify-bark-key" type="text" placeholder="Bark Device Key" data-i18n-ph="Bark Device Key">
1036
+ <input id="set-notify-bark-server" type="text" placeholder="Bark 服务器(默认 https://api.day.app)" data-i18n-ph="Bark 服务器(默认 https://api.day.app)" style="margin-top:6px"></div>
1037
+ <div><input id="set-notify-ntfy" type="text" placeholder="ntfy 主题 URL(如 https://ntfy.sh/my-topic)" data-i18n-ph="ntfy 主题 URL(如 https://ntfy.sh/my-topic)"></div>
1038
+ </div>
1039
+ <div class="grid-2" style="margin-top:6px">
1040
+ <div><input id="set-notify-serverchan" type="text" placeholder="Server酱 SendKey(推送到微信)" data-i18n-ph="Server酱 SendKey(推送到微信)"></div>
1041
+ <div><input id="set-notify-tg-token" type="text" placeholder="Telegram Bot Token" data-i18n-ph="Telegram Bot Token">
1042
+ <input id="set-notify-tg-chat" type="text" placeholder="Telegram Chat ID" data-i18n-ph="Telegram Chat ID" style="margin-top:6px"></div>
1043
+ </div>
1044
+ <p data-i18n="密钥只存本机。多通道同时配置时全部发送;任一通道收到即视为送达。" class="hint">密钥只存本机。多通道同时配置时全部发送;任一通道收到即视为送达。</p>
1045
+ </div>
1046
+ <div class="field">
1047
+ <div class="input-row">
1048
+ <button class="ghost small" onclick="saveNotifyPush()" data-i18n="保存推送设置">保存推送设置</button>
1049
+ <button class="ghost small" onclick="testNotifyPush()" data-i18n="发送测试">发送测试</button>
1050
+ </div>
1051
+ <p class="hint" id="notify-test-msg"></p>
1052
+ </div>
959
1053
  <div id="set-v2-card" class="field"></div>
960
1054
  <div id="settings-msg" class="msg"></div>
961
1055
  </div>
962
1056
  </div>
963
1057
 
1058
+ <!-- 模型评测(评测基准台:样题 × 候选模型 × 固定 rubric → 能力榜) -->
1059
+ <div id="sub-evalbench" class="subpage hidden">
1060
+ <div class="panel wide">
1061
+ <div class="panel-head"><h2 data-i18n="模型评测">模型评测</h2><span class="spacer"></span><span class="hint" id="eb-judge"></span></div>
1062
+ <p data-i18n="固定样题(章节写作 / 修 bug / 结构化摘要)让候选模型各跑一遍,同一评审链打分出能力榜;修 bug 题带客观验证(代码真跑断言)。评审用「编排者」供应商,先在编排设置里配好;裁判与候选同供应商时如实标注「同族评审」。所有调用计入用量台账(评测记账不计费用,价格表单位未核实)。实测分(14 天内)已作为软信号参与模型链排序与推荐选模——只动排序,健康/冷却/协议等硬约束照常一票否决。" class="hint">固定样题(章节写作 / 修 bug / 结构化摘要)让候选模型各跑一遍,同一评审链打分出能力榜;修 bug 题带客观验证(代码真跑断言)。评审用「编排者」供应商,先在编排设置里配好;裁判与候选同供应商时如实标注「同族评审」。所有调用计入用量台账(评测记账不计费用,价格表单位未核实)。实测分(14 天内)已作为软信号参与模型链排序与推荐选模——只动排序,健康/冷却/协议等硬约束照常一票否决。</p>
1063
+ <h3 data-i18n="内置样题" class="sec-title">内置样题</h3>
1064
+ <div id="eb-samples" class="list"></div>
1065
+ <div class="input-row" style="margin:8px 0">
1066
+ <button class="ghost small" onclick="sampleAdd()" data-i18n="+ 添加自定义样题">+ 添加自定义样题</button>
1067
+ <button class="ghost small" onclick="sampleImport()" data-i18n="导入样题分享码">导入样题分享码</button>
1068
+ </div>
1069
+ <h3 data-i18n="候选模型(勾选要实测的模型)" class="sec-title">候选模型(勾选要实测的模型)</h3>
1070
+ <div id="eb-cands" class="list"></div>
1071
+ <div class="input-row" style="margin-top:10px">
1072
+ <button id="eb-run-btn" class="primary" onclick="evalbenchRun()" data-i18n="开始评测">开始评测</button>
1073
+ <button class="ghost" onclick="evalbenchCancel()" data-i18n="停止">停止</button>
1074
+ <span id="eb-progress" class="hint"></span>
1075
+ </div>
1076
+ <div id="eb-msg" class="msg"></div>
1077
+ <div class="field"><label data-i18n="定时回归(自动防漂移)">定时回归(自动防漂移)</label>
1078
+ <label class="toggle" style="margin-top:6px"><input id="eb-auto-enabled" type="checkbox"> <span data-i18n="到期自动重跑候选榜并推送结果(挂自动化 tick,裁判为编排者;候选=启用供应商的启用模型,最多 8 个)">到期自动重跑候选榜并推送结果(挂自动化 tick,裁判为编排者;候选=启用供应商的启用模型,最多 8 个)</span></label>
1079
+ <div class="input-row" style="margin-top:6px">
1080
+ <input id="eb-auto-days" type="number" min="1" max="90" value="7" style="width:80px">
1081
+ <span data-i18n="天一轮">天一轮</span>
1082
+ <button class="ghost small" onclick="saveBenchAuto()" data-i18n="保存">保存</button>
1083
+ <span id="eb-auto-msg" class="hint"></span>
1084
+ </div>
1085
+ </div>
1086
+ <h3 data-i18n="能力榜" class="sec-title">能力榜</h3>
1087
+ <div class="input-row" id="eb-trend" style="align-items:center;gap:8px"></div>
1088
+ <div id="eb-board" class="list"></div>
1089
+ <h3 data-i18n="逐题对比" class="sec-title">逐题对比</h3>
1090
+ <div id="eb-matrix"></div>
1091
+ </div>
1092
+ </div>
1093
+
964
1094
  <!-- 群摘要(正式设置子页:配置与摘要一体,替代原右下角悬浮蜜蜂坞) -->
965
1095
  <div id="sub-__wxdigest" class="subpage hidden">
966
1096
  <div class="panel wide">
@@ -1025,10 +1155,31 @@
1025
1155
  <label class="toggle" style="margin-top:6px"><input id="bk-logs" type="checkbox" checked> <span data-i18n="包含运行过程日志(备份更大,但历史日志可完整回看)">包含运行过程日志(备份更大,但历史日志可完整回看)</span></label>
1026
1156
  <div id="bk-result" class="msg"></div>
1027
1157
  </div>
1158
+ <div class="field">
1159
+ <label data-i18n="远程备份(导出后自动上传到 WebDAV / S3 兼容 PUT 端点)">远程备份(导出后自动上传到 WebDAV / S3 兼容 PUT 端点)</label>
1160
+ <label class="toggle" style="margin-top:6px"><input id="bk-remote-enabled" type="checkbox"> <span data-i18n="启用:每次导出成功后自动推送备份包到远程端点">启用:每次导出成功后自动推送备份包到远程端点</span></label>
1161
+ <div class="input-row" style="margin-top:6px">
1162
+ <input id="bk-remote-url" type="text" placeholder="端点 URL(如 https://dav.example.com/backup/)" data-i18n-ph="端点 URL(如 https://dav.example.com/backup/)" style="flex:1">
1163
+ </div>
1164
+ <div class="input-row" style="margin-top:6px">
1165
+ <input id="bk-remote-user" type="text" placeholder="用户名(可空)" data-i18n-ph="用户名(可空)">
1166
+ <input id="bk-remote-pass" type="password" placeholder="密码(可空)" data-i18n-ph="密码(可空)">
1167
+ <button class="ghost small" type="button" onclick="saveBackupRemote()" data-i18n="保存">保存</button>
1168
+ <button class="ghost small" type="button" onclick="testBackupRemote()" data-i18n="测试连接">测试连接</button>
1169
+ </div>
1170
+ <p class="hint" id="bk-remote-msg"></p>
1171
+ </div>
1028
1172
  </div>
1029
1173
  <div class="panel wide">
1030
1174
  <div class="panel-head"><h2 data-i18n="恢复(导入备份包)">恢复(导入备份包)</h2></div>
1031
1175
  <p class="hint" data-i18n="选择之前导出的备份包,先预览确认再导入。导入会覆盖同名任务与配置;当前数据会先自动备份一份到数据目录 imports/ 下,导入后需重启服务生效。">选择之前导出的备份包,先预览确认再导入。导入会覆盖同名任务与配置;当前数据会先自动备份一份到数据目录 imports/ 下,导入后需重启服务生效。</p>
1176
+ <div class="field">
1177
+ <div class="input-row">
1178
+ <button class="ghost small" type="button" onclick="listRemoteBackups()" data-i18n="从远程端点拉取备份…">从远程端点拉取备份…</button>
1179
+ <span class="hint" id="bi-remote-msg"></span>
1180
+ </div>
1181
+ <div id="bi-remote-list" class="list"></div>
1182
+ </div>
1032
1183
  <div class="field">
1033
1184
  <div class="input-row">
1034
1185
  <input id="bi-path" type="text" placeholder="备份包 zip 路径" data-i18n-ph="备份包 zip 路径">
@@ -1192,6 +1343,119 @@
1192
1343
  </div>
1193
1344
  </div>
1194
1345
  </div>
1346
+
1347
+ <div id="sub-browser" class="subpage hidden">
1348
+ <div class="browser-shell">
1349
+ <div class="browser-head">
1350
+ <div class="browser-tabs" id="browser-tabs" role="tablist" aria-label="浏览器标签页">
1351
+ <button class="browser-tab active" type="button" data-browser-tab="home" role="tab" aria-selected="true">
1352
+ <svg class="ico" aria-hidden="true"><use href="#i-browser"></use></svg><span>CodeBee 浏览器</span>
1353
+ </button>
1354
+ <button class="browser-tab-add" id="browser-new-tab" type="button" title="新建标签页" aria-label="新建标签页"><svg class="ico" aria-hidden="true"><use href="#i-plus"></use></svg></button>
1355
+ </div>
1356
+ <div class="browser-status"><span class="browser-status-dot"></span><span data-i18n="本地浏览器工作区">本地浏览器工作区</span></div>
1357
+ </div>
1358
+ <div class="browser-toolbar">
1359
+ <button class="icon-btn" id="browser-back" type="button" title="后退" aria-label="后退"><svg class="ico" aria-hidden="true"><use href="#i-arrow-left"></use></svg></button>
1360
+ <button class="icon-btn" id="browser-forward" type="button" title="前进" aria-label="前进"><svg class="ico" aria-hidden="true"><use href="#i-arrow-right"></use></svg></button>
1361
+ <button class="icon-btn" id="browser-reload" type="button" title="刷新" aria-label="刷新"><svg class="ico" aria-hidden="true"><use href="#i-refresh"></use></svg></button>
1362
+ <button class="icon-btn" id="browser-home" type="button" title="主页" aria-label="主页"><svg class="ico" aria-hidden="true"><use href="#i-home"></use></svg></button>
1363
+ <form id="browser-nav-form" class="browser-address-wrap">
1364
+ <svg class="ico browser-lock" aria-hidden="true"><use href="#i-lock"></use></svg>
1365
+ <input id="browser-address" type="text" autocomplete="off" spellcheck="false" placeholder="输入网址或搜索内容" data-i18n-ph="输入网址或搜索内容" aria-label="网址">
1366
+ <button class="browser-go" type="submit" title="打开" aria-label="打开"><svg class="ico" aria-hidden="true"><use href="#i-arrow-right"></use></svg></button>
1367
+ </form>
1368
+ <button class="ghost small browser-external" id="browser-open-external" type="button" title="在系统浏览器打开"><svg class="ico" aria-hidden="true"><use href="#i-external"></use></svg><span data-i18n="系统浏览器">系统浏览器</span></button>
1369
+ </div>
1370
+ <div class="browser-shortcuts" id="browser-shortcuts">
1371
+ <button type="button" class="browser-shortcut" data-browser-url="https://www.google.com"><span class="shortcut-mark google">G</span><span>Google</span></button>
1372
+ <button type="button" class="browser-shortcut" data-browser-url="https://github.com"><span class="shortcut-mark github">GH</span><span>GitHub</span></button>
1373
+ <button type="button" class="browser-shortcut" data-browser-url="https://developer.mozilla.org"><span class="shortcut-mark mdn">MDN</span><span>MDN</span></button>
1374
+ <button type="button" class="browser-shortcut" data-browser-preview="1"><span class="shortcut-mark preview">P</span><span data-i18n="当前任务预览">当前任务预览</span></button>
1375
+ </div>
1376
+ <div class="browser-stage">
1377
+ <aside class="browser-context" id="browser-context" aria-label="CodeBee 工作上下文" data-i18n-aria="CodeBee 工作上下文">
1378
+ <div class="browser-context-head">
1379
+ <span class="browser-context-kicker"><svg class="ico" aria-hidden="true"><use href="#i-baton"></use></svg><span data-i18n="工作上下文">工作上下文</span></span>
1380
+ <span class="browser-context-live"><i></i><span data-i18n="本地">本地</span></span>
1381
+ </div>
1382
+ <div class="browser-context-select">
1383
+ <label for="browser-task-select" data-i18n="当前任务">当前任务</label>
1384
+ <select id="browser-task-select" aria-label="选择当前任务" data-i18n-aria="选择当前任务"></select>
1385
+ </div>
1386
+ <div class="browser-task-card" id="browser-task-card">
1387
+ <div class="browser-task-empty" data-i18n="选择一个任务开始工作">选择一个任务开始工作</div>
1388
+ </div>
1389
+ <div class="browser-context-actions" id="browser-context-actions">
1390
+ <button class="primary small" id="browser-action-preview" type="button"><svg class="ico" aria-hidden="true"><use href="#i-clapper"></use></svg><span data-i18n="预览成品">预览成品</span></button>
1391
+ <button class="ghost small" id="browser-action-detail" type="button"><svg class="ico" aria-hidden="true"><use href="#i-file-search"></use></svg><span data-i18n="查看详情">查看详情</span></button>
1392
+ <button class="ghost small" id="browser-action-retry" type="button"><svg class="ico" aria-hidden="true"><use href="#i-refresh"></use></svg><span data-i18n="重新运行">重新运行</span></button>
1393
+ </div>
1394
+ <section class="browser-context-section">
1395
+ <div class="browser-context-section-head"><span data-i18n="验证">验证</span><button class="icon-btn" id="browser-action-verify" type="button" title="查看验证结果" aria-label="查看验证结果" data-i18n-title="查看验证结果" data-i18n-aria="查看验证结果"><svg class="ico" aria-hidden="true"><use href="#i-chevron-r"></use></svg></button></div>
1396
+ <div id="browser-verify-card" class="browser-verify-card"></div>
1397
+ </section>
1398
+ <section class="browser-context-section browser-publish-section">
1399
+ <div class="browser-context-section-head"><span data-i18n="小说发布">小说发布</span><button class="icon-btn" id="browser-action-publish" type="button" title="打开发布工作台" aria-label="打开发布工作台" data-i18n-title="打开发布工作台" data-i18n-aria="打开发布工作台"><svg class="ico" aria-hidden="true"><use href="#i-chevron-r"></use></svg></button></div>
1400
+ <div class="browser-publish-note" data-i18n="发布由 CodeBee 受控浏览器执行,提交前保留人工确认。">发布由 CodeBee 受控浏览器执行,提交前保留人工确认。</div>
1401
+ <div id="browser-publish-card" class="browser-publish-card"></div>
1402
+ </section>
1403
+ </aside>
1404
+ <div class="browser-viewport">
1405
+ <div class="browser-empty" id="browser-empty">
1406
+ <div class="browser-home-workbench" id="browser-home-dashboard">
1407
+ <header class="browser-home-hero">
1408
+ <div class="browser-empty-mark"><svg class="ico" aria-hidden="true"><use href="#i-browser"></use></svg></div>
1409
+ <div class="browser-home-copy">
1410
+ <span class="browser-home-eyebrow" data-i18n="CodeBee 工作浏览器">CodeBee 工作浏览器</span>
1411
+ <h2 data-i18n="让 CodeBee 打开页面并完成验证">让 CodeBee 打开页面并完成验证</h2>
1412
+ <p data-i18n="配置 Playwright 工具后,任务智能体可打开页面、点击、填表和截图;小说发布继续复用本机登录态。">配置 Playwright 工具后,任务智能体可打开页面、点击、填表和截图;小说发布继续复用本机登录态。</p>
1413
+ </div>
1414
+ <span class="browser-home-mode"><i></i><span data-i18n="任务驱动">任务驱动</span></span>
1415
+ </header>
1416
+ <section class="browser-home-current">
1417
+ <span class="browser-home-section-label" data-i18n="当前工作">当前工作</span>
1418
+ <div class="browser-home-task-row">
1419
+ <div>
1420
+ <h3 id="browser-home-task-title" data-i18n="还没有任务">还没有任务</h3>
1421
+ <p id="browser-home-task-meta" data-i18n="先新建任务,CodeBee 会在这里接管预览、验证与发布动作。">先新建任务,CodeBee 会在这里接管预览、验证与发布动作。</p>
1422
+ </div>
1423
+ <span id="browser-home-run" class="browser-home-run" data-i18n="等待任务进入工作台">等待任务进入工作台</span>
1424
+ </div>
1425
+ </section>
1426
+ <div class="browser-home-workflows">
1427
+ <button class="browser-home-action primary" id="browser-open-preview" data-browser-home-action="preview" type="button">
1428
+ <svg class="ico" aria-hidden="true"><use href="#i-clapper"></use></svg><span><b data-i18n="预览成品">预览成品</b><small data-i18n="打开当前任务的网页成果">打开当前任务的网页成果</small></span>
1429
+ </button>
1430
+ <button class="browser-home-action" data-browser-home-action="verify" type="button">
1431
+ <svg class="ico" aria-hidden="true"><use href="#i-check"></use></svg><span><b data-i18n="查看验证">查看验证</b><small data-i18n="检查测试、截图与修复证据">检查测试、截图与修复证据</small></span>
1432
+ </button>
1433
+ <button class="browser-home-action" data-browser-home-action="retry" type="button">
1434
+ <svg class="ico" aria-hidden="true"><use href="#i-refresh"></use></svg><span><b data-i18n="交给 CodeBee 重跑">交给 CodeBee 重跑</b><small data-i18n="带着当前任务上下文再次执行">带着当前任务上下文再次执行</small></span>
1435
+ </button>
1436
+ <button class="browser-home-action" data-browser-home-action="publish" type="button">
1437
+ <svg class="ico" aria-hidden="true"><use href="#i-book-open"></use></svg><span><b data-i18n="进入小说发布">进入小说发布</b><small data-i18n="番茄、七猫自动填稿,提交前确认">番茄、七猫自动填稿,提交前确认</small></span>
1438
+ </button>
1439
+ </div>
1440
+ <div class="browser-home-capabilities">
1441
+ <div><svg class="ico" aria-hidden="true"><use href="#i-browser"></use></svg><span><b data-i18n="浏览器自动化">浏览器自动化</b><small data-i18n="配置 Playwright MCP 后可开页、交互与截图">配置 Playwright MCP 后可开页、交互与截图</small></span></div>
1442
+ <div><svg class="ico" aria-hidden="true"><use href="#i-check"></use></svg><span><b data-i18n="结果验证">结果验证</b><small data-i18n="成品、命令与证据集中回看">成品、命令与证据集中回看</small></span></div>
1443
+ <div><svg class="ico" aria-hidden="true"><use href="#i-book-open"></use></svg><span><b data-i18n="受控发布">受控发布</b><small data-i18n="平台登录态留在本机,最终提交由你确认">平台登录态留在本机,最终提交由你确认</small></span></div>
1444
+ </div>
1445
+ </div>
1446
+ </div>
1447
+ <div class="browser-frame-error hidden" id="browser-frame-error" role="status">
1448
+ <div class="browser-frame-error-mark"><svg class="ico" aria-hidden="true"><use href="#i-x"></use></svg></div>
1449
+ <h2 data-i18n="这个网站拒绝了内置嵌入">这个网站拒绝了内置嵌入</h2>
1450
+ <p id="browser-frame-error-text" data-i18n="Google 等网站会拦截 iframe 或自动化挑战;页面本身未必不可访问。">Google 等网站会拦截 iframe 或自动化挑战;页面本身未必不可访问。</p>
1451
+ <button class="primary small" id="browser-frame-error-open" type="button"><svg class="ico" aria-hidden="true"><use href="#i-external"></use></svg><span data-i18n="用系统浏览器继续">用系统浏览器继续</span></button>
1452
+ </div>
1453
+ <iframe id="browser-frame" class="browser-frame hidden" title="CodeBee 浏览器" sandbox="allow-scripts allow-same-origin allow-forms allow-modals allow-popups allow-downloads" referrerpolicy="no-referrer"></iframe>
1454
+ </div>
1455
+ </div>
1456
+ <div class="browser-foot"><span id="browser-hint" data-i18n="外部网站可能禁止嵌入;可用右上角系统浏览器打开。">外部网站可能禁止嵌入;可用右上角系统浏览器打开。</span><span class="spacer"></span><span id="browser-history-count"></span></div>
1457
+ </div>
1458
+ </div>
1195
1459
  </section>
1196
1460
  </main>
1197
1461
  </div>
@@ -1,16 +1,16 @@
1
- {
2
- "name": "CodeBee · 多智能体编排台",
3
- "short_name": "CodeBee",
4
- "description": "All agents, one hive. 一句话目标,自动拆解、路由、执行、验证与跨厂商评审。",
5
- "start_url": "/",
6
- "scope": "/",
7
- "display": "standalone",
8
- "orientation": "portrait-primary",
9
- "background_color": "#0f1115",
10
- "theme_color": "#6d5df6",
11
- "icons": [
12
- { "src": "icons/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
13
- { "src": "icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
14
- { "src": "icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
15
- ]
16
- }
1
+ {
2
+ "name": "CodeBee · 多智能体编排台",
3
+ "short_name": "CodeBee",
4
+ "description": "All agents, one hive. 一句话目标,自动拆解、路由、执行、验证与跨厂商评审。",
5
+ "start_url": "/",
6
+ "scope": "/",
7
+ "display": "standalone",
8
+ "orientation": "portrait-primary",
9
+ "background_color": "#0f1115",
10
+ "theme_color": "#6d5df6",
11
+ "icons": [
12
+ { "src": "icons/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
13
+ { "src": "icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
14
+ { "src": "icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
15
+ ]
16
+ }