Files
cc-web/public/index.html

430 lines
29 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
<meta name="application-name" content="CC-Web">
<meta name="theme-color" content="#020c16">
<title>CC-Web</title>
<link data-instance-icon-link rel="icon" type="image/png" href="/api/instance-icon?v=default">
<link data-instance-icon-link rel="apple-touch-icon" href="/api/instance-icon?v=default">
<link rel="manifest" href="/api/site.webmanifest">
<script>
(function () {
var theme = localStorage.getItem('cc-web-theme') || 'washi';
if (theme === 'gilded') {
theme = 'washi';
localStorage.setItem('cc-web-theme', theme);
}
var dividerTime = localStorage.getItem('cc-web-show-divider-time') === '0' ? 'hide' : 'show';
document.documentElement.dataset.theme = theme;
document.documentElement.dataset.dividerTime = dividerTime;
})();
</script>
<link rel="stylesheet" href="style.css?v=20260818-goal-mode-label">
<link rel="stylesheet" href="task-board.css?v=__CC_WEB_FRONTEND_ASSET_VERSION__">
<link rel="stylesheet" href="gitea-workflow.css?v=__CC_WEB_GITEA_WORKFLOW_ASSET_VERSION__">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
</head>
<body>
<!-- Login -->
<div id="login-overlay" class="login-overlay">
<div class="login-box">
<img class="login-logo" data-instance-icon src="/api/instance-icon?v=default" alt="CC-Web">
<h2>CC-Web</h2>
<p>Claude / Codex Web Chat</p>
<form id="login-form">
<input type="password" id="login-password" placeholder="输入密码" autocomplete="current-password" autofocus>
<label class="remember-label">
<input type="checkbox" id="remember-pw"> 记住密码
</label>
<button type="submit">登录</button>
</form>
<div id="login-error" class="login-error" hidden>密码错误</div>
</div>
</div>
<!-- Main App -->
<div id="app" class="app" hidden>
<!-- Sidebar -->
<aside id="sidebar" class="sidebar">
<div class="sidebar-header">
<div class="new-chat-split">
<button id="new-chat-btn" class="new-chat-btn"><span class="new-chat-glyph" aria-hidden="true">+</span> 新会话</button>
<button id="new-chat-arrow" class="new-chat-arrow" title="更多"></button>
</div>
<div id="new-chat-dropdown" class="new-chat-dropdown" hidden>
<button id="import-session-btn">导入本地 CLI 会话</button>
</div>
<div class="session-search-row">
<div class="session-search">
<input id="session-search-input" class="session-search-input" type="search" placeholder="检索会话 / 项目" autocomplete="off" aria-label="检索会话或项目">
<button id="session-search-clear" class="session-search-clear" type="button" title="清空检索" aria-label="清空检索" hidden>×</button>
</div>
<button id="mcp-session-visibility-toggle" class="mcp-session-visibility-toggle icon-only" type="button" title="隐藏 MCP 会话" aria-label="隐藏 MCP 会话" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M2.5 12s3.5-6 9.5-6 9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6Z"></path>
<circle cx="12" cy="12" r="2.5"></circle>
<path class="mcp-session-visibility-slash" d="m4 4 16 16"></path>
</svg>
</button>
<button id="advanced-search-open" class="advanced-search-open" type="button" title="高级会话检索" aria-label="打开高级会话检索" aria-controls="advanced-search-panel" aria-expanded="false"></button>
</div>
</div>
<div id="session-list" class="session-list"></div>
<div class="sidebar-footer">
<div class="sidebar-footer-actions" role="group" aria-label="CC-Web 工具">
<button id="settings-btn" class="settings-btn" type="button" title="设置" aria-label="打开设置"></button>
<button id="usage-dashboard-open" class="usage-dashboard-open" type="button" title="使用统计" aria-label="打开使用统计" aria-controls="usage-dashboard-panel" aria-expanded="false" hidden>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M5 21v-6"></path><path d="M12 21V9"></path><path d="M19 21V3"></path>
</svg>
</button>
<button id="task-board-open" class="usage-dashboard-open" type="button" title="任务看板" aria-label="打开任务看板" aria-controls="task-board-panel" aria-expanded="false" hidden>
<span aria-hidden="true"></span>
</button>
<button id="gitea-workflow-open" class="usage-dashboard-open" type="button" title="Gitea Workflow" aria-label="打开 Gitea Workflow 管理" aria-controls="gitea-workflow-panel" aria-expanded="false">
<span aria-hidden="true"></span>
</button>
</div>
<span class="brand">CC-Web</span>
</div>
</aside>
<div id="sidebar-overlay" class="sidebar-overlay" hidden></div>
<!-- Chat -->
<main class="chat-main">
<header class="chat-header">
<button id="menu-btn" class="menu-btn" type="button" title="收起左侧菜单" aria-label="收起左侧菜单" aria-controls="sidebar" aria-expanded="true"></button>
<span id="chat-title" class="chat-title">新会话</span>
<button id="chat-session-id-btn" class="chat-session-id-btn" type="button" title="复制当前会话 ID" hidden>ID</button>
<button id="chat-cwd" class="chat-cwd" type="button" hidden></button>
</header>
<div class="messages-wrap">
<div id="messages" class="messages">
<div class="welcome-msg">
<section class="warframe-hero" aria-labelledby="warframe-welcome-title">
<div class="warframe-hero-art" aria-hidden="true">
<img class="warframe-hero-image" src="assets/themes/gilded-wasteland.png" alt="" draggable="false" decoding="async">
<span class="warframe-hero-orbit"></span>
<span class="warframe-hero-emblem"></span>
</div>
<div class="wasteland-welcome-art" aria-hidden="true">
<div class="wasteland-welcome-surface"></div>
<img class="wasteland-welcome-frame" src="assets/themes/wasteland/frames/welcome-card.png" alt="" draggable="false" decoding="async">
</div>
<div class="welcome-icon"></div>
<div class="welcome-copy">
<div class="welcome-kicker">OROKIN FIELD ARCHIVE · CC-WEB</div>
<h3 id="warframe-welcome-title" data-welcome-project-copy></h3>
<p>本次你要构建什么?</p>
</div>
</section>
</div>
</div>
<div class="custom-scrollbar" id="custom-scrollbar">
<div class="custom-scrollbar-thumb" id="custom-scrollbar-thumb"></div>
</div>
</div>
<section id="task-board-panel" class="task-board-panel" role="dialog" aria-labelledby="task-board-panel-title" aria-hidden="true" hidden>
<header class="task-board-panel__header">
<h2 id="task-board-panel-title" class="sr-only">任务看板</h2>
<button id="task-board-close" type="button" class="usage-dashboard__icon-button" title="返回聊天" aria-label="返回聊天"></button>
</header>
<div id="task-board-root" class="task-board-panel__root"></div>
</section>
<section id="gitea-workflow-panel" class="gitea-workflow-panel" role="dialog" aria-labelledby="gitea-workflow-title" aria-hidden="true" hidden>
<header class="gitea-workflow-panel__header">
<button id="gitea-workflow-close" type="button" class="usage-dashboard__icon-button" title="返回聊天" aria-label="返回聊天"></button>
<div>
<h2 id="gitea-workflow-title">Gitea Workflow</h2>
<p id="gitea-workflow-status" role="status" aria-live="polite">正在加载工作流状态…</p>
</div>
<button id="gitea-workflow-refresh" type="button" class="gitea-workflow__refresh">刷新</button>
</header>
<div id="gitea-workflow-root" class="gitea-workflow-panel__root"></div>
</section>
<!-- Slash command menu -->
<div id="cmd-menu" class="cmd-menu" hidden></div>
<section id="advanced-search-panel" class="advanced-search-panel" role="dialog" aria-labelledby="advanced-search-title" hidden>
<div class="advanced-search-shell">
<header class="advanced-search-header">
<button id="advanced-search-close" class="advanced-search-close" type="button" aria-label="关闭高级会话检索"></button>
<div class="advanced-search-field">
<label id="advanced-search-title" class="advanced-search-title" for="advanced-search-input">高级会话检索</label>
<div class="advanced-search-input-wrap">
<input id="advanced-search-input" class="advanced-search-input" type="search" placeholder="搜索会话标题、路径与消息内容" autocomplete="off" aria-label="高级会话检索关键词" aria-describedby="advanced-search-status">
<button id="advanced-search-clear" class="advanced-search-clear" type="button" aria-label="清空高级检索关键词" hidden>×</button>
</div>
</div>
<button id="advanced-search-submit" class="advanced-search-submit" type="button" aria-label="执行高级会话检索"></button>
</header>
<div class="advanced-search-toolbar" aria-label="高级检索选项">
<div class="advanced-search-toggle-group" role="group" aria-label="排序方式">
<button id="advanced-search-sort-relevance" class="advanced-search-pill" type="button" aria-pressed="false">最相关</button>
<button id="advanced-search-sort-newest" class="advanced-search-pill" type="button" aria-pressed="true">最新优先</button>
</div>
<div class="advanced-search-toggle-group" role="group" aria-label="匹配方式">
<button id="advanced-search-match-contains" class="advanced-search-pill" type="button" aria-pressed="false">包含</button>
<button id="advanced-search-match-word" class="advanced-search-pill" type="button" aria-pressed="true">整词</button>
</div>
</div>
<div id="advanced-search-status" class="advanced-search-status" role="status" aria-live="polite">输入至少 2 个字符开始检索</div>
<div id="advanced-search-results" class="advanced-search-results" role="list" aria-label="高级检索结果"></div>
<div id="advanced-search-empty" class="advanced-search-empty" role="status" hidden>没有匹配的会话</div>
</div>
</section>
<section id="usage-dashboard-panel" class="usage-dashboard" role="dialog" aria-labelledby="usage-dashboard-title" aria-describedby="usage-dashboard-status" data-state="idle" hidden>
<div class="usage-dashboard__shell">
<header class="usage-dashboard__header">
<div class="usage-dashboard__heading">
<h2 id="usage-dashboard-title">使用统计</h2>
<p id="usage-dashboard-status" role="status" aria-live="polite">基于当前保留的会话数据</p>
</div>
<div class="usage-dashboard__header-actions">
<time id="usage-dashboard-generated-at" class="usage-dashboard__generated-at"></time>
<button id="usage-dashboard-refresh" class="usage-dashboard__refresh" type="button" aria-label="刷新统计" title="刷新统计">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M21 12a9 9 0 0 0-15.12-6.6L3 8"></path><path d="M3 3v5h5"></path><path d="M3 12a9 9 0 0 0 15.12 6.6L21 16"></path><path d="M16 16h5v5"></path>
</svg>
<span id="usage-dashboard-refresh-label" aria-live="polite">刷新</span>
</button>
<button id="usage-dashboard-close" class="usage-dashboard__icon-button usage-dashboard__back" type="button" aria-label="返回聊天" title="返回聊天">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="m15 18-6-6 6-6"></path>
</svg>
</button>
</div>
</header>
<div class="usage-dashboard__toolbar" aria-label="统计范围">
<div class="usage-dashboard__filters">
<div class="usage-dashboard__periods" role="group" aria-label="快捷时间范围">
<button id="usage-dashboard-period-week" class="usage-dashboard__period" type="button" aria-pressed="true">本周</button>
<button id="usage-dashboard-period-month" class="usage-dashboard__period" type="button" aria-pressed="false">本月</button>
<button id="usage-dashboard-period-custom" class="usage-dashboard__period" type="button" aria-pressed="false">自定义</button>
</div>
<div class="usage-dashboard__dates">
<span class="usage-dashboard__date-icon" aria-hidden="true">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="5" width="18" height="16" rx="2"></rect><path d="M16 3v4M8 3v4M3 10h18"></path>
</svg>
</span>
<label><span class="sr-only">统计开始日期</span><input id="usage-dashboard-from" type="date" aria-label="统计开始日期"></label>
<span class="usage-dashboard__date-separator" aria-hidden="true">~</span>
<label><span class="sr-only">统计结束日期</span><input id="usage-dashboard-to" type="date" aria-label="统计结束日期"></label>
<button id="usage-dashboard-apply" class="usage-dashboard__apply" type="button">应用</button>
</div>
</div>
</div>
<div class="usage-dashboard__body">
<div id="usage-dashboard-error" class="usage-dashboard__error" role="alert" hidden></div>
<section class="usage-dashboard__metric-grid" aria-label="统计概览">
<article class="usage-dashboard__metric usage-dashboard__metric--sessions">
<span class="usage-dashboard__metric-icon" aria-hidden="true">
<svg viewBox="0 0 24 24"><path d="M6 3.5h9l3 3V20.5H6z"></path><path d="M14 3.5v4h4M12 11v6M9 14h6"></path></svg>
</span>
<span class="usage-dashboard__metric-copy"><span class="usage-dashboard__metric-label">新建会话</span><strong data-usage-metric="newSessions">0</strong><small>所选范围内</small></span>
<div class="usage-dashboard__sparkline" data-usage-spark="newSessions" role="img" aria-label="新建会话每日微趋势"></div>
</article>
<article class="usage-dashboard__metric usage-dashboard__metric--messages">
<span class="usage-dashboard__metric-icon" aria-hidden="true">
<svg viewBox="0 0 24 24"><path d="M4 6.5h10.5a3 3 0 0 1 3 3v4a3 3 0 0 1-3 3H9l-4 3v-3.1a3 3 0 0 1-1-2.2v-4.7a3 3 0 0 1 3-3Z"></path><path d="m15 9 4 4-4 4M12 13h7"></path></svg>
</span>
<span class="usage-dashboard__metric-copy"><span class="usage-dashboard__metric-label">发送消息</span><strong data-usage-metric="messages">0</strong><small data-usage-message-split>直接 0 · 跨会话 0</small></span>
<div class="usage-dashboard__sparkline" data-usage-spark="messages" role="img" aria-label="发送消息每日微趋势"></div>
</article>
<article class="usage-dashboard__metric usage-dashboard__metric--mcp">
<span class="usage-dashboard__metric-icon" aria-hidden="true">
<svg viewBox="0 0 24 24"><path d="M7 6.5 12 4l5 2.5v5L12 14l-5-2.5zM7 16.5 12 14l5 2.5v3L12 22l-5-2.5z"></path><path d="M7 9.5 4 11v5l3 1.5M17 9.5l3 1.5v5L17 18"></path></svg>
</span>
<span class="usage-dashboard__metric-copy"><span class="usage-dashboard__metric-label">MCP 调用</span><strong data-usage-metric="mcpCalls">0</strong><small>按消息时间归属</small></span>
<div class="usage-dashboard__sparkline" data-usage-spark="mcpCalls" role="img" aria-label="MCP 调用每日微趋势"></div>
</article>
<article class="usage-dashboard__metric usage-dashboard__metric--danger">
<span class="usage-dashboard__metric-icon" aria-hidden="true">
<svg viewBox="0 0 24 24"><path d="m12 3 9 16H3z"></path><path d="M12 9v4M12 17.2v.1"></path><path d="m5 5 14 14"></path></svg>
</span>
<span class="usage-dashboard__metric-copy"><span class="usage-dashboard__metric-label">MCP 失败</span><strong data-usage-metric="mcpFailures">0</strong><small data-usage-failure-rate>失败率 0%</small></span>
<div class="usage-dashboard__sparkline" data-usage-spark="mcpFailures" role="img" aria-label="MCP 失败每日微趋势"></div>
</article>
<article class="usage-dashboard__metric usage-dashboard__metric--projects">
<span class="usage-dashboard__metric-icon" aria-hidden="true">
<svg viewBox="0 0 24 24"><path d="M3.5 6.5h6l2 2h9v10.5h-17z"></path><path d="M3.5 9h17"></path></svg>
</span>
<span class="usage-dashboard__metric-copy"><span class="usage-dashboard__metric-label">涉及项目</span><strong data-usage-metric="projects">0</strong><small>有活动的项目</small></span>
<div class="usage-dashboard__sparkline" data-usage-spark="projects" role="img" aria-label="每日涉及项目微趋势"></div>
</article>
</section>
<div class="usage-dashboard__content-grid usage-dashboard__content-grid--primary">
<section class="usage-dashboard__panel usage-dashboard__panel--trend" aria-labelledby="usage-dashboard-trend-title">
<div class="usage-dashboard__panel-heading">
<div><h3 id="usage-dashboard-trend-title">使用趋势</h3><p>每日变化 · 柱:消息 / MCP线会话 / 项目</p></div>
<div class="usage-dashboard__trend-tools"><span class="usage-dashboard__grain">按日</span></div>
</div>
<div class="usage-dashboard__chart-wrap">
<div id="usage-dashboard-trend" class="usage-dashboard__chart" role="img" aria-label="每日消息、MCP、会话和项目使用趋势"></div>
</div>
</section>
<section class="usage-dashboard__panel usage-dashboard__panel--mcp" aria-labelledby="usage-dashboard-mcp-title">
<div class="usage-dashboard__panel-heading">
<div><h3 id="usage-dashboard-mcp-title">MCP 使用明细</h3><p>按调用次数排序 · 点击成功率查看明细</p></div>
</div>
<div class="usage-dashboard__table-wrap">
<table class="usage-dashboard__table usage-dashboard__table--mcp">
<thead><tr><th scope="col">排名</th><th scope="col">MCP Server / Tool</th><th scope="col">调用次数</th><th scope="col">成功次数</th><th scope="col">失败次数</th><th scope="col">成功率</th></tr></thead>
<tbody id="usage-dashboard-mcp-rows"></tbody>
</table>
</div>
<button id="usage-dashboard-mcp-more" class="usage-dashboard__list-more" type="button" aria-expanded="false" hidden></button>
<div id="usage-dashboard-mcp-empty" class="usage-dashboard__empty" hidden>所选时间内没有 MCP 调用</div>
</section>
</div>
<button id="usage-dashboard-detail-scrim" class="usage-dashboard__detail-scrim" type="button" aria-label="关闭调用明细" hidden></button>
<section id="usage-dashboard-detail" class="usage-dashboard__panel usage-dashboard__detail" role="dialog" aria-modal="true" aria-labelledby="usage-dashboard-detail-title" aria-describedby="usage-dashboard-detail-meta" hidden>
<div class="usage-dashboard__panel-heading">
<div><h3 id="usage-dashboard-detail-title">调用明细</h3><p id="usage-dashboard-detail-meta"></p></div>
<button id="usage-dashboard-detail-close" class="usage-dashboard__icon-button" type="button" aria-label="关闭调用明细" title="关闭调用明细">×</button>
</div>
<div class="usage-dashboard__table-wrap">
<table class="usage-dashboard__table">
<thead><tr><th scope="col">时间</th><th scope="col">状态</th><th scope="col">会话</th><th scope="col">Agent</th></tr></thead>
<tbody id="usage-dashboard-detail-rows"></tbody>
</table>
</div>
</section>
<div class="usage-dashboard__content-grid usage-dashboard__content-grid--lower">
<section class="usage-dashboard__panel usage-dashboard__panel--status" aria-labelledby="usage-dashboard-mcp-status-title">
<div class="usage-dashboard__panel-heading">
<div><h3 id="usage-dashboard-mcp-status-title">状态统计</h3><p>真实拆分 · 调用结果、消息来源与项目归属</p></div>
</div>
<div id="usage-dashboard-mcp-status" class="usage-dashboard__status-list"></div>
</section>
<section class="usage-dashboard__panel usage-dashboard__panel--projects" aria-labelledby="usage-dashboard-projects-title">
<div class="usage-dashboard__panel-heading">
<div><h3 id="usage-dashboard-projects-title">项目使用排行</h3><p>按消息活跃量排序 · 汇总会话与 MCP</p></div>
</div>
<div class="usage-dashboard__rank-head" aria-hidden="true">
<span>排名</span><span>项目</span><span>会话</span><span>消息</span><span>MCP</span>
</div>
<ol id="usage-dashboard-project-rows" class="usage-dashboard__rank-list usage-dashboard__project-list"></ol>
<div id="usage-dashboard-project-empty" class="usage-dashboard__empty" hidden>所选时间内没有可归属的项目活动</div>
</section>
</div>
<section class="usage-dashboard__panel usage-dashboard__panel--sessions" aria-labelledby="usage-dashboard-sessions-title">
<div class="usage-dashboard__panel-heading">
<div><h3 id="usage-dashboard-sessions-title">最近会话</h3><p>点击名称或“查看”回到原会话</p></div>
</div>
<div class="usage-dashboard__table-wrap">
<table class="usage-dashboard__table usage-dashboard__table--sessions">
<thead><tr><th scope="col">会话名称</th><th scope="col">消息数</th><th scope="col">MCP 调用次数</th><th scope="col">项目</th><th scope="col">最近时间</th><th scope="col">操作</th></tr></thead>
<tbody id="usage-dashboard-session-rows"></tbody>
</table>
</div>
<div id="usage-dashboard-session-empty" class="usage-dashboard__empty" hidden>所选时间内没有会话记录</div>
</section>
</div>
</div>
</section>
<div class="input-area">
<div class="chat-controls" aria-label="会话控制">
<span id="chat-runtime-state" class="chat-runtime-state" hidden>运行中</span>
<select id="mode-select" class="mode-select" title="权限模式">
<option value="yolo">YOLO</option>
<option value="default">默认</option>
<option value="plan">Plan</option>
</select>
<div class="user-outline-anchor">
<button id="user-outline-btn" class="user-outline-btn" type="button" aria-expanded="false" aria-controls="user-outline-panel" title="定位用户消息">定位</button>
<div id="user-outline-panel" class="user-outline-panel" hidden></div>
</div>
<div class="ccweb-prompt-outline-anchor" hidden>
<button id="ccweb-prompt-outline-btn" class="user-outline-btn ccweb-prompt-outline-btn" type="button" aria-expanded="false" aria-controls="ccweb-prompt-outline-panel" title="定位待处理表单">表单</button>
<div id="ccweb-prompt-outline-panel" class="user-outline-panel ccweb-prompt-outline-panel" hidden></div>
</div>
<button id="reload-mcp-btn" class="reload-mcp-btn" type="button" title="重载 Codex App MCP 配置" hidden>重载 MCP</button>
<span id="cost-display" class="cost-display" hidden></span>
<div id="task-tracking-control" class="task-tracking-control" hidden></div>
</div>
<div id="attachment-tray" class="attachment-tray" hidden></div>
<div id="pending-notes-tray" class="pending-notes-tray" hidden></div>
<div class="input-wrapper">
<input id="image-upload-input" type="file" accept="image/png,image/jpeg,image/webp,image/gif" multiple hidden>
<button id="attach-btn" class="attach-btn" title="上传图片" type="button">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21.44 11.05l-8.49 8.49a6 6 0 1 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path>
</svg>
</button>
<textarea id="msg-input" rows="1" placeholder="输入消息… 输入 / 查看指令" autocomplete="off"></textarea>
<button id="note-mode-btn" class="note-mode-btn" title="笔记模式" aria-label="笔记模式" aria-pressed="false" type="button">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 20h9"></path>
<path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"></path>
<path d="m15 5 3 3"></path>
</svg>
</button>
<button id="queue-send-btn" class="queue-send-btn" title="排队发送" aria-label="排队发送" type="button" hidden>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 6h10"></path>
<path d="M4 12h8"></path>
<path d="M4 18h10"></path>
<path d="m16 10 4 4-4 4"></path>
</svg>
</button>
<button id="send-btn" class="send-btn" title="发送">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon>
</svg>
</button>
<button id="abort-btn" class="abort-btn" title="停止" hidden>
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
<rect x="6" y="6" width="12" height="12" rx="2"></rect>
</svg>
</button>
</div>
</div>
</main>
</div>
<div id="session-loading-overlay" class="session-loading-overlay" hidden aria-live="polite" aria-hidden="true">
<div class="session-loading-card" role="status" aria-busy="true">
<div class="session-loading-badge">Session</div>
<div class="session-loading-title">会话加载中</div>
<div id="session-loading-label" class="session-loading-label">正在整理消息与上下文…</div>
<div class="session-loading-bar">
<span class="session-loading-bar-fill"></span>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/12.0.1/marked.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.9.1/mermaid.min.js"></script>
<script src="vendor/echarts.min.js?v=5.6.0"></script>
<script>window.ccWebFrontendAssetVersion = '__CC_WEB_FRONTEND_ASSET_VERSION__';</script>
<script src="task-board.js?v=__CC_WEB_FRONTEND_ASSET_VERSION__"></script>
<script src="gitea-workflow.js?v=__CC_WEB_GITEA_WORKFLOW_ASSET_VERSION__"></script>
<script src="app.js?v=__CC_WEB_FRONTEND_ASSET_VERSION__"></script>
</body>
</html>