mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-07-09 17:19:02 +00:00
Some checks are pending
* test(web-shell): add browser and lint harness * test(web-shell): harden browser smoke harness * fix(web-shell): guard mock daemon model state * test(web-shell): remove unused scenario harness * fix(web-shell): remove stale lint disables * test(web-shell): make matchMedia stub writable * fix(web-shell): exclude tests from package typecheck * test(web-shell): tighten mock daemon route contract * Update packages/web-shell/client/e2e/utils/mockDaemon.ts Co-authored-by: qwen-code-ci-bot <qwen-code-ci@service.alibaba.com> * test(web-shell): clear stale SSE connections * ci(web-shell): gate smoke on full CI profile --------- Co-authored-by: ermin.zem <ermin.zem@alibaba-inc.com> Co-authored-by: qwen-code-ci-bot <qwen-code-ci@service.alibaba.com> Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com> Co-authored-by: 易良 <1204183885@qq.com>
75 lines
4.5 KiB
HTML
75 lines
4.5 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<!--
|
|
`interactive-widget=resizes-content` is Chrome-on-Android-only (108+);
|
|
iOS Safari silently ignores it — the virtual keyboard always overlays
|
|
the viewport there. Keyboard-aware layout on iOS requires the
|
|
VirtualKeyboard API or `visualViewport` resize events instead.
|
|
-->
|
|
<meta
|
|
name="viewport"
|
|
content="width=device-width, initial-scale=1.0, viewport-fit=cover, interactive-widget=resizes-content"
|
|
/>
|
|
<!--
|
|
Status bar color follows the active theme; the inline script below
|
|
updates this meta tag in the same tick it applies the theme class so
|
|
mobile browsers never flash the default (white) bar.
|
|
-->
|
|
<meta name="theme-color" content="#0d0d0d" />
|
|
<title>Qwen Code Web chat</title>
|
|
<!--
|
|
Apply the stored theme class + theme-color before first paint so the
|
|
<html> background matches the app theme on mobile. Without this, the
|
|
iOS Safari rubber-band overscroll and the status-bar / home-indicator
|
|
safe areas briefly show the default white canvas. Storage key mirrors
|
|
THEME_STORAGE_KEY in main.tsx.
|
|
-->
|
|
<script>
|
|
!function(){try{var k='qwen-code-web-shell-theme',p=new URLSearchParams(location.search),t=p.get('theme');if(t!=='dark'&&t!=='light'){try{t=localStorage.getItem(k)}catch(_){t=null}}if(t!=='dark'&&t!=='light')t='dark';document.documentElement.classList.add('theme-'+t);var m=document.querySelector('meta[name=theme-color]');if(m)m.setAttribute('content',t==='light'?'#ffffff':'#0d0d0d')}catch(e){console.warn('theme-init:',e)}}();
|
|
</script>
|
|
<!--
|
|
Favicon is inlined as a data: URI rather than a /favicon.svg file because
|
|
the daemon's static server only exposes /assets/* and / (see
|
|
packages/cli/src/serve/web-shell-static.ts) — a file at the dist root
|
|
would never be reachable. The data: URI is allowed by the shell CSP
|
|
(img-src 'self' data: blob:). The encodeURIComponent(svg) encoding
|
|
technique mirrors packages/web-templates/src/export-html/build.mjs;
|
|
the artwork is from packages/desktop/apps/webui/src/public/favicon.svg
|
|
(the purple #6D44E8 Qwen mark, legible on both light and dark browser
|
|
tab bars).
|
|
-->
|
|
<link
|
|
rel="icon"
|
|
type="image/svg+xml"
|
|
href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%20141.38%20140%22%3E%0A%20%20%3Cpath%0A%20%20%20%20fill%3D%22%236D44E8%22%0A%20%20%20%20d%3D%22m140.93%2085-16.35-28.33-1.93-3.34%208.66-15a3.323%203.323%200%200%200%200-3.34l-9.62-16.67c-.3-.51-.72-.93-1.22-1.22s-1.07-.45-1.67-.45H82.23l-8.66-15a3.33%203.33%200%200%200-2.89-1.67H51.43c-.59%200-1.17.16-1.66.45-.5.29-.92.71-1.22%201.22L32.19%2029.98l-1.92%203.33H12.96c-.59%200-1.17.16-1.66.45-.5.29-.93.71-1.22%201.22L.45%2051.66a3.323%203.323%200%200%200%200%203.34l18.28%2031.67-8.66%2015a3.32%203.32%200%200%200%200%203.34l9.62%2016.67c.3.51.72.93%201.22%201.22s1.07.45%201.67.45h36.56l8.66%2015a3.35%203.35%200%200%200%202.89%201.67h19.25a3.34%203.34%200%200%200%202.89-1.67l18.28-31.67h17.32c.6%200%201.17-.16%201.67-.45s.92-.71%201.22-1.22l9.62-16.67a3.323%203.323%200%200%200%200-3.34ZM51.44%203.33%2061.07%2020l-9.63%2016.66h76.98l-9.62%2016.66H45.67l-11.54-20zM57.21%20120H22.58l9.63-16.67h19.25l-38.5-66.67h19.25l9.62%2016.67L68.78%20100l-11.55%2020Zm61.59-33.34-9.62-16.67-38.49%2066.67-9.63-16.67%209.63-16.66%2026.94-46.67h23.1l17.32%2030z%22%0A%20%20%2F%3E%0A%3C%2Fsvg%3E"
|
|
/>
|
|
</head>
|
|
<body>
|
|
<!--
|
|
Prevent React 19 dev-mode OOM crash: logComponentRender() calls
|
|
performance.measure() with component props as structured-clone detail.
|
|
Large transcript data exceeds the clone memory limit. This patch
|
|
silently drops the failing measure call; production builds are unaffected
|
|
because logComponentRender only exists in react-dom development bundles.
|
|
-->
|
|
<script>
|
|
!(function () {
|
|
if (typeof performance === 'undefined' || !performance.measure) return;
|
|
var m = performance.measure.bind(performance);
|
|
performance.measure = function () {
|
|
try {
|
|
return m.apply(this, arguments);
|
|
} catch (e) {
|
|
if (e instanceof DOMException && e.name === 'DataCloneError')
|
|
return;
|
|
throw e;
|
|
}
|
|
};
|
|
})();
|
|
</script>
|
|
<div id="root"></div>
|
|
<script type="module" src="/main.tsx"></script>
|
|
</body>
|
|
</html>
|