mirror of
https://github.com/LostRuins/koboldcpp.git
synced 2026-05-17 04:09:19 +00:00
* webui: Move static build output from `tools/server/public` to `build/ui` directory * refactor: Move to `tools/ui` * refactor: rename CMake variables and preprocessor defines - Rename LLAMA_BUILD_WEBUI -> LLAMA_BUILD_UI (old kept as deprecated) - Rename LLAMA_USE_PREBUILT_WEBUI -> LLAMA_USE_PREBUILT_UI (old kept as deprecated) - Backward compat: old vars auto-forward to new ones with DEPRECATION warning - Rename internal vars: WEBUI_SOURCE -> UI_SOURCE, WEBUI_SOURCE_DIR -> UI_SOURCE_DIR, etc. - Rename HF bucket: LLAMA_WEBUI_HF_BUCKET -> LLAMA_UI_HF_BUCKET - Emit both LLAMA_BUILD_WEBUI and LLAMA_BUILD_UI preprocessor defines - Emit both LLAMA_WEBUI_DEFAULT_ENABLED and LLAMA_UI_DEFAULT_ENABLED * refactor: rename CLI flags (--webui -> --ui) with backward compat - Add --ui/--no-ui (old --webui/--no-webui kept as deprecated aliases) - Add --ui-config (old --webui-config kept as deprecated alias) - Add --ui-config-file (old --webui-config-file kept as deprecated alias) - Add --ui-mcp-proxy/--no-ui-mcp-proxy (old --webui-mcp-proxy kept as deprecated) - Add new env vars: LLAMA_ARG_UI, LLAMA_ARG_UI_CONFIG, LLAMA_ARG_UI_CONFIG_FILE, LLAMA_ARG_UI_MCP_PROXY - C++ struct fields: params.ui, params.ui_config_json, params.ui_mcp_proxy added alongside old fields - Backward compat: old fields synced to new ones in g_params_to_internals * refactor: update C++ server internals with backward compat - Rename json_webui_settings -> json_ui_settings (both kept in server_context_meta) - Rename params.webui usage -> params.ui (both synced, old still works) - JSON API emits both "ui"/"ui_settings" and "webui"/"webui_settings" keys - Server routes use params.ui_mcp_proxy || params.webui_mcp_proxy - Preprocessor guards use #if defined(LLAMA_BUILD_UI) || defined(LLAMA_BUILD_WEBUI) * refactor: rename CI/CD workflows, artifacts, and build script - Rename webui-build.yml -> ui-build.yml; artifact webui-build -> ui-build - Rename webui-publish.yml -> ui-publish.yml; var HF_BUCKET_WEBUI_STATIC_OUTPUT -> HF_BUCKET_UI_STATIC_OUTPUT - Rename server-webui.yml -> server-ui.yml; job webui-build/checks -> ui-build/checks - Update server.yml: job/artifact refs webui-build -> ui-build - Update release.yml: all webui-build/publish refs -> ui-build/publish; HF_TOKEN_WEBUI_STATIC_OUTPUT -> HF_TOKEN_UI_STATIC_OUTPUT - Update server-self-hosted.yml: webui-build -> ui-build - Update build-self-hosted.yml: HF_WEBUI_VERSION -> HF_UI_VERSION - Rename webui-download.cmake -> ui-download.cmake (internal refs updated) - Update labeler.yml: server/webui -> server/ui path label * docs: update CODEOWNERS and server README docs - Update CODEOWNERS: team ggml-org/llama-webui -> ggml-org/llama-ui, path /tools/server/webui/ -> /tools/ui/ - Update server README.md: CLI tables show --ui flags with deprecated --webui aliases - Update server README-dev.md: "WebUI" -> "UI", paths updated to tools/ui/ * fix: Small fixes for UI build * fix: CMake.txt syntax * chore: Formatting * fix: `.editorconfig` for llama-ui * chore: Formatting * refactor: Use `APP_NAME` in Error route * refactor: Cleanup * refactor: Single migration service * make llama-ui a linkable target * fix: UI Build output * fix: Missing change * fix: separate llama-ui npm build output into build/tools/ui/dist subfolder + use cmake npm build instead of downloading ui-build.yml artifacts in CI * refactor: UI workflows cleanup --------- Co-authored-by: Xuan Son Nguyen <son@huggingface.co>
103 lines
3.5 KiB
TypeScript
103 lines
3.5 KiB
TypeScript
import {
|
|
readFileSync,
|
|
writeFileSync,
|
|
existsSync,
|
|
readdirSync,
|
|
copyFileSync,
|
|
rmSync,
|
|
unlinkSync
|
|
} from 'fs';
|
|
import { resolve } from 'path';
|
|
import type { Plugin } from 'vite';
|
|
|
|
const GUIDE_FOR_FRONTEND = `
|
|
<!--
|
|
This is a static build of the frontend.
|
|
It is automatically generated by the build process.
|
|
Do not edit this file directly.
|
|
To make changes, refer to the "Web UI" section in the README.
|
|
-->
|
|
`.trim();
|
|
|
|
const OUTPUT_DIR = '../../build/tools/ui/dist';
|
|
|
|
export function llamaCppBuildPlugin(): Plugin {
|
|
return {
|
|
name: 'llamacpp:build',
|
|
apply: 'build',
|
|
closeBundle() {
|
|
setTimeout(() => {
|
|
try {
|
|
const outDir = resolve(OUTPUT_DIR);
|
|
const indexPath = resolve(outDir, 'index.html');
|
|
if (!existsSync(indexPath)) return;
|
|
|
|
let content = readFileSync(indexPath, 'utf-8');
|
|
|
|
// Inline favicon as base64 data URL
|
|
const faviconPath = resolve('static/favicon.svg');
|
|
if (existsSync(faviconPath)) {
|
|
const faviconContent = readFileSync(faviconPath, 'utf-8');
|
|
const faviconBase64 = Buffer.from(faviconContent).toString('base64');
|
|
const faviconDataUrl = `data:image/svg+xml;base64,${faviconBase64}`;
|
|
content = content.replace(/href="[^"]*favicon\.svg"/g, `href="${faviconDataUrl}"`);
|
|
console.log('✓ Inlined favicon.svg as base64 data URL');
|
|
}
|
|
|
|
content = content.replace(/\r/g, '');
|
|
content = GUIDE_FOR_FRONTEND + '\n' + content;
|
|
content = content.replace(/\/_app\/immutable\/bundle\.[^"]+\.js/g, './bundle.js');
|
|
content = content.replace(
|
|
/\/_app\/immutable\/assets\/bundle\.[^"]+\.css/g,
|
|
'./bundle.css'
|
|
);
|
|
content = content.replace(/__sveltekit_[a-z0-9]+/g, '__sveltekit__');
|
|
|
|
writeFileSync(indexPath, content, 'utf-8');
|
|
console.log('✓ Updated index.html');
|
|
|
|
// Copy bundle.*.js -> bundle.js at output root
|
|
const immutableDir = resolve(outDir, '_app/immutable');
|
|
const bundleDir = resolve(outDir, '_app/immutable/assets');
|
|
|
|
if (existsSync(immutableDir)) {
|
|
const jsFiles = readdirSync(immutableDir).filter((f) => f.match(/^bundle\..+\.js$/));
|
|
if (jsFiles.length > 0) {
|
|
copyFileSync(resolve(immutableDir, jsFiles[0]), resolve(outDir, 'bundle.js'));
|
|
// Normalize __sveltekit_<hash> to __sveltekit__ in bundle.js
|
|
const bundleJsPath = resolve(outDir, 'bundle.js');
|
|
let bundleJs = readFileSync(bundleJsPath, 'utf-8');
|
|
bundleJs = bundleJs.replace(/__sveltekit_[a-z0-9]+/g, '__sveltekit__');
|
|
writeFileSync(bundleJsPath, bundleJs, 'utf-8');
|
|
console.log(`✓ Copied ${jsFiles[0]} -> bundle.js`);
|
|
}
|
|
}
|
|
|
|
// Copy bundle.*.css -> bundle.css at output root
|
|
if (existsSync(bundleDir)) {
|
|
const cssFiles = readdirSync(bundleDir).filter((f) => f.match(/^bundle\..+\.css$/));
|
|
if (cssFiles.length > 0) {
|
|
copyFileSync(resolve(bundleDir, cssFiles[0]), resolve(outDir, 'bundle.css'));
|
|
console.log(`✓ Copied ${cssFiles[0]} -> bundle.css`);
|
|
}
|
|
}
|
|
|
|
// Cleanup: remove _app directory, favicon.svg, and legacy index.html.gz
|
|
const appDir = resolve(outDir, '_app');
|
|
if (existsSync(appDir)) {
|
|
rmSync(appDir, { recursive: true, force: true });
|
|
console.log('✓ Removed _app directory');
|
|
}
|
|
|
|
const faviconOut = resolve(outDir, 'favicon.svg');
|
|
if (existsSync(faviconOut)) {
|
|
unlinkSync(faviconOut);
|
|
console.log('✓ Removed favicon.svg');
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to process build output:', error);
|
|
}
|
|
}, 100);
|
|
}
|
|
};
|
|
}
|