codebee 0.1.96 → 0.1.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +4 -2
- package/app/core/agent_context.py +21 -3
- package/app/core/board.py +39 -2
- package/app/core/builtin_agent.py +409 -34
- package/app/core/checkpoints.py +505 -0
- package/app/core/jobs.py +8 -1
- package/app/core/manager.py +109 -11
- package/app/core/mcp_client.py +200 -29
- package/app/core/pipeline.py +289 -40
- package/app/core/policy.py +36 -4
- package/app/core/project_memory.py +139 -0
- package/app/core/publish/auto.py +80 -19
- package/app/core/publish/browser.py +39 -0
- package/app/core/publish/fanqie.py +2 -0
- package/app/core/publish/flow.py +96 -17
- package/app/core/publish/flows-fanqie-calibrated.json +23 -11
- package/app/core/publish/ledger.py +38 -1
- package/app/core/runner.py +21 -11
- package/app/core/settings.py +13 -5
- package/app/core/settings_schema.py +14 -3
- package/app/core/store.py +21 -6
- package/app/core/tool_outputs.py +107 -0
- package/app/core/wxdigest.py +8 -1
- package/app/main.py +76 -2
- package/app/ui/app.js +356 -82
- package/app/ui/assets/workbench-reference.png +0 -0
- package/app/ui/board.css +451 -666
- package/app/ui/board.html +97 -94
- package/app/ui/board.js +316 -112
- package/app/ui/hive3d.js +242 -0
- package/app/ui/i18n.js +93 -10
- package/app/ui/index.html +31 -3
- package/app/ui/style.css +97 -111
- package/package.json +3 -2
package/app/ui/hive3d.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/* Fixed-view office: the reference artwork preserves its lighting/materials;
|
|
2
|
+
* localized HTML screens share the same aspect ratio, pan and zoom transform.
|
|
3
|
+
* No WebGL is required. The host supplies actual run/step data and log access. */
|
|
4
|
+
window.Hive3D = (function () {
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const tr = (key, ...args) => typeof window.t === "function" ? window.t(key, ...args) : key;
|
|
8
|
+
const clamp = (value, low, high) => Math.max(low, Math.min(high, value));
|
|
9
|
+
const STATUS = { running: "运行中", done: "完成", queued: "排队中", failed: "失败", timeout: "超时", cancelled: "已取消" };
|
|
10
|
+
const STAGES = ["规划", "起草", "评审", "执行", "打磨", "合成"];
|
|
11
|
+
// Glass content rectangles measured on the 2048 × 1151 reference image.
|
|
12
|
+
const SCREENS = [
|
|
13
|
+
[163, 441, 127, 55], [389, 441, 126, 55], [616, 441, 125, 55], [843, 441, 125, 55],
|
|
14
|
+
[1073, 441, 122, 55], [1298, 441, 125, 55], [1531, 441, 120, 55], [1750, 441, 125, 55],
|
|
15
|
+
[166, 724, 165, 66], [470, 724, 165, 66], [778, 724, 165, 66],
|
|
16
|
+
[1091, 724, 162, 66], [1392, 724, 163, 66], [1695, 724, 165, 66],
|
|
17
|
+
];
|
|
18
|
+
const PLATES = [[278, 206], [578, 206], [876, 206], [1175, 206], [1473, 206], [1766, 206]];
|
|
19
|
+
|
|
20
|
+
function node(tag, className, parent) {
|
|
21
|
+
const el = document.createElement(tag);
|
|
22
|
+
el.className = className;
|
|
23
|
+
if (parent) parent.appendChild(el);
|
|
24
|
+
return el;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function ReferenceScene(opts) {
|
|
28
|
+
this.opts = opts;
|
|
29
|
+
this.canvas = opts.canvas;
|
|
30
|
+
this.overlay = opts.overlay;
|
|
31
|
+
this.host = this.canvas.parentElement;
|
|
32
|
+
this.onCellActivate = opts.onCellActivate || function () {};
|
|
33
|
+
this.cellRefresh = opts.cellRefresh || function () { return {}; };
|
|
34
|
+
this.model = null;
|
|
35
|
+
this.page = 0;
|
|
36
|
+
this.zoom = 1;
|
|
37
|
+
this.pan = { x: 0, y: 0 };
|
|
38
|
+
this.active = false;
|
|
39
|
+
this.timer = null;
|
|
40
|
+
this.screenMeta = [];
|
|
41
|
+
this.listeners = [];
|
|
42
|
+
this.layer = node("div", "hive-reference-layer", this.host);
|
|
43
|
+
this.layer.appendChild(this.host.querySelector(".hive-reference"));
|
|
44
|
+
this.layer.appendChild(this.overlay);
|
|
45
|
+
this.overlay.replaceChildren();
|
|
46
|
+
this.canvas.hidden = true;
|
|
47
|
+
this.host.dataset.renderer = "reference";
|
|
48
|
+
|
|
49
|
+
this.stageMeta = PLATES.map(([x, y], index) => {
|
|
50
|
+
const el = node("button", "hg-badge", this.overlay);
|
|
51
|
+
el.type = "button";
|
|
52
|
+
el.style.left = (x / 2048 * 100) + "%";
|
|
53
|
+
el.style.top = (y / 1151 * 100) + "%";
|
|
54
|
+
const name = node("b", "hg-name", el);
|
|
55
|
+
const meta = node("span", "hg-meta", el);
|
|
56
|
+
this.listen(el, "click", () => {
|
|
57
|
+
const lane = this.stageMeta[index].lane;
|
|
58
|
+
if (!lane) return;
|
|
59
|
+
const cell = lane.cells.find((item) => item.status === "running") || lane.cells[lane.cells.length - 1];
|
|
60
|
+
if (cell) this.onCellActivate(this.model.runId, cell.rel, cell);
|
|
61
|
+
});
|
|
62
|
+
return { el, name, meta, lane: null };
|
|
63
|
+
});
|
|
64
|
+
this.monitors = SCREENS.map(([x, y, width, height], index) => {
|
|
65
|
+
const el = node("button", "hg-monitor", this.overlay);
|
|
66
|
+
el.type = "button";
|
|
67
|
+
el.style.left = (x / 2048 * 100) + "%";
|
|
68
|
+
el.style.top = (y / 1151 * 100) + "%";
|
|
69
|
+
el.style.width = (width / 2048 * 100) + "%";
|
|
70
|
+
el.style.height = (height / 1151 * 100) + "%";
|
|
71
|
+
const role = node("b", "hg-monitor-role", el);
|
|
72
|
+
const status = node("span", "hg-monitor-status", el);
|
|
73
|
+
const tail = node("span", "hg-monitor-tail", el);
|
|
74
|
+
const time = node("span", "hg-monitor-time", el);
|
|
75
|
+
this.listen(el, "click", () => {
|
|
76
|
+
const cell = this.screenMeta[index];
|
|
77
|
+
if (cell) this.onCellActivate(this.model.runId, cell.rel, cell);
|
|
78
|
+
});
|
|
79
|
+
return { el, role, status, tail, time };
|
|
80
|
+
});
|
|
81
|
+
const toolbar = this.host.parentElement.querySelector(".hive-scene-tools");
|
|
82
|
+
this.pager = node("div", "hive-scene-pager");
|
|
83
|
+
this.pager.hidden = true;
|
|
84
|
+
this.prev = node("button", "hive-scene-btn", this.pager);
|
|
85
|
+
this.prev.type = "button"; this.prev.textContent = "‹";
|
|
86
|
+
this.pageLabel = node("span", "hive-scene-page-label", this.pager);
|
|
87
|
+
this.next = node("button", "hive-scene-btn", this.pager);
|
|
88
|
+
this.next.type = "button"; this.next.textContent = "›";
|
|
89
|
+
if (toolbar) toolbar.insertBefore(this.pager, toolbar.querySelector(".hive-scene-spacer"));
|
|
90
|
+
this.listen(this.prev, "click", () => this.showPage(this.page - 1));
|
|
91
|
+
this.listen(this.next, "click", () => this.showPage(this.page + 1));
|
|
92
|
+
this.bindSurface();
|
|
93
|
+
this.resizeObserver = new ResizeObserver(() => this.resize());
|
|
94
|
+
this.resizeObserver.observe(this.host);
|
|
95
|
+
this.languageObserver = new MutationObserver(() => this.updateOverlay());
|
|
96
|
+
this.languageObserver.observe(document.documentElement, { attributes: true, attributeFilter: ["data-lang"] });
|
|
97
|
+
this.resize();
|
|
98
|
+
this.updateOverlay();
|
|
99
|
+
window.__hive3d = this;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
ReferenceScene.prototype.listen = function (el, type, fn, options) {
|
|
103
|
+
el.addEventListener(type, fn, options);
|
|
104
|
+
this.listeners.push(() => el.removeEventListener(type, fn, options));
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
ReferenceScene.prototype.bindSurface = function () {
|
|
108
|
+
let drag = null;
|
|
109
|
+
this.listen(this.host, "contextmenu", (event) => event.preventDefault());
|
|
110
|
+
this.listen(this.host, "pointerdown", (event) => {
|
|
111
|
+
if (!this.active || event.target.closest("button") || event.button !== 0) return;
|
|
112
|
+
drag = { x: event.clientX, y: event.clientY, panX: this.pan.x, panY: this.pan.y };
|
|
113
|
+
this.host.setPointerCapture(event.pointerId);
|
|
114
|
+
this.host.classList.add("is-dragging");
|
|
115
|
+
});
|
|
116
|
+
this.listen(this.host, "pointermove", (event) => {
|
|
117
|
+
if (!drag) return;
|
|
118
|
+
this.pan.x = drag.panX + event.clientX - drag.x;
|
|
119
|
+
this.pan.y = drag.panY + event.clientY - drag.y;
|
|
120
|
+
this.applyTransform();
|
|
121
|
+
});
|
|
122
|
+
const end = () => { drag = null; this.host.classList.remove("is-dragging"); };
|
|
123
|
+
this.listen(this.host, "pointerup", end);
|
|
124
|
+
this.listen(this.host, "pointercancel", end);
|
|
125
|
+
this.listen(this.host, "dblclick", (event) => { if (!event.target.closest("button")) this.resetView(); });
|
|
126
|
+
this.listen(this.host, "wheel", (event) => {
|
|
127
|
+
if (!this.active || event.target.closest("button")) return;
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
this.zoomAt(Math.exp(event.deltaY * 0.0011));
|
|
130
|
+
}, { passive: false });
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
ReferenceScene.prototype.sync = function (model) {
|
|
134
|
+
const changedRun = !this.model || this.model.runId !== model.runId;
|
|
135
|
+
this.model = model;
|
|
136
|
+
this.cells = model.lanes.flatMap((lane, stageIdx) => lane.cells.map((cell) => ({ ...cell, stageIdx })));
|
|
137
|
+
if (changedRun) {
|
|
138
|
+
const running = this.cells.findIndex((cell) => cell.status === "running");
|
|
139
|
+
this.page = running < 0 ? 0 : Math.floor(running / SCREENS.length);
|
|
140
|
+
this.resetView();
|
|
141
|
+
}
|
|
142
|
+
this.showPage(this.page);
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
ReferenceScene.prototype.showPage = function (page) {
|
|
146
|
+
const pages = Math.max(1, Math.ceil((this.cells || []).length / SCREENS.length));
|
|
147
|
+
this.page = clamp(page, 0, pages - 1);
|
|
148
|
+
this.screenMeta = (this.cells || []).slice(this.page * SCREENS.length, (this.page + 1) * SCREENS.length);
|
|
149
|
+
this.pager.hidden = pages <= 1;
|
|
150
|
+
this.prev.disabled = this.page === 0;
|
|
151
|
+
this.next.disabled = this.page === pages - 1;
|
|
152
|
+
this.pageLabel.textContent = (this.page + 1) + " / " + pages;
|
|
153
|
+
this.updateOverlay();
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
ReferenceScene.prototype.updateOverlay = function () {
|
|
157
|
+
const lanes = this.model ? this.model.lanes : [];
|
|
158
|
+
this.stageMeta.forEach((plate, index) => {
|
|
159
|
+
const lane = lanes[index];
|
|
160
|
+
plate.lane = lane || null;
|
|
161
|
+
const name = lane ? tr(lane.nameKey || lane.name) : tr(STAGES[index]);
|
|
162
|
+
plate.name.textContent = tr("阶段 {0} · {1}", index + 1, name);
|
|
163
|
+
plate.meta.textContent = lane ? tr("{0} / {1} 步骤", lane.settled, lane.count) : tr("等待任务");
|
|
164
|
+
plate.el.classList.toggle("hg-active", !!(lane && lane.active));
|
|
165
|
+
plate.el.disabled = !lane || !lane.cells.length;
|
|
166
|
+
plate.el.title = tr("点击查看实时日志");
|
|
167
|
+
});
|
|
168
|
+
this.monitors.forEach((monitor, index) => {
|
|
169
|
+
const cell = this.screenMeta[index];
|
|
170
|
+
const refresh = cell && cell.rel ? this.cellRefresh(cell.rel) || {} : {};
|
|
171
|
+
const state = cell ? cell.status : "idle";
|
|
172
|
+
monitor.el.className = "hg-monitor st-" + state;
|
|
173
|
+
monitor.el.disabled = !cell;
|
|
174
|
+
monitor.el.dataset.log = cell ? cell.rel : "";
|
|
175
|
+
monitor.role.textContent = cell ? tr(cell.role) : tr("空闲工位");
|
|
176
|
+
monitor.status.textContent = cell ? tr(STATUS[state] || "完成") : tr("待命");
|
|
177
|
+
monitor.tail.textContent = cell ? refresh.tail || cell.displayTail ||
|
|
178
|
+
(state === "running" ? tr("等待日志输出…") : state === "queued" ? tr("等待执行") : tr("(无输出)")) : tr("等待任务");
|
|
179
|
+
monitor.time.textContent = cell ? refresh.elapsed || cell.displayElapsed || "" : "";
|
|
180
|
+
monitor.el.title = cell ? [tr(cell.role), tr(STATUS[state] || "完成"), cell.displayAgent,
|
|
181
|
+
monitor.tail.textContent, tr("点击查看实时日志")].filter(Boolean).join(" · ") : tr("空闲工位");
|
|
182
|
+
monitor.el.setAttribute("aria-label", monitor.el.title);
|
|
183
|
+
});
|
|
184
|
+
this.prev.setAttribute("aria-label", tr("上一组工位"));
|
|
185
|
+
this.next.setAttribute("aria-label", tr("下一组工位"));
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
ReferenceScene.prototype.setActive = function (active) {
|
|
189
|
+
this.active = !!active;
|
|
190
|
+
this.layer.hidden = !this.active;
|
|
191
|
+
if (this.timer) clearInterval(this.timer);
|
|
192
|
+
this.timer = null;
|
|
193
|
+
if (this.active) {
|
|
194
|
+
this.updateOverlay();
|
|
195
|
+
this.timer = setInterval(() => {
|
|
196
|
+
if (!document.hidden && this.host.offsetParent !== null) this.updateOverlay();
|
|
197
|
+
}, 1000);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
ReferenceScene.prototype.resize = function () {
|
|
202
|
+
this.cssW = this.host.clientWidth;
|
|
203
|
+
this.cssH = this.host.clientHeight;
|
|
204
|
+
this.applyTransform();
|
|
205
|
+
};
|
|
206
|
+
ReferenceScene.prototype.applyTransform = function () {
|
|
207
|
+
const xLimit = this.cssW * (this.zoom - 1) / 2;
|
|
208
|
+
const yLimit = this.cssH * (this.zoom - 1) / 2;
|
|
209
|
+
this.pan.x = clamp(this.pan.x, -xLimit, xLimit);
|
|
210
|
+
this.pan.y = clamp(this.pan.y, -yLimit, yLimit);
|
|
211
|
+
this.layer.style.transform = "translate(" + this.pan.x + "px," + this.pan.y + "px) scale(" + this.zoom + ")";
|
|
212
|
+
};
|
|
213
|
+
ReferenceScene.prototype.zoomAt = function (factor) {
|
|
214
|
+
this.zoom = clamp(this.zoom / factor, 1, 3);
|
|
215
|
+
this.applyTransform();
|
|
216
|
+
};
|
|
217
|
+
ReferenceScene.prototype.resetView = function () {
|
|
218
|
+
this.zoom = 1;
|
|
219
|
+
this.pan = { x: 0, y: 0 };
|
|
220
|
+
this.applyTransform();
|
|
221
|
+
};
|
|
222
|
+
ReferenceScene.prototype.info = function () {
|
|
223
|
+
return { renderer: "reference", cells: (this.cells || []).length, screens: SCREENS.length,
|
|
224
|
+
lanes: this.model ? this.model.lanes.length : 0, page: this.page, zoom: this.zoom, cssW: this.cssW, cssH: this.cssH };
|
|
225
|
+
};
|
|
226
|
+
ReferenceScene.prototype.projectCell = function (rel) {
|
|
227
|
+
const index = this.screenMeta.findIndex((cell) => cell.rel === rel);
|
|
228
|
+
if (index < 0) return null;
|
|
229
|
+
const [x, y, width, height] = SCREENS[index];
|
|
230
|
+
return { x: (x + width / 2) / 2048 * this.cssW, y: (y + height / 2) / 1151 * this.cssH };
|
|
231
|
+
};
|
|
232
|
+
ReferenceScene.prototype.dispose = function () {
|
|
233
|
+
this.setActive(false);
|
|
234
|
+
this.resizeObserver.disconnect();
|
|
235
|
+
this.languageObserver.disconnect();
|
|
236
|
+
this.listeners.forEach((remove) => remove());
|
|
237
|
+
this.pager.remove();
|
|
238
|
+
if (window.__hive3d === this) delete window.__hive3d;
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
return { create(opts) { return new ReferenceScene(opts); } };
|
|
242
|
+
})();
|
package/app/ui/i18n.js
CHANGED
|
@@ -14,11 +14,29 @@
|
|
|
14
14
|
"视图模式": "View mode",
|
|
15
15
|
"3D 场景": "3D scene",
|
|
16
16
|
"2D 列表": "2D list",
|
|
17
|
-
"
|
|
17
|
+
"拖动旋转 · 滚轮缩放 · 右键升降": "Drag to orbit · Scroll to zoom · Right-drag to climb",
|
|
18
|
+
"拖动平移 · 滚轮缩放 · 点击屏幕看日志": "Drag to pan · Scroll to zoom · Click a screen for logs",
|
|
18
19
|
"复位视角": "Reset view",
|
|
19
20
|
"缩小": "Zoom out",
|
|
20
21
|
"放大": "Zoom in",
|
|
21
22
|
"蜂巢流程 3D 场景": "Hive workflow 3D scene",
|
|
23
|
+
"当前环境不支持 WebGL,已切换 2D 列表": "WebGL is unavailable here — switched to 2D list",
|
|
24
|
+
"3D 场景不可用,已切换 2D 列表": "3D scene failed — switched to 2D list",
|
|
25
|
+
"点击格子看日志": "click a cell for its log",
|
|
26
|
+
"点击工位看该阶段最新日志": "click the station for its latest log",
|
|
27
|
+
"点击查看实时日志": "Click to view live log",
|
|
28
|
+
"加载日志中…": "Loading log…",
|
|
29
|
+
"协作工作台参考场景": "Collaborative workbench reference scene",
|
|
30
|
+
"阶段 {0} · {1}": "Stage {0} · {1}",
|
|
31
|
+
"{0} / {1} 步骤": "{0} / {1} steps",
|
|
32
|
+
"等待任务": "Waiting for task",
|
|
33
|
+
"空闲工位": "Idle workstation",
|
|
34
|
+
"待命": "Standby",
|
|
35
|
+
"等待日志输出…": "Waiting for log output…",
|
|
36
|
+
"等待执行": "Waiting to run",
|
|
37
|
+
"(无输出)": "(No output)",
|
|
38
|
+
"上一组工位": "Previous workstation group",
|
|
39
|
+
"下一组工位": "Next workstation group",
|
|
22
40
|
// —— 短片段(拼接用)——
|
|
23
41
|
"检查中…": "Checking…",
|
|
24
42
|
"浏览器": "Browser",
|
|
@@ -363,7 +381,6 @@
|
|
|
363
381
|
"个文件": " files",
|
|
364
382
|
"本次运行没有产生工作区变更。": "No workspace changes were produced in this run.",
|
|
365
383
|
"Git 工具": "Git tools",
|
|
366
|
-
"进度": "Progress",
|
|
367
384
|
"运行统计": "Run stats",
|
|
368
385
|
"完整详情": "Full detail",
|
|
369
386
|
"收起检查器": "Collapse inspector",
|
|
@@ -1268,13 +1285,9 @@
|
|
|
1268
1285
|
"其他": "Other",
|
|
1269
1286
|
"协议 · ": "protocol · ",
|
|
1270
1287
|
"墨金": "Ink & Gold",
|
|
1271
|
-
"经典": "Classic",
|
|
1272
1288
|
"简白": "Paper",
|
|
1273
1289
|
"深海": "Deep sea",
|
|
1274
1290
|
"森野": "Forest",
|
|
1275
|
-
"暖阳": "Amber",
|
|
1276
|
-
"霓虹": "Neon",
|
|
1277
|
-
"高对比": "High contrast",
|
|
1278
1291
|
"夜间": "Dark",
|
|
1279
1292
|
"日间": "Light",
|
|
1280
1293
|
"暖墨底色 + 金色发丝线,Hermes 式古典优雅": "Warm-ink base with gold hairlines — Hermes-style classical elegance",
|
|
@@ -1342,7 +1355,6 @@
|
|
|
1342
1355
|
"刚刚更新 ": "updated ",
|
|
1343
1356
|
"停在底部自动跟随新输出;上翻回看时不动": "Stay at the bottom to follow new output; scrolling up freezes the view",
|
|
1344
1357
|
"共 ": "Total ",
|
|
1345
|
-
" 个文件": " files",
|
|
1346
1358
|
"(仅显示最近 200 个)": " (showing only the latest 200)",
|
|
1347
1359
|
"删除所选": "Delete selected",
|
|
1348
1360
|
"条;另有 ": " removed; another ",
|
|
@@ -1459,7 +1471,6 @@
|
|
|
1459
1471
|
" → <b>": " → <b>",
|
|
1460
1472
|
"(已是最新版本,无需升级)": " (already up to date — no upgrade needed)",
|
|
1461
1473
|
"(等待输出…安装/下载阶段可能有一段静默期)": " (waiting for output… install/download may be silent for a while)",
|
|
1462
|
-
"(无输出)": " (no output)",
|
|
1463
1474
|
"(尚无输出)": " (no output yet)",
|
|
1464
1475
|
"完整运行": "Full run",
|
|
1465
1476
|
"编辑供应商配置(地址 / 协议 / 难度模型)": "Edit provider config (endpoint / protocol / difficulty models)",
|
|
@@ -1585,6 +1596,27 @@
|
|
|
1585
1596
|
"创建一个按计划自动运行的任务": "Create a task that runs on a schedule",
|
|
1586
1597
|
"重新拉取任务列表": "Reload the task list",
|
|
1587
1598
|
"刷新": "Refresh",
|
|
1599
|
+
"文件检查点": "File checkpoints",
|
|
1600
|
+
"查看检查点": "View checkpoints",
|
|
1601
|
+
"恢复文件": "Restore files",
|
|
1602
|
+
"项目记忆治理": "Project memory review",
|
|
1603
|
+
"刷新记忆": "Refresh memory",
|
|
1604
|
+
"批准": "Approve",
|
|
1605
|
+
"拒绝": "Reject",
|
|
1606
|
+
"项目记忆": "Project memory",
|
|
1607
|
+
"已过期": "Expired",
|
|
1608
|
+
"暂无项目记忆": "No project memory entries",
|
|
1609
|
+
"正在加载项目记忆…": "Loading project memory…",
|
|
1610
|
+
"加载项目记忆失败:": "Could not load project memory: ",
|
|
1611
|
+
"正在读取文件检查点…": "Loading file checkpoints…",
|
|
1612
|
+
"此运行没有文件快照": "This run has no file snapshots",
|
|
1613
|
+
"可恢复": "Restorable",
|
|
1614
|
+
"检查点读取失败:": "Could not load checkpoints: ",
|
|
1615
|
+
"恢复会覆盖检查点记录的文件,shell、MCP 和外部服务副作用不保证可回滚。确定继续?": "Restore overwrites files recorded by the checkpoint. Shell, MCP, and external-service side effects are not guaranteed to roll back. Continue?",
|
|
1616
|
+
"已恢复 ": "Restored ",
|
|
1617
|
+
" 个文件": " files",
|
|
1618
|
+
"冲突 ": " conflicts: ",
|
|
1619
|
+
"项目记忆操作失败:": "Project-memory action failed: ",
|
|
1588
1620
|
"任务筛选": "Filter tasks",
|
|
1589
1621
|
"定时任务模板": "Scheduled task templates",
|
|
1590
1622
|
"每天 ": "Every day at ",
|
|
@@ -1776,7 +1808,6 @@
|
|
|
1776
1808
|
"工具": "Tool",
|
|
1777
1809
|
"角色": "Role",
|
|
1778
1810
|
"智能体": "Agent",
|
|
1779
|
-
"模型": "Model",
|
|
1780
1811
|
"模型:": "Model: ",
|
|
1781
1812
|
"电脑": "Computer",
|
|
1782
1813
|
"接管": "Take over",
|
|
@@ -2600,7 +2631,7 @@
|
|
|
2600
2631
|
"预算": "Budget",
|
|
2601
2632
|
"级联路由": "Cascade routing",
|
|
2602
2633
|
"引擎调参(schema 化设置,立即生效)": "Engine tuning (schema-driven settings, effective immediately)",
|
|
2603
|
-
"
|
|
2634
|
+
"上下文压缩总开关(默认开启;可在设置页或用 TUTTI_COMPACTION=0 关闭)": "Master switch for context compaction (enabled by default; disable in settings or with TUTTI_COMPACTION=0)",
|
|
2604
2635
|
"触发压缩的压力比阈值": "Pressure ratio threshold that triggers compaction",
|
|
2605
2636
|
"压缩时保留尾部预算(token 估算)": "Tail budget kept when compacting (estimated in tokens)",
|
|
2606
2637
|
"Goal 续行上限": "Max goal continuation rounds",
|
|
@@ -3016,6 +3047,55 @@
|
|
|
3016
3047
|
"没有正在运行的任务,新任务在主界面创建后会实时出现在这里": "No running tasks — new ones created in the main UI appear here in real time.",
|
|
3017
3048
|
"还没有已完成的运行": "No finished runs yet",
|
|
3018
3049
|
"暂无调用记录": "No calls yet",
|
|
3050
|
+
// —— 大屏改版补词条(2026-10-08:指标副位 / 下钻抽屉 / 换肤)——
|
|
3051
|
+
"今日消耗": "Usage today",
|
|
3052
|
+
"今日运行": "Runs today",
|
|
3053
|
+
"今日零失败": "Zero failures today",
|
|
3054
|
+
"尚无结课运行": "No finished runs yet",
|
|
3055
|
+
"成功率 {0}%": "Success {0}%",
|
|
3056
|
+
"最长等待 {0}": "Longest wait {0}",
|
|
3057
|
+
"队首空闲": "Queue head idle",
|
|
3058
|
+
"无活动": "Idle",
|
|
3059
|
+
"步 {0}/{1}": "steps {0}/{1}",
|
|
3060
|
+
"最近 {0}": "Latest {0}",
|
|
3061
|
+
"次调用": "calls",
|
|
3062
|
+
"7日": "7d",
|
|
3063
|
+
"每 4 秒刷新": "Refreshes every 4s",
|
|
3064
|
+
"蜂群运行中 · {0} 个任务并行": "Hive active · {0} task(s) in parallel",
|
|
3065
|
+
"蜂群待命 · {0} 个任务排队": "Hive standing by · {0} task(s) queued",
|
|
3066
|
+
"服务 {0}/{1} 正常": "Services {0}/{1} nominal",
|
|
3067
|
+
"{0} 个服务异常": "{0} service(s) down",
|
|
3068
|
+
"新任务在主界面创建后会实时出现在这里": "New tasks created in the main UI appear here in real time",
|
|
3069
|
+
"今天还没有已结束的": "Nothing has finished today yet",
|
|
3070
|
+
"等待实时输出…": "Waiting for live output…",
|
|
3071
|
+
"蜂巢槽位": "Hive slots",
|
|
3072
|
+
"对话槽位": "Chat slots",
|
|
3073
|
+
"空闲槽位": "Free slots",
|
|
3074
|
+
"开始": "Started",
|
|
3075
|
+
"已运行": "Elapsed",
|
|
3076
|
+
"进度": "Progress",
|
|
3077
|
+
"预估": "Estimate",
|
|
3078
|
+
"执行体": "Executor",
|
|
3079
|
+
"模型": "Model",
|
|
3080
|
+
"厂商": "Provider",
|
|
3081
|
+
"消耗": "Usage",
|
|
3082
|
+
"无": "None",
|
|
3083
|
+
"步骤日志": "Step log",
|
|
3084
|
+
"加载中": "Loading",
|
|
3085
|
+
"暂无步骤": "No steps",
|
|
3086
|
+
"该步没有日志文件": "This step has no log file",
|
|
3087
|
+
"(日志为空)": "(log empty)",
|
|
3088
|
+
"日志读取失败": "Failed to read log",
|
|
3089
|
+
"等待": "Waiting",
|
|
3090
|
+
"经典": "Classic",
|
|
3091
|
+
"森林": "Forest",
|
|
3092
|
+
"暖阳": "Amber",
|
|
3093
|
+
"霓虹": "Neon",
|
|
3094
|
+
"高对比": "High contrast",
|
|
3095
|
+
"夜": "Night",
|
|
3096
|
+
"切换皮肤(仅大屏记忆)": "Switch skin (board only)",
|
|
3097
|
+
"切换明暗(仅大屏记忆)": "Toggle light/dark (board only)",
|
|
3098
|
+
"关闭 (Esc)": "Close (Esc)",
|
|
3019
3099
|
// —— EN 词条收尾补全(2026-10-06 巡检 G-② 残件 7 条:本地插件/自定义样题/报告导出/浏览器面板;133 字 webhooks 键词条早已在位,文件级 grep 误报勿重加)——
|
|
3020
3100
|
"本地插件": "Local plugins",
|
|
3021
3101
|
"本地插件遵循统一 manifest 规范。技能会接入经验库;MCP 只在启用后合并到内置智能体工具,不执行插件脚本或钩子。": "Local plugins follow a unified manifest spec. Skills feed the experience library; MCP tools merge into the built-in agent's toolkit only once enabled — plugin scripts or hooks are never executed.",
|
|
@@ -3174,6 +3254,9 @@
|
|
|
3174
3254
|
scope.querySelectorAll("[data-i18n-aria]").forEach((el) => {
|
|
3175
3255
|
el.setAttribute("aria-label", t(el.dataset.i18nAria));
|
|
3176
3256
|
});
|
|
3257
|
+
scope.querySelectorAll("[data-i18n-alt]").forEach((el) => {
|
|
3258
|
+
el.setAttribute("alt", t(el.dataset.i18nAlt));
|
|
3259
|
+
});
|
|
3177
3260
|
// 编排 pill 短名取自 option 文本,重译后要跟着换语言
|
|
3178
3261
|
if (typeof window.syncCmpSelFace === "function") {
|
|
3179
3262
|
// au-* 是自动化弹框里的偏好胶囊:弹框未开时这两个 id 不在 DOM 里,
|
package/app/ui/index.html
CHANGED
|
@@ -672,15 +672,27 @@
|
|
|
672
672
|
<button type="button" class="hive-view-btn active" data-hive-view="3d" aria-pressed="true" data-i18n="3D 场景">3D 场景</button>
|
|
673
673
|
<button type="button" class="hive-view-btn" data-hive-view="2d" aria-pressed="false" data-i18n="2D 列表">2D 列表</button>
|
|
674
674
|
</div>
|
|
675
|
-
<span class="hive-scene-hint" data-i18n="
|
|
675
|
+
<span class="hive-scene-hint" data-i18n="拖动平移 · 滚轮缩放 · 点击屏幕看日志">拖动平移 · 滚轮缩放 · 点击屏幕看日志</span>
|
|
676
676
|
<span class="hive-scene-spacer"></span>
|
|
677
677
|
<button type="button" class="hive-scene-btn" data-hive-scene-action="zoom-out" aria-label="缩小" title="缩小">−</button>
|
|
678
678
|
<button type="button" class="hive-scene-btn" data-hive-scene-action="zoom-in" aria-label="放大" title="放大">+</button>
|
|
679
679
|
<button type="button" class="hive-scene-btn hive-scene-reset" data-hive-scene-action="reset" data-i18n="复位视角">复位视角</button>
|
|
680
680
|
</div>
|
|
681
|
-
<div id="rd-hive-viewport" class="hive-viewport" data-i18n-aria="蜂巢流程 3D 场景" aria-label="蜂巢流程 3D 场景">
|
|
682
|
-
<
|
|
681
|
+
<div id="rd-hive-viewport" class="hive-viewport hive-mode-3d" data-i18n-aria="蜂巢流程 3D 场景" aria-label="蜂巢流程 3D 场景">
|
|
682
|
+
<img class="hive-reference" src="assets/workbench-reference.png" alt="协作工作台参考场景" data-i18n-alt="协作工作台参考场景" decoding="async">
|
|
683
|
+
<canvas id="rd-hive-gl" class="hive-gl" aria-hidden="true"></canvas>
|
|
684
|
+
<div id="rd-hive-overlay" class="hive-gl-overlay" aria-hidden="true"></div>
|
|
685
|
+
<div id="rd-hive-cells" class="hive-cells"></div>
|
|
683
686
|
</div>
|
|
687
|
+
<dialog id="hive-log-dialog" class="hive-detail-dialog" aria-labelledby="hive-log-title">
|
|
688
|
+
<div class="hive-detail-head">
|
|
689
|
+
<h3 id="hive-log-title"></h3>
|
|
690
|
+
<button id="hive-log-close" class="hive-detail-close" type="button" data-i18n="关闭">关闭</button>
|
|
691
|
+
</div>
|
|
692
|
+
<div id="hive-log-meta" class="hive-detail-meta"></div>
|
|
693
|
+
<pre id="hive-log-text" class="hive-detail-log"></pre>
|
|
694
|
+
<p id="hive-log-error" class="hive-detail-error"></p>
|
|
695
|
+
</dialog>
|
|
684
696
|
</div>
|
|
685
697
|
<!-- 运行中指挥信箱:renderDirector 只认活跃 run,渲染时摘掉 hidden;
|
|
686
698
|
与检查器的迷你指挥坞不同屏(详情上下文检查器让位),这里是带附件的完整版 -->
|
|
@@ -700,6 +712,21 @@
|
|
|
700
712
|
</div>
|
|
701
713
|
</div>
|
|
702
714
|
<div id="rd-pane-steps" class="rd-pane" role="tabpanel" aria-labelledby="rd-tab-steps" data-pane="steps">
|
|
715
|
+
<section id="rd-checkpoints" class="rd-checkpoints hidden" aria-live="polite">
|
|
716
|
+
<div class="rd-checkpoints-head">
|
|
717
|
+
<strong data-i18n="文件检查点">文件检查点</strong>
|
|
718
|
+
<button id="rd-checkpoints-load" type="button" class="ghost small" onclick="loadRunCheckpoints()" data-i18n="查看检查点">查看检查点</button>
|
|
719
|
+
<button id="rd-checkpoints-restore" type="button" class="danger small hidden" onclick="restoreRunCheckpoints()" data-i18n="恢复文件">恢复文件</button>
|
|
720
|
+
</div>
|
|
721
|
+
<div id="rd-checkpoints-body" class="hint"></div>
|
|
722
|
+
</section>
|
|
723
|
+
<section id="rd-project-memory" class="rd-project-memory hidden" aria-live="polite">
|
|
724
|
+
<div class="rd-checkpoints-head">
|
|
725
|
+
<strong data-i18n="项目记忆治理">项目记忆治理</strong>
|
|
726
|
+
<button id="rd-project-memory-refresh" type="button" class="ghost small" onclick="loadProjectMemory()" data-i18n="刷新记忆">刷新记忆</button>
|
|
727
|
+
</div>
|
|
728
|
+
<div id="rd-project-memory-body" class="hint"></div>
|
|
729
|
+
</section>
|
|
703
730
|
<div id="rd-plan" class="hidden"></div>
|
|
704
731
|
<div id="rd-routing" class="rd-routing hidden"></div>
|
|
705
732
|
<div id="rd-chapters" class="rd-chapters hidden"></div>
|
|
@@ -1645,6 +1672,7 @@
|
|
|
1645
1672
|
<script src="qrcode.js"></script>
|
|
1646
1673
|
<script src="i18n.js"></script>
|
|
1647
1674
|
<script src="artdiff.js"></script>
|
|
1675
|
+
<script src="hive3d.js"></script>
|
|
1648
1676
|
<script src="app.js"></script>
|
|
1649
1677
|
</body>
|
|
1650
1678
|
</html>
|