(step, index)
| 620 | } |
| 621 | |
| 622 | function createStepHTML(step, index) { |
| 623 | const roleClass = step.role === 'user' ? 'user-message' : |
| 624 | step.role === 'tool' ? 'tool-message' : |
| 625 | step.role === 'system' ? 'system-message' : |
| 626 | 'assistant-message'; |
| 627 | const agentClass = step.agent.includes('browser') ? 'browser-agent' : ''; |
| 628 | |
| 629 | // 渲染内容 |
| 630 | const renderedPreview = renderContent(step.content_preview); |
| 631 | const renderedFullContent = renderContent(step.full_content); |
| 632 | |
| 633 | return ` |
| 634 | <div class="execution-step fade-in" data-step-id="${step.step_id}" data-agent="${step.agent}" id="step-${index}"> |
| 635 | <div class="step-header ${roleClass} ${agentClass}" data-toggle="collapse" data-target="#step-content-${index}"> |
| 636 | <div class="d-flex justify-content-between align-items-center"> |
| 637 | <div> |
| 638 | <span class="badge badge-role badge-${step.role}">${step.role}</span> |
| 639 | <span class="badge badge-browser ms-2">${step.agent}</span> |
| 640 | ${step.tool_calls.length > 0 ? `<span class="badge bg-warning text-dark ms-2">${step.tool_calls.length} 工具调用</span>` : ''} |
| 641 | ${step.browser_session ? `<span class="badge bg-success ms-2">Browser会话</span>` : ''} |
| 642 | </div> |
| 643 | <div class="d-flex align-items-center"> |
| 644 | <span class="timestamp me-2">${formatTimestamp(step.timestamp)}</span> |
| 645 | <span class="step-toggle"> |
| 646 | <i class="fas fa-chevron-down"></i> |
| 647 | </span> |
| 648 | </div> |
| 649 | </div> |
| 650 | <div class="content-preview mt-2"> |
| 651 | <div class="preview-text"> |
| 652 | ${renderedPreview} |
| 653 | </div> |
| 654 | </div> |
| 655 | </div> |
| 656 | |
| 657 | <div class="step-content collapse" id="step-content-${index}"> |
| 658 | <div class="mb-3"> |
| 659 | <h6>完整内容:</h6> |
| 660 | <div class="rendered-content">${renderedFullContent}</div> |
| 661 | </div> |
| 662 | |
| 663 | ${step.tool_calls.length > 0 ? ` |
| 664 | <div class="mb-3"> |
| 665 | <h6>工具调用:</h6> |
| 666 | ${step.tool_calls.map(tool => createToolCallHTML(tool)).join('')} |
| 667 | </div> |
| 668 | ` : ''} |
| 669 | |
| 670 | ${step.browser_flow && step.browser_flow.length > 0 ? ` |
| 671 | <div class="mb-3"> |
| 672 | <h6>Browser会话流程:</h6> |
| 673 | <div class="browser-session"> |
| 674 | <div class="browser-session-header"> |
| 675 | <i class="fas fa-globe"></i> ${step.browser_session} (${step.browser_flow.length} 步骤) |
| 676 | </div> |
| 677 | ${step.browser_flow.map(browserStep => createBrowserStepHTML(browserStep, index)).join('')} |
| 678 | </div> |
| 679 | </div> |
no test coverage detected