zdashboard 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -6
- package/dist/cli.js.map +1 -1
- package/dist/web/assets/{DesignViewer-BiIHNjBe.js → DesignViewer-DVjbRv43.js} +1 -1
- package/dist/web/assets/{ReviewViewer-DQQx6ub2.js → ReviewViewer-CBiXEfGM.js} +1 -1
- package/dist/web/assets/Viewer-C9o6Vus_.js +2 -0
- package/dist/web/assets/{Viewer-Co9GLZ-m.js → Viewer-D5A1eb2d.js} +1 -1
- package/dist/web/assets/{folder-open-m5HYQ2Fs.js → folder-open-Bqx7RnFM.js} +1 -1
- package/dist/web/assets/index-BILnSgFA.js +2 -0
- package/dist/web/assets/{index-DxY55LjD.js → index-BIjLvz0a.js} +2 -2
- package/dist/web/assets/{index-C3gGpzPU.js → index-D-6GmZe2.js} +1 -1
- package/dist/web/assets/{index-BpP67FE7.js → index-DXG7qZLN.js} +2 -2
- package/dist/web/assets/{index-DRK8BNuy.js → index-DxHu81tF.js} +2 -2
- package/dist/web/assets/{index-C041WeTi.js → index-qoCAa7mn.js} +2 -2
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/web/assets/Viewer-QBsqLDK_.js +0 -2
- package/dist/web/assets/index-Cm0afIpM.js +0 -2
package/dist/cli.js
CHANGED
|
@@ -443,7 +443,7 @@ function scanAssets(root2) {
|
|
|
443
443
|
// package.json
|
|
444
444
|
var package_default = {
|
|
445
445
|
name: "zdashboard",
|
|
446
|
-
version: "1.4.
|
|
446
|
+
version: "1.4.1",
|
|
447
447
|
description: "ZCode skill dashboard platform \u2014 pluggable viewers for zdesign/zview/zreview/zgoal",
|
|
448
448
|
type: "module",
|
|
449
449
|
bin: {
|
|
@@ -641,11 +641,6 @@ function createServer(opts) {
|
|
|
641
641
|
res.end(JSON.stringify(scanApplyChanges(ROOT)));
|
|
642
642
|
},
|
|
643
643
|
"/__apply/change": async (req, res) => {
|
|
644
|
-
if (req.headers["x-stop-token"] !== STOP_TOKEN) {
|
|
645
|
-
res.writeHead(403);
|
|
646
|
-
res.end("forbidden");
|
|
647
|
-
return;
|
|
648
|
-
}
|
|
649
644
|
(async () => {
|
|
650
645
|
try {
|
|
651
646
|
const url = new URL(req.url || "", "http://x");
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/index.ts","../src/server/spec-scan.ts","../src/server/just-runner.ts","../src/server/bugs.ts","../src/server/api/fetch.ts","../src/server/errors.ts","../src/server/plugins.ts","../src/server/review-store.ts","../src/server/design-assets.ts","../package.json","../src/server/detect.ts","../src/cli.ts"],"sourcesContent":["import http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { exec } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { scanTree } from './spec-scan.js';\nimport { JustRunner } from './just-runner.js';\nimport { fetchBugs } from './bugs.js';\nimport { registerBuiltin, allBuiltins, type DashboardPlugin } from './plugins.js';\nimport { ReviewStore, type ItemState, type ReviewStatus } from './review-store.js';\nimport { scanAssets } from './design-assets.js';\nimport type { DetectResult } from './detect.js';\nimport pkg from '../../package.json' with { type: 'json' };\n\nconst VERSION = pkg.version;\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst STOP_TOKEN = crypto.randomBytes(12).toString('hex');\nconst INJECT = `<script>(function(){try{var es=new EventSource('/__reload');es.addEventListener('reload',function(){location.reload();});es.onerror=function(){es.close();};}catch(e){}document.addEventListener('click',function(e){var t=e.target;if(t&&t.closest){var a=t.closest('a[target]');if(a&&a.target!=='_self'){a.target='_self';}}},true);})();</script>`;\n\nconst MIME: Record<string, string> = {\n '.html': 'text/html; charset=utf-8', '.htm': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8', '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8', '.json': 'application/json; charset=utf-8',\n '.svg': 'image/svg+xml', '.png': 'image/png', '.ico': 'image/x-icon',\n '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.gif': 'image/gif', '.webp': 'image/webp',\n '.md': 'text/markdown; charset=utf-8', '.txt': 'text/plain; charset=utf-8',\n '.yml': 'text/yaml; charset=utf-8', '.yaml': 'text/yaml; charset=utf-8',\n '.woff': 'font/woff', '.woff2': 'font/woff2', '.ttf': 'font/ttf',\n '.map': 'application/json; charset=utf-8',\n};\n\nexport interface ServerOptions {\n root: string;\n port?: number;\n open?: boolean;\n detect: DetectResult;\n dashboardDir?: string;\n mode?: string;\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve) => {\n let data = '';\n req.on('data', (c) => (data += c));\n req.on('end', () => resolve(data));\n });\n}\n\nexport function createServer(opts: ServerOptions) {\n const ROOT = path.resolve(opts.root);\n const PORT0 = opts.port ?? 4190;\n const OPEN = !!opts.open;\n const APP_DIR = opts.dashboardDir ?? path.resolve(__dirname, 'web');\n if (!fs.existsSync(ROOT)) fs.mkdirSync(ROOT, { recursive: true });\n const det = opts.detect;\n const runner = new JustRunner(ROOT);\n const MODE = opts.mode;\n\n // register builtin plugins (server-side: apiRoutes only; viewer loaded by frontend)\n registerBuiltin({\n mode: 'bugs', label: '禅道 Bugs', icon: '🎯',\n apiRoutes: { '/__bugs': async (_, res) => { res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' }); fetchBugs(ROOT).then((r) => res.end(JSON.stringify(r))); } }\n });\n registerBuiltin({ mode: 'view', label: '项目浏览', icon: '👁️' });\n\n const reviewStore = new ReviewStore(ROOT);\n registerBuiltin({\n mode: 'review', label: '文档评审', icon: '✅',\n apiRoutes: {\n '/__review': async (_, res) => {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(JSON.stringify(reviewStore.read()));\n },\n '/__review/item': async (req, res) => {\n if (req.headers['x-stop-token'] !== STOP_TOKEN) { res.writeHead(403); res.end('forbidden'); return; }\n (async () => {\n try {\n const body = JSON.parse(await readBody(req) || '{}');\n const data = reviewStore.updateItem(body.id, { answer: body.answer, state: body.state as ItemState | undefined });\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(data));\n } catch (e) {\n res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ error: (e as Error).message }));\n }\n })();\n return;\n },\n '/__review/status': async (req, res) => {\n if (req.headers['x-stop-token'] !== STOP_TOKEN) { res.writeHead(403); res.end('forbidden'); return; }\n (async () => {\n try {\n const body = JSON.parse(await readBody(req) || '{}');\n const data = reviewStore.setStatus(body.status as ReviewStatus);\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(data));\n } catch (e) {\n res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ error: (e as Error).message }));\n }\n })();\n return;\n },\n '/__docs': async (_, res) => {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(JSON.stringify(reviewStore.docs()));\n },\n }\n });\n\n registerBuiltin({ mode: 'design', label: '设计资产', icon: '🎨' });\n\n // apply plugin routes\n registerBuiltin({\n mode: 'apply', label: '执行进度', icon: '⚙️',\n apiRoutes: {\n '/__apply': async (_, res) => {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(JSON.stringify(scanApplyChanges(ROOT)));\n },\n '/__apply/change': async (req, res) => {\n if (req.headers['x-stop-token'] !== STOP_TOKEN) { res.writeHead(403); res.end('forbidden'); return; }\n (async () => {\n try {\n const url = new URL(req.url || '', 'http://x');\n const name = url.searchParams.get('name');\n if (!name) { res.writeHead(400); res.end(JSON.stringify({ error: 'missing name' })); return; }\n const data = readApplyChange(ROOT, name);\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(JSON.stringify(data));\n } catch (e) { res.writeHead(400); res.end(JSON.stringify({ error: (e as Error).message })); }\n })();\n return;\n },\n }\n });\n\n const clients = new Set<http.ServerResponse>();\n const broadcast = (ev: string, data: unknown = '') => {\n const payload = `event: ${ev}\\ndata: ${JSON.stringify(data == null ? '' : data)}\\n\\n`;\n for (const c of clients) c.write(payload);\n };\n\n function serveFile(filePath: string, res: http.ServerResponse, injectHtml: boolean) {\n fs.readFile(filePath, (err, data) => {\n if (err) { res.writeHead(404); return res.end('Not found'); }\n const ext = path.extname(filePath).toLowerCase();\n const ct = MIME[ext] ?? 'application/octet-stream';\n let body = data;\n if (injectHtml && ext === '.html') {\n const s = data.toString('utf8');\n body = Buffer.from(s.indexOf('</body>') >= 0 ? s.replace('</body>', INJECT + '</body>') : s + INJECT);\n }\n res.writeHead(200, { 'Content-Type': ct, 'Cache-Control': 'no-cache' });\n res.end(body);\n });\n }\n\n function handler(req: http.IncomingMessage, res: http.ServerResponse) {\n const url = req.url!.split('?')[0];\n\n // ── SSE:文件变更 ──\n if (url === '/__reload') {\n res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive' });\n res.write(': connected\\n\\n');\n clients.add(res);\n req.on('close', () => clients.delete(res));\n return;\n }\n if (url === '/__config') {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n return res.end(JSON.stringify({ stopToken: STOP_TOKEN }));\n }\n if (url === '/__stop' && req.method === 'POST') {\n if (req.headers['x-stop-token'] === STOP_TOKEN) {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end('{\"ok\":true}');\n runner.stop();\n setTimeout(() => { try { server.close(); } catch (e) { console.error('[zdashboard] server close failed:', e); } process.exit(0); }, 50);\n } else { res.writeHead(403); res.end('forbidden'); }\n return;\n }\n\n // ── 方案模式:树形文件清单(+探测结果) / 设计模式:资产分类清单 ──\n if (url === '/__files') {\n if (MODE === 'design') {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n return res.end(JSON.stringify(scanAssets(ROOT)));\n }\n const tree = scanTree(ROOT, det.hasOpenspec, det.hasDocs);\n const payload: TreeNodePayload = { tree, ...det };\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n return res.end(JSON.stringify(payload));\n }\n\n // ── 日志能力 ──\n if (url === '/__just/recipes') {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n runner.recipes().then((r) => res.end(JSON.stringify(r)));\n return;\n }\n if (url === '/__just/logs') {\n res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive' });\n res.write(': connected\\n\\n');\n const unsub = runner.subscribe((ev) => res.write(`data: ${JSON.stringify(ev)}\\n\\n`));\n req.on('close', unsub);\n return;\n }\n const justAction = url.match(/^\\/__just\\/(start|stop|restart)$/);\n if (justAction && req.method === 'POST') {\n (async () => {\n if (req.headers['x-stop-token'] !== STOP_TOKEN) { res.writeHead(403); res.end('forbidden'); return; }\n const body = await readBody(req);\n let recipe: string | undefined;\n try { recipe = JSON.parse(body || '{}').recipe; } catch (e) { console.error('[zdashboard] invalid just action body:', e); }\n const act = justAction[1];\n if (act === 'start' || act === 'restart') {\n const target = recipe ?? runner.info().recipe;\n if (!target) { res.writeHead(400); res.end('{\"error\":\"no recipe\"}'); return; }\n const recipes = await runner.recipes();\n if (!recipes.some((r) => r.name === target)) { res.writeHead(403); res.end('{\"error\":\"unknown recipe\"}'); return; }\n runner.start(target);\n } else {\n runner.stop();\n }\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(runner.info()));\n })();\n return;\n }\n\n // ── plugin API routes ──\n let handled = false;\n for (const plugin of allBuiltins()) {\n if (!plugin.apiRoutes) continue;\n for (const [route, handler] of Object.entries(plugin.apiRoutes)) {\n if (url === route) {\n handled = true;\n handler(req, res, ROOT);\n return;\n }\n }\n }\n\n // ── dashboard 前端 ──\n if (url === '/') return serveFile(path.join(APP_DIR, 'index.html'), res, false);\n if (url.indexOf('/__app/') === 0) {\n const fp = path.join(APP_DIR, url.slice(7));\n if (fp !== APP_DIR && fp.indexOf(APP_DIR + path.sep) !== 0) { res.writeHead(403); return res.end('Forbidden'); }\n return serveFile(fp, res, false);\n }\n if (url.indexOf('/assets/') === 0) {\n const fp = path.join(APP_DIR, decodeURIComponent(url));\n if (fp.indexOf(APP_DIR + path.sep) !== 0) { res.writeHead(403); return res.end('Forbidden'); }\n return serveFile(fp, res, false);\n }\n\n // ── 用户资产 ──\n const fp = path.join(ROOT, decodeURIComponent(url));\n if (fp !== ROOT && fp.indexOf(ROOT + path.sep) !== 0) { res.writeHead(403); return res.end('Forbidden'); }\n return serveFile(fp, res, true);\n }\n\n let server: http.Server;\n function start(port: number) {\n server = http.createServer(handler);\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') { console.log(`[zdashboard] port ${port} busy, trying ${port + 1}`); start(port + 1); }\n else throw err;\n });\n server.listen(port, () => {\n const u = `http://localhost:${port}`;\n console.log(`[zdashboard] v${VERSION} dashboard -> ${u}`);\n console.log(`[zdashboard] project -> ${ROOT}`);\n console.log(`[zdashboard] mode -> ${MODE ?? '(auto)'}`);\n console.log(`[zdashboard] detect -> openspec:${det.hasOpenspec} docs:${det.hasDocs} just:${det.hasJust} bugs:${det.hasBugs}`);\n if (OPEN) exec(process.platform === 'darwin' ? `open ${u}` : `start ${u}`);\n });\n }\n\n let debounce: NodeJS.Timeout;\n try {\n fs.watch(ROOT, { recursive: true }, () => {\n clearTimeout(debounce);\n debounce = setTimeout(() => {\n broadcast('reload');\n broadcast('files');\n console.log(`[zdashboard] change -> reload + refresh tree (${clients.size} client${clients.size === 1 ? '' : 's'})`);\n }, 150);\n });\n } catch { console.log('[zdashboard] watch unavailable - static only.'); }\n\n start(PORT0);\n}\n\ninterface TreeNodePayload { tree: unknown; hasOpenspec: boolean; hasDocs: boolean; hasJust: boolean; hasBugs: boolean; }\n\ninterface ChangeSummary { name: string; path: string; total: number; done: number; hasProposal: boolean; hasDesign: boolean; }\ninterface ChangeDetail extends ChangeSummary { proposal?: string; design?: string; tasks: string; }\n\nfunction countTasks(md: string): { total: number; done: number } {\n const all = (md.match(/^\\s*-\\s*\\[[ xX]\\]\\s*/gm) || []).length;\n const done = (md.match(/^\\s*-\\s*\\[[xX]\\]\\s*/gm) || []).length;\n return { total: all, done };\n}\n\nfunction readText(p: string): string {\n try { return fs.readFileSync(p, 'utf8'); } catch { return ''; }\n}\n\nfunction scanApplyChanges(root: string): ChangeSummary[] {\n const changesDir = path.join(root, 'openspec', 'changes');\n if (!fs.existsSync(changesDir)) return [];\n const out: ChangeSummary[] = [];\n for (const ent of fs.readdirSync(changesDir, { withFileTypes: true })) {\n if (!ent.isDirectory() || ent.name.startsWith('.') || ent.name === 'archive') continue;\n const dir = path.join(changesDir, ent.name);\n const tasks = readText(path.join(dir, 'tasks.md'));\n const { total, done } = countTasks(tasks);\n out.push({ name: ent.name, path: `openspec/changes/${ent.name}`, total, done, hasProposal: fs.existsSync(path.join(dir, 'proposal.md')), hasDesign: fs.existsSync(path.join(dir, 'design.md')) });\n }\n out.sort((a, b) => a.name.localeCompare(b.name));\n return out;\n}\n\nfunction readApplyChange(root: string, name: string): ChangeDetail {\n const dir = path.join(root, 'openspec', 'changes', name);\n const proposal = readText(path.join(dir, 'proposal.md'));\n const design = readText(path.join(dir, 'design.md'));\n const tasks = readText(path.join(dir, 'tasks.md'));\n const { total, done } = countTasks(tasks);\n return { name, path: `openspec/changes/${name}`, total, done, hasProposal: !!proposal, hasDesign: !!design, proposal, design, tasks };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type NodeKind = 'file' | 'dir' | 'log';\nexport interface TreeNode {\n name: string;\n kind: NodeKind;\n path?: string; // file: 相对 root 的路径(点击预览用)\n defaultCollapsed?: boolean;\n children?: TreeNode[];\n}\n\nfunction walkFiles(absDir: string, relDir: string, depth = 0): TreeNode[] {\n if (depth > 4) return [];\n let ents: fs.Dirent[];\n try { ents = fs.readdirSync(absDir, { withFileTypes: true }); } catch { return []; }\n const nodes: TreeNode[] = [];\n for (const ent of ents) {\n if (ent.name.startsWith('.') || ent.name === 'node_modules') continue;\n const rel = relDir ? `${relDir}/${ent.name}` : ent.name;\n if (ent.isDirectory()) {\n nodes.push({ name: ent.name, kind: 'dir', children: walkFiles(path.join(absDir, ent.name), rel, depth + 1) });\n } else {\n nodes.push({ name: ent.name, kind: 'file', path: rel });\n }\n }\n nodes.sort((a, b) => (a.kind === b.kind ? a.name.localeCompare(b.name) : a.kind === 'dir' ? -1 : 1));\n return nodes;\n}\n\n/** 方案模式树形扫描:openspec 感知 + docs 聚合 + 其他兜底 */\nexport function scanTree(root: string, hasOpenspec: boolean, hasDocs: boolean): TreeNode[] {\n const tree: TreeNode[] = [];\n if (hasOpenspec && fs.existsSync(path.join(root, 'openspec', 'changes'))) {\n const changesDir = path.join(root, 'openspec', 'changes');\n const active: TreeNode[] = [];\n const archived: TreeNode[] = [];\n for (const ent of fs.readdirSync(changesDir, { withFileTypes: true })) {\n if (!ent.isDirectory() || ent.name.startsWith('.') || ent.name === 'archive') continue;\n active.push({ name: ent.name, kind: 'dir', children: walkFiles(path.join(changesDir, ent.name), `openspec/changes/${ent.name}`) });\n }\n active.sort((a, b) => a.name.localeCompare(b.name));\n const archiveDir = path.join(changesDir, 'archive');\n if (fs.existsSync(archiveDir)) {\n for (const ent of fs.readdirSync(archiveDir, { withFileTypes: true })) {\n if (!ent.isDirectory() || ent.name.startsWith('.')) continue;\n archived.push({ name: ent.name, kind: 'dir', children: walkFiles(path.join(archiveDir, ent.name), `openspec/changes/archive/${ent.name}`) });\n }\n archived.sort((a, b) => b.name.localeCompare(a.name)); // 日期前缀倒序\n }\n if (active.length) tree.push({ name: `进行中 (${active.length})`, kind: 'dir', children: active });\n if (archived.length) tree.push({ name: `归档 (${archived.length})`, kind: 'dir', defaultCollapsed: true, children: archived });\n const specsDir = path.join(root, 'openspec', 'specs');\n if (fs.existsSync(specsDir)) {\n const specs = walkFiles(specsDir, 'openspec/specs');\n if (specs.length) tree.push({ name: '能力 Specs', kind: 'dir', children: specs });\n }\n }\n if (hasDocs && fs.existsSync(path.join(root, 'docs'))) {\n const docs = walkFiles(path.join(root, 'docs'), 'docs');\n if (docs.length) tree.push({ name: 'docs', kind: 'dir', children: docs });\n }\n const skip = new Set(['openspec', 'docs', 'node_modules', '.git', 'dist', 'test-server']);\n // \"其他\"只收根目录的 md 文档(README/CLAUDE 等);构建配置(pom.xml/justfile 等)不收——对\"方案+日志\"定位是噪音\n const etc: TreeNode[] = [];\n try {\n for (const ent of fs.readdirSync(root, { withFileTypes: true })) {\n if (ent.name.startsWith('.') || skip.has(ent.name)) continue;\n const ext = path.extname(ent.name).toLowerCase();\n if (ent.isFile() && (ext === '.md' || ext === '.markdown')) etc.push({ name: ent.name, kind: 'file', path: ent.name });\n }\n } catch (e) { console.error('[zdashboard] scan root etc failed:', e); }\n etc.sort((a, b) => a.name.localeCompare(b.name));\n if (etc.length) tree.push({ name: `其他 (${etc.length})`, kind: 'dir', children: etc });\n return tree;\n}\n","import { spawn, execFile, type ChildProcess } from 'node:child_process';\n\nexport interface Recipe { name: string; description: string; }\nexport type JustState = 'idle' | 'running' | 'exited';\nexport type JustEvent =\n | { type: 'log'; text: string }\n | { type: 'clear' }\n | { type: 'state'; state: JustState; recipe: string | null; code: number | null };\n\nconst MAX_BUFFER = 1000;\n\nexport class JustRunner {\n private cwd: string;\n private child: ChildProcess | null = null;\n private recipe: string | null = null;\n private state: JustState = 'idle';\n private code: number | null = null;\n private buffer: string[] = [];\n private pending = ''; // 行缓冲:块缓冲输出(如 maven)的 chunk 会在行中间断开,攒到 \\n 才切行\n private clients = new Set<(ev: JustEvent) => void>();\n private recipesCache: Recipe[] | null = null;\n\n constructor(cwd: string) { this.cwd = cwd; }\n\n recipes(): Promise<Recipe[]> {\n if (this.recipesCache) return Promise.resolve(this.recipesCache);\n return new Promise((resolve) => {\n execFile('just', ['--list', '--unsorted'], { cwd: this.cwd, maxBuffer: 1 << 20, timeout: 8000 }, (err, stdout) => {\n if (err) { resolve([]); return; }\n const out: Recipe[] = [];\n const seen = new Set<string>();\n for (const line of stdout.split(/\\r?\\n/).slice(1)) { // 跳过 \"Available recipes:\"\n const trimmed = line.trim();\n if (!trimmed) continue;\n const hashIdx = trimmed.indexOf('#');\n const sig = (hashIdx >= 0 ? trimmed.slice(0, hashIdx) : trimmed).trim();\n if (!sig) continue;\n const name = sig.split(/\\s+/)[0]; // \"hello msg=...\" -> \"hello\"\n if (seen.has(name)) continue;\n seen.add(name);\n out.push({ name, description: hashIdx >= 0 ? trimmed.slice(hashIdx + 1).trim() : '' });\n }\n this.recipesCache = out;\n resolve(out);\n });\n });\n }\n\n subscribe(fn: (ev: JustEvent) => void): () => void {\n this.clients.add(fn);\n // 连上即重放:历史日志 + 当前状态\n for (const text of this.buffer) fn({ type: 'log', text });\n fn({ type: 'state', state: this.state, recipe: this.recipe, code: this.code });\n return () => this.clients.delete(fn);\n }\n\n private emit(ev: JustEvent) { for (const fn of this.clients) fn(ev); }\n\n info() { return { state: this.state, recipe: this.recipe, code: this.code }; }\n\n /** 启动 recipe(调用方须先用 recipes() 校验名字);自动停旧进程 */\n start(recipe: string) {\n this.killChild();\n this.recipe = recipe;\n this.code = null;\n this.state = 'running';\n this.buffer = [];\n this.pending = '';\n this.emit({ type: 'clear' }); // 广播清屏:已连接的订阅者同步清掉上一个任务的残留日志\n this.emit({ type: 'state', state: 'running', recipe, code: null });\n const child = spawn('just', [recipe], {\n cwd: this.cwd,\n shell: true,\n env: {\n ...process.env,\n FORCE_COLOR: '1', // node 生态(chalk 等)\n // maven 检测非 tty 会关颜色;经 MAVEN_OPTS 强制开(保留用户已有值)\n MAVEN_OPTS: `${process.env.MAVEN_OPTS ?? ''} -Dstyle.color=always`.trim(),\n CI: '',\n },\n });\n this.child = child;\n const push = (d: Buffer) => {\n this.pending += d.toString();\n let idx: number;\n while ((idx = this.pending.indexOf('\\n')) >= 0) {\n const line = this.pending.slice(0, idx + 1);\n this.pending = this.pending.slice(idx + 1);\n this.pushLine(line);\n }\n // 无 \\n 的尾巴留在 pending,等下个 chunk(块缓冲输出会在行中断开,不能当独立行)\n };\n child.stdout?.on('data', push);\n child.stderr?.on('data', push);\n child.on('error', (err) => { this.pushLine(`[zdashboard] spawn error: ${err.message}\\n`); });\n child.on('exit', (code) => {\n if (this.pending) { this.pushLine(this.pending + '\\n'); this.pending = ''; } // flush 末尾无换行的残留\n this.child = null;\n this.state = 'exited';\n this.code = code ?? 0;\n this.emit({ type: 'state', state: 'exited', recipe: this.recipe, code: this.code });\n });\n }\n\n private pushLine(line: string) {\n this.buffer.push(line);\n if (this.buffer.length > MAX_BUFFER) this.buffer.shift();\n this.emit({ type: 'log', text: line });\n }\n\n stop() {\n this.killChild();\n }\n\n restart(recipe?: string) {\n const target = recipe ?? this.recipe;\n if (target) this.start(target);\n }\n\n private killChild() {\n const child = this.child;\n if (child?.pid) {\n try {\n if (process.platform === 'win32') spawn('taskkill', ['/PID', String(child.pid), '/T', '/F']);\n else child.kill('SIGTERM');\n } catch { /* 已退出 */ }\n }\n this.child = null;\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fetchJson } from './api/fetch.js';\n\n/** .zgoal/config.yaml(zgoal skill 的禅道凭据配置,扁平 key: value) */\nexport interface ZgoalConfig {\n url: string;\n account: string;\n password?: string;\n token?: string;\n product: number;\n}\n\nexport interface ZenBug {\n id: number;\n title: string;\n severity: number | string;\n pri: number | string;\n status: string;\n assignedTo: string;\n openedBy?: string;\n /** 指派给 config.account 的本人 */\n mine: boolean;\n}\n\nexport type BugsResult =\n | { ok: true; url: string; total: number; bugs: ZenBug[] }\n | { ok: false; error: string };\n\n/** 极简扁平 yaml 解析(仅 key: value 行,够 .zgoal/config.yaml 用) */\nfunction loadZgoalConfig(root: string): ZgoalConfig | null {\n const file = path.join(root, '.zgoal', 'config.yaml');\n if (!fs.existsSync(file)) return null;\n const kv: Record<string, string> = {};\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n const m = line.match(/^\\s*([A-Za-z_]\\w*)\\s*:\\s*(.+?)\\s*$/);\n if (m && !m[2].startsWith('#')) kv[m[1]] = m[2].replace(/^[\"']|[\"']$/g, '');\n }\n const product = Number(kv.product);\n if (!kv.url || !product) return null;\n return {\n url: kv.url.replace(/\\/+$/, ''),\n account: kv.account ?? '',\n password: kv.password,\n token: kv.token,\n product,\n };\n}\n\nlet tokenCache: { key: string; token: string; at: number } | null = null;\n\nasync function getToken(cfg: ZgoalConfig): Promise<string> {\n if (cfg.token) return cfg.token;\n const key = `${cfg.url}|${cfg.account}|${cfg.password ?? ''}`;\n if (tokenCache && tokenCache.key === key && Date.now() - tokenCache.at < 10 * 60_000) return tokenCache.token;\n const json = await fetchJson(`${cfg.url}/api.php/v1/tokens`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ account: cfg.account, password: cfg.password }),\n });\n const token = typeof json.token === 'string' ? json.token : '';\n if (!token) throw new Error('token 获取失败:检查 account / password');\n tokenCache = { key, token, at: Date.now() };\n return token;\n}\n\nfunction normBug(b: Record<string, unknown>, account: string): ZenBug {\n const assigned = b.assignedTo;\n const assignedTo =\n typeof assigned === 'string'\n ? assigned\n : assigned && typeof assigned === 'object' && 'realname' in (assigned as Record<string, unknown>)\n ? String((assigned as Record<string, unknown>).realname ?? '')\n : '';\n const assignedAccount =\n typeof assigned === 'string'\n ? assigned\n : assigned && typeof assigned === 'object'\n ? String((assigned as Record<string, unknown>).account ?? '')\n : '';\n const mine = !!account && (assignedAccount === account || assignedTo === account);\n return {\n id: Number(b.id),\n title: String(b.title ?? ''),\n severity: (b.severity as number | string) ?? 4,\n pri: (b.pri as number | string) ?? 3,\n status: String(b.status ?? ''),\n assignedTo,\n openedBy: typeof b.openedBy === 'string' ? b.openedBy : undefined,\n mine,\n };\n}\n\n/** 只读拉取禅道 bug 列表(GET,绝不写)。失败返回 ok:false,不抛。 */\nexport async function fetchBugs(root: string): Promise<BugsResult> {\n const cfg = loadZgoalConfig(root);\n if (!cfg) return { ok: false, error: '.zgoal/config.yaml 缺失或 url/product 未配置(由 zgoal skill 创建)' };\n try {\n const token = await getToken(cfg);\n const json = await fetchJson(\n `${cfg.url}/api.php/v1/products/${cfg.product}/bugs?page=1&limit=100`,\n { headers: { Token: token } },\n );\n const raw = Array.isArray(json.bugs) ? (json.bugs as Record<string, unknown>[]) : [];\n return { ok: true, url: cfg.url, total: Number(json.total ?? raw.length), bugs: raw.map((b) => normBug(b, cfg.account)) };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { ok: false, error: `禅道请求失败(${msg})——检查 url / 凭据 / 是否开启 RESTful API v1` };\n }\n}\n","import ky from 'ky';\nimport { HttpError, NetworkError } from '../errors.js';\n\nexport async function fetchJson(url: string, init?: RequestInit): Promise<Record<string, unknown>> {\n try {\n const res = await ky(url, { ...init, timeout: 8000, retry: 2 });\n return await res.json() as Record<string, unknown>;\n } catch (e) {\n if (e instanceof HttpError) throw e;\n if (e instanceof Error && e.name === 'TimeoutError') {\n throw new NetworkError(`请求超时: ${url}`);\n }\n if (e instanceof Error && e.name === 'HTTPError') {\n throw new HttpError((e as Error & { status?: number }).status ?? 500, e.message);\n }\n throw new NetworkError(`请求失败: ${url}`, e);\n }\n}\n","export class HttpError extends Error {\n constructor(\n public status: number,\n message: string,\n public body?: unknown,\n ) {\n super(message);\n this.name = 'HttpError';\n }\n}\n\nexport class NetworkError extends Error {\n constructor(message: string, public cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n }\n}\n\nexport function isHttpError(e: unknown): e is HttpError {\n return e instanceof HttpError;\n}\n","/**\n * zdashboard plugin system\n *\n * Plugin contract:\n * {\n * mode: string; // unique mode identifier, e.g. 'bugs'\n * label: string; // human label, e.g. '禅道'\n * icon?: string; // optional emoji or icon name\n * viewer: () => Promise<{ default: React.ComponentType }>;\n * sidebar?: () => Promise<{ default: React.ComponentType }>;\n * apiRoutes?: Record<string, (req: http.IncomingMessage, res: http.ServerResponse, root: string) => void>;\n * }\n */\n\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport React from 'react';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface DashboardPlugin {\n mode: string;\n label: string;\n icon?: string;\n viewer?: () => Promise<{ default: React.ComponentType }>;\n sidebar?: () => Promise<{ default: React.ComponentType }>;\n apiRoutes?: Record<string, (req: http.IncomingMessage, res: http.ServerResponse, root: string) => void>;\n}\n\nexport interface PluginContext {\n root: string;\n appDir: string;\n}\n\nconst builtinPlugins = new Map<string, DashboardPlugin>();\n\nexport function registerBuiltin(plugin: DashboardPlugin) {\n builtinPlugins.set(plugin.mode, plugin);\n}\n\nexport function getBuiltin(mode: string): DashboardPlugin | undefined {\n return builtinPlugins.get(mode);\n}\n\nexport function allBuiltins(): DashboardPlugin[] {\n return Array.from(builtinPlugins.values());\n}\n\nexport async function loadExternalPlugins(pluginDirs: string[]): Promise<DashboardPlugin[]> {\n const plugins: DashboardPlugin[] = [];\n for (const dir of pluginDirs) {\n if (!fs.existsSync(dir)) continue;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const indexPath = path.join(dir, entry.name, 'index.ts');\n if (!fs.existsSync(indexPath)) continue;\n try {\n const mod = await import(path.join(dir, entry.name, 'index.ts'));\n const plugin = mod.default as DashboardPlugin;\n if (plugin?.mode) {\n plugins.push(plugin);\n }\n } catch (e) {\n console.error(`[zdashboard] failed to load plugin ${entry.name}:`, e);\n }\n }\n }\n return plugins;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\n\nexport type ItemState = 'open' | 'answered' | 'accepted' | 'dismissed';\nexport type ReviewStatus = 'draft' | 'reviewing' | 'passed' | 'rejected';\n\nexport interface ReviewItem {\n id: string;\n doc?: string;\n category?: string;\n severity?: 'high' | 'medium' | 'low';\n state: ItemState;\n question: string;\n answer?: string;\n}\n\nexport interface ReviewData {\n status: ReviewStatus;\n items: ReviewItem[];\n}\n\nconst REVIEW_FILE = 'review.yaml';\n\nexport class ReviewStore {\n private root: string;\n private file: string;\n private onChange?: () => void;\n\n constructor(root: string, onChange?: () => void) {\n this.root = root;\n this.file = path.join(root, REVIEW_FILE);\n this.onChange = onChange;\n }\n\n exists(): boolean { return fs.existsSync(this.file); }\n\n read(): ReviewData {\n try {\n const parsed = YAML.parse(fs.readFileSync(this.file, 'utf8')) as ReviewData;\n if (!parsed || !Array.isArray(parsed.items)) return { status: 'draft', items: [] };\n return parsed;\n } catch {\n return { status: 'draft', items: [] };\n }\n }\n\n private write(data: ReviewData) {\n fs.writeFileSync(this.file, YAML.stringify(data), 'utf8');\n this.onChange?.();\n }\n\n updateItem(id: string, patch: { answer?: string; state?: ItemState }): ReviewData {\n const data = this.read();\n const item = data.items.find((i) => i.id === id);\n if (!item) throw new Error(`item ${id} not found`);\n if (patch.answer !== undefined) item.answer = patch.answer;\n if (patch.state !== undefined) item.state = patch.state;\n if (patch.state === 'answered' && !patch.answer && !item.answer) item.answer = '';\n this.write(data);\n return data;\n }\n\n setStatus(status: ReviewStatus): ReviewData {\n const data = this.read();\n if (status === 'passed' && data.items.some((i) => i.state === 'open')) {\n throw new Error('存在未处理的评审项(open),不能通过');\n }\n data.status = status;\n this.write(data);\n return data;\n }\n\n docs(): string[] {\n try {\n return fs.readdirSync(this.root)\n .filter((f) => /\\.(md|markdown)$/i.test(f) && fs.statSync(path.join(this.root, f)).isFile())\n .sort();\n } catch { return []; }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type AssetType = 'page' | 'component' | 'icon' | 'token' | 'md' | 'video' | 'audio' | 'pdf' | 'code' | 'font' | 'other';\n\nconst PAGE_EXTS = ['.html', '.htm'];\nconst ICON_EXTS = ['.svg', '.png', '.ico', '.jpg', '.jpeg', '.gif', '.webp'];\nconst VIDEO_EXTS = ['.mp4', '.webm', '.mov', '.ogg', '.ogv'];\nconst AUDIO_EXTS = ['.mp3', '.wav', '.flac', '.aac', '.m4a'];\nconst CODE_EXTS = ['.js', '.mjs', '.ts', '.tsx', '.jsx', '.css', '.json', '.txt', '.xml', '.yml', '.yaml', '.sh', '.md'];\nconst FONT_EXTS = ['.woff', '.woff2', '.ttf', '.otf'];\nconst TOKEN_RE = /token|theme|design|color|palette|typograph/i;\n\nexport function categorize(rel: string, ext: string): AssetType {\n if (rel.indexOf('components/') === 0) return 'component';\n if (VIDEO_EXTS.includes(ext)) return 'video';\n if (AUDIO_EXTS.includes(ext)) return 'audio';\n if (ext === '.pdf') return 'pdf';\n if (ext === '.md') return 'md';\n if (FONT_EXTS.includes(ext)) return 'font';\n if (ICON_EXTS.includes(ext)) return 'icon';\n if (PAGE_EXTS.includes(ext)) return 'page';\n if (CODE_EXTS.includes(ext)) return TOKEN_RE.test(rel) && (ext === '.css' || ext === '.json') ? 'token' : 'code';\n return 'other';\n}\n\nexport interface AssetFile { path: string; name: string; ext: string; type: AssetType; }\nexport type ScanResult = Record<AssetType, AssetFile[]>;\n\nexport function scanAssets(root: string): ScanResult {\n const out: ScanResult = {} as ScanResult;\n const keys: AssetType[] = ['page','component','icon','token','md','video','audio','pdf','code','font','other'];\n for (const k of keys) out[k] = [];\n const SKIP = new Set(['node_modules', '.git', 'dist', 'build', 'coverage', '.next', '.cache']);\n function walk(dir: string, rel: string) {\n let ents: fs.Dirent[];\n try { ents = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }\n for (const ent of ents) {\n if (ent.name.startsWith('.') || SKIP.has(ent.name)) continue;\n const r = rel ? `${rel}/${ent.name}` : ent.name;\n if (ent.isDirectory()) { walk(path.join(dir, ent.name), r); continue; }\n const ext = path.extname(ent.name).toLowerCase();\n const t = categorize(r, ext);\n out[t].push({ path: r, name: ent.name, ext, type: t });\n }\n }\n walk(root, '');\n return out;\n}\n","{\n \"name\": \"zdashboard\",\n \"version\": \"1.4.0\",\n \"description\": \"ZCode skill dashboard platform — pluggable viewers for zdesign/zview/zreview/zgoal\",\n \"type\": \"module\",\n \"bin\": {\n \"zdashboard\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsup && vite build\",\n \"build:web\": \"vite build\",\n \"build:node\": \"tsup\",\n \"start\": \"node dist/cli.js\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"@radix-ui/react-scroll-area\": \"^1.2.0\",\n \"@radix-ui/react-separator\": \"^1.1.0\",\n \"@radix-ui/react-slot\": \"^1.1.0\",\n \"@radix-ui/react-tooltip\": \"^1.1.2\",\n \"@uidotdev/usehooks\": \"^2.4.0\",\n \"ansi-to-react\": \"^6.1.6\",\n \"class-variance-authority\": \"^0.7.0\",\n \"clsx\": \"^2.1.1\",\n \"date-fns\": \"^3.6.0\",\n \"filesize\": \"^11.0.0\",\n \"highlight.js\": \"^11.11.1\",\n \"katex\": \"^0.16.11\",\n \"ky\": \"^1.7.0\",\n \"lodash-es\": \"^4.17.21\",\n \"lucide-react\": \"^0.460.0\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"react-error-boundary\": \"^5.0.0\",\n \"react-markdown\": \"^9.0.1\",\n \"rehype-autolink-headings\": \"^7.1.0\",\n \"rehype-highlight\": \"^7.0.1\",\n \"rehype-katex\": \"^7.0.1\",\n \"rehype-raw\": \"^7.0.0\",\n \"rehype-slug\": \"^6.0.0\",\n \"remark-frontmatter\": \"^5.0.0\",\n \"remark-gfm\": \"^4.0.0\",\n \"remark-math\": \"^6.0.0\",\n \"sonner\": \"^1.5.0\",\n \"tailwind-merge\": \"^2.5.4\",\n \"use-debounce\": \"^10.0.0\",\n \"yaml\": \"^2.9.0\"\n },\n \"devDependencies\": {\n \"@tailwindcss/typography\": \"^0.5.20\",\n \"@testing-library/jest-dom\": \"^7.0.1\",\n \"@testing-library/react\": \"^16.3.2\",\n \"@types/lodash-es\": \"^4.17.12\",\n \"@types/node\": \"^22.9.0\",\n \"@types/react\": \"^18.3.12\",\n \"@types/react-dom\": \"^18.3.1\",\n \"@vitejs/plugin-react\": \"^4.7.0\",\n \"autoprefixer\": \"^10.4.20\",\n \"jsdom\": \"^30.0.1\",\n \"postcss\": \"^8.4.49\",\n \"tailwindcss\": \"^3.4.14\",\n \"tailwindcss-animate\": \"^1.0.7\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.6.3\",\n \"vite\": \"^5.4.10\",\n \"vitest\": \"^1.6.0\"\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [\n \"esbuild\"\n ]\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { execFile } from 'node:child_process';\n\nexport interface DetectResult {\n hasOpenspec: boolean;\n hasDocs: boolean;\n hasJust: boolean;\n hasBugs: boolean;\n}\n\nfunction justAvailable(cwd: string): Promise<boolean> {\n return new Promise((resolve) => {\n const child = execFile('just', ['--list', '--unsorted'], { cwd, timeout: 5000 }, (err) => {\n resolve(!err);\n });\n if (child.killed) resolve(false);\n });\n}\n\nexport async function detect(root: string): Promise<DetectResult> {\n const hasOpenspec = fs.existsSync(path.join(root, 'openspec'));\n const hasDocs = fs.existsSync(path.join(root, 'docs'));\n const hasJust = await justAvailable(root);\n const hasBugs = fs.existsSync(path.join(root, '.zgoal', 'config.yaml'));\n return { hasOpenspec, hasDocs, hasJust, hasBugs };\n}\n","import { createServer } from './server/index.js';\nimport { detect } from './server/detect.js';\n\nfunction parseArgs(a: string[]): Record<string, string | true> {\n const o: Record<string, string | true> = {};\n for (let i = 0; i < a.length; i++) {\n if (a[i].indexOf('--') === 0) {\n const n = a[i + 1];\n o[a[i].slice(2)] = n && n.indexOf('--') !== 0 ? a[++i] : true;\n }\n }\n return o;\n}\n\nconst args = parseArgs(process.argv.slice(2));\nconst root = (args.dir as string) ?? '.';\n\nconst det = await detect(root);\ncreateServer({\n root,\n port: args.port ? parseInt(args.port as string, 10) : undefined,\n open: !!args.open,\n detect: det,\n mode: args.mode as string | undefined,\n});\n"],"mappings":"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","names":["fs","path","fileURLToPath","root","fs","path","root","path","fs","fs","path","fs","path","root","fs","path","root","__dirname","path","fileURLToPath","fs","det","handler","fp","root","fs","path","execFile","root"]}
|
|
1
|
+
{"version":3,"sources":["../src/server/index.ts","../src/server/spec-scan.ts","../src/server/just-runner.ts","../src/server/bugs.ts","../src/server/api/fetch.ts","../src/server/errors.ts","../src/server/plugins.ts","../src/server/review-store.ts","../src/server/design-assets.ts","../package.json","../src/server/detect.ts","../src/cli.ts"],"sourcesContent":["import http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { exec } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { scanTree } from './spec-scan.js';\nimport { JustRunner } from './just-runner.js';\nimport { fetchBugs } from './bugs.js';\nimport { registerBuiltin, allBuiltins, type DashboardPlugin } from './plugins.js';\nimport { ReviewStore, type ItemState, type ReviewStatus } from './review-store.js';\nimport { scanAssets } from './design-assets.js';\nimport type { DetectResult } from './detect.js';\nimport pkg from '../../package.json' with { type: 'json' };\n\nconst VERSION = pkg.version;\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst STOP_TOKEN = crypto.randomBytes(12).toString('hex');\nconst INJECT = `<script>(function(){try{var es=new EventSource('/__reload');es.addEventListener('reload',function(){location.reload();});es.onerror=function(){es.close();};}catch(e){}document.addEventListener('click',function(e){var t=e.target;if(t&&t.closest){var a=t.closest('a[target]');if(a&&a.target!=='_self'){a.target='_self';}}},true);})();</script>`;\n\nconst MIME: Record<string, string> = {\n '.html': 'text/html; charset=utf-8', '.htm': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8', '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8', '.json': 'application/json; charset=utf-8',\n '.svg': 'image/svg+xml', '.png': 'image/png', '.ico': 'image/x-icon',\n '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.gif': 'image/gif', '.webp': 'image/webp',\n '.md': 'text/markdown; charset=utf-8', '.txt': 'text/plain; charset=utf-8',\n '.yml': 'text/yaml; charset=utf-8', '.yaml': 'text/yaml; charset=utf-8',\n '.woff': 'font/woff', '.woff2': 'font/woff2', '.ttf': 'font/ttf',\n '.map': 'application/json; charset=utf-8',\n};\n\nexport interface ServerOptions {\n root: string;\n port?: number;\n open?: boolean;\n detect: DetectResult;\n dashboardDir?: string;\n mode?: string;\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve) => {\n let data = '';\n req.on('data', (c) => (data += c));\n req.on('end', () => resolve(data));\n });\n}\n\nexport function createServer(opts: ServerOptions) {\n const ROOT = path.resolve(opts.root);\n const PORT0 = opts.port ?? 4190;\n const OPEN = !!opts.open;\n const APP_DIR = opts.dashboardDir ?? path.resolve(__dirname, 'web');\n if (!fs.existsSync(ROOT)) fs.mkdirSync(ROOT, { recursive: true });\n const det = opts.detect;\n const runner = new JustRunner(ROOT);\n const MODE = opts.mode;\n\n // register builtin plugins (server-side: apiRoutes only; viewer loaded by frontend)\n registerBuiltin({\n mode: 'bugs', label: '禅道 Bugs', icon: '🎯',\n apiRoutes: { '/__bugs': async (_, res) => { res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' }); fetchBugs(ROOT).then((r) => res.end(JSON.stringify(r))); } }\n });\n registerBuiltin({ mode: 'view', label: '项目浏览', icon: '👁️' });\n\n const reviewStore = new ReviewStore(ROOT);\n registerBuiltin({\n mode: 'review', label: '文档评审', icon: '✅',\n apiRoutes: {\n '/__review': async (_, res) => {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(JSON.stringify(reviewStore.read()));\n },\n '/__review/item': async (req, res) => {\n if (req.headers['x-stop-token'] !== STOP_TOKEN) { res.writeHead(403); res.end('forbidden'); return; }\n (async () => {\n try {\n const body = JSON.parse(await readBody(req) || '{}');\n const data = reviewStore.updateItem(body.id, { answer: body.answer, state: body.state as ItemState | undefined });\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(data));\n } catch (e) {\n res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ error: (e as Error).message }));\n }\n })();\n return;\n },\n '/__review/status': async (req, res) => {\n if (req.headers['x-stop-token'] !== STOP_TOKEN) { res.writeHead(403); res.end('forbidden'); return; }\n (async () => {\n try {\n const body = JSON.parse(await readBody(req) || '{}');\n const data = reviewStore.setStatus(body.status as ReviewStatus);\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(data));\n } catch (e) {\n res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ error: (e as Error).message }));\n }\n })();\n return;\n },\n '/__docs': async (_, res) => {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(JSON.stringify(reviewStore.docs()));\n },\n }\n });\n\n registerBuiltin({ mode: 'design', label: '设计资产', icon: '🎨' });\n\n // apply plugin routes\n registerBuiltin({\n mode: 'apply', label: '执行进度', icon: '⚙️',\n apiRoutes: {\n '/__apply': async (_, res) => {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(JSON.stringify(scanApplyChanges(ROOT)));\n },\n '/__apply/change': async (req, res) => {\n (async () => {\n try {\n const url = new URL(req.url || '', 'http://x');\n const name = url.searchParams.get('name');\n if (!name) { res.writeHead(400); res.end(JSON.stringify({ error: 'missing name' })); return; }\n const data = readApplyChange(ROOT, name);\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(JSON.stringify(data));\n } catch (e) { res.writeHead(400); res.end(JSON.stringify({ error: (e as Error).message })); }\n })();\n return;\n },\n }\n });\n\n const clients = new Set<http.ServerResponse>();\n const broadcast = (ev: string, data: unknown = '') => {\n const payload = `event: ${ev}\\ndata: ${JSON.stringify(data == null ? '' : data)}\\n\\n`;\n for (const c of clients) c.write(payload);\n };\n\n function serveFile(filePath: string, res: http.ServerResponse, injectHtml: boolean) {\n fs.readFile(filePath, (err, data) => {\n if (err) { res.writeHead(404); return res.end('Not found'); }\n const ext = path.extname(filePath).toLowerCase();\n const ct = MIME[ext] ?? 'application/octet-stream';\n let body = data;\n if (injectHtml && ext === '.html') {\n const s = data.toString('utf8');\n body = Buffer.from(s.indexOf('</body>') >= 0 ? s.replace('</body>', INJECT + '</body>') : s + INJECT);\n }\n res.writeHead(200, { 'Content-Type': ct, 'Cache-Control': 'no-cache' });\n res.end(body);\n });\n }\n\n function handler(req: http.IncomingMessage, res: http.ServerResponse) {\n const url = req.url!.split('?')[0];\n\n // ── SSE:文件变更 ──\n if (url === '/__reload') {\n res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive' });\n res.write(': connected\\n\\n');\n clients.add(res);\n req.on('close', () => clients.delete(res));\n return;\n }\n if (url === '/__config') {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n return res.end(JSON.stringify({ stopToken: STOP_TOKEN }));\n }\n if (url === '/__stop' && req.method === 'POST') {\n if (req.headers['x-stop-token'] === STOP_TOKEN) {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end('{\"ok\":true}');\n runner.stop();\n setTimeout(() => { try { server.close(); } catch (e) { console.error('[zdashboard] server close failed:', e); } process.exit(0); }, 50);\n } else { res.writeHead(403); res.end('forbidden'); }\n return;\n }\n\n // ── 方案模式:树形文件清单(+探测结果) / 设计模式:资产分类清单 ──\n if (url === '/__files') {\n if (MODE === 'design') {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n return res.end(JSON.stringify(scanAssets(ROOT)));\n }\n const tree = scanTree(ROOT, det.hasOpenspec, det.hasDocs);\n const payload: TreeNodePayload = { tree, ...det };\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n return res.end(JSON.stringify(payload));\n }\n\n // ── 日志能力 ──\n if (url === '/__just/recipes') {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-cache' });\n runner.recipes().then((r) => res.end(JSON.stringify(r)));\n return;\n }\n if (url === '/__just/logs') {\n res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive' });\n res.write(': connected\\n\\n');\n const unsub = runner.subscribe((ev) => res.write(`data: ${JSON.stringify(ev)}\\n\\n`));\n req.on('close', unsub);\n return;\n }\n const justAction = url.match(/^\\/__just\\/(start|stop|restart)$/);\n if (justAction && req.method === 'POST') {\n (async () => {\n if (req.headers['x-stop-token'] !== STOP_TOKEN) { res.writeHead(403); res.end('forbidden'); return; }\n const body = await readBody(req);\n let recipe: string | undefined;\n try { recipe = JSON.parse(body || '{}').recipe; } catch (e) { console.error('[zdashboard] invalid just action body:', e); }\n const act = justAction[1];\n if (act === 'start' || act === 'restart') {\n const target = recipe ?? runner.info().recipe;\n if (!target) { res.writeHead(400); res.end('{\"error\":\"no recipe\"}'); return; }\n const recipes = await runner.recipes();\n if (!recipes.some((r) => r.name === target)) { res.writeHead(403); res.end('{\"error\":\"unknown recipe\"}'); return; }\n runner.start(target);\n } else {\n runner.stop();\n }\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(runner.info()));\n })();\n return;\n }\n\n // ── plugin API routes ──\n let handled = false;\n for (const plugin of allBuiltins()) {\n if (!plugin.apiRoutes) continue;\n for (const [route, handler] of Object.entries(plugin.apiRoutes)) {\n if (url === route) {\n handled = true;\n handler(req, res, ROOT);\n return;\n }\n }\n }\n\n // ── dashboard 前端 ──\n if (url === '/') return serveFile(path.join(APP_DIR, 'index.html'), res, false);\n if (url.indexOf('/__app/') === 0) {\n const fp = path.join(APP_DIR, url.slice(7));\n if (fp !== APP_DIR && fp.indexOf(APP_DIR + path.sep) !== 0) { res.writeHead(403); return res.end('Forbidden'); }\n return serveFile(fp, res, false);\n }\n if (url.indexOf('/assets/') === 0) {\n const fp = path.join(APP_DIR, decodeURIComponent(url));\n if (fp.indexOf(APP_DIR + path.sep) !== 0) { res.writeHead(403); return res.end('Forbidden'); }\n return serveFile(fp, res, false);\n }\n\n // ── 用户资产 ──\n const fp = path.join(ROOT, decodeURIComponent(url));\n if (fp !== ROOT && fp.indexOf(ROOT + path.sep) !== 0) { res.writeHead(403); return res.end('Forbidden'); }\n return serveFile(fp, res, true);\n }\n\n let server: http.Server;\n function start(port: number) {\n server = http.createServer(handler);\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') { console.log(`[zdashboard] port ${port} busy, trying ${port + 1}`); start(port + 1); }\n else throw err;\n });\n server.listen(port, () => {\n const u = `http://localhost:${port}`;\n console.log(`[zdashboard] v${VERSION} dashboard -> ${u}`);\n console.log(`[zdashboard] project -> ${ROOT}`);\n console.log(`[zdashboard] mode -> ${MODE ?? '(auto)'}`);\n console.log(`[zdashboard] detect -> openspec:${det.hasOpenspec} docs:${det.hasDocs} just:${det.hasJust} bugs:${det.hasBugs}`);\n if (OPEN) exec(process.platform === 'darwin' ? `open ${u}` : `start ${u}`);\n });\n }\n\n let debounce: NodeJS.Timeout;\n try {\n fs.watch(ROOT, { recursive: true }, () => {\n clearTimeout(debounce);\n debounce = setTimeout(() => {\n broadcast('reload');\n broadcast('files');\n console.log(`[zdashboard] change -> reload + refresh tree (${clients.size} client${clients.size === 1 ? '' : 's'})`);\n }, 150);\n });\n } catch { console.log('[zdashboard] watch unavailable - static only.'); }\n\n start(PORT0);\n}\n\ninterface TreeNodePayload { tree: unknown; hasOpenspec: boolean; hasDocs: boolean; hasJust: boolean; hasBugs: boolean; }\n\ninterface ChangeSummary { name: string; path: string; total: number; done: number; hasProposal: boolean; hasDesign: boolean; }\ninterface ChangeDetail extends ChangeSummary { proposal?: string; design?: string; tasks: string; }\n\nfunction countTasks(md: string): { total: number; done: number } {\n const all = (md.match(/^\\s*-\\s*\\[[ xX]\\]\\s*/gm) || []).length;\n const done = (md.match(/^\\s*-\\s*\\[[xX]\\]\\s*/gm) || []).length;\n return { total: all, done };\n}\n\nfunction readText(p: string): string {\n try { return fs.readFileSync(p, 'utf8'); } catch { return ''; }\n}\n\nfunction scanApplyChanges(root: string): ChangeSummary[] {\n const changesDir = path.join(root, 'openspec', 'changes');\n if (!fs.existsSync(changesDir)) return [];\n const out: ChangeSummary[] = [];\n for (const ent of fs.readdirSync(changesDir, { withFileTypes: true })) {\n if (!ent.isDirectory() || ent.name.startsWith('.') || ent.name === 'archive') continue;\n const dir = path.join(changesDir, ent.name);\n const tasks = readText(path.join(dir, 'tasks.md'));\n const { total, done } = countTasks(tasks);\n out.push({ name: ent.name, path: `openspec/changes/${ent.name}`, total, done, hasProposal: fs.existsSync(path.join(dir, 'proposal.md')), hasDesign: fs.existsSync(path.join(dir, 'design.md')) });\n }\n out.sort((a, b) => a.name.localeCompare(b.name));\n return out;\n}\n\nfunction readApplyChange(root: string, name: string): ChangeDetail {\n const dir = path.join(root, 'openspec', 'changes', name);\n const proposal = readText(path.join(dir, 'proposal.md'));\n const design = readText(path.join(dir, 'design.md'));\n const tasks = readText(path.join(dir, 'tasks.md'));\n const { total, done } = countTasks(tasks);\n return { name, path: `openspec/changes/${name}`, total, done, hasProposal: !!proposal, hasDesign: !!design, proposal, design, tasks };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type NodeKind = 'file' | 'dir' | 'log';\nexport interface TreeNode {\n name: string;\n kind: NodeKind;\n path?: string; // file: 相对 root 的路径(点击预览用)\n defaultCollapsed?: boolean;\n children?: TreeNode[];\n}\n\nfunction walkFiles(absDir: string, relDir: string, depth = 0): TreeNode[] {\n if (depth > 4) return [];\n let ents: fs.Dirent[];\n try { ents = fs.readdirSync(absDir, { withFileTypes: true }); } catch { return []; }\n const nodes: TreeNode[] = [];\n for (const ent of ents) {\n if (ent.name.startsWith('.') || ent.name === 'node_modules') continue;\n const rel = relDir ? `${relDir}/${ent.name}` : ent.name;\n if (ent.isDirectory()) {\n nodes.push({ name: ent.name, kind: 'dir', children: walkFiles(path.join(absDir, ent.name), rel, depth + 1) });\n } else {\n nodes.push({ name: ent.name, kind: 'file', path: rel });\n }\n }\n nodes.sort((a, b) => (a.kind === b.kind ? a.name.localeCompare(b.name) : a.kind === 'dir' ? -1 : 1));\n return nodes;\n}\n\n/** 方案模式树形扫描:openspec 感知 + docs 聚合 + 其他兜底 */\nexport function scanTree(root: string, hasOpenspec: boolean, hasDocs: boolean): TreeNode[] {\n const tree: TreeNode[] = [];\n if (hasOpenspec && fs.existsSync(path.join(root, 'openspec', 'changes'))) {\n const changesDir = path.join(root, 'openspec', 'changes');\n const active: TreeNode[] = [];\n const archived: TreeNode[] = [];\n for (const ent of fs.readdirSync(changesDir, { withFileTypes: true })) {\n if (!ent.isDirectory() || ent.name.startsWith('.') || ent.name === 'archive') continue;\n active.push({ name: ent.name, kind: 'dir', children: walkFiles(path.join(changesDir, ent.name), `openspec/changes/${ent.name}`) });\n }\n active.sort((a, b) => a.name.localeCompare(b.name));\n const archiveDir = path.join(changesDir, 'archive');\n if (fs.existsSync(archiveDir)) {\n for (const ent of fs.readdirSync(archiveDir, { withFileTypes: true })) {\n if (!ent.isDirectory() || ent.name.startsWith('.')) continue;\n archived.push({ name: ent.name, kind: 'dir', children: walkFiles(path.join(archiveDir, ent.name), `openspec/changes/archive/${ent.name}`) });\n }\n archived.sort((a, b) => b.name.localeCompare(a.name)); // 日期前缀倒序\n }\n if (active.length) tree.push({ name: `进行中 (${active.length})`, kind: 'dir', children: active });\n if (archived.length) tree.push({ name: `归档 (${archived.length})`, kind: 'dir', defaultCollapsed: true, children: archived });\n const specsDir = path.join(root, 'openspec', 'specs');\n if (fs.existsSync(specsDir)) {\n const specs = walkFiles(specsDir, 'openspec/specs');\n if (specs.length) tree.push({ name: '能力 Specs', kind: 'dir', children: specs });\n }\n }\n if (hasDocs && fs.existsSync(path.join(root, 'docs'))) {\n const docs = walkFiles(path.join(root, 'docs'), 'docs');\n if (docs.length) tree.push({ name: 'docs', kind: 'dir', children: docs });\n }\n const skip = new Set(['openspec', 'docs', 'node_modules', '.git', 'dist', 'test-server']);\n // \"其他\"只收根目录的 md 文档(README/CLAUDE 等);构建配置(pom.xml/justfile 等)不收——对\"方案+日志\"定位是噪音\n const etc: TreeNode[] = [];\n try {\n for (const ent of fs.readdirSync(root, { withFileTypes: true })) {\n if (ent.name.startsWith('.') || skip.has(ent.name)) continue;\n const ext = path.extname(ent.name).toLowerCase();\n if (ent.isFile() && (ext === '.md' || ext === '.markdown')) etc.push({ name: ent.name, kind: 'file', path: ent.name });\n }\n } catch (e) { console.error('[zdashboard] scan root etc failed:', e); }\n etc.sort((a, b) => a.name.localeCompare(b.name));\n if (etc.length) tree.push({ name: `其他 (${etc.length})`, kind: 'dir', children: etc });\n return tree;\n}\n","import { spawn, execFile, type ChildProcess } from 'node:child_process';\n\nexport interface Recipe { name: string; description: string; }\nexport type JustState = 'idle' | 'running' | 'exited';\nexport type JustEvent =\n | { type: 'log'; text: string }\n | { type: 'clear' }\n | { type: 'state'; state: JustState; recipe: string | null; code: number | null };\n\nconst MAX_BUFFER = 1000;\n\nexport class JustRunner {\n private cwd: string;\n private child: ChildProcess | null = null;\n private recipe: string | null = null;\n private state: JustState = 'idle';\n private code: number | null = null;\n private buffer: string[] = [];\n private pending = ''; // 行缓冲:块缓冲输出(如 maven)的 chunk 会在行中间断开,攒到 \\n 才切行\n private clients = new Set<(ev: JustEvent) => void>();\n private recipesCache: Recipe[] | null = null;\n\n constructor(cwd: string) { this.cwd = cwd; }\n\n recipes(): Promise<Recipe[]> {\n if (this.recipesCache) return Promise.resolve(this.recipesCache);\n return new Promise((resolve) => {\n execFile('just', ['--list', '--unsorted'], { cwd: this.cwd, maxBuffer: 1 << 20, timeout: 8000 }, (err, stdout) => {\n if (err) { resolve([]); return; }\n const out: Recipe[] = [];\n const seen = new Set<string>();\n for (const line of stdout.split(/\\r?\\n/).slice(1)) { // 跳过 \"Available recipes:\"\n const trimmed = line.trim();\n if (!trimmed) continue;\n const hashIdx = trimmed.indexOf('#');\n const sig = (hashIdx >= 0 ? trimmed.slice(0, hashIdx) : trimmed).trim();\n if (!sig) continue;\n const name = sig.split(/\\s+/)[0]; // \"hello msg=...\" -> \"hello\"\n if (seen.has(name)) continue;\n seen.add(name);\n out.push({ name, description: hashIdx >= 0 ? trimmed.slice(hashIdx + 1).trim() : '' });\n }\n this.recipesCache = out;\n resolve(out);\n });\n });\n }\n\n subscribe(fn: (ev: JustEvent) => void): () => void {\n this.clients.add(fn);\n // 连上即重放:历史日志 + 当前状态\n for (const text of this.buffer) fn({ type: 'log', text });\n fn({ type: 'state', state: this.state, recipe: this.recipe, code: this.code });\n return () => this.clients.delete(fn);\n }\n\n private emit(ev: JustEvent) { for (const fn of this.clients) fn(ev); }\n\n info() { return { state: this.state, recipe: this.recipe, code: this.code }; }\n\n /** 启动 recipe(调用方须先用 recipes() 校验名字);自动停旧进程 */\n start(recipe: string) {\n this.killChild();\n this.recipe = recipe;\n this.code = null;\n this.state = 'running';\n this.buffer = [];\n this.pending = '';\n this.emit({ type: 'clear' }); // 广播清屏:已连接的订阅者同步清掉上一个任务的残留日志\n this.emit({ type: 'state', state: 'running', recipe, code: null });\n const child = spawn('just', [recipe], {\n cwd: this.cwd,\n shell: true,\n env: {\n ...process.env,\n FORCE_COLOR: '1', // node 生态(chalk 等)\n // maven 检测非 tty 会关颜色;经 MAVEN_OPTS 强制开(保留用户已有值)\n MAVEN_OPTS: `${process.env.MAVEN_OPTS ?? ''} -Dstyle.color=always`.trim(),\n CI: '',\n },\n });\n this.child = child;\n const push = (d: Buffer) => {\n this.pending += d.toString();\n let idx: number;\n while ((idx = this.pending.indexOf('\\n')) >= 0) {\n const line = this.pending.slice(0, idx + 1);\n this.pending = this.pending.slice(idx + 1);\n this.pushLine(line);\n }\n // 无 \\n 的尾巴留在 pending,等下个 chunk(块缓冲输出会在行中断开,不能当独立行)\n };\n child.stdout?.on('data', push);\n child.stderr?.on('data', push);\n child.on('error', (err) => { this.pushLine(`[zdashboard] spawn error: ${err.message}\\n`); });\n child.on('exit', (code) => {\n if (this.pending) { this.pushLine(this.pending + '\\n'); this.pending = ''; } // flush 末尾无换行的残留\n this.child = null;\n this.state = 'exited';\n this.code = code ?? 0;\n this.emit({ type: 'state', state: 'exited', recipe: this.recipe, code: this.code });\n });\n }\n\n private pushLine(line: string) {\n this.buffer.push(line);\n if (this.buffer.length > MAX_BUFFER) this.buffer.shift();\n this.emit({ type: 'log', text: line });\n }\n\n stop() {\n this.killChild();\n }\n\n restart(recipe?: string) {\n const target = recipe ?? this.recipe;\n if (target) this.start(target);\n }\n\n private killChild() {\n const child = this.child;\n if (child?.pid) {\n try {\n if (process.platform === 'win32') spawn('taskkill', ['/PID', String(child.pid), '/T', '/F']);\n else child.kill('SIGTERM');\n } catch { /* 已退出 */ }\n }\n this.child = null;\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fetchJson } from './api/fetch.js';\n\n/** .zgoal/config.yaml(zgoal skill 的禅道凭据配置,扁平 key: value) */\nexport interface ZgoalConfig {\n url: string;\n account: string;\n password?: string;\n token?: string;\n product: number;\n}\n\nexport interface ZenBug {\n id: number;\n title: string;\n severity: number | string;\n pri: number | string;\n status: string;\n assignedTo: string;\n openedBy?: string;\n /** 指派给 config.account 的本人 */\n mine: boolean;\n}\n\nexport type BugsResult =\n | { ok: true; url: string; total: number; bugs: ZenBug[] }\n | { ok: false; error: string };\n\n/** 极简扁平 yaml 解析(仅 key: value 行,够 .zgoal/config.yaml 用) */\nfunction loadZgoalConfig(root: string): ZgoalConfig | null {\n const file = path.join(root, '.zgoal', 'config.yaml');\n if (!fs.existsSync(file)) return null;\n const kv: Record<string, string> = {};\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n const m = line.match(/^\\s*([A-Za-z_]\\w*)\\s*:\\s*(.+?)\\s*$/);\n if (m && !m[2].startsWith('#')) kv[m[1]] = m[2].replace(/^[\"']|[\"']$/g, '');\n }\n const product = Number(kv.product);\n if (!kv.url || !product) return null;\n return {\n url: kv.url.replace(/\\/+$/, ''),\n account: kv.account ?? '',\n password: kv.password,\n token: kv.token,\n product,\n };\n}\n\nlet tokenCache: { key: string; token: string; at: number } | null = null;\n\nasync function getToken(cfg: ZgoalConfig): Promise<string> {\n if (cfg.token) return cfg.token;\n const key = `${cfg.url}|${cfg.account}|${cfg.password ?? ''}`;\n if (tokenCache && tokenCache.key === key && Date.now() - tokenCache.at < 10 * 60_000) return tokenCache.token;\n const json = await fetchJson(`${cfg.url}/api.php/v1/tokens`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ account: cfg.account, password: cfg.password }),\n });\n const token = typeof json.token === 'string' ? json.token : '';\n if (!token) throw new Error('token 获取失败:检查 account / password');\n tokenCache = { key, token, at: Date.now() };\n return token;\n}\n\nfunction normBug(b: Record<string, unknown>, account: string): ZenBug {\n const assigned = b.assignedTo;\n const assignedTo =\n typeof assigned === 'string'\n ? assigned\n : assigned && typeof assigned === 'object' && 'realname' in (assigned as Record<string, unknown>)\n ? String((assigned as Record<string, unknown>).realname ?? '')\n : '';\n const assignedAccount =\n typeof assigned === 'string'\n ? assigned\n : assigned && typeof assigned === 'object'\n ? String((assigned as Record<string, unknown>).account ?? '')\n : '';\n const mine = !!account && (assignedAccount === account || assignedTo === account);\n return {\n id: Number(b.id),\n title: String(b.title ?? ''),\n severity: (b.severity as number | string) ?? 4,\n pri: (b.pri as number | string) ?? 3,\n status: String(b.status ?? ''),\n assignedTo,\n openedBy: typeof b.openedBy === 'string' ? b.openedBy : undefined,\n mine,\n };\n}\n\n/** 只读拉取禅道 bug 列表(GET,绝不写)。失败返回 ok:false,不抛。 */\nexport async function fetchBugs(root: string): Promise<BugsResult> {\n const cfg = loadZgoalConfig(root);\n if (!cfg) return { ok: false, error: '.zgoal/config.yaml 缺失或 url/product 未配置(由 zgoal skill 创建)' };\n try {\n const token = await getToken(cfg);\n const json = await fetchJson(\n `${cfg.url}/api.php/v1/products/${cfg.product}/bugs?page=1&limit=100`,\n { headers: { Token: token } },\n );\n const raw = Array.isArray(json.bugs) ? (json.bugs as Record<string, unknown>[]) : [];\n return { ok: true, url: cfg.url, total: Number(json.total ?? raw.length), bugs: raw.map((b) => normBug(b, cfg.account)) };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { ok: false, error: `禅道请求失败(${msg})——检查 url / 凭据 / 是否开启 RESTful API v1` };\n }\n}\n","import ky from 'ky';\nimport { HttpError, NetworkError } from '../errors.js';\n\nexport async function fetchJson(url: string, init?: RequestInit): Promise<Record<string, unknown>> {\n try {\n const res = await ky(url, { ...init, timeout: 8000, retry: 2 });\n return await res.json() as Record<string, unknown>;\n } catch (e) {\n if (e instanceof HttpError) throw e;\n if (e instanceof Error && e.name === 'TimeoutError') {\n throw new NetworkError(`请求超时: ${url}`);\n }\n if (e instanceof Error && e.name === 'HTTPError') {\n throw new HttpError((e as Error & { status?: number }).status ?? 500, e.message);\n }\n throw new NetworkError(`请求失败: ${url}`, e);\n }\n}\n","export class HttpError extends Error {\n constructor(\n public status: number,\n message: string,\n public body?: unknown,\n ) {\n super(message);\n this.name = 'HttpError';\n }\n}\n\nexport class NetworkError extends Error {\n constructor(message: string, public cause?: unknown) {\n super(message);\n this.name = 'NetworkError';\n }\n}\n\nexport function isHttpError(e: unknown): e is HttpError {\n return e instanceof HttpError;\n}\n","/**\n * zdashboard plugin system\n *\n * Plugin contract:\n * {\n * mode: string; // unique mode identifier, e.g. 'bugs'\n * label: string; // human label, e.g. '禅道'\n * icon?: string; // optional emoji or icon name\n * viewer: () => Promise<{ default: React.ComponentType }>;\n * sidebar?: () => Promise<{ default: React.ComponentType }>;\n * apiRoutes?: Record<string, (req: http.IncomingMessage, res: http.ServerResponse, root: string) => void>;\n * }\n */\n\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport React from 'react';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface DashboardPlugin {\n mode: string;\n label: string;\n icon?: string;\n viewer?: () => Promise<{ default: React.ComponentType }>;\n sidebar?: () => Promise<{ default: React.ComponentType }>;\n apiRoutes?: Record<string, (req: http.IncomingMessage, res: http.ServerResponse, root: string) => void>;\n}\n\nexport interface PluginContext {\n root: string;\n appDir: string;\n}\n\nconst builtinPlugins = new Map<string, DashboardPlugin>();\n\nexport function registerBuiltin(plugin: DashboardPlugin) {\n builtinPlugins.set(plugin.mode, plugin);\n}\n\nexport function getBuiltin(mode: string): DashboardPlugin | undefined {\n return builtinPlugins.get(mode);\n}\n\nexport function allBuiltins(): DashboardPlugin[] {\n return Array.from(builtinPlugins.values());\n}\n\nexport async function loadExternalPlugins(pluginDirs: string[]): Promise<DashboardPlugin[]> {\n const plugins: DashboardPlugin[] = [];\n for (const dir of pluginDirs) {\n if (!fs.existsSync(dir)) continue;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const indexPath = path.join(dir, entry.name, 'index.ts');\n if (!fs.existsSync(indexPath)) continue;\n try {\n const mod = await import(path.join(dir, entry.name, 'index.ts'));\n const plugin = mod.default as DashboardPlugin;\n if (plugin?.mode) {\n plugins.push(plugin);\n }\n } catch (e) {\n console.error(`[zdashboard] failed to load plugin ${entry.name}:`, e);\n }\n }\n }\n return plugins;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\n\nexport type ItemState = 'open' | 'answered' | 'accepted' | 'dismissed';\nexport type ReviewStatus = 'draft' | 'reviewing' | 'passed' | 'rejected';\n\nexport interface ReviewItem {\n id: string;\n doc?: string;\n category?: string;\n severity?: 'high' | 'medium' | 'low';\n state: ItemState;\n question: string;\n answer?: string;\n}\n\nexport interface ReviewData {\n status: ReviewStatus;\n items: ReviewItem[];\n}\n\nconst REVIEW_FILE = 'review.yaml';\n\nexport class ReviewStore {\n private root: string;\n private file: string;\n private onChange?: () => void;\n\n constructor(root: string, onChange?: () => void) {\n this.root = root;\n this.file = path.join(root, REVIEW_FILE);\n this.onChange = onChange;\n }\n\n exists(): boolean { return fs.existsSync(this.file); }\n\n read(): ReviewData {\n try {\n const parsed = YAML.parse(fs.readFileSync(this.file, 'utf8')) as ReviewData;\n if (!parsed || !Array.isArray(parsed.items)) return { status: 'draft', items: [] };\n return parsed;\n } catch {\n return { status: 'draft', items: [] };\n }\n }\n\n private write(data: ReviewData) {\n fs.writeFileSync(this.file, YAML.stringify(data), 'utf8');\n this.onChange?.();\n }\n\n updateItem(id: string, patch: { answer?: string; state?: ItemState }): ReviewData {\n const data = this.read();\n const item = data.items.find((i) => i.id === id);\n if (!item) throw new Error(`item ${id} not found`);\n if (patch.answer !== undefined) item.answer = patch.answer;\n if (patch.state !== undefined) item.state = patch.state;\n if (patch.state === 'answered' && !patch.answer && !item.answer) item.answer = '';\n this.write(data);\n return data;\n }\n\n setStatus(status: ReviewStatus): ReviewData {\n const data = this.read();\n if (status === 'passed' && data.items.some((i) => i.state === 'open')) {\n throw new Error('存在未处理的评审项(open),不能通过');\n }\n data.status = status;\n this.write(data);\n return data;\n }\n\n docs(): string[] {\n try {\n return fs.readdirSync(this.root)\n .filter((f) => /\\.(md|markdown)$/i.test(f) && fs.statSync(path.join(this.root, f)).isFile())\n .sort();\n } catch { return []; }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type AssetType = 'page' | 'component' | 'icon' | 'token' | 'md' | 'video' | 'audio' | 'pdf' | 'code' | 'font' | 'other';\n\nconst PAGE_EXTS = ['.html', '.htm'];\nconst ICON_EXTS = ['.svg', '.png', '.ico', '.jpg', '.jpeg', '.gif', '.webp'];\nconst VIDEO_EXTS = ['.mp4', '.webm', '.mov', '.ogg', '.ogv'];\nconst AUDIO_EXTS = ['.mp3', '.wav', '.flac', '.aac', '.m4a'];\nconst CODE_EXTS = ['.js', '.mjs', '.ts', '.tsx', '.jsx', '.css', '.json', '.txt', '.xml', '.yml', '.yaml', '.sh', '.md'];\nconst FONT_EXTS = ['.woff', '.woff2', '.ttf', '.otf'];\nconst TOKEN_RE = /token|theme|design|color|palette|typograph/i;\n\nexport function categorize(rel: string, ext: string): AssetType {\n if (rel.indexOf('components/') === 0) return 'component';\n if (VIDEO_EXTS.includes(ext)) return 'video';\n if (AUDIO_EXTS.includes(ext)) return 'audio';\n if (ext === '.pdf') return 'pdf';\n if (ext === '.md') return 'md';\n if (FONT_EXTS.includes(ext)) return 'font';\n if (ICON_EXTS.includes(ext)) return 'icon';\n if (PAGE_EXTS.includes(ext)) return 'page';\n if (CODE_EXTS.includes(ext)) return TOKEN_RE.test(rel) && (ext === '.css' || ext === '.json') ? 'token' : 'code';\n return 'other';\n}\n\nexport interface AssetFile { path: string; name: string; ext: string; type: AssetType; }\nexport type ScanResult = Record<AssetType, AssetFile[]>;\n\nexport function scanAssets(root: string): ScanResult {\n const out: ScanResult = {} as ScanResult;\n const keys: AssetType[] = ['page','component','icon','token','md','video','audio','pdf','code','font','other'];\n for (const k of keys) out[k] = [];\n const SKIP = new Set(['node_modules', '.git', 'dist', 'build', 'coverage', '.next', '.cache']);\n function walk(dir: string, rel: string) {\n let ents: fs.Dirent[];\n try { ents = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }\n for (const ent of ents) {\n if (ent.name.startsWith('.') || SKIP.has(ent.name)) continue;\n const r = rel ? `${rel}/${ent.name}` : ent.name;\n if (ent.isDirectory()) { walk(path.join(dir, ent.name), r); continue; }\n const ext = path.extname(ent.name).toLowerCase();\n const t = categorize(r, ext);\n out[t].push({ path: r, name: ent.name, ext, type: t });\n }\n }\n walk(root, '');\n return out;\n}\n","{\n \"name\": \"zdashboard\",\n \"version\": \"1.4.1\",\n \"description\": \"ZCode skill dashboard platform — pluggable viewers for zdesign/zview/zreview/zgoal\",\n \"type\": \"module\",\n \"bin\": {\n \"zdashboard\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsup && vite build\",\n \"build:web\": \"vite build\",\n \"build:node\": \"tsup\",\n \"start\": \"node dist/cli.js\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"@radix-ui/react-scroll-area\": \"^1.2.0\",\n \"@radix-ui/react-separator\": \"^1.1.0\",\n \"@radix-ui/react-slot\": \"^1.1.0\",\n \"@radix-ui/react-tooltip\": \"^1.1.2\",\n \"@uidotdev/usehooks\": \"^2.4.0\",\n \"ansi-to-react\": \"^6.1.6\",\n \"class-variance-authority\": \"^0.7.0\",\n \"clsx\": \"^2.1.1\",\n \"date-fns\": \"^3.6.0\",\n \"filesize\": \"^11.0.0\",\n \"highlight.js\": \"^11.11.1\",\n \"katex\": \"^0.16.11\",\n \"ky\": \"^1.7.0\",\n \"lodash-es\": \"^4.17.21\",\n \"lucide-react\": \"^0.460.0\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"react-error-boundary\": \"^5.0.0\",\n \"react-markdown\": \"^9.0.1\",\n \"rehype-autolink-headings\": \"^7.1.0\",\n \"rehype-highlight\": \"^7.0.1\",\n \"rehype-katex\": \"^7.0.1\",\n \"rehype-raw\": \"^7.0.0\",\n \"rehype-slug\": \"^6.0.0\",\n \"remark-frontmatter\": \"^5.0.0\",\n \"remark-gfm\": \"^4.0.0\",\n \"remark-math\": \"^6.0.0\",\n \"sonner\": \"^1.5.0\",\n \"tailwind-merge\": \"^2.5.4\",\n \"use-debounce\": \"^10.0.0\",\n \"yaml\": \"^2.9.0\"\n },\n \"devDependencies\": {\n \"@tailwindcss/typography\": \"^0.5.20\",\n \"@testing-library/jest-dom\": \"^7.0.1\",\n \"@testing-library/react\": \"^16.3.2\",\n \"@types/lodash-es\": \"^4.17.12\",\n \"@types/node\": \"^22.9.0\",\n \"@types/react\": \"^18.3.12\",\n \"@types/react-dom\": \"^18.3.1\",\n \"@vitejs/plugin-react\": \"^4.7.0\",\n \"autoprefixer\": \"^10.4.20\",\n \"jsdom\": \"^30.0.1\",\n \"postcss\": \"^8.4.49\",\n \"tailwindcss\": \"^3.4.14\",\n \"tailwindcss-animate\": \"^1.0.7\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.6.3\",\n \"vite\": \"^5.4.10\",\n \"vitest\": \"^1.6.0\"\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [\n \"esbuild\"\n ]\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { execFile } from 'node:child_process';\n\nexport interface DetectResult {\n hasOpenspec: boolean;\n hasDocs: boolean;\n hasJust: boolean;\n hasBugs: boolean;\n}\n\nfunction justAvailable(cwd: string): Promise<boolean> {\n return new Promise((resolve) => {\n const child = execFile('just', ['--list', '--unsorted'], { cwd, timeout: 5000 }, (err) => {\n resolve(!err);\n });\n if (child.killed) resolve(false);\n });\n}\n\nexport async function detect(root: string): Promise<DetectResult> {\n const hasOpenspec = fs.existsSync(path.join(root, 'openspec'));\n const hasDocs = fs.existsSync(path.join(root, 'docs'));\n const hasJust = await justAvailable(root);\n const hasBugs = fs.existsSync(path.join(root, '.zgoal', 'config.yaml'));\n return { hasOpenspec, hasDocs, hasJust, hasBugs };\n}\n","import { createServer } from './server/index.js';\nimport { detect } from './server/detect.js';\n\nfunction parseArgs(a: string[]): Record<string, string | true> {\n const o: Record<string, string | true> = {};\n for (let i = 0; i < a.length; i++) {\n if (a[i].indexOf('--') === 0) {\n const n = a[i + 1];\n o[a[i].slice(2)] = n && n.indexOf('--') !== 0 ? a[++i] : true;\n }\n }\n return o;\n}\n\nconst args = parseArgs(process.argv.slice(2));\nconst root = (args.dir as string) ?? '.';\n\nconst det = await detect(root);\ncreateServer({\n root,\n port: args.port ? parseInt(args.port as string, 10) : undefined,\n open: !!args.open,\n detect: det,\n mode: args.mode as string | undefined,\n});\n"],"mappings":"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","names":["fs","path","fileURLToPath","root","fs","path","root","path","fs","fs","path","fs","path","root","fs","path","root","__dirname","path","fileURLToPath","fs","det","handler","fp","root","fs","path","execFile","root"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as m,r as o,u as k,j as e,M as v,b as N,d as S,e as T,f as C,g as _,a as E,h as A,i as M}from"./index-
|
|
1
|
+
import{c as m,r as o,u as k,j as e,M as v,b as N,d as S,e as T,f as C,g as _,a as E,h as A,i as M}from"./index-qoCAa7mn.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as l,j as e,F as m,M as f,a as g}from"./index-qoCAa7mn.js";import{F as b}from"./folder-open-Bqx7RnFM.js";function v(s,t){return t===0?0:Math.round(s/t*100)}function j({done:s,total:t}){const n=v(s,t),d=n===100?"bg-emerald-500/10 text-emerald-600 border-emerald-500/30":n>0?"bg-amber-500/10 text-amber-600 border-amber-500/30":"bg-muted text-muted-foreground border-border";return e.jsxs("span",{className:`inline-flex items-center px-1.5 py-0.5 rounded border text-[10px] font-mono ${d}`,children:[s,"/",t," · ",n,"%"]})}function k({tasks:s}){const t=s.split(`
|
|
2
|
+
`).filter(n=>n.trim().startsWith("- ["));return t.length?e.jsx("ul",{className:"space-y-1 text-xs",children:t.map((n,d)=>{const r=/- \[[xX]\]/.test(n),c=n.replace(/^-\s*\[[ xX]\]\s*/,"");return e.jsxs("li",{className:`flex items-start gap-2 ${r?"text-foreground":"text-muted-foreground"}`,children:[r?e.jsx("span",{className:"mt-0.5 h-3.5 w-3.5 shrink-0 rounded-full bg-emerald-500 text-white flex items-center justify-center text-[8px]",children:"✓"}):e.jsx("span",{className:"mt-0.5 h-3.5 w-3.5 shrink-0 rounded-full border border-muted-foreground/50"}),e.jsx("span",{children:c})]},d)})}):e.jsx("p",{className:"text-xs text-muted-foreground",children:"无 tasks.md"})}function w({item:s,onSelect:t}){return e.jsxs("button",{type:"button",onClick:t,className:"w-full text-left rounded-lg border bg-card p-4 hover:bg-muted/50 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(b,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm font-medium font-mono truncate",children:s.name}),e.jsx(j,{done:s.done,total:s.total})]}),e.jsxs("div",{className:"flex items-center gap-3 text-[11px] text-muted-foreground",children:[e.jsx("span",{className:s.hasProposal?"text-foreground":"",children:"proposal"}),e.jsx("span",{className:s.hasDesign?"text-foreground":"",children:"design"})]})]})}function C(){const[s,t]=l.useState([]),[n,d]=l.useState(null),[r,c]=l.useState(null),[i,o]=l.useState(!0),[u,h]=l.useState(null),p=l.useCallback(()=>{o(!0),d(null),c(null),fetch("/__apply",{cache:"no-store"}).then(a=>a.json()).then(t).catch(a=>h(a.message)).finally(()=>o(!1))},[]);l.useEffect(()=>{p()},[p]);const N=l.useCallback(a=>{o(!0),d(a),fetch(`/__apply/change?name=${encodeURIComponent(a)}`,{cache:"no-store"}).then(x=>x.json()).then(c).catch(x=>h(x.message)).finally(()=>o(!1))},[]);return i&&!s.length?e.jsx("div",{className:"flex h-full items-center justify-center text-muted-foreground",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold animate-pulse",children:"⚙️"}),e.jsx("p",{children:"加载执行进度…"})]})}):u?e.jsx("div",{className:"flex h-full items-center justify-center text-destructive",children:e.jsx("p",{children:u})}):e.jsxs("div",{className:"mx-auto max-w-5xl h-full flex flex-col bg-background border rounded-lg shadow-sm overflow-hidden",children:[e.jsxs("div",{className:"flex-none px-4 py-3 border-b flex items-center gap-2",children:[e.jsx("span",{className:"text-sm font-medium",children:"OpenSpec 执行进度"}),e.jsx("span",{className:"ml-auto text-[11px] text-muted-foreground",children:"openspec/changes/"})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-auto p-4 space-y-4",children:[s.length?e.jsx("div",{className:"grid gap-3 sm:grid-cols-2",children:s.map(a=>e.jsx(w,{item:a,onSelect:()=>N(a.name)},a.name))}):e.jsxs("div",{className:"text-center text-muted-foreground py-8",children:[e.jsx("p",{className:"text-sm",children:"没有进行中的 change"}),e.jsx("p",{className:"text-xs mt-1",children:"在 openspec/changes/ 下创建 change 后会显示在这里"})]}),n&&r&&!i&&e.jsxs("section",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h3",{className:"text-sm font-medium",children:r.name}),e.jsx(j,{done:r.done,total:r.total})]}),r.proposal&&e.jsxs("div",{children:[e.jsxs("h4",{className:"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1",children:[e.jsx(m,{className:"h-3 w-3"})," proposal.md"]}),e.jsx("div",{className:"prose dark:prose-invert max-w-none text-xs border rounded-lg p-3 bg-card",children:e.jsx(f,{remarkPlugins:[g],children:r.proposal})})]}),r.design&&e.jsxs("div",{children:[e.jsxs("h4",{className:"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1",children:[e.jsx(m,{className:"h-3 w-3"})," design.md"]}),e.jsx("div",{className:"prose dark:prose-invert max-w-none text-xs border rounded-lg p-3 bg-card",children:e.jsx(f,{remarkPlugins:[g],children:r.design})})]}),e.jsxs("div",{children:[e.jsxs("h4",{className:"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1",children:[e.jsx(m,{className:"h-3 w-3"})," tasks.md"]}),e.jsx("div",{className:"border rounded-lg p-3 bg-card",children:e.jsx(k,{tasks:r.tasks})})]})]})]})]})}export{C as ApplyViewer,C as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Viewer-C9o6Vus_.js","assets/index-qoCAa7mn.js","assets/index-0GvyDl5M.css","assets/folder-open-Bqx7RnFM.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as e}from"./index-qoCAa7mn.js";const a={mode:"apply",label:"执行进度",icon:"⚙️",viewer:async()=>({default:(await e(()=>import("./Viewer-C9o6Vus_.js"),__vite__mapDeps([0,1,2,3]))).default})};export{a as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ReviewViewer-
|
|
2
|
-
import{_ as e}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ReviewViewer-CBiXEfGM.js","assets/index-qoCAa7mn.js","assets/index-0GvyDl5M.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as e}from"./index-qoCAa7mn.js";const a={mode:"review",label:"文档评审",icon:"✅",viewer:async()=>({default:(await e(()=>import("./ReviewViewer-CBiXEfGM.js"),__vite__mapDeps([0,1,2]))).default})};export{a as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as w,r as l,j as e,F as M,I as R,M as S,a as D}from"./index-
|
|
1
|
+
import{c as w,r as l,j as e,F as M,I as R,M as S,a as D}from"./index-qoCAa7mn.js";import{F as A}from"./folder-open-Bqx7RnFM.js";/**
|
|
2
2
|
* @license lucide-react v0.460.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DesignViewer-
|
|
2
|
-
import{_ as e}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DesignViewer-DVjbRv43.js","assets/index-qoCAa7mn.js","assets/index-0GvyDl5M.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as e}from"./index-qoCAa7mn.js";const a={mode:"design",label:"设计资产",icon:"🎨",viewer:async()=>({default:(await e(()=>import("./DesignViewer-DVjbRv43.js"),__vite__mapDeps([0,1,2]))).default})};export{a as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Viewer-
|
|
2
|
-
import{_ as e}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Viewer-D5A1eb2d.js","assets/index-qoCAa7mn.js","assets/index-0GvyDl5M.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as e}from"./index-qoCAa7mn.js";const a={mode:"bugs",label:"禅道 Bugs",icon:"🎯",viewer:async()=>({default:(await e(()=>import("./Viewer-D5A1eb2d.js"),__vite__mapDeps([0,1,2]))).default})};export{a as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-D-6GmZe2.js","assets/folder-open-Bqx7RnFM.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
var xE=Object.defineProperty;var wE=(e,t,n)=>t in e?xE(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var _0=(e,t,n)=>wE(e,typeof t!="symbol"?t+"":t,n);function AE(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!="string"&&!Array.isArray(r)){for(const i in r)if(i!=="default"&&!(i in e)){const a=Object.getOwnPropertyDescriptor(r,i);a&&Object.defineProperty(e,i,a.get?a:{enumerable:!0,get:()=>r[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const s of a.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();var zn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ts(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var f2={exports:{}},Ol={},h2={exports:{}},Le={};/**
|
|
3
3
|
* @license React
|
|
4
4
|
* react.production.min.js
|
|
@@ -435,4 +435,4 @@ l0,-`+(n+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,
|
|
|
435
435
|
`},l]}}const HR=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},UNICODE_RANGE:{scope:"number",begin:/\b[Uu]\+[0-9A-Fa-f][0-9A-Fa-f?]{0,4}(-[0-9A-Fa-f][0-9A-Fa-f]{0,4})?/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),$R=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],qR=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],GR=[...$R,...qR],YR=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),V5=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),K5=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),jR=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","unicode-range","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse(),WR=V5.concat(K5).sort().reverse();function VR(e){const t=HR(e),n=WR,r="and or not only",i="[\\w-]+",a="("+i+"|@\\{"+i+"\\})",s=[],o=[],u=function(T){return{className:"string",begin:"~?"+T+".*?"+T}},l=function(T,I,M){return{className:T,begin:I,relevance:M}},d={$pattern:/[a-z-]+/,keyword:r,attribute:YR.join(" ")},c={begin:"\\(",end:"\\)",contains:o,keywords:d,relevance:0};o.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,u("'"),u('"'),t.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},t.UNICODE_RANGE,t.HEXCOLOR,c,l("variable","@@?"+i,10),l("variable","@\\{"+i+"\\}"),l("built_in","~?`[^`]*?`"),{className:"attribute",begin:i+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0},t.IMPORTANT,{beginKeywords:"and not"},t.FUNCTION_DISPATCH);const m=o.concat({begin:/\{/,end:/\}/,contains:s}),h={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(o)},E={begin:a+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+jR.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:o}}]},v={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",keywords:d,returnEnd:!0,contains:o,relevance:0}},w={className:"variable",variants:[{begin:"@"+i+"\\s*:",relevance:15},{begin:"@"+i}],starts:{end:"[;}]",returnEnd:!0,contains:m}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:a,end:/\{/}],returnBegin:!0,returnEnd:!0,illegal:`[<='$"]`,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,h,l("keyword","all\\b"),l("variable","@\\{"+i+"\\}"),{begin:"\\b("+GR.join("|")+")\\b",className:"selector-tag"},t.CSS_NUMBER_MODE,l("selector-tag",a,0),l("selector-id","#"+a),l("selector-class","\\."+a,0),l("selector-tag","&",0),t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",begin:":("+V5.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+K5.join("|")+")"},{begin:/\(/,end:/\)/,relevance:0,contains:m},{begin:"!important"},t.FUNCTION_DISPATCH]},y={begin:i+`:(:)?(${n.join("|")})`,returnBegin:!0,contains:[b]};return s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,v,w,y,E,b,h,t.FUNCTION_DISPATCH),{name:"Less",case_insensitive:!0,illegal:`[=>'/<($"]`,contains:s}}function KR(e){const t="\\[=*\\[",n="\\]=*\\]",r={begin:t,end:n,contains:["self"]},i=[e.COMMENT("--(?!"+t+")","$"),e.COMMENT("--"+t,n,{contains:[r],relevance:10})];return{name:"Lua",aliases:["pluto"],keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:i}].concat(i)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:t,end:n,contains:[r],relevance:5}])}}function XR(e){const t={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t]},r={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[t,n]},i={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},a={className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,keyword:".PHONY"}},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[t]};return{name:"Makefile",aliases:["mk","mak","make"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,t,n,r,i,a,s]}}function QR(e){const t=e.regex,n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},r={begin:"^[-\\*]{3,}",end:"$"},i={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},a={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},s={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},o=/[A-Za-z][A-Za-z0-9+.-]*/,u={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:t.concat(/\[.+?\]\(/,o,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},l={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},d={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(l,{contains:[]}),m=e.inherit(d,{contains:[]});l.contains.push(m),d.contains.push(c);let h=[n,u];return[l,d,c,m].forEach(b=>{b.contains=b.contains.concat(h)}),h=h.concat(l,d),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:h},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:h}]}]},n,a,l,d,{className:"quote",begin:"^>\\s+",contains:h,end:"$"},i,r,u,s,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}function ZR(e){const t={className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},n=/[a-zA-Z@][a-zA-Z0-9_]*/,o={"variable.language":["this","super"],$pattern:n,keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"],literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"],built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"],type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"]},u={$pattern:n,keyword:["@interface","@class","@protocol","@implementation"]};return{name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:o,illegal:"</",contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),{className:"string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+u.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:u,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}function JR(e){const t=e.regex,n=["abs","accept","alarm","and","atan2","bind","binmode","bless","break","caller","chdir","chmod","chomp","chop","chown","chr","chroot","class","close","closedir","connect","continue","cos","crypt","dbmclose","dbmopen","defined","delete","die","do","dump","each","else","elsif","endgrent","endhostent","endnetent","endprotoent","endpwent","endservent","eof","eval","exec","exists","exit","exp","fcntl","field","fileno","flock","for","foreach","fork","format","formline","getc","getgrent","getgrgid","getgrnam","gethostbyaddr","gethostbyname","gethostent","getlogin","getnetbyaddr","getnetbyname","getnetent","getpeername","getpgrp","getpriority","getprotobyname","getprotobynumber","getprotoent","getpwent","getpwnam","getpwuid","getservbyname","getservbyport","getservent","getsockname","getsockopt","given","glob","gmtime","goto","grep","gt","hex","if","index","int","ioctl","join","keys","kill","last","lc","lcfirst","length","link","listen","local","localtime","log","lstat","lt","ma","map","method","mkdir","msgctl","msgget","msgrcv","msgsnd","my","ne","next","no","not","oct","open","opendir","or","ord","our","pack","package","pipe","pop","pos","print","printf","prototype","push","q|0","qq","quotemeta","qw","qx","rand","read","readdir","readline","readlink","readpipe","recv","redo","ref","rename","require","reset","return","reverse","rewinddir","rindex","rmdir","say","scalar","seek","seekdir","select","semctl","semget","semop","send","setgrent","sethostent","setnetent","setpgrp","setpriority","setprotoent","setpwent","setservent","setsockopt","shift","shmctl","shmget","shmread","shmwrite","shutdown","sin","sleep","socket","socketpair","sort","splice","split","sprintf","sqrt","srand","stat","state","study","sub","substr","symlink","syscall","sysopen","sysread","sysseek","system","syswrite","tell","telldir","tie","tied","time","times","tr","truncate","uc","ucfirst","umask","undef","unless","unlink","unpack","unshift","untie","until","use","utime","values","vec","wait","waitpid","wantarray","warn","when","while","write","x|0","xor","y|0"],r=/[dualxmsipngr]{0,12}/,i={$pattern:/[\w.]+/,keyword:n.join(" ")},a={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:i},s={begin:/->\{/,end:/\}/},o={scope:"attr",match:/\s+:\s*\w+(\s*\(.*?\))?/},u={scope:"variable",variants:[{begin:/\$\d/},{begin:t.concat(/[$%@](?!")(\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")},{begin:/[$%@](?!")[^\s\w{=]|\$=/,relevance:0}],contains:[o]},l={className:"number",variants:[{match:/0?\.[0-9][0-9_]+\b/},{match:/\bv?(0|[1-9][0-9_]*(\.[0-9_]+)?|[1-9][0-9_]*)\b/},{match:/\b0[0-7][0-7_]*\b/},{match:/\b0x[0-9a-fA-F][0-9a-fA-F_]*\b/},{match:/\b0b[0-1][0-1_]*\b/}],relevance:0},d=[e.BACKSLASH_ESCAPE,a,u],c=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],m=(v,w,b="\\1")=>{const y=b==="\\1"?b:t.concat(b,w);return t.concat(t.concat("(?:",v,")"),w,/(?:\\.|[^\\\/])*?/,y,/(?:\\.|[^\\\/])*?/,b,r)},h=(v,w,b)=>t.concat(t.concat("(?:",v,")"),w,/(?:\\.|[^\\\/])*?/,b,r),E=[u,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{endsWithParent:!0}),s,{className:"string",contains:d,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{begin:"-?\\w+\\s*=>",relevance:0}]},l,{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{begin:m("s|tr|y",t.either(...c,{capture:!0}))},{begin:m("s|tr|y","\\(","\\)")},{begin:m("s|tr|y","\\[","\\]")},{begin:m("s|tr|y","\\{","\\}")}],relevance:2},{className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{begin:h("(?:m|qr)?",/\//,/\//)},{begin:h("m|qr",t.either(...c,{capture:!0}),/\1/)},{begin:h("m|qr",/\(/,/\)/)},{begin:h("m|qr",/\[/,/\]/)},{begin:h("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub method",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,o]},{className:"class",beginKeywords:"class",end:"[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,o,l]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return a.contains=E,s.contains=E,{name:"Perl",aliases:["pl","pm"],keywords:i,contains:E}}function eM(e){const t=e.regex,n=/(?![A-Za-z0-9])(?![$])/,r=t.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,n),i=t.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,n),a=t.concat(/[A-Z]+/,n),s={scope:"variable",match:"\\$+"+r},o={scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/}]},u={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},l=e.inherit(e.APOS_STRING_MODE,{illegal:null}),d=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(u)}),c={begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(u),"on:begin":(he,ce)=>{ce.data._beginMatch=he[1]||he[2]},"on:end":(he,ce)=>{ce.data._beginMatch!==he[1]&&ce.ignoreMatch()}},m=e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/}),h=`[
|
|
436
436
|
]`,E={scope:"string",variants:[d,l,c,m]},v={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"}],relevance:0},w=["false","null","true"],b=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],y=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],I={keyword:b,literal:(he=>{const ce=[];return he.forEach(G=>{ce.push(G),G.toLowerCase()===G?ce.push(G.toUpperCase()):ce.push(G.toLowerCase())}),ce})(w),built_in:y},M=he=>he.map(ce=>ce.replace(/\|\d+$/,"")),k={variants:[{match:[/new/,t.concat(h,"+"),t.concat("(?!",M(y).join("\\b|"),"\\b)"),i],scope:{1:"keyword",4:"title.class"}}]},P=t.concat(r,"\\b(?!\\()"),H={variants:[{match:[t.concat(/::/,t.lookahead(/(?!class\b)/)),P],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[i,t.concat(/::/,t.lookahead(/(?!class\b)/)),P],scope:{1:"title.class",3:"variable.constant"}},{match:[i,t.concat("::",t.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class",3:"variable.language"}}]},V={scope:"attr",match:t.concat(r,t.lookahead(":"),t.lookahead(/(?!::)/))},F={relevance:0,begin:/\(/,end:/\)/,keywords:I,contains:[V,s,H,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,E,v,k]},Z={relevance:0,match:[/\b/,t.concat("(?!fn\\b|function\\b|",M(b).join("\\b|"),"|",M(y).join("\\b|"),"\\b)"),r,t.concat(h,"*"),t.lookahead(/(?=\()/)],scope:{3:"title.function.invoke"},contains:[F]};F.contains.push(Z);const W=[V,H,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,E,v,k],ye={begin:t.concat(/#\[\s*\\?/,t.either(i,a)),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:w,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:w,keyword:["new","array"]},contains:["self",...W]},...W,{scope:"meta",variants:[{match:i},{match:a}]}]};return{case_insensitive:!1,keywords:I,contains:[ye,e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},o,{scope:"variable.language",match:/\$this\b/},s,Z,H,{match:[/const/,/\s/,r],scope:{1:"keyword",3:"variable.constant"}},k,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:I,contains:["self",ye,s,H,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,E,v]}]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},E,v]}}function tM(e){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}function nM(e){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}function rM(e){const t=e.regex,n=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],o={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},u={className:"meta",begin:/^(>>>|\.\.\.) /},l={className:"subst",begin:/\{/,end:/\}/,keywords:o,illegal:/#/},d={begin:/\{\{/,relevance:0},c={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,u],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,u],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,u,d,l]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,u,d,l]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,d,l]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,d,l]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},m="[0-9](_?[0-9])*",h=`(\\b(${m}))?\\.(${m})|\\b(${m})\\.`,E=`\\b|${r.join("|")}`,v={className:"number",relevance:0,variants:[{begin:`(\\b(${m})|(${h}))[eE][+-]?(${m})[jJ]?(?=${E})`},{begin:`(${h})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${E})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${E})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${E})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${E})`},{begin:`\\b(${m})[jJ](?=${E})`}]},w={className:"comment",begin:t.lookahead(/# type:/),end:/$/,keywords:o,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},b={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:["self",u,v,c,e.HASH_COMMENT_MODE]}]};return l.contains=[c,v,u],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:o,illegal:/(<\/|\?)|=>/,contains:[u,v,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},c,w,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[b]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[v,b,c]}]}}function iM(e){return{aliases:["pycon"],contains:[{className:"meta.prompt",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}function aM(e){const t=e.regex,n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,r=t.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,a=t.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:n,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:t.lookahead(t.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:n},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE],variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[i,r]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,r]},{scope:{1:"punctuation",2:"number"},match:[a,r]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,r]}]},{scope:{3:"operator"},match:[n,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:a},{begin:"`",end:"`",contains:[{begin:/\\./}]}]}}function sM(e){const t=e.regex,n="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",r=t.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=t.concat(r,/(::\w+)*/),s={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield",...["include","extend","prepend","public","private","protected","raise","throw"]],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},o={className:"doctag",begin:"@[A-Za-z]+"},u={begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[o]}),e.COMMENT("^=begin","^=end",{contains:[o],relevance:10}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],d={className:"subst",begin:/#\{/,end:/\}/,keywords:s},c={className:"string",contains:[e.BACKSLASH_ESCAPE,d],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?</,end:/>/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:t.concat(/<<[-~]?'?/,t.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,d]})]}]},m="[1-9](_?[0-9])*|0",h="[0-9](_?[0-9])*",E={className:"number",relevance:0,variants:[{begin:`\\b(${m})(\\.(${h}))?([eE][+-]?(${h})|r)?i?\\b`},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},v={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:s}]},k=[c,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:s},{match:[/(include|extend)\s+/,i],scope:{2:"title.class"},keywords:s},{relevance:0,match:[i,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:r,scope:"title.class"},{match:[/def/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[v]},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[c,{begin:n}],relevance:0},E,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|(?!=)/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:s},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,d],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(u,l),relevance:0}].concat(u,l);d.contains=k,v.contains=k;const F=[{begin:/^\s*=>/,starts:{end:"$",contains:k}},{className:"meta.prompt",begin:"^("+"[>?]>"+"|"+"[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]"+"|"+"(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>"+")(?=[ ])",starts:{end:"$",keywords:s,contains:k}}];return l.unshift(u),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:s,illegal:/\/\*/,contains:[e.SHEBANG({binary:"ruby"})].concat(F).concat(l).concat(k)}}function oM(e){const t=e.regex,n=/(r#)?/,r=t.concat(n,e.UNDERSCORE_IDENT_RE),i=t.concat(n,e.IDENT_RE),a={className:"title.function.invoke",relevance:0,begin:t.concat(/\b/,/(?!let|for|while|if|else|match\b)/,i,t.lookahead(/\s*\(/))},s="([ui](8|16|32|64|128|size)|f(32|64))?",o=["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"],u=["true","false","Some","None","Ok","Err"],l=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],d=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"];return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:d,keyword:o,literal:u,built_in:l},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*(?!')/},{scope:"string",variants:[{begin:/b?r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'/,end:/'/,contains:[{scope:"char.escape",match:/\\('|\w|x\w{2}|u\w{4}|U\w{8})/}]}]},{className:"number",variants:[{begin:"\\b0b([01_]+)"+s},{begin:"\\b0o([0-7_]+)"+s},{begin:"\\b0x([A-Fa-f0-9_]+)"+s},{begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+s}],relevance:0},{begin:[/fn/,/\s+/,r],className:{1:"keyword",3:"title.function"}},{className:"meta",begin:"#!?\\[",end:"\\]",contains:[{className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE]}]},{begin:[/let/,/\s+/,/(?:mut\s+)?/,r],className:{1:"keyword",3:"keyword",4:"variable"}},{begin:[/for/,/\s+/,r,/\s+/,/in/],className:{1:"keyword",3:"variable",5:"keyword"}},{begin:[/type/,/\s+/,r],className:{1:"keyword",3:"title.class"}},{begin:[/(?:trait|enum|struct|union|impl|for)/,/\s+/,r],className:{1:"keyword",3:"title.class"}},{begin:e.IDENT_RE+"::",keywords:{keyword:"Self",built_in:l,type:d}},{className:"punctuation",begin:"->"},a]}}const uM=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},UNICODE_RANGE:{scope:"number",begin:/\b[Uu]\+[0-9A-Fa-f][0-9A-Fa-f?]{0,4}(-[0-9A-Fa-f][0-9A-Fa-f]{0,4})?/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),lM=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],cM=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],dM=[...lM,...cM],fM=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),hM=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),mM=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),pM=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","unicode-range","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function gM(e){const t=uM(e),n=mM,r=hM,i="@[a-z-]+",a="and or not only",o={className:"variable",begin:"(\\$"+"[a-zA-Z-][a-zA-Z0-9_-]*"+")\\b",relevance:0};return{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t.CSS_NUMBER_MODE,{className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",begin:"\\b("+dM.join("|")+")\\b",relevance:0},{className:"selector-pseudo",begin:":("+r.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+n.join("|")+")"},o,{begin:/\(/,end:/\)/,contains:[t.CSS_NUMBER_MODE]},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+pM.join("|")+")\\b"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:/:/,end:/[;}{]/,relevance:0,contains:[t.BLOCK_COMMENT,o,t.HEXCOLOR,t.CSS_NUMBER_MODE,t.UNICODE_RANGE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,t.IMPORTANT,t.FUNCTION_DISPATCH]},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,keyword:a,attribute:fM.join(" ")},contains:[{begin:i,className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"},o,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,t.HEXCOLOR,t.CSS_NUMBER_MODE]},t.FUNCTION_DISPATCH]}}function bM(e){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}function EM(e){const t=e.regex,n=e.COMMENT("--","$"),r={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},i={begin:/"/,end:/"/,contains:[{match:/""/}]},a=["true","false","unknown"],s=["double precision","large object","with timezone","without timezone"],o=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],u=["add","asc","collation","desc","final","first","last","view"],l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],d=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],c=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],m=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],h=d,E=[...l,...u].filter(M=>!d.includes(M)),v={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},w={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},b={match:t.concat(/\b/,t.either(...h),/\s*\(/),relevance:0,keywords:{built_in:h}};function y(M){return t.concat(/\b/,t.either(...M.map(k=>k.replace(/\s+/,"\\s+"))),/\b/)}const T={scope:"keyword",match:y(m),relevance:0};function I(M,{exceptions:k,when:P}={}){const H=P;return k=k||[],M.map(V=>V.match(/\|\d+$/)||k.includes(V)?V:H(V)?`${V}|0`:V)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:I(E,{when:M=>M.length<3}),literal:a,type:o,built_in:c},contains:[{scope:"type",match:y(s)},T,b,v,r,i,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,w]}}function X5(e){return e?typeof e=="string"?e:e.source:null}function Ds(e){return Ge("(?=",e,")")}function Ge(...e){return e.map(n=>X5(n)).join("")}function yM(e){const t=e[e.length-1];return typeof t=="object"&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function Vt(...e){return"("+(yM(e).capture?"":"?:")+e.map(r=>X5(r)).join("|")+")"}const o1=e=>Ge(/\b/,e,/\w$/.test(e)?/\b/:/\B/),vM=["Protocol","Type"].map(o1),Jg=["init","self"].map(o1),_M=["Any","Self"],Mc=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","package","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],e2=["false","nil","true"],TM=["assignment","associativity","higherThan","left","lowerThan","none","right"],xM=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],t2=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Q5=Vt(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Z5=Vt(Q5,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),Lc=Ge(Q5,Z5,"*"),J5=Vt(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),Nl=Vt(J5,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),lr=Ge(J5,Nl,"*"),ku=Ge(/[A-Z]/,Nl,"*"),wM=["attached","autoclosure",Ge(/convention\(/,Vt("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",Ge(/objc\(/,lr,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],AM=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"];function SM(e){const t={match:/\s+/,relevance:0},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),r=[e.C_LINE_COMMENT_MODE,n],i={match:[/\./,Vt(...vM,...Jg)],className:{2:"keyword"}},a={match:Ge(/\./,Vt(...Mc)),relevance:0},s=Mc.filter(Fe=>typeof Fe=="string").concat(["_|0"]),o=Mc.filter(Fe=>typeof Fe!="string").concat(_M).map(o1),u={variants:[{className:"keyword",match:Vt(...o,...Jg)}]},l={$pattern:Vt(/\b\w+/,/#\w+/),keyword:s.concat(xM),literal:e2},d=[i,a,u],c={match:Ge(/\./,Vt(...t2)),relevance:0},m={className:"built_in",match:Ge(/\b/,Vt(...t2),/(?=\()/)},h=[c,m],E={match:/->/,relevance:0},v={className:"operator",relevance:0,variants:[{match:Lc},{match:`\\.(\\.|${Z5})+`}]},w=[E,v],b="([0-9]_*)+",y="([0-9a-fA-F]_*)+",T={className:"number",relevance:0,variants:[{match:`\\b(${b})(\\.(${b}))?([eE][+-]?(${b}))?\\b`},{match:`\\b0x(${y})(\\.(${y}))?([pP][+-]?(${b}))?\\b`},{match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},I=(Fe="")=>({className:"subst",variants:[{match:Ge(/\\/,Fe,/[0\\tnr"']/)},{match:Ge(/\\/,Fe,/u\{[0-9a-fA-F]{1,8}\}/)}]}),M=(Fe="")=>({className:"subst",match:Ge(/\\/,Fe,/[\t ]*(?:[\r\n]|\r\n)/)}),k=(Fe="")=>({className:"subst",label:"interpol",begin:Ge(/\\/,Fe,/\(/),end:/\)/}),P=(Fe="")=>({begin:Ge(Fe,/"""/),end:Ge(/"""/,Fe),contains:[I(Fe),M(Fe),k(Fe)]}),H=(Fe="")=>({begin:Ge(Fe,/"/),end:Ge(/"/,Fe),contains:[I(Fe),k(Fe)]}),V={className:"string",variants:[P(),P("#"),P("##"),P("###"),H(),H("#"),H("##"),H("###")]},F=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[e.BACKSLASH_ESCAPE]}],Z={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//,contains:F},W=Fe=>{const Yt=Ge(Fe,/\//),ve=Ge(/\//,Fe);return{begin:Yt,end:ve,contains:[...F,{scope:"comment",begin:`#(?!.*${ve})`,end:/$/}]}},ye={scope:"regexp",variants:[W("###"),W("##"),W("#"),Z]},he={match:Ge(/`/,lr,/`/)},ce={className:"variable",match:/\$\d+/},G={className:"variable",match:`\\$${Nl}+`},K=[he,ce,G],U={match:/(@|#(un)?)available/,scope:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:AM,contains:[...w,T,V]}]}},Y={scope:"keyword",match:Ge(/@/,Vt(...wM),Ds(Vt(/\(/,/\s+/)))},A={scope:"meta",match:Ge(/@/,lr)},ue=[U,Y,A],se={match:Ds(/\b[A-Z]/),relevance:0,contains:[{className:"type",match:Ge(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,Nl,"+")},{className:"type",match:ku,relevance:0},{match:/[?!]+/,relevance:0},{match:/\.\.\./,relevance:0},{match:Ge(/\s+&\s+/,Ds(ku)),relevance:0}]},N={begin:/</,end:/>/,keywords:l,contains:[...r,...d,...ue,E,se]};se.contains.push(N);const be={match:Ge(lr,/\s*:/),keywords:"_|0",relevance:0},ke={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",be,...r,ye,...d,...h,...w,T,V,...K,...ue,se]},Ne={begin:/</,end:/>/,keywords:"repeat each",contains:[...r,se]},we={begin:Vt(Ds(Ge(lr,/\s*:/)),Ds(Ge(lr,/\s+/,lr,/\s*:/))),end:/:/,relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:lr}]},ft={begin:/\(/,end:/\)/,keywords:l,contains:[we,...r,...d,...w,T,V,...ue,se,ke],endsParent:!0,illegal:/["']/},rt={match:[/(func|macro)/,/\s+/,Vt(he.match,lr,Lc)],className:{1:"keyword",3:"title.function"},contains:[Ne,ft,t],illegal:[/\[/,/%/]},kt={match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"},contains:[Ne,ft,t],illegal:/\[|%/},Ot={match:[/operator/,/\s+/,Lc],className:{1:"keyword",3:"title"}},Cn={begin:[/precedencegroup/,/\s+/,ku],className:{1:"keyword",3:"title"},contains:[se],keywords:[...TM,...e2],end:/}/},Ft={match:[/class\b/,/\s+/,/func\b/,/\s+/,/\b[A-Za-z_][A-Za-z0-9_]*\b/],scope:{1:"keyword",3:"keyword",5:"title.function"}},pn={match:[/class\b/,/\s+/,/var\b/],scope:{1:"keyword",3:"keyword"}},Tt={begin:[/(struct|protocol|class|extension|enum|actor)/,/\s+/,lr,/\s*/],beginScope:{1:"keyword",3:"title.class"},keywords:l,contains:[Ne,...d,{begin:/:/,end:/\{/,keywords:l,contains:[{scope:"title.class.inherited",match:ku},...d],relevance:0}]};for(const Fe of V.variants){const Yt=Fe.contains.find(Nn=>Nn.label==="interpol");Yt.keywords=l;const ve=[...d,...h,...w,T,V,...K];Yt.contains=[...ve,{begin:/\(/,end:/\)/,contains:["self",...ve]}]}return{name:"Swift",keywords:l,contains:[...r,rt,kt,Ft,pn,Tt,Ot,Cn,{beginKeywords:"import",end:/$/,contains:[...r],relevance:0},ye,...d,...h,...w,T,V,...K,...ue,se,ke]}}const Dl="[A-Za-z$_][0-9A-Za-z$_]*",eE=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],tE=["true","false","null","undefined","NaN","Infinity"],nE=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],rE=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],iE=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],aE=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],sE=[].concat(iE,nE,rE);function kM(e){const t=e.regex,n=(U,{after:Y})=>{const A="</"+U[0].slice(1);return U.input.indexOf(A,Y)!==-1},r=Dl,i={begin:"<>",end:"</>"},a=/<[A-Za-z0-9\\._:-]+\s*\/>/,s={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(U,Y)=>{const A=U[0].length+U.index,ue=U.input[A];if(ue==="<"||ue===","){Y.ignoreMatch();return}ue===">"&&(n(U,{after:A})||Y.ignoreMatch());let se;const N=U.input.substring(A);if(se=N.match(/^\s*=/)){Y.ignoreMatch();return}if((se=N.match(/^\s+extends\s+/))&&se.index===0){Y.ignoreMatch();return}}},o={$pattern:Dl,keyword:eE,literal:tE,built_in:sE,"variable.language":aE},u="[0-9](_?[0-9])*",l=`\\.(${u})`,d="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",c={className:"number",variants:[{begin:`(\\b(${d})((${l})|\\.)?|(${l}))[eE][+-]?(${u})\\b`},{begin:`\\b(${d})\\b((${l})\\b|\\.)?|(${l})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},m={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},h={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:"xml"}},E={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:"css"}},v={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,m],subLanguage:"graphql"}},w={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,m]},y={className:"comment",variants:[e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},T=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,h,E,v,w,{match:/\$\d+/},c];m.contains=T.concat({begin:/\{/,end:/\}/,keywords:o,contains:["self"].concat(T)});const I=[].concat(y,m.contains),M=I.concat([{begin:/(\s*)\(/,end:/\)/,keywords:o,contains:["self"].concat(I)}]),k={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:M},P={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,t.concat(r,"(",t.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},H={relevance:0,match:t.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...nE,...rE]}},V={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},F={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[k],illegal:/%/},Z={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function W(U){return t.concat("(?!",U.join("|"),")")}const ye={match:t.concat(/\b/,W([...iE,"super","import","await"].map(U=>`${U}\\s*\\(`)),r,t.lookahead(/\s*\(/)),className:"title.function",relevance:0},he={begin:t.concat(/\./,t.lookahead(t.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},ce={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},k]},G="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",K={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(G)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[k]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,exports:{PARAMS_CONTAINS:M,CLASS_REFERENCE:H},illegal:/#(?![$_A-Za-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),V,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,h,E,v,w,y,{match:/\$\d+/},c,H,{scope:"attr",match:r+t.lookahead(":"),relevance:0},K,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[y,e.REGEXP_MODE,{className:"function",begin:G,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:M}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:i.begin,end:i.end},{match:a},{begin:s.begin,"on:begin":s.isTrulyOpeningTag,end:s.end}],subLanguage:"xml",contains:[{begin:s.begin,end:s.end,skip:!0,contains:["self"]}]}]},F,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[k,e.inherit(e.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},he,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[k]},ye,Z,P,ce,{match:/\$[(.]/}]}}function CM(e){const t=e.regex,n=kM(e),r=Dl,i=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],a={begin:[/namespace/,/\s+/,e.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},s={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:i},contains:[n.exports.CLASS_REFERENCE]},o={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},u=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],l={$pattern:Dl,keyword:eE.concat(u),literal:tE,built_in:sE.concat(i),"variable.language":aE},d={className:"meta",begin:"@"+r},c=(v,w,b)=>{const y=v.contains.findIndex(T=>T.label===w);if(y===-1)throw new Error("can not find mode to replace");v.contains.splice(y,1,b)};Object.assign(n.keywords,l),n.exports.PARAMS_CONTAINS.push(d);const m=n.contains.find(v=>v.scope==="attr"),h=Object.assign({},m,{match:t.concat(r,t.lookahead(/\s*\?:/))});n.exports.PARAMS_CONTAINS.push([n.exports.CLASS_REFERENCE,m,h]),n.contains=n.contains.concat([d,a,s,h]),c(n,"shebang",e.SHEBANG()),c(n,"use_strict",o);const E=n.contains.find(v=>v.label==="func.def");return E.relevance=0,Object.assign(n,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n}function NM(e){const t=e.regex,n={className:"string",begin:/"(""|[^/n])"C\b/},r={className:"string",begin:/"/,end:/"/,illegal:/\n/,contains:[{begin:/""/}]},i=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,s=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,o=/\d{1,2}(:\d{1,2}){1,2}/,u={className:"literal",variants:[{begin:t.concat(/# */,t.either(a,i),/ *#/)},{begin:t.concat(/# */,o,/ *#/)},{begin:t.concat(/# */,s,/ *#/)},{begin:t.concat(/# */,t.either(a,i),/ +/,t.either(s,o),/ *#/)}]},l={className:"number",relevance:0,variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},d={className:"label",begin:/^\w+:/},c=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}]}),m=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield",built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort",type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort",literal:"true false nothing"},illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[n,r,u,l,d,c,m,{className:"meta",begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,end:/$/,keywords:{keyword:"const disable else elseif enable end externalsource if region then"},contains:[m]}]}}function DM(e){e.regex;const t=e.COMMENT(/\(;/,/;\)/);t.contains.push("self");const n=e.COMMENT(/;;/,/$/),r=["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"],i={begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword",3:"title.function"}},a={className:"variable",begin:/\$[\w_]+/},s={match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},o={className:"number",relevance:0,match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/},u={match:/(i32|i64|f32|f64)(?!\.)/,className:"type"},l={className:"keyword",match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/};return{name:"WebAssembly",keywords:{$pattern:/[\w.]+/,keyword:r},contains:[n,t,{match:[/(?:offset|align)/,/\s*/,/=/],className:{1:"keyword",3:"operator"}},a,s,i,e.QUOTE_STRING_MODE,u,l,o]}}function IM(e){const t=e.regex,n=t.concat(/[\p{L}_]/u,t.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,i={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},a={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},s=e.inherit(a,{begin:/\(/,end:/\)/}),o=e.inherit(e.APOS_STRING_MODE,{className:"string"}),u=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:r,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[i]},{begin:/'/,end:/'/,contains:[i]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,relevance:10,contains:[a,u,o,s,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,contains:[a,s,u,o]}]}]},e.COMMENT(/<!--/,/-->/,{relevance:10}),{begin:/<!\[CDATA\[/,end:/\]\]>/,relevance:10},i,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[u]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/<style(?=\s|>)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/<script(?=\s|>)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:t.concat(/</,t.lookahead(t.concat(n,t.either(/\/>/,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:l}]},{className:"tag",begin:t.concat(/<\//,t.lookahead(t.concat(n,/>/))),contains:[{className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function OM(e){const t="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},i={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},a={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},s={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,i]},o=e.inherit(s,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),m={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},h={end:",",endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},E={begin:/\{/,end:/\}/,contains:[h],illegal:"\\n",relevance:0},v={begin:"\\[",end:"\\]",contains:[h],illegal:"\\n",relevance:0},w=[r,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},m,{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},E,v,a,s],b=[...w];return b.pop(),b.push(o),h.contains=b,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:w}}const RM={arduino:fR,bash:hR,c:mR,cpp:pR,csharp:gR,css:AR,diff:SR,go:kR,graphql:CR,ini:NR,java:DR,javascript:LR,json:BR,kotlin:UR,less:VR,lua:KR,makefile:XR,markdown:QR,objectivec:ZR,perl:JR,php:eM,"php-template":tM,plaintext:nM,python:rM,"python-repl":iM,r:aM,ruby:sM,rust:oM,scss:gM,shell:bM,sql:EM,swift:SM,typescript:CM,vbnet:NM,wasm:DM,xml:IM,yaml:OM};function oE(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw new Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw new Error("set is read-only")}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(t=>{const n=e[t],r=typeof n;(r==="object"||r==="function")&&!Object.isFrozen(n)&&oE(n)}),e}class n2{constructor(t){t.data===void 0&&(t.data={}),this.data=t.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function uE(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function mi(e,...t){const n=Object.create(null);for(const r in e)n[r]=e[r];return t.forEach(function(r){for(const i in r)n[i]=r[i]}),n}const MM="</span>",r2=e=>!!e.scope,LM=(e,{prefix:t})=>{if(e.startsWith("language:"))return e.replace("language:","language-");if(e.includes(".")){const n=e.split(".");return[`${t}${n.shift()}`,...n.map((r,i)=>`${r}${"_".repeat(i+1)}`)].join(" ")}return`${t}${e}`};class FM{constructor(t,n){this.buffer="",this.classPrefix=n.classPrefix,t.walk(this)}addText(t){this.buffer+=uE(t)}openNode(t){if(!r2(t))return;const n=LM(t.scope,{prefix:this.classPrefix});this.span(n)}closeNode(t){r2(t)&&(this.buffer+=MM)}value(){return this.buffer}span(t){this.buffer+=`<span class="${t}">`}}const i2=(e={})=>{const t={children:[]};return Object.assign(t,e),t};class u1{constructor(){this.rootNode=i2(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(t){this.top.children.push(t)}openNode(t){const n=i2({scope:t});this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(t){return this.constructor._walk(t,this.rootNode)}static _walk(t,n){return typeof n=="string"?t.addText(n):n.children&&(t.openNode(n),n.children.forEach(r=>this._walk(t,r)),t.closeNode(n)),t}static _collapse(t){typeof t!="string"&&t.children&&(t.children.every(n=>typeof n=="string")?t.children=[t.children.join("")]:t.children.forEach(n=>{u1._collapse(n)}))}}class PM extends u1{constructor(t){super(),this.options=t}addText(t){t!==""&&this.add(t)}startScope(t){this.openNode(t)}endScope(){this.closeNode()}__addSublanguage(t,n){const r=t.root;n&&(r.scope=`language:${n}`),this.add(r)}toHTML(){return new FM(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function So(e){return e?typeof e=="string"?e:e.source:null}function lE(e){return ma("(?=",e,")")}function BM(e){return ma("(?:",e,")*")}function zM(e){return ma("(?:",e,")?")}function ma(...e){return e.map(n=>So(n)).join("")}function UM(e){const t=e[e.length-1];return typeof t=="object"&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function l1(...e){return"("+(UM(e).capture?"":"?:")+e.map(r=>So(r)).join("|")+")"}function cE(e){return new RegExp(e.toString()+"|").exec("").length-1}function HM(e,t){const n=e&&e.exec(t);return n&&n.index===0}const $M=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function c1(e,{joinWith:t}){let n=0;return e.map(r=>{n+=1;const i=n;let a=So(r),s="";for(;a.length>0;){const o=$M.exec(a);if(!o){s+=a;break}s+=a.substring(0,o.index),a=a.substring(o.index+o[0].length),o[0][0]==="\\"&&o[1]?s+="\\"+String(Number(o[1])+i):(s+=o[0],o[0]==="("&&n++)}return s}).map(r=>`(${r})`).join(t)}const qM=/\b\B/,dE="[a-zA-Z]\\w*",d1="[a-zA-Z_]\\w*",fE="\\b\\d+(\\.\\d+)?",hE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",mE="\\b(0b[01]+)",GM="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",YM=(e={})=>{const t=/^#![ ]*\//;return e.binary&&(e.begin=ma(t,/.*\b/,e.binary,/\b.*/)),mi({scope:"meta",begin:t,end:/$/,relevance:0,"on:begin":(n,r)=>{n.index!==0&&r.ignoreMatch()}},e)},ko={begin:"\\\\[\\s\\S]",relevance:0},jM={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[ko]},WM={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[ko]},VM={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},y0=function(e,t,n={}){const r=mi({scope:"comment",begin:e,end:t,contains:[]},n);r.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const i=l1("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:ma(/[ ]+/,"(",i,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),r},KM=y0("//","$"),XM=y0("/\\*","\\*/"),QM=y0("#","$"),ZM={scope:"number",begin:fE,relevance:0},JM={scope:"number",begin:hE,relevance:0},eL={scope:"number",begin:mE,relevance:0},tL={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[ko,{begin:/\[/,end:/\]/,relevance:0,contains:[ko]}]},nL={scope:"title",begin:dE,relevance:0},rL={scope:"title",begin:d1,relevance:0},iL={begin:"\\.\\s*"+d1,relevance:0},aL=function(e){return Object.assign(e,{"on:begin":(t,n)=>{n.data._beginMatch=t[1]},"on:end":(t,n)=>{n.data._beginMatch!==t[1]&&n.ignoreMatch()}})};var Cu=Object.freeze({__proto__:null,APOS_STRING_MODE:jM,BACKSLASH_ESCAPE:ko,BINARY_NUMBER_MODE:eL,BINARY_NUMBER_RE:mE,COMMENT:y0,C_BLOCK_COMMENT_MODE:XM,C_LINE_COMMENT_MODE:KM,C_NUMBER_MODE:JM,C_NUMBER_RE:hE,END_SAME_AS_BEGIN:aL,HASH_COMMENT_MODE:QM,IDENT_RE:dE,MATCH_NOTHING_RE:qM,METHOD_GUARD:iL,NUMBER_MODE:ZM,NUMBER_RE:fE,PHRASAL_WORDS_MODE:VM,QUOTE_STRING_MODE:WM,REGEXP_MODE:tL,RE_STARTERS_RE:GM,SHEBANG:YM,TITLE_MODE:nL,UNDERSCORE_IDENT_RE:d1,UNDERSCORE_TITLE_MODE:rL});function sL(e,t){e.input[e.index-1]==="."&&t.ignoreMatch()}function oL(e,t){e.className!==void 0&&(e.scope=e.className,delete e.className)}function uL(e,t){t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",e.__beforeBegin=sL,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,e.relevance===void 0&&(e.relevance=0))}function lL(e,t){Array.isArray(e.illegal)&&(e.illegal=l1(...e.illegal))}function cL(e,t){if(e.match){if(e.begin||e.end)throw new Error("begin & end are not supported with match");e.begin=e.match,delete e.match}}function dL(e,t){e.relevance===void 0&&(e.relevance=1)}const fL=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw new Error("beforeMatch cannot be used with starts");const n=Object.assign({},e);Object.keys(e).forEach(r=>{delete e[r]}),e.keywords=n.keywords,e.begin=ma(n.beforeMatch,lE(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},hL=["of","and","for","in","not","or","if","then","parent","list","value"],mL="keyword";function pE(e,t,n=mL){const r=Object.create(null);return typeof e=="string"?i(n,e.split(" ")):Array.isArray(e)?i(n,e):Object.keys(e).forEach(function(a){Object.assign(r,pE(e[a],t,a))}),r;function i(a,s){t&&(s=s.map(o=>o.toLowerCase())),s.forEach(function(o){const u=o.split("|");r[u[0]]=[a,pL(u[0],u[1])]})}}function pL(e,t){return t?Number(t):gL(e)?0:1}function gL(e){return hL.includes(e.toLowerCase())}const a2={},ea=e=>{console.error(e)},s2=(e,...t)=>{console.log(`WARN: ${e}`,...t)},ba=(e,t)=>{a2[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),a2[`${e}/${t}`]=!0)},Il=new Error;function gE(e,t,{key:n}){let r=0;const i=e[n],a={},s={};for(let o=1;o<=t.length;o++)s[o+r]=i[o],a[o+r]=!0,r+=cE(t[o-1]);e[n]=s,e[n]._emit=a,e[n]._multi=!0}function bL(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw ea("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),Il;if(typeof e.beginScope!="object"||e.beginScope===null)throw ea("beginScope must be object"),Il;gE(e,e.begin,{key:"beginScope"}),e.begin=c1(e.begin,{joinWith:""})}}function EL(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw ea("skip, excludeEnd, returnEnd not compatible with endScope: {}"),Il;if(typeof e.endScope!="object"||e.endScope===null)throw ea("endScope must be object"),Il;gE(e,e.end,{key:"endScope"}),e.end=c1(e.end,{joinWith:""})}}function yL(e){e.scope&&typeof e.scope=="object"&&e.scope!==null&&(e.beginScope=e.scope,delete e.scope)}function vL(e){yL(e),typeof e.beginScope=="string"&&(e.beginScope={_wrap:e.beginScope}),typeof e.endScope=="string"&&(e.endScope={_wrap:e.endScope}),bL(e),EL(e)}function _L(e){function t(s,o){return new RegExp(So(s),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(o?"g":""))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(o,u){u.position=this.position++,this.matchIndexes[this.matchAt]=u,this.regexes.push([u,o]),this.matchAt+=cE(o)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const o=this.regexes.map(u=>u[1]);this.matcherRe=t(c1(o,{joinWith:"|"}),!0),this.lastIndex=0}exec(o){this.matcherRe.lastIndex=this.lastIndex;const u=this.matcherRe.exec(o);if(!u)return null;const l=u.findIndex((c,m)=>m>0&&c!==void 0),d=this.matchIndexes[l];return u.splice(0,l),Object.assign(u,d)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(o){if(this.multiRegexes[o])return this.multiRegexes[o];const u=new n;return this.rules.slice(o).forEach(([l,d])=>u.addRule(l,d)),u.compile(),this.multiRegexes[o]=u,u}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(o,u){this.rules.push([o,u]),u.type==="begin"&&this.count++}exec(o){const u=this.getMatcher(this.regexIndex);u.lastIndex=this.lastIndex;let l=u.exec(o);if(this.resumingScanAtSamePosition()&&!(l&&l.index===this.lastIndex)){const d=this.getMatcher(0);d.lastIndex=this.lastIndex+1,l=d.exec(o)}return l&&(this.regexIndex+=l.position+1,this.regexIndex===this.count&&this.considerAll()),l}}function i(s){const o=new r;return s.contains.forEach(u=>o.addRule(u.begin,{rule:u,type:"begin"})),s.terminatorEnd&&o.addRule(s.terminatorEnd,{type:"end"}),s.illegal&&o.addRule(s.illegal,{type:"illegal"}),o}function a(s,o){const u=s;if(s.isCompiled)return u;[oL,cL,vL,fL].forEach(d=>d(s,o)),e.compilerExtensions.forEach(d=>d(s,o)),s.__beforeBegin=null,[uL,lL,dL].forEach(d=>d(s,o)),s.isCompiled=!0;let l=null;return typeof s.keywords=="object"&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords),l=s.keywords.$pattern,delete s.keywords.$pattern),l=l||/\w+/,s.keywords&&(s.keywords=pE(s.keywords,e.case_insensitive)),u.keywordPatternRe=t(l,!0),o&&(s.begin||(s.begin=/\B|\b/),u.beginRe=t(u.begin),!s.end&&!s.endsWithParent&&(s.end=/\B|\b/),s.end&&(u.endRe=t(u.end)),u.terminatorEnd=So(u.end)||"",s.endsWithParent&&o.terminatorEnd&&(u.terminatorEnd+=(s.end?"|":"")+o.terminatorEnd)),s.illegal&&(u.illegalRe=t(s.illegal)),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map(function(d){return TL(d==="self"?s:d)})),s.contains.forEach(function(d){a(d,u)}),s.starts&&a(s.starts,o),u.matcher=i(u),u}if(e.compilerExtensions||(e.compilerExtensions=[]),e.contains&&e.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return e.classNameAliases=mi(e.classNameAliases||{}),a(e)}function bE(e){return e?e.endsWithParent||bE(e.starts):!1}function TL(e){return e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map(function(t){return mi(e,{variants:null},t)})),e.cachedVariants?e.cachedVariants:bE(e)?mi(e,{starts:e.starts?mi(e.starts):null}):Object.isFrozen(e)?mi(e):e}var xL="11.11.2";class wL extends Error{constructor(t,n){super(t),this.name="HTMLInjectionError",this.html=n}}const Fc=uE,o2=mi,u2=Symbol("nomatch"),AL=7,EE=function(e){const t=Object.create(null),n=Object.create(null),r=[];let i=!0;const a="Could not find the language '{}', did you forget to load/include a language module?",s={disableAutodetect:!0,name:"Plain text",contains:[]};let o={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:PM};function u(G){return o.noHighlightRe.test(G)}function l(G){let K=G.className+" ";K+=G.parentNode?G.parentNode.className:"";const U=o.languageDetectRe.exec(K);if(U){const Y=H(U[1]);return Y||(s2(a.replace("{}",U[1])),s2("Falling back to no-highlight mode for this block.",G)),Y?U[1]:"no-highlight"}return K.split(/\s+/).find(Y=>u(Y)||H(Y))}function d(G,K,U){let Y="",A="";typeof K=="object"?(Y=G,U=K.ignoreIllegals,A=K.language):(ba("10.7.0","highlight(lang, code, ...args) has been deprecated."),ba("10.7.0",`Please use highlight(code, options) instead.
|
|
437
437
|
https://github.com/highlightjs/highlight.js/issues/2277`),A=G,Y=K),U===void 0&&(U=!0);const ue={code:Y,language:A};he("before:highlight",ue);const se=ue.result?ue.result:c(ue.language,ue.code,U);return se.code=ue.code,he("after:highlight",se),se}function c(G,K,U,Y){const A=Object.create(null);function ue(L,$){return L.keywords[$]}function se(){if(!ve.keywords){$e.addText(Pe);return}let L=0;ve.keywordPatternRe.lastIndex=0;let $=ve.keywordPatternRe.exec(Pe),ae="";for(;$;){ae+=Pe.substring(L,$.index);const de=Tt.case_insensitive?$[0].toLowerCase():$[0],Te=ue(ve,de);if(Te){const[it,Dn]=Te;if($e.addText(ae),ae="",A[de]=(A[de]||0)+1,A[de]<=AL&&(Gn+=Dn),it.startsWith("_"))ae+=$[0];else{const jt=Tt.classNameAliases[it]||it;ke($[0],jt)}}else ae+=$[0];L=ve.keywordPatternRe.lastIndex,$=ve.keywordPatternRe.exec(Pe)}ae+=Pe.substring(L),$e.addText(ae)}function N(){if(Pe==="")return;let L=null;if(typeof ve.subLanguage=="string"){if(!t[ve.subLanguage]){$e.addText(Pe);return}L=c(ve.subLanguage,Pe,!0,Nn[ve.subLanguage]),Nn[ve.subLanguage]=L._top}else L=h(Pe,ve.subLanguage.length?ve.subLanguage:null);ve.relevance>0&&(Gn+=L.relevance),$e.__addSublanguage(L._emitter,L.language)}function be(){ve.subLanguage!=null?N():se(),Pe=""}function ke(L,$){L!==""&&($e.startScope($),$e.addText(L),$e.endScope())}function Ne(L,$){let ae=1;const de=$.length-1;for(;ae<=de;){if(!L._emit[ae]){ae++;continue}const Te=Tt.classNameAliases[L[ae]]||L[ae],it=$[ae];Te?ke(it,Te):(Pe=it,se(),Pe=""),ae++}}function we(L,$){return L.scope&&typeof L.scope=="string"&&$e.openNode(Tt.classNameAliases[L.scope]||L.scope),L.beginScope&&(L.beginScope._wrap?(ke(Pe,Tt.classNameAliases[L.beginScope._wrap]||L.beginScope._wrap),Pe=""):L.beginScope._multi&&(Ne(L.beginScope,$),Pe="")),ve=Object.create(L,{parent:{value:ve}}),ve}function ft(L,$,ae){let de=HM(L.endRe,ae);if(de){if(L["on:end"]){const Te=new n2(L);L["on:end"]($,Te),Te.isMatchIgnored&&(de=!1)}if(de){for(;L.endsParent&&L.parent;)L=L.parent;return L}}if(L.endsWithParent)return ft(L.parent,$,ae)}function rt(L){return ve.matcher.regexIndex===0?(Pe+=L[0],1):(or=!0,0)}function kt(L){const $=L[0],ae=L.rule,de=new n2(ae),Te=[ae.__beforeBegin,ae["on:begin"]];for(const it of Te)if(it&&(it(L,de),de.isMatchIgnored))return rt($);return ae.skip?Pe+=$:(ae.excludeBegin&&(Pe+=$),be(),!ae.returnBegin&&!ae.excludeBegin&&(Pe=$)),we(ae,L),ae.returnBegin?0:$.length}function Ot(L){const $=L[0],ae=K.substring(L.index),de=ft(ve,L,ae);if(!de)return u2;const Te=ve;ve.endScope&&ve.endScope._wrap?(be(),ke($,ve.endScope._wrap)):ve.endScope&&ve.endScope._multi?(be(),Ne(ve.endScope,L)):Te.skip?Pe+=$:(Te.returnEnd||Te.excludeEnd||(Pe+=$),be(),Te.excludeEnd&&(Pe=$));do ve.scope&&$e.closeNode(),!ve.skip&&!ve.subLanguage&&(Gn+=ve.relevance),ve=ve.parent;while(ve!==de.parent);return de.starts&&we(de.starts,L),Te.returnEnd?0:$.length}function Cn(){const L=[];for(let $=ve;$!==Tt;$=$.parent)$.scope&&L.unshift($.scope);L.forEach($=>$e.openNode($))}let Ft={};function pn(L,$){const ae=$&&$[0];if(Pe+=L,ae==null)return be(),0;if(Ft.type==="begin"&&$.type==="end"&&Ft.index===$.index&&ae===""){if(Pe+=K.slice($.index,$.index+1),!i){const de=new Error(`0 width match regex (${G})`);throw de.languageName=G,de.badRule=Ft.rule,de}return 1}if(Ft=$,$.type==="begin")return kt($);if($.type==="illegal"&&!U){const de=new Error('Illegal lexeme "'+ae+'" for mode "'+(ve.scope||"<unnamed>")+'"');throw de.mode=ve,de}else if($.type==="end"){const de=Ot($);if(de!==u2)return de}if($.type==="illegal"&&ae==="")return $.index===K.length||(Pe+=`
|
|
438
|
-
`),1;if(sr>1e5&&sr>$.index*3)throw new Error("potential infinite loop, way more iterations than matches");return Pe+=ae,ae.length}const Tt=H(G);if(!Tt)throw ea(a.replace("{}",G)),new Error('Unknown language: "'+G+'"');const Fe=_L(Tt);let Yt="",ve=Y||Fe;const Nn={},$e=new o.__emitter(o);Cn();let Pe="",Gn=0,ht=0,sr=0,or=!1;try{if(Tt.__emitTokens)Tt.__emitTokens(K,$e);else{for(ve.matcher.considerAll();;){sr++,or?or=!1:ve.matcher.considerAll(),ve.matcher.lastIndex=ht;const L=ve.matcher.exec(K);if(!L)break;const $=K.substring(ht,L.index),ae=pn($,L);ht=L.index+ae}pn(K.substring(ht))}return $e.finalize(),Yt=$e.toHTML(),{language:G,value:Yt,relevance:Gn,illegal:!1,_emitter:$e,_top:ve}}catch(L){if(L.message&&L.message.includes("Illegal"))return{language:G,value:Fc(K),illegal:!0,relevance:0,_illegalBy:{message:L.message,index:ht,context:K.slice(ht-100,ht+100),mode:L.mode,resultSoFar:Yt},_emitter:$e};if(i)return{language:G,value:Fc(K),illegal:!1,relevance:0,errorRaised:L,_emitter:$e,_top:ve};throw L}}function m(G){const K={value:Fc(G),illegal:!1,relevance:0,_top:s,_emitter:new o.__emitter(o)};return K._emitter.addText(G),K}function h(G,K){K=K||o.languages||Object.keys(t);const U=m(G),Y=K.filter(H).filter(F).map(be=>c(be,G,!1));Y.unshift(U);const A=Y.sort((be,ke)=>{if(be.relevance!==ke.relevance)return ke.relevance-be.relevance;if(be.language&&ke.language){if(H(be.language).supersetOf===ke.language)return 1;if(H(ke.language).supersetOf===be.language)return-1}return 0}),[ue,se]=A,N=ue;return N.secondBest=se,N}function E(G,K,U){const Y=K&&n[K]||U;G.classList.add("hljs"),G.classList.add(`language-${Y}`)}function v(G){let K=null;const U=l(G);if(u(U))return;if(he("before:highlightElement",{el:G,language:U}),G.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",G);return}if(G.children.length>0&&(o.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(G)),o.throwUnescapedHTML))throw new wL("One of your code blocks includes unescaped HTML.",G.innerHTML);K=G;const Y=K.textContent,A=U?d(Y,{language:U,ignoreIllegals:!0}):h(Y);G.innerHTML=A.value,G.dataset.highlighted="yes",E(G,U,A.language),G.result={language:A.language,re:A.relevance,relevance:A.relevance},A.secondBest&&(G.secondBest={language:A.secondBest.language,relevance:A.secondBest.relevance}),he("after:highlightElement",{el:G,result:A,text:Y})}function w(G){o=o2(o,G)}const b=()=>{I(),ba("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function y(){I(),ba("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let T=!1;function I(){function G(){I()}if(document.readyState==="loading"){T||window.addEventListener("DOMContentLoaded",G,!1),T=!0;return}document.querySelectorAll(o.cssSelector).forEach(v)}function M(G,K){let U=null;try{U=K(e)}catch(Y){if(ea("Language definition for '{}' could not be registered.".replace("{}",G)),i)ea(Y);else throw Y;U=s}U.name||(U.name=G),t[G]=U,U.rawDefinition=K.bind(null,e),U.aliases&&V(U.aliases,{languageName:G})}function k(G){delete t[G];for(const K of Object.keys(n))n[K]===G&&delete n[K]}function P(){return Object.keys(t)}function H(G){return G=(G||"").toLowerCase(),t[G]||t[n[G]]}function V(G,{languageName:K}){typeof G=="string"&&(G=[G]),G.forEach(U=>{n[U.toLowerCase()]=K})}function F(G){const K=H(G);return K&&!K.disableAutodetect}function Z(G){G["before:highlightBlock"]&&!G["before:highlightElement"]&&(G["before:highlightElement"]=K=>{G["before:highlightBlock"](Object.assign({block:K.el},K))}),G["after:highlightBlock"]&&!G["after:highlightElement"]&&(G["after:highlightElement"]=K=>{G["after:highlightBlock"](Object.assign({block:K.el},K))})}function W(G){Z(G),r.push(G)}function ye(G){const K=r.indexOf(G);K!==-1&&r.splice(K,1)}function he(G,K){const U=G;r.forEach(function(Y){Y[U]&&Y[U](K)})}function ce(G){return ba("10.7.0","highlightBlock will be removed entirely in v12.0"),ba("10.7.0","Please use highlightElement now."),v(G)}Object.assign(e,{highlight:d,highlightAuto:h,highlightAll:I,highlightElement:v,highlightBlock:ce,configure:w,initHighlighting:b,initHighlightingOnLoad:y,registerLanguage:M,unregisterLanguage:k,listLanguages:P,getLanguage:H,registerAliases:V,autoDetection:F,inherit:o2,addPlugin:W,removePlugin:ye}),e.debugMode=function(){i=!1},e.safeMode=function(){i=!0},e.versionString=xL,e.regex={concat:ma,lookahead:lE,either:l1,optional:zM,anyNumberOfTimes:BM};for(const G in Cu)typeof Cu[G]=="object"&&oE(Cu[G]);return Object.assign(e,Cu),e},es=EE({});es.newInstance=()=>EE({});var SL=es;es.HighlightJS=es;es.default=es;const kL=ts(SL),l2={},CL="hljs-";function NL(e){const t=kL.newInstance();return e&&a(e),{highlight:n,highlightAuto:r,listLanguages:i,register:a,registerAlias:s,registered:o};function n(u,l,d){const c=d||l2,m=typeof c.prefix=="string"?c.prefix:CL;if(!t.getLanguage(u))throw new Error("Unknown language: `"+u+"` is not registered");t.configure({__emitter:DL,classPrefix:m});const h=t.highlight(l,{ignoreIllegals:!0,language:u});if(h.errorRaised)throw new Error("Could not highlight with `Highlight.js`",{cause:h.errorRaised});const E=h._emitter.root,v=E.data;return v.language=h.language,v.relevance=h.relevance,E}function r(u,l){const c=(l||l2).subset||i();let m=-1,h=0,E;for(;++m<c.length;){const v=c[m];if(!t.getLanguage(v))continue;const w=n(v,u,l);w.data&&w.data.relevance!==void 0&&w.data.relevance>h&&(h=w.data.relevance,E=w)}return E||{type:"root",children:[],data:{language:void 0,relevance:h}}}function i(){return t.listLanguages()}function a(u,l){if(typeof u=="string")t.registerLanguage(u,l);else{let d;for(d in u)Object.hasOwn(u,d)&&t.registerLanguage(d,u[d])}}function s(u,l){if(typeof u=="string")t.registerAliases(typeof l=="string"?l:[...l],{languageName:u});else{let d;for(d in u)if(Object.hasOwn(u,d)){const c=u[d];t.registerAliases(typeof c=="string"?c:[...c],{languageName:d})}}}function o(u){return!!t.getLanguage(u)}}class DL{constructor(t){this.options=t,this.root={type:"root",children:[],data:{language:void 0,relevance:0}},this.stack=[this.root]}addText(t){if(t==="")return;const n=this.stack[this.stack.length-1],r=n.children[n.children.length-1];r&&r.type==="text"?r.value+=t:n.children.push({type:"text",value:t})}startScope(t){this.openNode(String(t))}endScope(){this.closeNode()}__addSublanguage(t,n){const r=this.stack[this.stack.length-1],i=t.root.children;n?r.children.push({type:"element",tagName:"span",properties:{className:[n]},children:i}):r.children.push(...i)}openNode(t){const n=this,r=t.split(".").map(function(s,o){return o?s+"_".repeat(o):n.options.classPrefix+s}),i=this.stack[this.stack.length-1],a={type:"element",tagName:"span",properties:{className:r},children:[]};i.children.push(a),this.stack.push(a)}closeNode(){this.stack.pop()}finalize(){}toHTML(){return""}}const IL={};function OL(e){const t=e||IL,n=t.aliases,r=t.detect||!1,i=t.languages||RM,a=t.plainText,s=t.prefix,o=t.subset;let u="hljs";const l=NL(i);if(n&&l.registerAlias(n),s){const d=s.indexOf("-");u=d===-1?s:s.slice(0,d)}return function(d,c){da(d,"element",function(m,h,E){if(m.tagName!=="code"||!E||E.type!=="element"||E.tagName!=="pre")return;const v=RL(m);if(v===!1||!v&&!r||v&&a&&a.includes(v))return;Array.isArray(m.properties.className)||(m.properties.className=[]),m.properties.className.includes(u)||m.properties.className.unshift(u);const w=U5(m,{whitespace:"pre"});let b;try{b=v?l.highlight(v,w,{prefix:s}):l.highlightAuto(w,{prefix:s,subset:o})}catch(y){const T=y;if(v&&/Unknown language/.test(T.message)){c.message("Cannot highlight as `"+v+"`, it’s not registered",{ancestors:[E,m],cause:T,place:m.position,ruleId:"missing-language",source:"rehype-highlight"});return}throw T}!v&&b.data&&b.data.language&&m.properties.className.push("language-"+b.data.language),b.children.length>0&&(m.children=b.children)})}}function RL(e){const t=e.properties.className;let n=-1;if(!Array.isArray(t))return;let r;for(;++n<t.length;){const i=String(t[n]);if(i==="no-highlight"||i==="nohighlight")return!1;!r&&i.slice(0,5)==="lang-"&&(r=i.slice(5)),!r&&i.slice(0,9)==="language-"&&(r=i.slice(9))}return r}function ML(e,t){return yE(e,{})||{type:"root",children:[]}}function yE(e,t){const n=LL(e,t);return n&&t.afterTransform&&t.afterTransform(e,n),n}function LL(e,t){switch(e.nodeType){case 1:return zL(e,t);case 3:return PL(e);case 8:return BL(e);case 9:return c2(e,t);case 10:return FL();case 11:return c2(e,t);default:return}}function c2(e,t){return{type:"root",children:vE(e,t)}}function FL(){return{type:"doctype"}}function PL(e){return{type:"text",value:e.nodeValue||""}}function BL(e){return{type:"comment",value:e.nodeValue||""}}function zL(e,t){const n=e.namespaceURI,r=n===gr.svg?t5:e5,i=n===gr.html?e.tagName.toLowerCase():e.tagName,a=n===gr.html&&i==="template"?e.content:e,s=e.getAttributeNames(),o={};let u=-1;for(;++u<s.length;)o[s[u]]=e.getAttribute(s[u])||"";return r(i,o,vE(a,t))}function vE(e,t){const n=e.childNodes,r=[];let i=-1;for(;++i<n.length;){const a=yE(n[i],t);a!==void 0&&r.push(a)}return r}new DOMParser;function UL(e,t){const n=HL(e);return ML(n)}function HL(e){const t=document.createElement("template");return t.innerHTML=e,t.content}const $L={},qL=[];function GL(e){const t=e||$L;return function(n,r){Ih(n,"element",function(i,a){const s=Array.isArray(i.properties.className)?i.properties.className:qL,o=s.includes("language-math"),u=s.includes("math-display"),l=s.includes("math-inline");let d=u;if(!o&&!u&&!l)return;let c=a[a.length-1],m=i;if(i.tagName==="code"&&o&&c&&c.type==="element"&&c.tagName==="pre"&&(m=c,c=a[a.length-2],d=!0),!c)return;const h=U5(m,{whitespace:"pre"});let E;try{E=Tg.renderToString(h,{...t,displayMode:d,throwOnError:!0})}catch(w){const b=w,y=b.name.toLowerCase();r.message("Could not render math with KaTeX",{ancestors:[...a,i],cause:b,place:i.position,ruleId:y,source:"rehype-katex"});try{E=Tg.renderToString(h,{...t,displayMode:d,strict:"ignore",throwOnError:!1})}catch{E=[{type:"element",tagName:"span",properties:{className:["katex-error"],style:"color:"+(t.errorColor||"#cc0000"),title:String(w)},children:[{type:"text",value:h}]}]}}typeof E=="string"&&(E=UL(E).children);const v=c.children.indexOf(m);return c.children.splice(v,1,...E),Ks})}}function YL({children:e}){const t=pe.useRef(null),[n,r]=pe.useState(!1),i=async()=>{var s;const a=((s=t.current)==null?void 0:s.innerText)??"";try{await navigator.clipboard.writeText(a),r(!0),setTimeout(()=>r(!1),1500)}catch(o){console.error("[zdashboard] clipboard copy failed:",o)}};return q.jsxs("div",{className:"not-prose relative my-4 group",children:[q.jsx("button",{onClick:i,className:"absolute right-2 top-2 z-10 px-2 py-0.5 rounded border border-border bg-background/80 text-[11px] opacity-0 group-hover:opacity-100 transition-opacity",children:n?"已复制":"复制"}),q.jsx("pre",{ref:t,className:"overflow-auto rounded-md border bg-[#0d1117] p-3 text-xs leading-relaxed",children:e})]})}function jL({path:e}){const[t,n]=pe.useState(null);if(pe.useEffect(()=>{let s=!0;return fetch("/"+encodeURI(e),{cache:"no-store"}).then(o=>o.text()).then(o=>{s&&n(o)}).catch(()=>{s&&n("")}),()=>{s=!1}},[e]),t===null)return q.jsx("p",{className:"p-3 text-xs text-muted-foreground",children:"加载中…"});const r=t.match(/^---\n([\s\S]*?)\n---\n?/),i=(r==null?void 0:r[1])??null,a=i?t.slice(r[0].length):t;return q.jsxs("div",{className:"prose dark:prose-invert mx-auto max-w-3xl p-8 prose-headings:scroll-mt-4 prose-pre:bg-transparent prose-pre:p-0 prose-pre:m-0",children:[i&&q.jsxs("details",{className:"not-prose mb-4 rounded border p-3 text-sm",children:[q.jsx("summary",{className:"cursor-pointer font-medium",children:"YAML frontmatter"}),q.jsx("pre",{className:"mt-2 whitespace-pre-wrap text-xs",children:i})]}),q.jsx(eA,{remarkPlugins:[dk,yN,ON],rehypePlugins:[$O,XO,[nR,{behavior:"wrap",properties:{className:["no-underline"]}}],[OL,{detect:!0,ignoreMissing:!0}],[GL,{strict:!1}]],components:{pre:({children:s})=>q.jsx(YL,{children:s}),a:({href:s,children:o})=>{const u=s==null?void 0:s.startsWith("http");return q.jsx("a",{href:s,target:u?"_blank":void 0,rel:u?"noreferrer noopener":void 0,children:o})}},children:a})]})}function WL({path:e}){const[t,n]=pe.useState("-"),[r,i]=pe.useState(1),[a,s]=pe.useState(!1),o=e.split("/").pop(),u={backgroundImage:"linear-gradient(45deg,hsl(var(--border)) 25%,transparent 25%),linear-gradient(-45deg,hsl(var(--border)) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,hsl(var(--border)) 75%),linear-gradient(-45deg,transparent 75%,hsl(var(--border)) 75%)",backgroundSize:"16px 16px",backgroundPosition:"0 0,0 8px,8px -8px,-8px 0"};return q.jsxs("div",{className:"flex flex-col h-full",children:[q.jsxs("div",{className:"flex-none px-4 py-2 border-b text-xs flex items-center gap-3",children:[q.jsx("span",{className:"font-mono text-foreground",children:o}),q.jsx("span",{className:"text-muted-foreground",children:t}),q.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[q.jsx("button",{onClick:()=>i(l=>Math.max(.25,+(l-.25).toFixed(2))),className:"w-6 h-6 rounded bg-muted hover:bg-muted/70","aria-label":"缩小",children:"−"}),q.jsxs("span",{className:"w-10 text-center text-muted-foreground",children:[Math.round(r*100),"%"]}),q.jsx("button",{onClick:()=>i(l=>Math.min(8,+(l+.25).toFixed(2))),className:"w-6 h-6 rounded bg-muted hover:bg-muted/70","aria-label":"放大",children:"+"}),q.jsx("button",{onClick:()=>i(1),className:"ml-1 px-2 h-6 rounded bg-muted hover:bg-muted/70",children:"复位"})]})]}),q.jsx("div",{className:"flex-1 min-h-0 overflow-auto grid place-items-center p-6",style:u,children:a?q.jsx("p",{className:"text-muted-foreground",children:"该格式无法预览"}):q.jsx("img",{src:"/"+encodeURI(e),alt:o,style:{transform:`scale(${r})`},className:"max-w-full max-h-full object-contain transition-transform",onLoad:l=>n(`${l.currentTarget.naturalWidth} × ${l.currentTarget.naturalHeight} px`),onError:()=>s(!0)})})]})}function VL({path:e}){return q.jsx("div",{className:"grid place-items-center h-full text-center text-muted-foreground",children:q.jsxs("div",{children:[q.jsx(Sv,{className:"h-10 w-10 mx-auto mb-3 opacity-50"}),q.jsx("p",{children:"该格式无法预览"}),q.jsx("p",{className:"mt-1 font-mono text-xs break-all",children:e})]})})}function KL(e){iv.error(e)}async function d2(e){try{switch(e){case"view":return(await As(async()=>{const{default:t}=await import("./index-C3gGpzPU.js");return{default:t}},__vite__mapDeps([0,1]))).default??null;case"bugs":return(await As(async()=>{const{default:t}=await import("./index-DRK8BNuy.js");return{default:t}},[])).default??null;case"review":return(await As(async()=>{const{default:t}=await import("./index-DxY55LjD.js");return{default:t}},[])).default??null;case"design":return(await As(async()=>{const{default:t}=await import("./index-BpP67FE7.js");return{default:t}},[])).default??null;case"apply":return(await As(async()=>{const{default:t}=await import("./index-Cm0afIpM.js");return{default:t}},[])).default??null;default:return null}}catch(t){return console.error(`[zdashboard] failed to load plugin ${e}:`,t),KL(`加载插件 ${e} 失败`),null}}function XL(e){const t=e.slice(e.lastIndexOf(".")).toLowerCase();return t===".md"||t===".markdown"?jL:[".svg",".png",".jpg",".jpeg",".gif",".webp",".ico"].includes(t)?WL:VL}function QL(){const e=pe.useRef(!1),[t,n]=pe.useState(null),[r,i]=pe.useState(0),[a,s]=pe.useState(!0),[o,u]=pe.useState("view"),[l,d]=pe.useState([]),[c,m]=pe.useState(null),[h,E]=pe.useState(!1),v=yv(()=>{},()=>i(M=>M+1),e);pe.useEffect(()=>{let M=!1;return(async()=>{const k=["view","bugs","review","design","apply"],P=await Promise.all(k.map(d2));M||d(P.filter(Boolean))})(),()=>{M=!0}},[]),pe.useEffect(()=>{let M=!1;return(async()=>{E(!0);try{const k=await d2(o);if(!M&&(k!=null&&k.viewer)){const{default:P}=await k.viewer();m(()=>P)}else m(null)}finally{M||E(!1)}})(),()=>{M=!0}},[o]);const w=(t==null?void 0:t.kind)==="file"?XL(t.path):null,b=c;l.find(M=>M.mode===o);const y=(t==null?void 0:t.kind)==="log"?"服务日志 · just":(t==null?void 0:t.kind)==="plugin"?`${t.icon} ${t.label}`:(t==null?void 0:t.kind)==="file"?t.path:"",T={backgroundImage:"radial-gradient(circle at 1px 1px, hsl(var(--border)) 1px, transparent 0)",backgroundSize:"20px 20px"},I=pe.useCallback((M,k,P)=>{u(M),n({kind:"plugin",mode:M,label:k,icon:P})},[]);return q.jsxs("div",{className:"flex h-screen flex-col",children:[q.jsx(Uv,{status:v,stoppedRef:e,treeOpen:a,onTreeToggle:()=>s(M=>!M)}),q.jsxs("main",{className:"flex-1 min-h-0 flex relative",children:[q.jsx($v,{open:a,currentPath:(t==null?void 0:t.kind)==="file"?t.path:null,onSelectFile:M=>n({kind:"file",path:M}),onSelectLog:()=>n({kind:"log"}),onSelectPlugin:I,plugins:l,activeMode:o,refreshKey:r}),a&&q.jsx("div",{className:"absolute inset-0 z-10 bg-black/40 sm:hidden",onClick:()=>s(!1)}),q.jsx("section",{className:"flex-1 min-h-0 flex flex-col",children:t?q.jsxs(q.Fragment,{children:[q.jsxs("div",{className:"h-[38px] flex-none flex items-center justify-between px-3.5 border-b bg-background text-xs",children:[q.jsx("span",{className:"font-mono truncate",children:y}),q.jsx("span",{className:"text-muted-foreground ml-3 flex-none",children:t.kind==="log"?"日志":t.kind==="plugin"?t.label:"文档"})]}),q.jsx("div",{className:"flex-1 min-h-0 overflow-auto p-6 relative",style:T,children:t.kind==="log"?q.jsx("div",{className:"h-full",children:q.jsx(k_,{})}):t.kind==="plugin"&&h?q.jsx("div",{className:"flex-1 grid place-items-center text-muted-foreground",children:q.jsxs("div",{className:"text-center",children:[q.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold animate-pulse",children:"z"}),q.jsxs("p",{children:["加载 ",t.label," 中…"]})]})}):t.kind==="plugin"&&b?q.jsx("div",{className:"h-full",children:q.jsx(b,{})}):t.kind==="plugin"?q.jsx("div",{className:"flex-1 grid place-items-center text-muted-foreground",children:q.jsxs("div",{className:"text-center",children:[q.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold",children:"z"}),q.jsxs("p",{children:[t.icon," ",t.label," · 暂无可视化"]}),q.jsx("p",{className:"mt-1 text-xs",children:"该模式当前没有图形界面,请使用 API 或切换到其他模式"})]})}):t.kind==="file"&&w?q.jsx("div",{className:"mx-auto max-w-5xl h-full bg-background border rounded-lg shadow-sm overflow-auto",children:q.jsx(w,{path:t.path})}):q.jsx("div",{className:"flex-1 grid place-items-center text-muted-foreground",children:q.jsxs("div",{className:"text-center",children:[q.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold",children:"z"}),q.jsx("p",{children:"从左侧选择模式或文档"}),q.jsxs("p",{className:"mt-1 text-xs",children:["plugins: ",l.map(M=>`${M.icon}${M.label}`).join(" ")||"loading..."]})]})})})]}):q.jsx("div",{className:"flex-1 grid place-items-center text-muted-foreground",children:q.jsxs("div",{className:"text-center",children:[q.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold",children:"z"}),q.jsx("p",{children:"从左侧选择模式或文档"}),q.jsxs("p",{className:"mt-1 text-xs",children:["plugins: ",l.map(M=>`${M.icon}${M.label}`).join(" ")||"loading..."]})]})})})]})]})}const ZL=document.documentElement;let vf=localStorage.getItem("zdashboard-theme");vf||(vf=matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");ZL.classList.toggle("dark",vf==="dark");Pc.createRoot(document.getElementById("root")).render(q.jsxs(le.StrictMode,{children:[q.jsx($y,{children:q.jsx(QL,{})}),q.jsx(gv,{position:"bottom-right",richColors:!0})]}));export{Or as B,kv as F,Cv as I,eA as M,As as _,dk as a,$O as b,nn as c,XO as d,nR as e,OL as f,GL as g,yN as h,ON as i,q as j,jL as k,pe as r,yv as u};
|
|
438
|
+
`),1;if(sr>1e5&&sr>$.index*3)throw new Error("potential infinite loop, way more iterations than matches");return Pe+=ae,ae.length}const Tt=H(G);if(!Tt)throw ea(a.replace("{}",G)),new Error('Unknown language: "'+G+'"');const Fe=_L(Tt);let Yt="",ve=Y||Fe;const Nn={},$e=new o.__emitter(o);Cn();let Pe="",Gn=0,ht=0,sr=0,or=!1;try{if(Tt.__emitTokens)Tt.__emitTokens(K,$e);else{for(ve.matcher.considerAll();;){sr++,or?or=!1:ve.matcher.considerAll(),ve.matcher.lastIndex=ht;const L=ve.matcher.exec(K);if(!L)break;const $=K.substring(ht,L.index),ae=pn($,L);ht=L.index+ae}pn(K.substring(ht))}return $e.finalize(),Yt=$e.toHTML(),{language:G,value:Yt,relevance:Gn,illegal:!1,_emitter:$e,_top:ve}}catch(L){if(L.message&&L.message.includes("Illegal"))return{language:G,value:Fc(K),illegal:!0,relevance:0,_illegalBy:{message:L.message,index:ht,context:K.slice(ht-100,ht+100),mode:L.mode,resultSoFar:Yt},_emitter:$e};if(i)return{language:G,value:Fc(K),illegal:!1,relevance:0,errorRaised:L,_emitter:$e,_top:ve};throw L}}function m(G){const K={value:Fc(G),illegal:!1,relevance:0,_top:s,_emitter:new o.__emitter(o)};return K._emitter.addText(G),K}function h(G,K){K=K||o.languages||Object.keys(t);const U=m(G),Y=K.filter(H).filter(F).map(be=>c(be,G,!1));Y.unshift(U);const A=Y.sort((be,ke)=>{if(be.relevance!==ke.relevance)return ke.relevance-be.relevance;if(be.language&&ke.language){if(H(be.language).supersetOf===ke.language)return 1;if(H(ke.language).supersetOf===be.language)return-1}return 0}),[ue,se]=A,N=ue;return N.secondBest=se,N}function E(G,K,U){const Y=K&&n[K]||U;G.classList.add("hljs"),G.classList.add(`language-${Y}`)}function v(G){let K=null;const U=l(G);if(u(U))return;if(he("before:highlightElement",{el:G,language:U}),G.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",G);return}if(G.children.length>0&&(o.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(G)),o.throwUnescapedHTML))throw new wL("One of your code blocks includes unescaped HTML.",G.innerHTML);K=G;const Y=K.textContent,A=U?d(Y,{language:U,ignoreIllegals:!0}):h(Y);G.innerHTML=A.value,G.dataset.highlighted="yes",E(G,U,A.language),G.result={language:A.language,re:A.relevance,relevance:A.relevance},A.secondBest&&(G.secondBest={language:A.secondBest.language,relevance:A.secondBest.relevance}),he("after:highlightElement",{el:G,result:A,text:Y})}function w(G){o=o2(o,G)}const b=()=>{I(),ba("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function y(){I(),ba("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let T=!1;function I(){function G(){I()}if(document.readyState==="loading"){T||window.addEventListener("DOMContentLoaded",G,!1),T=!0;return}document.querySelectorAll(o.cssSelector).forEach(v)}function M(G,K){let U=null;try{U=K(e)}catch(Y){if(ea("Language definition for '{}' could not be registered.".replace("{}",G)),i)ea(Y);else throw Y;U=s}U.name||(U.name=G),t[G]=U,U.rawDefinition=K.bind(null,e),U.aliases&&V(U.aliases,{languageName:G})}function k(G){delete t[G];for(const K of Object.keys(n))n[K]===G&&delete n[K]}function P(){return Object.keys(t)}function H(G){return G=(G||"").toLowerCase(),t[G]||t[n[G]]}function V(G,{languageName:K}){typeof G=="string"&&(G=[G]),G.forEach(U=>{n[U.toLowerCase()]=K})}function F(G){const K=H(G);return K&&!K.disableAutodetect}function Z(G){G["before:highlightBlock"]&&!G["before:highlightElement"]&&(G["before:highlightElement"]=K=>{G["before:highlightBlock"](Object.assign({block:K.el},K))}),G["after:highlightBlock"]&&!G["after:highlightElement"]&&(G["after:highlightElement"]=K=>{G["after:highlightBlock"](Object.assign({block:K.el},K))})}function W(G){Z(G),r.push(G)}function ye(G){const K=r.indexOf(G);K!==-1&&r.splice(K,1)}function he(G,K){const U=G;r.forEach(function(Y){Y[U]&&Y[U](K)})}function ce(G){return ba("10.7.0","highlightBlock will be removed entirely in v12.0"),ba("10.7.0","Please use highlightElement now."),v(G)}Object.assign(e,{highlight:d,highlightAuto:h,highlightAll:I,highlightElement:v,highlightBlock:ce,configure:w,initHighlighting:b,initHighlightingOnLoad:y,registerLanguage:M,unregisterLanguage:k,listLanguages:P,getLanguage:H,registerAliases:V,autoDetection:F,inherit:o2,addPlugin:W,removePlugin:ye}),e.debugMode=function(){i=!1},e.safeMode=function(){i=!0},e.versionString=xL,e.regex={concat:ma,lookahead:lE,either:l1,optional:zM,anyNumberOfTimes:BM};for(const G in Cu)typeof Cu[G]=="object"&&oE(Cu[G]);return Object.assign(e,Cu),e},es=EE({});es.newInstance=()=>EE({});var SL=es;es.HighlightJS=es;es.default=es;const kL=ts(SL),l2={},CL="hljs-";function NL(e){const t=kL.newInstance();return e&&a(e),{highlight:n,highlightAuto:r,listLanguages:i,register:a,registerAlias:s,registered:o};function n(u,l,d){const c=d||l2,m=typeof c.prefix=="string"?c.prefix:CL;if(!t.getLanguage(u))throw new Error("Unknown language: `"+u+"` is not registered");t.configure({__emitter:DL,classPrefix:m});const h=t.highlight(l,{ignoreIllegals:!0,language:u});if(h.errorRaised)throw new Error("Could not highlight with `Highlight.js`",{cause:h.errorRaised});const E=h._emitter.root,v=E.data;return v.language=h.language,v.relevance=h.relevance,E}function r(u,l){const c=(l||l2).subset||i();let m=-1,h=0,E;for(;++m<c.length;){const v=c[m];if(!t.getLanguage(v))continue;const w=n(v,u,l);w.data&&w.data.relevance!==void 0&&w.data.relevance>h&&(h=w.data.relevance,E=w)}return E||{type:"root",children:[],data:{language:void 0,relevance:h}}}function i(){return t.listLanguages()}function a(u,l){if(typeof u=="string")t.registerLanguage(u,l);else{let d;for(d in u)Object.hasOwn(u,d)&&t.registerLanguage(d,u[d])}}function s(u,l){if(typeof u=="string")t.registerAliases(typeof l=="string"?l:[...l],{languageName:u});else{let d;for(d in u)if(Object.hasOwn(u,d)){const c=u[d];t.registerAliases(typeof c=="string"?c:[...c],{languageName:d})}}}function o(u){return!!t.getLanguage(u)}}class DL{constructor(t){this.options=t,this.root={type:"root",children:[],data:{language:void 0,relevance:0}},this.stack=[this.root]}addText(t){if(t==="")return;const n=this.stack[this.stack.length-1],r=n.children[n.children.length-1];r&&r.type==="text"?r.value+=t:n.children.push({type:"text",value:t})}startScope(t){this.openNode(String(t))}endScope(){this.closeNode()}__addSublanguage(t,n){const r=this.stack[this.stack.length-1],i=t.root.children;n?r.children.push({type:"element",tagName:"span",properties:{className:[n]},children:i}):r.children.push(...i)}openNode(t){const n=this,r=t.split(".").map(function(s,o){return o?s+"_".repeat(o):n.options.classPrefix+s}),i=this.stack[this.stack.length-1],a={type:"element",tagName:"span",properties:{className:r},children:[]};i.children.push(a),this.stack.push(a)}closeNode(){this.stack.pop()}finalize(){}toHTML(){return""}}const IL={};function OL(e){const t=e||IL,n=t.aliases,r=t.detect||!1,i=t.languages||RM,a=t.plainText,s=t.prefix,o=t.subset;let u="hljs";const l=NL(i);if(n&&l.registerAlias(n),s){const d=s.indexOf("-");u=d===-1?s:s.slice(0,d)}return function(d,c){da(d,"element",function(m,h,E){if(m.tagName!=="code"||!E||E.type!=="element"||E.tagName!=="pre")return;const v=RL(m);if(v===!1||!v&&!r||v&&a&&a.includes(v))return;Array.isArray(m.properties.className)||(m.properties.className=[]),m.properties.className.includes(u)||m.properties.className.unshift(u);const w=U5(m,{whitespace:"pre"});let b;try{b=v?l.highlight(v,w,{prefix:s}):l.highlightAuto(w,{prefix:s,subset:o})}catch(y){const T=y;if(v&&/Unknown language/.test(T.message)){c.message("Cannot highlight as `"+v+"`, it’s not registered",{ancestors:[E,m],cause:T,place:m.position,ruleId:"missing-language",source:"rehype-highlight"});return}throw T}!v&&b.data&&b.data.language&&m.properties.className.push("language-"+b.data.language),b.children.length>0&&(m.children=b.children)})}}function RL(e){const t=e.properties.className;let n=-1;if(!Array.isArray(t))return;let r;for(;++n<t.length;){const i=String(t[n]);if(i==="no-highlight"||i==="nohighlight")return!1;!r&&i.slice(0,5)==="lang-"&&(r=i.slice(5)),!r&&i.slice(0,9)==="language-"&&(r=i.slice(9))}return r}function ML(e,t){return yE(e,{})||{type:"root",children:[]}}function yE(e,t){const n=LL(e,t);return n&&t.afterTransform&&t.afterTransform(e,n),n}function LL(e,t){switch(e.nodeType){case 1:return zL(e,t);case 3:return PL(e);case 8:return BL(e);case 9:return c2(e,t);case 10:return FL();case 11:return c2(e,t);default:return}}function c2(e,t){return{type:"root",children:vE(e,t)}}function FL(){return{type:"doctype"}}function PL(e){return{type:"text",value:e.nodeValue||""}}function BL(e){return{type:"comment",value:e.nodeValue||""}}function zL(e,t){const n=e.namespaceURI,r=n===gr.svg?t5:e5,i=n===gr.html?e.tagName.toLowerCase():e.tagName,a=n===gr.html&&i==="template"?e.content:e,s=e.getAttributeNames(),o={};let u=-1;for(;++u<s.length;)o[s[u]]=e.getAttribute(s[u])||"";return r(i,o,vE(a,t))}function vE(e,t){const n=e.childNodes,r=[];let i=-1;for(;++i<n.length;){const a=yE(n[i],t);a!==void 0&&r.push(a)}return r}new DOMParser;function UL(e,t){const n=HL(e);return ML(n)}function HL(e){const t=document.createElement("template");return t.innerHTML=e,t.content}const $L={},qL=[];function GL(e){const t=e||$L;return function(n,r){Ih(n,"element",function(i,a){const s=Array.isArray(i.properties.className)?i.properties.className:qL,o=s.includes("language-math"),u=s.includes("math-display"),l=s.includes("math-inline");let d=u;if(!o&&!u&&!l)return;let c=a[a.length-1],m=i;if(i.tagName==="code"&&o&&c&&c.type==="element"&&c.tagName==="pre"&&(m=c,c=a[a.length-2],d=!0),!c)return;const h=U5(m,{whitespace:"pre"});let E;try{E=Tg.renderToString(h,{...t,displayMode:d,throwOnError:!0})}catch(w){const b=w,y=b.name.toLowerCase();r.message("Could not render math with KaTeX",{ancestors:[...a,i],cause:b,place:i.position,ruleId:y,source:"rehype-katex"});try{E=Tg.renderToString(h,{...t,displayMode:d,strict:"ignore",throwOnError:!1})}catch{E=[{type:"element",tagName:"span",properties:{className:["katex-error"],style:"color:"+(t.errorColor||"#cc0000"),title:String(w)},children:[{type:"text",value:h}]}]}}typeof E=="string"&&(E=UL(E).children);const v=c.children.indexOf(m);return c.children.splice(v,1,...E),Ks})}}function YL({children:e}){const t=pe.useRef(null),[n,r]=pe.useState(!1),i=async()=>{var s;const a=((s=t.current)==null?void 0:s.innerText)??"";try{await navigator.clipboard.writeText(a),r(!0),setTimeout(()=>r(!1),1500)}catch(o){console.error("[zdashboard] clipboard copy failed:",o)}};return q.jsxs("div",{className:"not-prose relative my-4 group",children:[q.jsx("button",{onClick:i,className:"absolute right-2 top-2 z-10 px-2 py-0.5 rounded border border-border bg-background/80 text-[11px] opacity-0 group-hover:opacity-100 transition-opacity",children:n?"已复制":"复制"}),q.jsx("pre",{ref:t,className:"overflow-auto rounded-md border bg-[#0d1117] p-3 text-xs leading-relaxed",children:e})]})}function jL({path:e}){const[t,n]=pe.useState(null);if(pe.useEffect(()=>{let s=!0;return fetch("/"+encodeURI(e),{cache:"no-store"}).then(o=>o.text()).then(o=>{s&&n(o)}).catch(()=>{s&&n("")}),()=>{s=!1}},[e]),t===null)return q.jsx("p",{className:"p-3 text-xs text-muted-foreground",children:"加载中…"});const r=t.match(/^---\n([\s\S]*?)\n---\n?/),i=(r==null?void 0:r[1])??null,a=i?t.slice(r[0].length):t;return q.jsxs("div",{className:"prose dark:prose-invert mx-auto max-w-3xl p-8 prose-headings:scroll-mt-4 prose-pre:bg-transparent prose-pre:p-0 prose-pre:m-0",children:[i&&q.jsxs("details",{className:"not-prose mb-4 rounded border p-3 text-sm",children:[q.jsx("summary",{className:"cursor-pointer font-medium",children:"YAML frontmatter"}),q.jsx("pre",{className:"mt-2 whitespace-pre-wrap text-xs",children:i})]}),q.jsx(eA,{remarkPlugins:[dk,yN,ON],rehypePlugins:[$O,XO,[nR,{behavior:"wrap",properties:{className:["no-underline"]}}],[OL,{detect:!0,ignoreMissing:!0}],[GL,{strict:!1}]],components:{pre:({children:s})=>q.jsx(YL,{children:s}),a:({href:s,children:o})=>{const u=s==null?void 0:s.startsWith("http");return q.jsx("a",{href:s,target:u?"_blank":void 0,rel:u?"noreferrer noopener":void 0,children:o})}},children:a})]})}function WL({path:e}){const[t,n]=pe.useState("-"),[r,i]=pe.useState(1),[a,s]=pe.useState(!1),o=e.split("/").pop(),u={backgroundImage:"linear-gradient(45deg,hsl(var(--border)) 25%,transparent 25%),linear-gradient(-45deg,hsl(var(--border)) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,hsl(var(--border)) 75%),linear-gradient(-45deg,transparent 75%,hsl(var(--border)) 75%)",backgroundSize:"16px 16px",backgroundPosition:"0 0,0 8px,8px -8px,-8px 0"};return q.jsxs("div",{className:"flex flex-col h-full",children:[q.jsxs("div",{className:"flex-none px-4 py-2 border-b text-xs flex items-center gap-3",children:[q.jsx("span",{className:"font-mono text-foreground",children:o}),q.jsx("span",{className:"text-muted-foreground",children:t}),q.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[q.jsx("button",{onClick:()=>i(l=>Math.max(.25,+(l-.25).toFixed(2))),className:"w-6 h-6 rounded bg-muted hover:bg-muted/70","aria-label":"缩小",children:"−"}),q.jsxs("span",{className:"w-10 text-center text-muted-foreground",children:[Math.round(r*100),"%"]}),q.jsx("button",{onClick:()=>i(l=>Math.min(8,+(l+.25).toFixed(2))),className:"w-6 h-6 rounded bg-muted hover:bg-muted/70","aria-label":"放大",children:"+"}),q.jsx("button",{onClick:()=>i(1),className:"ml-1 px-2 h-6 rounded bg-muted hover:bg-muted/70",children:"复位"})]})]}),q.jsx("div",{className:"flex-1 min-h-0 overflow-auto grid place-items-center p-6",style:u,children:a?q.jsx("p",{className:"text-muted-foreground",children:"该格式无法预览"}):q.jsx("img",{src:"/"+encodeURI(e),alt:o,style:{transform:`scale(${r})`},className:"max-w-full max-h-full object-contain transition-transform",onLoad:l=>n(`${l.currentTarget.naturalWidth} × ${l.currentTarget.naturalHeight} px`),onError:()=>s(!0)})})]})}function VL({path:e}){return q.jsx("div",{className:"grid place-items-center h-full text-center text-muted-foreground",children:q.jsxs("div",{children:[q.jsx(Sv,{className:"h-10 w-10 mx-auto mb-3 opacity-50"}),q.jsx("p",{children:"该格式无法预览"}),q.jsx("p",{className:"mt-1 font-mono text-xs break-all",children:e})]})})}function KL(e){iv.error(e)}async function d2(e){try{switch(e){case"view":return(await As(async()=>{const{default:t}=await import("./index-D-6GmZe2.js");return{default:t}},__vite__mapDeps([0,1]))).default??null;case"bugs":return(await As(async()=>{const{default:t}=await import("./index-DxHu81tF.js");return{default:t}},[])).default??null;case"review":return(await As(async()=>{const{default:t}=await import("./index-BIjLvz0a.js");return{default:t}},[])).default??null;case"design":return(await As(async()=>{const{default:t}=await import("./index-DXG7qZLN.js");return{default:t}},[])).default??null;case"apply":return(await As(async()=>{const{default:t}=await import("./index-BILnSgFA.js");return{default:t}},[])).default??null;default:return null}}catch(t){return console.error(`[zdashboard] failed to load plugin ${e}:`,t),KL(`加载插件 ${e} 失败`),null}}function XL(e){const t=e.slice(e.lastIndexOf(".")).toLowerCase();return t===".md"||t===".markdown"?jL:[".svg",".png",".jpg",".jpeg",".gif",".webp",".ico"].includes(t)?WL:VL}function QL(){const e=pe.useRef(!1),[t,n]=pe.useState(null),[r,i]=pe.useState(0),[a,s]=pe.useState(!0),[o,u]=pe.useState("view"),[l,d]=pe.useState([]),[c,m]=pe.useState(null),[h,E]=pe.useState(!1),v=yv(()=>{},()=>i(M=>M+1),e);pe.useEffect(()=>{let M=!1;return(async()=>{const k=["view","bugs","review","design","apply"],P=await Promise.all(k.map(d2));M||d(P.filter(Boolean))})(),()=>{M=!0}},[]),pe.useEffect(()=>{let M=!1;return(async()=>{E(!0);try{const k=await d2(o);if(!M&&(k!=null&&k.viewer)){const{default:P}=await k.viewer();m(()=>P)}else m(null)}finally{M||E(!1)}})(),()=>{M=!0}},[o]);const w=(t==null?void 0:t.kind)==="file"?XL(t.path):null,b=c;l.find(M=>M.mode===o);const y=(t==null?void 0:t.kind)==="log"?"服务日志 · just":(t==null?void 0:t.kind)==="plugin"?`${t.icon} ${t.label}`:(t==null?void 0:t.kind)==="file"?t.path:"",T={backgroundImage:"radial-gradient(circle at 1px 1px, hsl(var(--border)) 1px, transparent 0)",backgroundSize:"20px 20px"},I=pe.useCallback((M,k,P)=>{u(M),n({kind:"plugin",mode:M,label:k,icon:P})},[]);return q.jsxs("div",{className:"flex h-screen flex-col",children:[q.jsx(Uv,{status:v,stoppedRef:e,treeOpen:a,onTreeToggle:()=>s(M=>!M)}),q.jsxs("main",{className:"flex-1 min-h-0 flex relative",children:[q.jsx($v,{open:a,currentPath:(t==null?void 0:t.kind)==="file"?t.path:null,onSelectFile:M=>n({kind:"file",path:M}),onSelectLog:()=>n({kind:"log"}),onSelectPlugin:I,plugins:l,activeMode:o,refreshKey:r}),a&&q.jsx("div",{className:"absolute inset-0 z-10 bg-black/40 sm:hidden",onClick:()=>s(!1)}),q.jsx("section",{className:"flex-1 min-h-0 flex flex-col",children:t?q.jsxs(q.Fragment,{children:[q.jsxs("div",{className:"h-[38px] flex-none flex items-center justify-between px-3.5 border-b bg-background text-xs",children:[q.jsx("span",{className:"font-mono truncate",children:y}),q.jsx("span",{className:"text-muted-foreground ml-3 flex-none",children:t.kind==="log"?"日志":t.kind==="plugin"?t.label:"文档"})]}),q.jsx("div",{className:"flex-1 min-h-0 overflow-auto p-6 relative",style:T,children:t.kind==="log"?q.jsx("div",{className:"h-full",children:q.jsx(k_,{})}):t.kind==="plugin"&&h?q.jsx("div",{className:"flex-1 grid place-items-center text-muted-foreground",children:q.jsxs("div",{className:"text-center",children:[q.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold animate-pulse",children:"z"}),q.jsxs("p",{children:["加载 ",t.label," 中…"]})]})}):t.kind==="plugin"&&b?q.jsx("div",{className:"h-full",children:q.jsx(b,{})}):t.kind==="plugin"?q.jsx("div",{className:"flex-1 grid place-items-center text-muted-foreground",children:q.jsxs("div",{className:"text-center",children:[q.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold",children:"z"}),q.jsxs("p",{children:[t.icon," ",t.label," · 暂无可视化"]}),q.jsx("p",{className:"mt-1 text-xs",children:"该模式当前没有图形界面,请使用 API 或切换到其他模式"})]})}):t.kind==="file"&&w?q.jsx("div",{className:"mx-auto max-w-5xl h-full bg-background border rounded-lg shadow-sm overflow-auto",children:q.jsx(w,{path:t.path})}):q.jsx("div",{className:"flex-1 grid place-items-center text-muted-foreground",children:q.jsxs("div",{className:"text-center",children:[q.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold",children:"z"}),q.jsx("p",{children:"从左侧选择模式或文档"}),q.jsxs("p",{className:"mt-1 text-xs",children:["plugins: ",l.map(M=>`${M.icon}${M.label}`).join(" ")||"loading..."]})]})})})]}):q.jsx("div",{className:"flex-1 grid place-items-center text-muted-foreground",children:q.jsxs("div",{className:"text-center",children:[q.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold",children:"z"}),q.jsx("p",{children:"从左侧选择模式或文档"}),q.jsxs("p",{className:"mt-1 text-xs",children:["plugins: ",l.map(M=>`${M.icon}${M.label}`).join(" ")||"loading..."]})]})})})]})]})}const ZL=document.documentElement;let vf=localStorage.getItem("zdashboard-theme");vf||(vf=matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");ZL.classList.toggle("dark",vf==="dark");Pc.createRoot(document.getElementById("root")).render(q.jsxs(le.StrictMode,{children:[q.jsx($y,{children:q.jsx(QL,{})}),q.jsx(gv,{position:"bottom-right",richColors:!0})]}));export{Or as B,kv as F,Cv as I,eA as M,As as _,dk as a,$O as b,nn as c,XO as d,nR as e,OL as f,GL as g,yN as h,ON as i,q as j,jL as k,pe as r,yv as u};
|
package/dist/web/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<link rel="icon" href="/__app/favicon.svg" type="image/svg+xml" />
|
|
7
7
|
<title>zdashboard · 项目洞察</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-qoCAa7mn.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-0GvyDl5M.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as l,j as e,F as i,M as f,a as g}from"./index-C041WeTi.js";import{F as b}from"./folder-open-m5HYQ2Fs.js";function v(s,t){return t===0?0:Math.round(s/t*100)}function j({done:s,total:t}){const n=v(s,t),d=n===100?"bg-emerald-500/10 text-emerald-600 border-emerald-500/30":n>0?"bg-amber-500/10 text-amber-600 border-amber-500/30":"bg-muted text-muted-foreground border-border";return e.jsxs("span",{className:`inline-flex items-center px-1.5 py-0.5 rounded border text-[10px] font-mono ${d}`,children:[s,"/",t," · ",n,"%"]})}function k({tasks:s}){const t=s.split(`
|
|
2
|
-
`).filter(n=>n.trim().startsWith("- ["));return t.length?e.jsx("ul",{className:"space-y-1 text-xs",children:t.map((n,d)=>{const r=/- \[[xX]\]/.test(n),c=n.replace(/^-\s*\[[ xX]\]\s*/,"");return e.jsxs("li",{className:`flex items-start gap-2 ${r?"text-foreground":"text-muted-foreground"}`,children:[r?e.jsx("span",{className:"mt-0.5 h-3.5 w-3.5 shrink-0 rounded-full bg-emerald-500 text-white flex items-center justify-center text-[8px]",children:"✓"}):e.jsx("span",{className:"mt-0.5 h-3.5 w-3.5 shrink-0 rounded-full border border-muted-foreground/50"}),e.jsx("span",{children:c})]},d)})}):e.jsx("p",{className:"text-xs text-muted-foreground",children:"无 tasks.md"})}function w({item:s,onSelect:t}){return e.jsxs("button",{type:"button",onClick:t,className:"w-full text-left rounded-lg border bg-card p-4 hover:bg-muted/50 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(b,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm font-medium font-mono truncate",children:s.name}),e.jsx(j,{done:s.done,total:s.total})]}),e.jsxs("div",{className:"flex items-center gap-3 text-[11px] text-muted-foreground",children:[e.jsx("span",{className:s.hasProposal?"text-foreground":"",children:"proposal"}),e.jsx("span",{className:s.hasDesign?"text-foreground":"",children:"design"})]})]})}function C(){const[s,t]=l.useState([]),[n,d]=l.useState(null),[r,c]=l.useState(null),[m,o]=l.useState(!0),[u,h]=l.useState(null),p=l.useCallback(()=>{o(!0),d(null),c(null),fetch("/__apply",{cache:"no-store"}).then(a=>a.json()).then(t).catch(a=>h(a.message)).finally(()=>o(!1))},[]);l.useEffect(()=>{p()},[p]);const N=l.useCallback(a=>{o(!0),d(a),fetch(`/__apply/change?name=${encodeURIComponent(a)}`,{cache:"no-store",headers:{"x-stop-token":"skip"}}).then(x=>x.json()).then(c).catch(x=>h(x.message)).finally(()=>o(!1))},[]);return m&&!s.length?e.jsx("div",{className:"flex h-full items-center justify-center text-muted-foreground",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"mx-auto mb-3.5 grid h-14 w-14 place-items-center rounded-[14px] bg-primary text-primary-foreground text-2xl font-bold animate-pulse",children:"⚙️"}),e.jsx("p",{children:"加载执行进度…"})]})}):u?e.jsx("div",{className:"flex h-full items-center justify-center text-destructive",children:e.jsx("p",{children:u})}):e.jsxs("div",{className:"mx-auto max-w-5xl h-full flex flex-col bg-background border rounded-lg shadow-sm overflow-hidden",children:[e.jsxs("div",{className:"flex-none px-4 py-3 border-b flex items-center gap-2",children:[e.jsx("span",{className:"text-sm font-medium",children:"OpenSpec 执行进度"}),e.jsx("span",{className:"ml-auto text-[11px] text-muted-foreground",children:"openspec/changes/"})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-auto p-4 space-y-4",children:[s.length?e.jsx("div",{className:"grid gap-3 sm:grid-cols-2",children:s.map(a=>e.jsx(w,{item:a,onSelect:()=>N(a.name)},a.name))}):e.jsxs("div",{className:"text-center text-muted-foreground py-8",children:[e.jsx("p",{className:"text-sm",children:"没有进行中的 change"}),e.jsx("p",{className:"text-xs mt-1",children:"在 openspec/changes/ 下创建 change 后会显示在这里"})]}),n&&r&&!m&&e.jsxs("section",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h3",{className:"text-sm font-medium",children:r.name}),e.jsx(j,{done:r.done,total:r.total})]}),r.proposal&&e.jsxs("div",{children:[e.jsxs("h4",{className:"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1",children:[e.jsx(i,{className:"h-3 w-3"})," proposal.md"]}),e.jsx("div",{className:"prose dark:prose-invert max-w-none text-xs border rounded-lg p-3 bg-card",children:e.jsx(f,{remarkPlugins:[g],children:r.proposal})})]}),r.design&&e.jsxs("div",{children:[e.jsxs("h4",{className:"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1",children:[e.jsx(i,{className:"h-3 w-3"})," design.md"]}),e.jsx("div",{className:"prose dark:prose-invert max-w-none text-xs border rounded-lg p-3 bg-card",children:e.jsx(f,{remarkPlugins:[g],children:r.design})})]}),e.jsxs("div",{children:[e.jsxs("h4",{className:"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1",children:[e.jsx(i,{className:"h-3 w-3"})," tasks.md"]}),e.jsx("div",{className:"border rounded-lg p-3 bg-card",children:e.jsx(k,{tasks:r.tasks})})]})]})]})]})}export{C as ApplyViewer,C as default};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Viewer-QBsqLDK_.js","assets/index-C041WeTi.js","assets/index-0GvyDl5M.css","assets/folder-open-m5HYQ2Fs.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{_ as e}from"./index-C041WeTi.js";const a={mode:"apply",label:"执行进度",icon:"⚙️",viewer:async()=>({default:(await e(()=>import("./Viewer-QBsqLDK_.js"),__vite__mapDeps([0,1,2,3]))).default})};export{a as default};
|