codebee 0.1.67 → 0.1.68

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 (113) hide show
  1. package/CHANGELOG.md +543 -532
  2. package/LICENSE +21 -21
  3. package/README.md +11 -7
  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/core/acceptance.py +100 -100
  12. package/app/core/aiflavor.py +197 -197
  13. package/app/core/artifacts.py +148 -148
  14. package/app/core/assets.py +110 -110
  15. package/app/core/attachments.py +623 -623
  16. package/app/core/automation.py +758 -758
  17. package/app/core/backup.py +470 -470
  18. package/app/core/beekeeper.py +183 -183
  19. package/app/core/board.py +209 -209
  20. package/app/core/bookmeta.py +930 -930
  21. package/app/core/bookmeta_catalog.py +180 -180
  22. package/app/core/branching.py +137 -137
  23. package/app/core/builtin_agent.py +1234 -1234
  24. package/app/core/capability.py +144 -144
  25. package/app/core/catalog.py +42 -0
  26. package/app/core/chaptersafe.py +32 -32
  27. package/app/core/cleanup.py +303 -303
  28. package/app/core/compaction.py +201 -201
  29. package/app/core/covergen.py +356 -356
  30. package/app/core/defectretro.py +43 -43
  31. package/app/core/diagnostics.py +114 -114
  32. package/app/core/dispatch.py +173 -173
  33. package/app/core/dispatch_log.py +128 -113
  34. package/app/core/env_scrub.py +85 -85
  35. package/app/core/error_codes.py +23 -23
  36. package/app/core/errorlog.py +137 -137
  37. package/app/core/evaluation.py +174 -174
  38. package/app/core/failure_notify.py +290 -290
  39. package/app/core/flows.py +2 -2
  40. package/app/core/goal_service.py +167 -167
  41. package/app/core/health.py +374 -374
  42. package/app/core/history.py +38 -38
  43. package/app/core/hooks.py +162 -162
  44. package/app/core/jobs.py +29 -25
  45. package/app/core/knowledge.py +7 -0
  46. package/app/core/manager.py +2122 -2122
  47. package/app/core/market.py +362 -362
  48. package/app/core/mocks.py +64 -64
  49. package/app/core/modelhub.py +22 -3
  50. package/app/core/notify.py +106 -106
  51. package/app/core/operations.py +228 -228
  52. package/app/core/paihang.py +138 -138
  53. package/app/core/paths.py +2 -2
  54. package/app/core/pipeline.py +16 -1
  55. package/app/core/planner.py +2 -0
  56. package/app/core/portguard.py +111 -111
  57. package/app/core/preview.py +293 -293
  58. package/app/core/publish/__init__.py +7 -7
  59. package/app/core/publish/auto.py +367 -367
  60. package/app/core/publish/browser.py +539 -539
  61. package/app/core/publish/fanqie.py +159 -159
  62. package/app/core/publish/flow.py +440 -440
  63. package/app/core/publish/flows-fanqie-calibrated.json +332 -332
  64. package/app/core/publish/flows-qimao-calibrated.json +7 -3
  65. package/app/core/publish/ledger.py +203 -203
  66. package/app/core/publish/manager.py +692 -692
  67. package/app/core/publish/qimao.py +141 -141
  68. package/app/core/publish/ws.py +139 -139
  69. package/app/core/redact.py +38 -38
  70. package/app/core/repeat_guard.py +129 -129
  71. package/app/core/router.py +398 -398
  72. package/app/core/runner.py +2067 -2065
  73. package/app/core/selfupdate.py +384 -384
  74. package/app/core/session_log.py +161 -161
  75. package/app/core/sessions.py +312 -312
  76. package/app/core/settings.py +149 -149
  77. package/app/core/settings_schema.py +262 -262
  78. package/app/core/share_page.py +114 -114
  79. package/app/core/skill_scan.py +122 -114
  80. package/app/core/skillpacks/fanqie-novel.md +80 -80
  81. package/app/core/skillpacks/market/character-bible.md +66 -66
  82. package/app/core/skillpacks/market/code-risk-checklist.md +58 -58
  83. package/app/core/skillpacks/market/git-workflow.md +57 -57
  84. package/app/core/skillpacks/market/release-notes.md +72 -72
  85. package/app/core/skillpacks/market/weekly-report.md +71 -71
  86. package/app/core/skillpacks/market/worldview-consistency.md +70 -70
  87. package/app/core/skills.py +15 -1
  88. package/app/core/step_runner.py +132 -132
  89. package/app/core/store.py +75 -34
  90. package/app/core/task_compile.py +199 -199
  91. package/app/core/telemetry.py +292 -292
  92. package/app/core/tlsctx.py +64 -64
  93. package/app/core/token_meter.py +147 -147
  94. package/app/core/tracing.py +144 -0
  95. package/app/core/upstream.py +41 -41
  96. package/app/core/usage.py +862 -858
  97. package/app/core/volumes.py +389 -389
  98. package/app/core/wxdigest.py +858 -858
  99. package/app/core/zentao.py +2465 -2465
  100. package/app/main.py +2981 -2957
  101. package/app/pick_dialog.py +110 -110
  102. package/app/ui/app.js +14399 -14384
  103. package/app/ui/artdiff.js +74 -74
  104. package/app/ui/board.html +162 -162
  105. package/app/ui/board.js +305 -305
  106. package/app/ui/i18n.js +2770 -2766
  107. package/app/ui/icons/bee.svg +79 -79
  108. package/app/ui/manifest.json +16 -16
  109. package/app/ui/qrcode.js +2297 -2297
  110. package/app/ui/style.css +16 -16
  111. package/bin/tutti.js +147 -147
  112. package/package.json +46 -46
  113. package/tools/wx_reader.py +261 -261
