Files
beaver_project/docs/presentations/参考资料/参考图片-html-ppt/pixel-reference.html
steven_li 520a21a027 feat(coordinator): 添加团队节点默认最大工具迭代次数配置
添加 DEFAULT_TEAM_NODE_MAX_TOOL_ITERATIONS 配置项以控制团队节点的最大工具迭代次数,
并修改 LocalAgentRunner 中的逻辑来使用此默认值当 envelope 中未指定时。

fix(runtime): 修复团队节点运行成功判断逻辑

更新运行成功判断条件,将 finish_reason 为 "max_tool_iterations_finalized" 的情况
视为运行失败,并添加对原始工具调用输出的检测,避免将其误判为成功完成。

feat(mcp): 添加团队工作流MCP工具类别支持

增加新的本地MCP工具类别 "team_workflow" 及其对应的工具创建功能,
为团队工作流提供本地工具支持。

refactor(engine): 调整AgentLoop最大工具迭代次数设置

将 AgentProfile 中的默认 max_tool_iterations 从 30 增加到 100,
同时移除 TaskExecutionPlanner 构造函数中的重复参数传递。

perf(mcp): 优化MCP连接管理避免重复连接

添加 mcp_connected 标志来跟踪MCP连接状态,确保 connect_all 只执行一次,
提高性能并避免不必要的重复连接。

refactor(skills): 移除技能团队模板相关功能

移除与技能团队模板相关的代码,包括解析、存储和处理逻辑,
简化技能记录结构和加载流程。

feat(process): 增强会话过程投影器功能

添加技能激活快照事件处理,改进团队运行完成消息显示,
并增强技能激活事件的时间戳记录功能。

refactor(tasks): 简化任务尝试编排器团队执行逻辑

移除团队执行相关代码,将所有任务统一按单步执行处理,
简化任务编排器的复杂度并提升执行效率。

fix(evidence): 修复节点证据评估中需求验证逻辑

更新节点证据评估逻辑,跳过自然语言证据需求的确定性验证,
只执行机器可读的需求验证,避免因自然语言需求导致的节点失败。
2026-06-26 16:36:29 +08:00

