104 lines
3.9 KiB
HTML
104 lines
3.9 KiB
HTML
<!doctype html>
|
|
<html lang="en-US" suppressHydrationWarning>
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<script>
|
|
(function () {
|
|
try {
|
|
var t = localStorage.getItem("strategy-theme");
|
|
var root = document.documentElement;
|
|
root.classList.remove("dark", "light");
|
|
if (t === "light") return;
|
|
root.classList.add("dark");
|
|
} catch (e) {}
|
|
})();
|
|
// Chrome 102 has no AbortSignal.timeout (Chrome 103+). Install before
|
|
// any module so LangGraph SDK control requests can set a deadline.
|
|
(function () {
|
|
try {
|
|
if (typeof AbortSignal === "undefined" || typeof AbortSignal.timeout === "function") {
|
|
return;
|
|
}
|
|
AbortSignal.timeout = function (milliseconds) {
|
|
var controller = new AbortController();
|
|
var timer = setTimeout(function () {
|
|
var reason;
|
|
try {
|
|
reason = new DOMException("signal timed out", "TimeoutError");
|
|
} catch (err) {
|
|
reason = new Error("signal timed out");
|
|
reason.name = "TimeoutError";
|
|
}
|
|
try {
|
|
controller.abort(reason);
|
|
} catch (err) {
|
|
controller.abort();
|
|
}
|
|
}, milliseconds);
|
|
controller.signal.addEventListener(
|
|
"abort",
|
|
function () {
|
|
clearTimeout(timer);
|
|
},
|
|
{ once: true },
|
|
);
|
|
return controller.signal;
|
|
};
|
|
} catch (err) {}
|
|
})();
|
|
</script>
|
|
<script>
|
|
// React 19's development profiler uses the User Timing Level 3
|
|
// `performance.measure(name, options)` overload. Firefox 101 only
|
|
// implements the legacy string-marker form and otherwise throws a
|
|
// DOMException during every scheduled update. Detect that overload
|
|
// before React loads and disable its optional profiler when unavailable.
|
|
(function () {
|
|
try {
|
|
var perf = window.performance;
|
|
if (!perf || typeof perf.measure !== "function" || typeof perf.now !== "function") return;
|
|
var probe = "__deerflow_user_timing_options_probe__";
|
|
var now = perf.now();
|
|
perf.measure(probe, { start: now, end: now });
|
|
if (typeof perf.clearMeasures === "function") perf.clearMeasures(probe);
|
|
} catch (e) {
|
|
try {
|
|
Object.defineProperty(window.performance, "measure", {
|
|
value: undefined,
|
|
configurable: true,
|
|
});
|
|
} catch (defineError) {
|
|
try {
|
|
window.performance.measure = undefined;
|
|
} catch (assignmentError) {}
|
|
}
|
|
}
|
|
})();
|
|
</script>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<script>
|
|
// Relative production assets need a directory URL. A mounted prefix such
|
|
// as /web must resolve against /web/. history.replaceState during parsing
|
|
// makes old Firefox abort the document (NS_BINDING_ABORTED) before the
|
|
// login bundle runs, so install a base URL instead of rewriting history.
|
|
(function () {
|
|
try {
|
|
var path = window.location.pathname;
|
|
if (path === "/" || /\/$/.test(path) || /\.[^/]+$/.test(path)) return;
|
|
if (document.querySelector("base")) return;
|
|
var base = document.createElement("base");
|
|
base.href = path + "/";
|
|
document.head.appendChild(base);
|
|
} catch (e) {}
|
|
})();
|
|
</script>
|
|
<link rel="icon" type="image/svg+xml" href="%BASE_URL%favicon.svg" />
|
|
<title>CM 助手</title>
|
|
<script src="%BASE_URL%runtime-config.js" data-runtime-config></script>
|
|
</head>
|
|
<body>
|
|
<div id="root"></div>
|
|
<script type="module" src="/src/main.tsx"></script>
|
|
</body>
|
|
</html>
|