package/app/ui/artdiff.js CHANGED
@@ -1,74 +1,74 @@
1
- /* 成品两版对比的纯 diff 计算(OpenCreator「版本化对比」借鉴)。
2
- * 独立文件无 DOM 依赖:app.js 用 window.ArtifactDiff 渲染,tests 用
3
- * module.exports 直测。算法:公共前后缀修剪 + 中段 LCS(上限保护,
4
- * 超限诚实降级为整块替换计数,不装作对齐了)。 */
5
- (function (root, factory) {
6
- var api = factory();
7
- if (typeof window !== "undefined") window.ArtifactDiff = api;
8
- if (typeof module !== "undefined" && module.exports) module.exports = api;
9
- })(typeof self !== "undefined" ? self : this, function () {
10
- "use strict";
11
-
12
- var MID_CAP = 400; // 中段行数单边上限
13
- var MID_PRODUCT_CAP = 160000; // LCS DP 格子上限(400×400)
14
-
15
- /* LCS 回溯产出统一 diff 行:[{t:"="|"-"/"+", s:行文本}](只对中段)。 */
16
- function lcsRows(A, B) {
17
- var n = A.length, m = B.length;
18
- var dp = [];
19
- for (var k = 0; k <= n; k++) dp.push(new Uint32Array(m + 1));
20
- for (var i = n - 1; i >= 0; i--)
21
- for (var j = m - 1; j >= 0; j--)
22
- dp[i][j] = A[i] === B[j] ? dp[i + 1][j + 1] + 1
23
- : (dp[i + 1][j] >= dp[i][j + 1] ? dp[i + 1][j] : dp[i][j + 1]);
24
- var rows = [];
25
- i = 0; j = 0;
26
- while (i < n && j < m) {
27
- if (A[i] === B[j]) { rows.push({ t: "=", s: A[i] }); i++; j++; }
28
- else if (dp[i + 1][j] >= dp[i][j + 1]) { rows.push({ t: "-", s: A[i] }); i++; }
29
- else { rows.push({ t: "+", s: B[j] }); j++; }
30
- }
31
- while (i < n) { rows.push({ t: "-", s: A[i] }); i++; }
32
- while (j < m) { rows.push({ t: "+", s: B[j] }); j++; }
33
- return rows;
34
- }
35
-
36
- /* 对外主口:旧版 a、新版 b → {
37
- * prefix/suffix: 相同行数(渲染端折叠展示),
38
- * identical: 布尔,两版一致,
39
- * rows: 中段统一 diff 行(超限时为 null),
40
- * oversized: {a, b} 超限时中段行数(诚实整块计数) } */
41
- function diff(a, b) {
42
- a = String(a == null ? "" : a);
43
- b = String(b == null ? "" : b);
44
- var A = a.split("\n"), B = b.split("\n");
45
- var p = 0;
46
- while (p < A.length && p < B.length && A[p] === B[p]) p++;
47
- var s = 0;
48
- while (s < A.length - p && s < B.length - p &&
49
- A[A.length - 1 - s] === B[B.length - 1 - s]) s++;
50
- var midA = A.slice(p, A.length - s), midB = B.slice(p, B.length - s);
51
- var out = { prefix: p, suffix: s, identical: !midA.length && !midB.length,
52
- rows: null, oversized: null };
53
- if (out.identical) return out;
54
- if (midA.length > MID_CAP || midB.length > MID_CAP ||
55
- midA.length * midB.length > MID_PRODUCT_CAP) {
56
- out.oversized = { a: midA.length, b: midB.length };
57
- return out;
58
- }
59
- out.rows = lcsRows(midA, midB);
60
- return out;
61
- }
62
-
63
- /* rows → 摘要计数(+x/-y,渲染端徽章用)。 */
64
- function counts(d) {
65
- var add = 0, del = 0;
66
- if (d.oversized) return { add: d.oversized.b, del: d.oversized.a };
67
- (d.rows || []).forEach(function (r) {
68
- if (r.t === "+") add++; else if (r.t === "-") del++;
69
- });
70
- return { add: add, del: del };
71
- }
72
-
73
- return { diff: diff, counts: counts, lcsRows: lcsRows };
74
- });
1
+ /* 成品两版对比的纯 diff 计算(OpenCreator「版本化对比」借鉴)。
2
+ * 独立文件无 DOM 依赖:app.js 用 window.ArtifactDiff 渲染,tests 用
3
+ * module.exports 直测。算法:公共前后缀修剪 + 中段 LCS(上限保护,
4
+ * 超限诚实降级为整块替换计数,不装作对齐了)。 */
5
+ (function (root, factory) {
6
+ var api = factory();
7
+ if (typeof window !== "undefined") window.ArtifactDiff = api;
8
+ if (typeof module !== "undefined" && module.exports) module.exports = api;
9
+ })(typeof self !== "undefined" ? self : this, function () {
10
+ "use strict";
11
+
12
+ var MID_CAP = 400; // 中段行数单边上限
13
+ var MID_PRODUCT_CAP = 160000; // LCS DP 格子上限(400×400)
14
+
15
+ /* LCS 回溯产出统一 diff 行:[{t:"="|"-"/"+", s:行文本}](只对中段)。 */
16
+ function lcsRows(A, B) {
17
+ var n = A.length, m = B.length;
18
+ var dp = [];
19
+ for (var k = 0; k <= n; k++) dp.push(new Uint32Array(m + 1));
20
+ for (var i = n - 1; i >= 0; i--)
21
+ for (var j = m - 1; j >= 0; j--)
22
+ dp[i][j] = A[i] === B[j] ? dp[i + 1][j + 1] + 1
23
+ : (dp[i + 1][j] >= dp[i][j + 1] ? dp[i + 1][j] : dp[i][j + 1]);
24
+ var rows = [];
25
+ i = 0; j = 0;
26
+ while (i < n && j < m) {
27
+ if (A[i] === B[j]) { rows.push({ t: "=", s: A[i] }); i++; j++; }
28
+ else if (dp[i + 1][j] >= dp[i][j + 1]) { rows.push({ t: "-", s: A[i] }); i++; }
29
+ else { rows.push({ t: "+", s: B[j] }); j++; }
30
+ }
31
+ while (i < n) { rows.push({ t: "-", s: A[i] }); i++; }
32
+ while (j < m) { rows.push({ t: "+", s: B[j] }); j++; }
33
+ return rows;
34
+ }
35
+
36
+ /* 对外主口:旧版 a、新版 b → {
37
+ * prefix/suffix: 相同行数(渲染端折叠展示),
38
+ * identical: 布尔,两版一致,
39
+ * rows: 中段统一 diff 行(超限时为 null),
40
+ * oversized: {a, b} 超限时中段行数(诚实整块计数) } */
41
+ function diff(a, b) {
42
+ a = String(a == null ? "" : a);
43
+ b = String(b == null ? "" : b);
44
+ var A = a.split("\n"), B = b.split("\n");
45
+ var p = 0;
46
+ while (p < A.length && p < B.length && A[p] === B[p]) p++;
47
+ var s = 0;
48
+ while (s < A.length - p && s < B.length - p &&
49
+ A[A.length - 1 - s] === B[B.length - 1 - s]) s++;
50
+ var midA = A.slice(p, A.length - s), midB = B.slice(p, B.length - s);
51
+ var out = { prefix: p, suffix: s, identical: !midA.length && !midB.length,
52
+ rows: null, oversized: null };
53
+ if (out.identical) return out;
54
+ if (midA.length > MID_CAP || midB.length > MID_CAP ||
55
+ midA.length * midB.length > MID_PRODUCT_CAP) {
56
+ out.oversized = { a: midA.length, b: midB.length };
57
+ return out;
58
+ }
59
+ out.rows = lcsRows(midA, midB);
60
+ return out;
61
+ }
62
+
63
+ /* rows → 摘要计数(+x/-y,渲染端徽章用)。 */
64
+ function counts(d) {
65
+ var add = 0, del = 0;
66
+ if (d.oversized) return { add: d.oversized.b, del: d.oversized.a };
67
+ (d.rows || []).forEach(function (r) {
68
+ if (r.t === "+") add++; else if (r.t === "-") del++;
69
+ });
70
+ return { add: add, del: del };
71
+ }
72
+
73
+ return { diff: diff, counts: counts, lcsRows: lcsRows };
74
+ });
package/app/ui/board.html CHANGED
@@ -1,162 +1,162 @@
1
- <!DOCTYPE html>
2
- <html lang="zh-CN" data-lang="zh">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6
- <title>CodeBee · 任务驾驶舱</title>
7
- <link rel="icon" href="/icons/icon-192.png">
8
- <link rel="stylesheet" href="/board.css">
9
- </head>
10
- <body>
11
-
12
- <!-- 远程访问令牌门(本机免输;与主界面共用 orch.token) -->
13
- <div id="gate" class="gate hidden">
14
- <div class="gate-box">
15
- <div class="gate-mark" aria-hidden="true"><span></span><span></span><span></span></div>
16
- <div class="gate-title" data-i18n="需要访问令牌">需要访问令牌</div>
17
- <div class="gate-sub" data-i18n="启动 CodeBee 时控制台会显示">启动 CodeBee 时控制台会显示</div>
18
- <input id="gate-token" type="password" data-i18n-ph="访问令牌" placeholder="访问令牌" autocomplete="off">
19
- <button id="gate-ok" type="button" data-i18n="进入大屏">进入大屏</button>
20
- <div id="gate-err" class="gate-err"></div>
21
- </div>
22
- </div>
23
-
24
- <header id="hd">
25
- <div class="hd-brand">
26
- <div class="brand-mark" aria-hidden="true"><i></i><i></i><i></i><b></b></div>
27
- <div class="brand-copy">
28
- <div class="brand-kicker">CODEBEE / OPERATIONS</div>
29
- <div class="hd-name" data-i18n="任务驾驶舱">任务驾驶舱</div>
30
- </div>
31
- </div>
32
- <div class="hd-center">
33
- <span class="live-pip"></span>
34
- <span data-i18n="实时监控">实时监控</span>
35
- <span class="hd-sep">/</span>
36
- <span id="hd-updated" class="hd-updated" data-i18n="同步中">同步中</span>
37
- </div>
38
- <div class="hd-right">
39
- <div id="hd-pool" class="hd-pill" title="执行池占用" data-i18n-title="执行池占用">—</div>
40
- <div id="hd-health" class="hd-pill warn hidden" title=""></div>
41
- <div id="hd-conn" class="hd-pill off hidden" data-i18n="连接断开">连接断开</div>
42
- <div id="hd-clock" class="hd-clock">--:--:--</div>
43
- </div>
44
- </header>
45
-
46
- <main id="board">
47
- <section id="overview" class="overview panel">
48
- <div class="overview-copy">
49
- <div class="eyebrow"><span></span><span data-i18n="蜂群状态">蜂群状态</span></div>
50
- <div class="overview-line">
51
- <div>
52
- <h1 id="hero-state" data-i18n="蜂群待命">蜂群待命</h1>
53
- <p id="hero-copy" data-i18n="没有正在运行的任务,新任务在主界面创建后会实时出现在这里">没有正在运行的任务,新任务在主界面创建后会实时出现在这里</p>
54
- </div>
55
- <div class="hero-count">
56
- <strong id="hero-live-count">0</strong>
57
- <span data-i18n="个活动单元">个活动单元</span>
58
- </div>
59
- </div>
60
- <div class="overview-foot">
61
- <span class="signal-chip"><i></i><span id="hero-signal" data-i18n="系统状态良好">系统状态良好</span></span>
62
- <span class="overview-note" data-i18n="实时聚合 · 每 4 秒刷新">实时聚合 · 每 4 秒刷新</span>
63
- </div>
64
- </div>
65
- <div class="overview-visual" aria-hidden="true">
66
- <div class="orbit orbit-a"></div>
67
- <div class="orbit orbit-b"></div>
68
- <div class="orbit-dot dot-a"></div>
69
- <div class="orbit-dot dot-b"></div>
70
- <div class="orbit-dot dot-c"></div>
71
- <div class="core-glow"></div>
72
- <div class="overview-core"><strong id="orb-number">0</strong><span>ACTIVE</span></div>
73
- </div>
74
- <div class="overview-aside">
75
- <div class="aside-label" data-i18n="执行池">执行池</div>
76
- <div class="pool-meter"><i id="pool-meter-fill"></i></div>
77
- <div class="pool-readout"><strong id="pool-alive">0</strong><span>/</span><span id="pool-target">0</span><em data-i18n="在线槽位">在线槽位</em></div>
78
- <div class="aside-divider"></div>
79
- <div class="aside-row"><span data-i18n="队列等待">队列等待</span><b id="overview-queued">0</b></div>
80
- <div class="aside-row"><span data-i18n="今日成功率">今日成功率</span><b id="overview-success">—</b></div>
81
- </div>
82
- </section>
83
-
84
- <section id="kpis" aria-label="核心指标" data-i18n-aria="核心指标">
85
- <div class="kpi k-run">
86
- <div class="kpi-head"><span data-i18n="运行中">运行中</span><i class="kpi-icon"></i></div>
87
- <div class="k-num" id="k-running">0</div>
88
- <div class="kpi-foot"><span data-i18n="当前活动">当前活动</span><b>LIVE</b></div>
89
- </div>
90
- <div class="kpi k-queue">
91
- <div class="kpi-head"><span data-i18n="排队中">排队中</span><i class="kpi-icon"></i></div>
92
- <div class="k-num" id="k-queued">0</div>
93
- <div class="kpi-foot"><span data-i18n="等待调度">等待调度</span><b>QUEUE</b></div>
94
- </div>
95
- <div class="kpi k-done">
96
- <div class="kpi-head"><span data-i18n="今日完成">今日完成</span><i class="kpi-icon"></i></div>
97
- <div class="k-num" id="k-done">0</div>
98
- <div class="kpi-foot"><span data-i18n="完成运行">完成运行</span><b>DONE</b></div>
99
- </div>
100
- <div class="kpi k-fail">
101
- <div class="kpi-head"><span data-i18n="今日失败">今日失败</span><i class="kpi-icon"></i></div>
102
- <div class="k-num" id="k-failed">0</div>
103
- <div class="kpi-foot"><span data-i18n="需要关注">需要关注</span><b>ALERT</b></div>
104
- </div>
105
- <div class="kpi k-tok">
106
- <div class="kpi-head"><span data-i18n="今日 tokens">今日 tokens</span><i class="kpi-icon"></i></div>
107
- <div class="k-num" id="k-tokens">0</div>
108
- <div class="kpi-foot"><span data-i18n="模型消耗">模型消耗</span><b>USAGE</b></div>
109
- </div>
110
- <div class="kpi k-cost">
111
- <div class="kpi-head"><span data-i18n="今日成本">今日成本</span><i class="kpi-icon"></i></div>
112
- <div class="k-num" id="k-cost">$0.00</div>
113
- <div class="kpi-foot"><span data-i18n="运行成本">运行成本</span><b>COST</b></div>
114
- </div>
115
- </section>
116
-
117
- <section id="main">
118
- <section id="wall" class="panel live-panel">
119
- <header class="panel-head">
120
- <div>
121
- <div class="eyebrow"><span></span><span data-i18n="实时任务流">实时任务流</span></div>
122
- <h2 data-i18n="运行中任务">运行中任务</h2>
123
- </div>
124
- <div class="panel-head-right">
125
- <span id="wall-count" class="live-count">0 ACTIVE</span>
126
- <span id="wall-mode" class="mode-label" data-i18n="监控中">监控中</span>
127
- </div>
128
- </header>
129
- <div id="wall-cards"></div>
130
- <div id="wall-empty" class="wall-empty hidden">
131
- <div class="empty-orbit" aria-hidden="true"><i></i><i></i><i></i><b>0</b></div>
132
- <div class="idle-t1" data-i18n="队列已清空">队列已清空</div>
133
- <div class="idle-t2" data-i18n="等待新的任务接入蜂巢">等待新的任务接入蜂巢</div>
134
- <div class="empty-meta"><span><i></i><b data-i18n="工作池就绪">工作池就绪</b></span><span><i></i><b data-i18n="监控在线">监控在线</b></span></div>
135
- </div>
136
- <div id="queue-row" class="queue-row hidden">
137
- <div class="q-label"><span class="q-mark"></span><span data-i18n="排队等待">排队等待</span><b id="queue-count">0</b></div>
138
- <span id="queue-chips"></span>
139
- </div>
140
- </section>
141
-
142
- <aside id="rail">
143
- <section class="rail-card rail-trend panel">
144
- <div class="rail-head"><div><div class="eyebrow"><span></span><span data-i18n="资源脉冲">资源脉冲</span></div><h3 data-i18n="近 7 日 tokens">近 7 日 tokens</h3></div><span class="rail-badge">7 DAYS</span></div>
145
- <div id="trend" class="trend"></div>
146
- </section>
147
- <section class="rail-card rail-models panel">
148
- <div class="rail-head"><div><div class="eyebrow"><span></span><span data-i18n="模型分布">模型分布</span></div><h3 data-i18n="近 7 日模型 TOP5">近 7 日模型 TOP5</h3></div><span class="rail-badge">TOP 5</span></div>
149
- <div id="models" class="models"></div>
150
- </section>
151
- <section class="rail-card rail-recent panel grow">
152
- <div class="rail-head"><div><div class="eyebrow"><span></span><span data-i18n="事件日志">事件日志</span></div><h3 data-i18n="最近动态">最近动态</h3></div><span id="recent-count" class="rail-badge">—</span></div>
153
- <div id="recent" class="recent"></div>
154
- </section>
155
- </aside>
156
- </section>
157
- </main>
158
-
159
- <script src="/i18n.js"></script>
160
- <script src="/board.js"></script>
161
- </body>
162
- </html>
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN" data-lang="zh">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6
+ <title>CodeBee · 任务驾驶舱</title>
7
+ <link rel="icon" href="/icons/icon-192.png">
8
+ <link rel="stylesheet" href="/board.css">
9
+ </head>
10
+ <body>
11
+
12
+ <!-- 远程访问令牌门(本机免输;与主界面共用 orch.token) -->
13
+ <div id="gate" class="gate hidden">
14
+ <div class="gate-box">
15
+ <div class="gate-mark" aria-hidden="true"><span></span><span></span><span></span></div>
16
+ <div class="gate-title" data-i18n="需要访问令牌">需要访问令牌</div>
17
+ <div class="gate-sub" data-i18n="启动 CodeBee 时控制台会显示">启动 CodeBee 时控制台会显示</div>
18
+ <input id="gate-token" type="password" data-i18n-ph="访问令牌" placeholder="访问令牌" autocomplete="off">
19
+ <button id="gate-ok" type="button" data-i18n="进入大屏">进入大屏</button>
20
+ <div id="gate-err" class="gate-err"></div>
21
+ </div>
22
+ </div>
23
+
24
+ <header id="hd">
25
+ <div class="hd-brand">
26
+ <div class="brand-mark" aria-hidden="true"><i></i><i></i><i></i><b></b></div>
27
+ <div class="brand-copy">
28
+ <div class="brand-kicker">CODEBEE / OPERATIONS</div>
29
+ <div class="hd-name" data-i18n="任务驾驶舱">任务驾驶舱</div>
30
+ </div>
31
+ </div>
32
+ <div class="hd-center">
33
+ <span class="live-pip"></span>
34
+ <span data-i18n="实时监控">实时监控</span>
35
+ <span class="hd-sep">/</span>
36
+ <span id="hd-updated" class="hd-updated" data-i18n="同步中">同步中</span>
37
+ </div>
38
+ <div class="hd-right">
39
+ <div id="hd-pool" class="hd-pill" title="执行池占用" data-i18n-title="执行池占用">—</div>
40
+ <div id="hd-health" class="hd-pill warn hidden" title=""></div>
41
+ <div id="hd-conn" class="hd-pill off hidden" data-i18n="连接断开">连接断开</div>
42
+ <div id="hd-clock" class="hd-clock">--:--:--</div>
43
+ </div>
44
+ </header>
45
+
46
+ <main id="board">
47
+ <section id="overview" class="overview panel">
48
+ <div class="overview-copy">
49
+ <div class="eyebrow"><span></span><span data-i18n="蜂群状态">蜂群状态</span></div>
50
+ <div class="overview-line">
51
+ <div>
52
+ <h1 id="hero-state" data-i18n="蜂群待命">蜂群待命</h1>
53
+ <p id="hero-copy" data-i18n="没有正在运行的任务,新任务在主界面创建后会实时出现在这里">没有正在运行的任务,新任务在主界面创建后会实时出现在这里</p>
54
+ </div>
55
+ <div class="hero-count">
56
+ <strong id="hero-live-count">0</strong>
57
+ <span data-i18n="个活动单元">个活动单元</span>
58
+ </div>
59
+ </div>
60
+ <div class="overview-foot">
61
+ <span class="signal-chip"><i></i><span id="hero-signal" data-i18n="系统状态良好">系统状态良好</span></span>
62
+ <span class="overview-note" data-i18n="实时聚合 · 每 4 秒刷新">实时聚合 · 每 4 秒刷新</span>
63
+ </div>
64
+ </div>
65
+ <div class="overview-visual" aria-hidden="true">
66
+ <div class="orbit orbit-a"></div>
67
+ <div class="orbit orbit-b"></div>
68
+ <div class="orbit-dot dot-a"></div>
69
+ <div class="orbit-dot dot-b"></div>
70
+ <div class="orbit-dot dot-c"></div>
71
+ <div class="core-glow"></div>
72
+ <div class="overview-core"><strong id="orb-number">0</strong><span>ACTIVE</span></div>
73
+ </div>
74
+ <div class="overview-aside">
75
+ <div class="aside-label" data-i18n="执行池">执行池</div>
76
+ <div class="pool-meter"><i id="pool-meter-fill"></i></div>
77
+ <div class="pool-readout"><strong id="pool-alive">0</strong><span>/</span><span id="pool-target">0</span><em data-i18n="在线槽位">在线槽位</em></div>
78
+ <div class="aside-divider"></div>
79
+ <div class="aside-row"><span data-i18n="队列等待">队列等待</span><b id="overview-queued">0</b></div>
80
+ <div class="aside-row"><span data-i18n="今日成功率">今日成功率</span><b id="overview-success">—</b></div>
81
+ </div>
82
+ </section>
83
+
84
+ <section id="kpis" aria-label="核心指标" data-i18n-aria="核心指标">
85
+ <div class="kpi k-run">
86
+ <div class="kpi-head"><span data-i18n="运行中">运行中</span><i class="kpi-icon"></i></div>
87
+ <div class="k-num" id="k-running">0</div>
88
+ <div class="kpi-foot"><span data-i18n="当前活动">当前活动</span><b>LIVE</b></div>
89
+ </div>
90
+ <div class="kpi k-queue">
91
+ <div class="kpi-head"><span data-i18n="排队中">排队中</span><i class="kpi-icon"></i></div>
92
+ <div class="k-num" id="k-queued">0</div>
93
+ <div class="kpi-foot"><span data-i18n="等待调度">等待调度</span><b>QUEUE</b></div>
94
+ </div>
95
+ <div class="kpi k-done">
96
+ <div class="kpi-head"><span data-i18n="今日完成">今日完成</span><i class="kpi-icon"></i></div>
97
+ <div class="k-num" id="k-done">0</div>
98
+ <div class="kpi-foot"><span data-i18n="完成运行">完成运行</span><b>DONE</b></div>
99
+ </div>
100
+ <div class="kpi k-fail">
101
+ <div class="kpi-head"><span data-i18n="今日失败">今日失败</span><i class="kpi-icon"></i></div>
102
+ <div class="k-num" id="k-failed">0</div>
103
+ <div class="kpi-foot"><span data-i18n="需要关注">需要关注</span><b>ALERT</b></div>
104
+ </div>
105
+ <div class="kpi k-tok">
106
+ <div class="kpi-head"><span data-i18n="今日 tokens">今日 tokens</span><i class="kpi-icon"></i></div>
107
+ <div class="k-num" id="k-tokens">0</div>
108
+ <div class="kpi-foot"><span data-i18n="模型消耗">模型消耗</span><b>USAGE</b></div>
109
+ </div>
110
+ <div class="kpi k-cost">
111
+ <div class="kpi-head"><span data-i18n="今日成本">今日成本</span><i class="kpi-icon"></i></div>
112
+ <div class="k-num" id="k-cost">$0.00</div>
113
+ <div class="kpi-foot"><span data-i18n="运行成本">运行成本</span><b>COST</b></div>
114
+ </div>
115
+ </section>
116
+
117
+ <section id="main">
118
+ <section id="wall" class="panel live-panel">
119
+ <header class="panel-head">
120
+ <div>
121
+ <div class="eyebrow"><span></span><span data-i18n="实时任务流">实时任务流</span></div>
122
+ <h2 data-i18n="运行中任务">运行中任务</h2>
123
+ </div>
124
+ <div class="panel-head-right">
125
+ <span id="wall-count" class="live-count">0 ACTIVE</span>
126
+ <span id="wall-mode" class="mode-label" data-i18n="监控中">监控中</span>
127
+ </div>
128
+ </header>
129
+ <div id="wall-cards"></div>
130
+ <div id="wall-empty" class="wall-empty hidden">
131
+ <div class="empty-orbit" aria-hidden="true"><i></i><i></i><i></i><b>0</b></div>
132
+ <div class="idle-t1" data-i18n="队列已清空">队列已清空</div>
133
+ <div class="idle-t2" data-i18n="等待新的任务接入蜂巢">等待新的任务接入蜂巢</div>
134
+ <div class="empty-meta"><span><i></i><b data-i18n="工作池就绪">工作池就绪</b></span><span><i></i><b data-i18n="监控在线">监控在线</b></span></div>
135
+ </div>
136
+ <div id="queue-row" class="queue-row hidden">
137
+ <div class="q-label"><span class="q-mark"></span><span data-i18n="排队等待">排队等待</span><b id="queue-count">0</b></div>
138
+ <span id="queue-chips"></span>
139
+ </div>
140
+ </section>
141
+
142
+ <aside id="rail">
143
+ <section class="rail-card rail-trend panel">
144
+ <div class="rail-head"><div><div class="eyebrow"><span></span><span data-i18n="资源脉冲">资源脉冲</span></div><h3 data-i18n="近 7 日 tokens">近 7 日 tokens</h3></div><span class="rail-badge">7 DAYS</span></div>
145
+ <div id="trend" class="trend"></div>
146
+ </section>
147
+ <section class="rail-card rail-models panel">
148
+ <div class="rail-head"><div><div class="eyebrow"><span></span><span data-i18n="模型分布">模型分布</span></div><h3 data-i18n="近 7 日模型 TOP5">近 7 日模型 TOP5</h3></div><span class="rail-badge">TOP 5</span></div>
149
+ <div id="models" class="models"></div>
150
+ </section>
151
+ <section class="rail-card rail-recent panel grow">
152
+ <div class="rail-head"><div><div class="eyebrow"><span></span><span data-i18n="事件日志">事件日志</span></div><h3 data-i18n="最近动态">最近动态</h3></div><span id="recent-count" class="rail-badge">—</span></div>
153
+ <div id="recent" class="recent"></div>
154
+ </section>
155
+ </aside>
156
+ </section>
157
+ </main>
158
+
159
+ <script src="/i18n.js"></script>
160
+ <script src="/board.js"></script>
161
+ </body>
162
+ </html>