193 lines
6.5 KiB
HTML

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Pixel Reference 对比验收</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
background: #15161c;
color: #edf5ff;
font-family: "Microsoft YaHei", "PingFang SC", Arial, sans-serif;
overflow: hidden;
}
.toolbar {
position: fixed;
inset: 0 0 auto 0;
height: 58px;
z-index: 20;
display: flex;
align-items: center;
gap: 14px;
padding: 10px 16px;
background: rgba(12, 14, 20, .94);
border-bottom: 1px solid rgba(255,255,255,.12);
}
button, select {
height: 36px;
border: 1px solid rgba(110, 190, 255, .45);
border-radius: 8px;
background: #202839;
color: #eef8ff;
padding: 0 12px;
font-weight: 800;
}
input[type="range"] { width: 180px; }
.wrap {
position: fixed;
inset: 58px 0 0 0;
display: grid;
place-items: center;
overflow: auto;
}
.canvas {
position: relative;
width: 1672px;
height: 941px;
transform-origin: center center;
background: #020815;
box-shadow: 0 20px 80px rgba(0,0,0,.55);
}
.pair {
width: calc(1672px * 2 + 24px);
height: 941px;
display: grid;
grid-template-columns: 1672px 1672px;
gap: 24px;
transform-origin: center center;
}
.pane {
position: relative;
background: #020815;
box-shadow: 0 20px 80px rgba(0,0,0,.55);
}
.label {
position: absolute;
left: 12px;
top: 12px;
z-index: 5;
padding: 6px 10px;
border-radius: 6px;
background: rgba(0,0,0,.55);
color: #fff;
font: 800 13px/1 Arial;
}
img, iframe {
position: absolute;
inset: 0;
width: 1672px;
height: 941px;
border: 0;
}
.ref { z-index: 1; }
.impl { z-index: 2; pointer-events: none; }
.checker {
position: absolute;
inset: 0;
z-index: 0;
background:
linear-gradient(45deg, #20232d 25%, transparent 25% 75%, #20232d 75%) 0 0/32px 32px,
linear-gradient(45deg, #20232d 25%, transparent 25% 75%, #20232d 75%) 16px 16px/32px 32px,
#15161c;
}
.hint { margin-left: auto; color: #aab4c3; font-size: 13px; }
</style>
</head>
<body>
<div class="toolbar">
<button id="prev">上一页</button>
<select id="page"></select>
<button id="next">下一页</button>
<button id="mode">模式:叠加</button>
<label>实现透明度 <input id="opacity" type="range" min="0" max="100" value="58"></label>
<span id="readout">58%</span>
<span class="hint">用于验收对比,最终展示页不引用整张参考图。</span>
</div>
<div class="wrap">
<div id="overlayCanvas" class="canvas">
<div class="checker"></div>
<img id="ref" class="ref" alt="参考图">
<iframe id="impl" class="impl" title="实现页"></iframe>
<span class="label">Reference + Recreated Overlay</span>
</div>
<div id="pairCanvas" class="pair" hidden>
<div class="pane"><span class="label">Reference</span><img id="refPair" alt="参考图"></div>
<div class="pane"><span class="label">Recreated</span><iframe id="implPair" title="实现页"></iframe></div>
</div>
</div>
<script>
const refs = [
'../参考图片/ChatGPT Image 2026年6月25日 16_23_46.png',
'../参考图片/ChatGPT Image 2026年6月25日 16_23_57.png',
'../参考图片/ChatGPT Image 2026年6月25日 16_24_02.png',
'../参考图片/ChatGPT Image 2026年6月25日 16_24_07.png',
'../参考图片/ChatGPT Image 2026年6月25日 16_24_20.png',
'../参考图片/ChatGPT Image 2026年6月25日 16_24_25.png',
'../参考图片/ChatGPT Image 2026年6月25日 16_24_39.png',
'../参考图片/ChatGPT Image 2026年6月25日 16_24_46.png',
'../参考图片/ChatGPT Image 2026年6月25日 16_24_56.png',
'../参考图片/ChatGPT Image 2026年6月25日 16_26_07.png'
];
let current = 0;
let sideBySide = false;
const pageSelect = document.getElementById('page');
const overlayCanvas = document.getElementById('overlayCanvas');
const pairCanvas = document.getElementById('pairCanvas');
const opacity = document.getElementById('opacity');
const readout = document.getElementById('readout');
const mode = document.getElementById('mode');
refs.forEach((_, i) => {
const option = document.createElement('option');
option.value = i;
option.textContent = `Page ${i + 1}`;
pageSelect.appendChild(option);
});
function fit() {
const target = sideBySide ? pairCanvas : overlayCanvas;
const width = sideBySide ? 1672 * 2 + 24 : 1672;
const scale = Math.min((window.innerWidth - 36) / width, (window.innerHeight - 90) / 941, 1);
target.style.transform = `scale(${scale})`;
}
function show(index) {
current = Math.max(0, Math.min(refs.length - 1, index));
pageSelect.value = current;
const implUrl = `index.html?capture=1#/page-${current + 1}`;
document.getElementById('ref').src = refs[current];
document.getElementById('impl').src = implUrl;
document.getElementById('refPair').src = refs[current];
document.getElementById('implPair').src = implUrl;
history.replaceState(null, '', `#/page-${current + 1}`);
}
function setOpacity() {
const value = Number(opacity.value) / 100;
document.getElementById('impl').style.opacity = value;
readout.textContent = `${opacity.value}%`;
}
function toggleMode() {
sideBySide = !sideBySide;
overlayCanvas.hidden = sideBySide;
pairCanvas.hidden = !sideBySide;
mode.textContent = sideBySide ? '模式:左右' : '模式:叠加';
fit();
}
document.getElementById('prev').onclick = () => show(current - 1);
document.getElementById('next').onclick = () => show(current + 1);
pageSelect.onchange = () => show(Number(pageSelect.value));
opacity.oninput = setOpacity;
mode.onclick = toggleMode;
window.onresize = fit;
window.onkeydown = (event) => {
if (['ArrowDown', 'PageDown', 'ArrowRight'].includes(event.key)) show(current + 1);
if (['ArrowUp', 'PageUp', 'ArrowLeft'].includes(event.key)) show(current - 1);
if (event.key.toLowerCase() === 'm') toggleMode();
};
const match = location.hash.match(/page-(\d+)/);
show(match ? Number(match[1]) - 1 : 0);
setOpacity();
fit();
</script>
</body>
</html>