feat(desktop): embed BoosAPI Desktop client as a subproject

Vendor the rebranded BoosAPI Desktop client (Tauri + Vue) into metapi as
a monorepo subdirectory under desktop/. Source only — node_modules,
dist, Cargo target and the upstream .git history are excluded.

desktop/ keeps its own independent Cargo workspace (desktop/src-tauri
with crates/*); it is not part of the backend boosapi crate, so a
`cargo check` at the metapi root still compiles only the backend. Build
the desktop app from desktop/src-tauri per desktop/README.md.

Note: app icons are still placeholder assets pending the final BoosAPI
logo. The updater signing keys live outside the repo and are not
included.
This commit is contained in:
boos
2026-06-22 11:32:57 +08:00
parent d9c78ecc73
commit e0a5f57793
2305 changed files with 449355 additions and 0 deletions
@@ -0,0 +1 @@
export { parseHtmlToReactNodes } from '../utils/htmlToReact'
@@ -0,0 +1,74 @@
import { normalizeKaTeXRenderInput } from '../utils/normalizeKaTeXRenderInput'
let katexModule: any | undefined
let katexLoadAttempted = false
function getRequire() {
try {
const processWithBuiltins = Reflect.get(globalThis, 'process') as {
getBuiltinModule?: (specifier: string) => any
} | undefined
const moduleApi = typeof processWithBuiltins?.getBuiltinModule === 'function'
? processWithBuiltins.getBuiltinModule('module')
: null
return typeof moduleApi?.createRequire === 'function'
? moduleApi.createRequire(import.meta.url)
: null
}
catch {
return null
}
}
function loadKatex() {
if (katexModule)
return katexModule
if (katexLoadAttempted)
return null
katexLoadAttempted = true
try {
const require = getRequire()
if (!require)
return null
const katex = require('katex')
try {
require('katex/contrib/mhchem')
}
catch {
// optional extension
}
katexModule = katex
return katexModule
}
catch {
return null
}
}
export function renderKatexToHtml(
content: string,
displayMode: boolean,
throwOnError: boolean,
) {
const normalizedContent = normalizeKaTeXRenderInput(content)
if (!normalizedContent)
return null
if ((globalThis as any).__MARKSTREAM_REACT_DISABLE_SYNC_KATEX__)
return null
const katex = loadKatex()
if (!katex)
return null
try {
return katex.renderToString(normalizedContent, {
displayMode,
throwOnError,
})
}
catch {
return null
}
}