chore: import original project baseline

Import the pre-repair source tree as the history baseline.
Runtime data (data/), virtualenvs, bytecode caches and logs are
gitignored so local secrets and user state stay out of the repo.
This commit is contained in:
2026-09-17 16:40:01 +08:00
commit a7412824e0
124 changed files with 26747 additions and 0 deletions
+82
View File
@@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Markdown 库 -->
<script src="marked.min.js"></script>
<!-- 代码高亮 -->
<link rel="stylesheet" href="highlight/atom-one-dark.min.css">
<script src="highlight/highlight.min.js"></script>
<!-- 🌟 HTML 消毒(防 XSS / 防 HTML 穿透的纵深防御) -->
<script src="dompurify.min.js"></script>
<!-- 🌟 KaTeX 公式渲染(本地离线资产;须在 app.js 之前) -->
<link rel="stylesheet" href="katex/katex.min.css">
<script src="katex/katex.min.js"></script>
<!-- 自定义样式 -->
<link rel="stylesheet" href="style.css">
<!-- 🌟 Qt WebChannel 支持(用于前端与 Python 通信) -->
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
</head>
<body>
<!--🌟 会话加载界面(进入新会话时的统一加载:居中图标 + 从左到右扫描条) -->
<div class="session-loading" id="session-loading" style="display:none;">
<div class="session-loading-box">
<img class="session-loading-icon" src="../../svg/main.svg" alt="haocode">
<div class="session-loading-bar">
<div class="session-loading-bar-fill"></div>
</div>
</div>
</div>
<!--🌟 欢迎界面 -->
<div class="welcome-screen">
<div class="welcome-content">
<img class="welcome-icon" src="../../svg/main.svg" alt="haocode">
<h1 class="brand-name">haocode</h1>
<p class="brand-tagline">探索未至之境</p>
</div>
</div>
<!-- 聊天容器 -->
<div id="chat-container"></div>
<div id="scroll-anchor" style="height: 1px; margin-bottom: 150px;"></div>
<!-- 🌟 桥接初始化脚本(必须在 app.js 之前执行)
双协议:WebView2window.chrome.webview.postMessage/ QtWebEngineQWebChannel -->
<script>
document.addEventListener("DOMContentLoaded", function () {
if (window.chrome && window.chrome.webview) {
// ---- WebView2 路径:JSON 消息协议,方法名与 QWebChannel slot 一一对应 ----
const post = (m, a) => {
try { window.chrome.webview.postMessage({ m: m, a: a }); } catch (e) { console.warn("[JS] postMessage 失败:", e); }
};
window.bridge = {
onRegenerateClicked: (x) => post("onRegenerateClicked", [x]),
onBranchSwitch: (x, d) => post("onBranchSwitch", [x, d]),
onDeleteMessageClicked: (x) => post("onDeleteMessageClicked", [x]),
onAttachmentClicked: (x) => post("onAttachmentClicked", [x]),
onScrollChanged: (y, h, c) => post("onScrollChanged", [y, h, c])
};
console.log("[JS] WebView2 桥接就绪,window.bridge 可用");
} else {
// ---- QtWebEngine 路径:原有 QWebChannel ----
new QWebChannel(qt.webChannelTransport, function (channel) {
window.bridge = channel.objects.bridge;
console.log("[JS] QWebChannel 已连接,window.bridge 就绪");
});
}
});
</script>
<!-- 主逻辑脚本 -->
<script src="app.js"></script>
</body>
</html>