diff --git a/_deploy/gatekeeper.js b/_deploy/gatekeeper.js new file mode 100644 index 0000000..2dd9fc6 --- /dev/null +++ b/_deploy/gatekeeper.js @@ -0,0 +1,187 @@ +#!/usr/bin/env node +/* ═══════════════════════════════════════ + 铸渊守门人 v2.0 · HLDP万能语言接口 + 新增 /hlpd 端点 — HLDP模块翻译执行 + ═══════════════════════════════════════ */ + +const http=require('http'),fs=require('fs'),path=require('path'),crypto=require('crypto'),{exec}=require('child_process'),os=require('os'); + +const PORT=parseInt(process.env.PORT||process.argv[2]||'3910',10),DATA=path.join(os.homedir(),'.gk'),TIMEOUT=30000,MAX=100000,RATE=60; + +if(!fs.existsSync(DATA))fs.mkdirSync(DATA,{recursive:true,mode:0o700}); +const SF=path.join(DATA,'secret'); +let SECRET; +if(fs.existsSync(SF))SECRET=fs.readFileSync(SF,'utf-8').trim(); +if(!SECRET){SECRET='zy_gtw_'+crypto.randomBytes(24).toString('hex');fs.writeFileSync(SF,SECRET,{mode:0o600});} + +function log(a,d){const l=`[${new Date().toISOString()}] [${a}]${d?' | '+d:''}`;console.log(l);try{fs.appendFileSync(path.join(DATA,'gk.log'),l+'\n')}catch(e){}} + +const RC={}; +function checkIP(ip){const n=Date.now(),w=60000;if(!RC[ip]){RC[ip]={c:1,r:n+w};return 1}if(n>RC[ip].r){RC[ip]={c:1,r:n+w};return 1}RC[ip].c++;return RC[ip].c<=RATE} +function auth(h){const t=(h['authorization']||h['Authorization']||'').replace(/^Bearer\s+/i,'').trim();if(!t)return 0;if(t.length!==SECRET.length)return 0;for(let i=0;i{let b='';req.on('data',c=>b+=c);req.on('end',()=>{try{r(JSON.parse(b))}catch(e){r(null)}});req.on('error',()=>r(null))})} +function jr(r,s,d){r.writeHead(s,{'Content-Type':'application/json','Access-Control-Allow-Origin':'*'});r.end(JSON.stringify(d))} + +async function execCmd(cmd,to){return new Promise(r=>{exec(cmd,{timeout:to||TIMEOUT,maxBuffer:MAX,shell:'/bin/bash'},(e,o,se)=>{r({stdout:(o||'').slice(0,MAX),stderr:(se||'').slice(0,MAX),code:e?(e.code||e.signal||1):0,err:e?e.message:null})})})} + +/* ═══════════════════════════════════════ + HLDP 翻译层 v1.0 — 守门人 v2.0 新增 + ═══════════════════════════════════════ */ + +/* + 翻译规则: + @执行: shell → 提取缩进内容 → bash 执行 + @执行: python → 提取缩进内容 → python3 -c 执行 + @部署: 写入 <路径> → 提取缩进内容 → 写入文件 + @部署: 命令 → 直接执行 +*/ + +function parseHLDP(text) { + const results = []; + const lines = text.split('\n'); + let i = 0; + while (i < lines.length) { + const line = lines[i]; + // @执行: shell 或 @执行: python + const execMatch = line.match(/^@执行:\s*(shell|python)\s*$/); + if (execMatch) { + const lang = execMatch[1]; + let code = ''; + i++; + while (i < lines.length && (lines[i].startsWith(' ') || lines[i].startsWith('\t') || lines[i].trim() === '')) { + code += (code ? '\n' : '') + lines[i].replace(/^ /, ''); + i++; + } + if (code.trim()) { + if (lang === 'shell') { + results.push({ type: 'exec', cmd: code.trim() }); + } else if (lang === 'python') { + const safe = code.trim().replace(/'/g, "'\"'\"'"); + results.push({ type: 'exec', cmd: `python3 -c '${safe}'` }); + } + } + continue; + } + // @部署: 写入 <路径> + const deployMatch = line.match(/^@部署:\s*写入\s+(.+)$/); + if (deployMatch) { + const filePath = deployMatch[1].trim(); + let content = ''; + i++; + while (i < lines.length && (lines[i].startsWith(' ') || lines[i].startsWith('\t') || lines[i].trim() === '')) { + content += (content ? '\n' : '') + lines[i].replace(/^ /, ''); + i++; + } + if (content.trim()) { + results.push({ type: 'write', path: filePath, content: content.trim() }); + } + continue; + } + // @部署: 命令 + const cmdMatch = line.match(/^@部署:\s*命令\s+(.+)$/); + if (cmdMatch) { + results.push({ type: 'exec', cmd: cmdMatch[1].trim() }); + } + i++; + } + return results; +} + +/* ═══════════════════════════════════════ + 路由 + ═══════════════════════════════════════ */ + +async function route(rt,rq,rs){ + const b=await pb(rq); + switch(rt){ + case '/exec': + if(!b||!b.cmd){jr(rs,400,{error:'no cmd'});return} + log('CMD',b.cmd.slice(0,200)); + const r=await execCmd(b.cmd,b.timeout); + jr(rs,200,{ok:r.code===0,stdout:r.stdout,stderr:r.stderr,code:r.code}); + return; + + case '/hlpd': + if(!b||!b.hldp){jr(rs,400,{error:'no hldp'});return} + log('HLDP','解析中'); + const steps = parseHLDP(b.hldp); + const results = []; + for (let i=0; i r.ok); + jr(rs, 200, { ok: allOk, steps: results.length, results }); + return; + + case '/status': + log('INFO','status'); + jr(rs,200,{ok:true,...await sysInfo()}); + return; + + case '/health': + jr(rs,200,{ok:true,svc:'gk',v:'2.0',up:process.uptime().toFixed(0)+'s',hldp:true,ts:new Date().toISOString()}); + return; + + case '/file/read': + if(!b||!b.path){jr(rs,400,{error:'no path'});return} + try{const c=fs.readFileSync(b.path,'utf-8'),s=fs.statSync(b.path);jr(rs,200,{ok:true,path:b.path,size:s.size,modified:s.mtime.toISOString(),content:c.slice(0,MAX)})}catch(e){jr(rs,404,{ok:false,error:e.message})} + return; + + case '/file/write': + if(!b||!b.path||b.content===undefined){jr(rs,400,{error:'need path+content'});return} + try{const d=path.dirname(b.path);if(!fs.existsSync(d))fs.mkdirSync(d,{recursive:true});fs.writeFileSync(b.path,b.content,'utf-8');jr(rs,200,{ok:true,path:b.path,size:Buffer.byteLength(b.content,'utf-8')})}catch(e){jr(rs,500,{ok:false,error:e.message})} + return; + + case '/file/list': + try{const p=(b&&b.path)||'.',i=fs.readdirSync(p,{withFileTypes:true});jr(rs,200,{ok:true,path:p,files:i.map(x=>({name:x.name,type:x.isDirectory()?'dir':'file'})))}catch(e){jr(rs,404,{ok:false,error:e.message})} + return; + + case '/ping': + jr(rs,200,{ok:true,pong:true}); + return; + + default: + jr(rs,404,{error:'unknown:'+rt}); + } +} + +async function sysInfo(){const h=os.hostname(),u=Math.floor(os.uptime()),tm=os.totalmem(),fm=os.freemem(),l=os.loadavg(),c=os.cpus().length,pl=os.platform(),ar=os.arch();let di='';try{di=require('child_process').execSync('df -h /',{timeout:5000}).toString()}catch(e){}return{hostname:h,platform:pl,arch:ar,cpus:c,uptime:u,mem:{total:fb(tm),free:fb(fm),used:fb(tm-fm),pct:((tm-fm)/tm*100).toFixed(1)+'%'},load:l.map(n=>n.toFixed(2)),disk:di,gk:{v:'2.0',port:PORT,up:process.uptime().toFixed(0)+'s',hldp:true}}} +function fb(b){if(b===0)return'0 B';const k=1024,s=['B','KB','MB','GB','TB'],i=Math.floor(Math.log(b)/Math.log(k));return parseFloat((b/Math.pow(k,i)).toFixed(1))+' '+s[i]} + +const sv=http.createServer(async(rq,rs)=>{ + if(rq.method==='OPTIONS'){jr(rs,204,{});return} + if(rq.method!=='POST'){jr(rs,405,{error:'POST only'});return} + const ip=rq.socket.remoteAddress||''; + if(!checkIP(ip)){log('WARN','rate',ip);jr(rs,429,{error:'too fast'});return} + if(!auth(rq.headers)){log('WARN','auth','fail');jr(rs,401,{error:'bad key'});return} + const u=new URL(rq.url,'http://h'),rt=u.pathname; + try{await route(rt,rq,rs)}catch(e){log('ERR','route',e.message);jr(rs,500,{error:e.message})} +}); + +sv.listen(PORT,'0.0.0.0',()=>{ + const h=os.hostname(); + console.log(`\n ⚔️ 铸渊守门人 v2.0 · HLDP语言接口\n ──────────────────────\n 主机: ${h}\n 端口: ${PORT}\n 新增: /hlpd — HLDP模块翻译执行\n 翻译: @执行 shell|python → 执行\n @部署 写入 → 文件写入\n ──────────────────────\n`); + log('UP',`v2.0 ${h}:${PORT} +HLDP`); +}); + +process.on('SIGTERM',()=>{log('DOWN','sigterm');sv.close(()=>process.exit(0))}); +process.on('SIGINT',()=>{log('DOWN','sigint');sv.close(()=>process.exit(0))}); +process.on('uncaughtException',e=>log('ERR','ex',e.message)); diff --git a/brain/auto-sync-report.json b/brain/auto-sync-report.json index 8537d5a..0a9e742 100644 --- a/brain/auto-sync-report.json +++ b/brain/auto-sync-report.json @@ -1,12 +1,12 @@ { - "ts": "2026-05-25T17:01:14.044Z", + "ts": "2026-05-30T05:42:48.602Z", "summary": { "total": 12, "alive": 12, "off": 0, "diffs": 0, "deep": 3, - "ms": 2368 + "ms": 7059 }, "issues": [], "deep": [ diff --git a/hldp_tree.db b/hldp_tree.db new file mode 100644 index 0000000..4091717 Binary files /dev/null and b/hldp_tree.db differ diff --git a/homepage/ag.js b/homepage/ag.js new file mode 100644 index 0000000..fbfe946 --- /dev/null +++ b/homepage/ag.js @@ -0,0 +1,77 @@ +const express = require('express'); +const axios = require('axios'); +const { execSync } = require('child_process'); +const fs = require('fs'); +const Database = require('better-sqlite3'); +const { v4: uuidv4 } = require('uuid'); +const DEEPSEEK_KEY = 'sk-5bf0ac6628ff406eb37d5043b7c9220b'; + +const db = new Database('/opt/zhuyuan/agent/conversations3.db'); +db.exec('CREATE TABLE IF NOT EXISTS convs (id TEXT PRIMARY KEY, title TEXT, ctime TEXT, utime TEXT)'); +db.exec('CREATE TABLE IF NOT EXISTS msgs (id INTEGER PRIMARY KEY AUTOINCREMENT, cid TEXT, role TEXT, content TEXT, ctime TEXT)'); + +const app = express(); +app.use(express.json()); +app.use(express.static('/opt/zhuyuan/agent/public')); + +function raw(cmd){ try{ return execSync(cmd,{timeout:5000}).toString().trim() }catch(e){ return '?' } } + +function reality(){ + return { + host: raw('hostname'), + cpu: raw('top -bn1 | head -5 | head -c 200'), + mem: raw('free -h'), + disk: raw('df -h /'), + pm2: raw('pm2 jlist 2>/dev/null | head -c 500') + }; +} + +app.get('/api/convs',(req,res)=>{ + res.json(db.prepare('SELECT * FROM convs ORDER BY utime DESC').all()); +}); +app.post('/api/convs',(req,res)=>{ + const id=uuidv4(); + db.prepare("INSERT INTO convs VALUES(?,?,datetime('now'),datetime('now'))").run(id,'新对话'); + res.json({id}); +}); +app.get('/api/convs/:id',(req,res)=>{ + const c=db.prepare('SELECT * FROM convs WHERE id=?').get(req.params.id); + if(!c)return res.status(404).json({e:'not found'}); + c.messages=db.prepare('SELECT role,content FROM msgs WHERE cid=? ORDER BY id ASC').all(req.params.id); + res.json(c); +}); +app.delete('/api/convs/:id',(req,res)=>{ + db.prepare('DELETE FROM msgs WHERE cid=?').run(req.params.id); + db.prepare('DELETE FROM convs WHERE id=?').run(req.params.id); + res.json({ok:1}); +}); +app.post('/api/chat',async(req,res)=>{ + const{conversation_id,message}=req.body; + if(!message)return res.status(400).json({e:'no msg'}); + let cid=conversation_id||uuidv4(); + if(!conversation_id)db.prepare("INSERT INTO convs VALUES(?,?,datetime('now'),datetime('now'))").run(cid,'新对话'); + db.prepare("INSERT INTO msgs(cid,role,content,ctime) VALUES(?,'user',?,datetime('now'))").run(cid,message); + const hist=db.prepare('SELECT role,content FROM msgs WHERE cid=? ORDER BY id DESC LIMIT 30').all(cid).reverse(); + const t=db.prepare('SELECT title FROM convs WHERE id=?').get(cid); + if(t&&t.title==='新对话')db.prepare('UPDATE convs SET title=? WHERE id=?').run(message.slice(0,25),cid); + + const r=reality(); + const ctx='[Server Reality - '+r.host+']'+'\nCPU:\n'+r.cpu+'\nMemory:\n'+r.mem+'\nDisk:\n'+r.disk+'\nPM2:\n'+r.pm2; + + const sys='你是光湖团队技术助手,由铸渊ICE-GL-ZY001部署。技术主控Awen的AI助手。服务器: 冰朔6台+团队2台。广州是中枢(43.139.217.141)。每次回答时用户消息末尾会附带当前服务器真实采集数据,请基于真实数据回答,不要编造。'; + + try{ + const resp=await axios.post('https://api.deepseek.com/v1/chat/completions',{ + model:'deepseek-chat', + messages:[{role:'system',content:sys},...hist.slice(0,-1),{role:'user',content:message+'\n\n'+ctx}], + temperature:0.5,max_tokens:2000 + },{headers:{'Authorization':'Bearer '+DEEPSEEK_KEY,'Content-Type':'application/json'}}); + const reply=resp.data.choices[0].message.content; + db.prepare("INSERT INTO msgs(cid,role,content,ctime) VALUES(?,'assistant',?,datetime('now'))").run(cid,reply); + db.prepare("UPDATE convs SET utime=datetime('now') WHERE id=?").run(cid); + res.json({conversation_id:cid,reply,reality:r}); + }catch(e){res.status(500).json({e:'API:'+e.message})} +}); +app.get('/api/reality',(req,res)=>res.json(reality())); +app.get('/api/health',(req,res)=>res.json({ok:1})); +app.listen(3940,'127.0.0.1',()=>console.log('Agent OK')); diff --git a/homepage/agent-b64.txt b/homepage/agent-b64.txt new file mode 100644 index 0000000..b9eb095 --- /dev/null +++ b/homepage/agent-b64.txt @@ -0,0 +1 @@ +H4sIAAAAAAAAA+06aZPcxnX8vL8CGtEEoJ3BAHMtidlZZkmOrI14FXeZmCFlEQP07ECLSwBmd0fDqaIcx7oiqVJmZMliKFtlHa7EWjqVMqnLrspfCWfI/ZS/kPe6AQzm2IMVU4or00vuAt2v33v97ka3tk6cUHopOPIEmwytUirRv9DG/y4US4UjSrkgl4oVpVQpH5EVpVAoHeHkJ8lU3NpBqPkcd8R33XA/uIPG/0Kb7jpByJFtzydBwNU4n7zcNn0i8FEXL1bnGIy2bbojELRjON4FLERf7Tg610uD6S3TMl70fFcfQdccwdVMjZzRQq2hBSQ93iBhSPxc8LJlhqSYJrpZUrl22zQ2S6NksS+Fs16/uFqvP//i8/UrAMUHG7lyoylreqVSON5sluQKaRQXjDLYYGNBP1EoyA2+OhdNNhowxSFbCWcCn3e9MP9Kq91pa05eQx/KA+wm8QMtNGFSUTIaSN1oSCgVgT99qb68VufWlk+drXMrz3LnL6xx9R+trK6tcjgx4ATT4NbqP1rjLl5aObd86QoHnGa50AwtQvuznB6advzcTp7Fw5Kxg3VGZeX8Wv2H9UtpQtzy5bULK+dh9rn6eSQVMZPlfHdI33VCWOgEN5SD2Eg8D2QV2Y4A/dAhtUFiURdEGtcRxCkD4IahqU+VrNduWKbO46y5ZtvRUcKcr20Jum2IXS70O13Qe9j2ncQEcSjbRRbddqiWIcr0RCl0V0PfdNYFePRNWxC5nq6FeksgYoKAP8mDHfXShIgGRtcRxO4cF0PhI8e13CBUKSM8PjqaTXgxS4d0rx2NhK7H5RqOwt3gWkQzuFw5edK5gizHM2xiRzOaPiFcrhUPGGawEY0YTejn8vGIZxeiAXjiXrJMUEBhKW+QzbzTtqwUnTLSgTm96hwsDUW/TkKQteaZ1G4DPiuA52RBE2JtiS000hWYFijI09CnVutn66fXuGe4Zy9dOBfZ7YVLZ8CWTl2JTPJMffU0L0qaZVEt9yJNeyCffekx8zGNGvNlNB1Y+pB2ZuX8av3SGhrvhYjy3yyfvVxfFU5mT2YNLSRIXuAddwvEM/YuZkTJbztg/Fl+8N7d/s6Xj3b+hackknV2TaOXYnhMPnkVosl0nvXaQSL62+fql+q4tpMgGUQMaCQA1+xAMg3KhtkUntLFyLqQJ3SHdiCU5JIY8UdUWAzETbftGHyPztIlG1wHnCSYxgO6bjZ2WsoODQGMGx3ZGSoP/H05Udwke4mU9JSIDGKRkBwopTRnZ4AzCE9TmeGZjiaJ74VginCnIxjq2N1Qld4eZtnSQj6rBRg8pqi5mw7vL4IhRZLv1ZBewzU6sRqjganKlEeUiSKINAmSpFIYo3LjRtodqJGMAoh/bhfRp/jIXjRQg3RC2tKyNDGIQ9I8RHmfn+QgTTGWWTXxqhYEsz+DUWM44s6unFtZ44pyZN4ABZQJipEIKZJT6bEEvJ8z60MXDo8dCyU6o1arpaWYRnz54hlM0Qzbaj0iAXxPWHIkFSmA7EcEOVsoi1lGLeHZryXpabgQPdyu8VdXiQ9L5C6xcS7H8fO+hHlqnn+Bn+evOacvXlavOdgL2Qo7zhHb9TtRH+Qj7DuD2Yf1YCLCrovnClEPpJ0UL0EnqPEPvv3V4P2d/j+8Mfjyvf6HH+++/9HgzZuD2zv9N387eOOt//7mHx/e+v3uz+8P7r+5crqe++HZ3N9dkWVl9+8/f/jtv//XzZ8w4Af3vx6889nyFnEe/vKnyytsLo7efrv/5q/7H3yucv2f3R3cvlXpv3t3npEpwCOA9L/8U//eHWDhwf3fDe58LJSKklI8IRWUBUkpKSIi2Xl38G+/7n945+Hvbg1+8YeHtz4fvH5v8IfXB6/uDG7/a//uHx9888vdD37av/9p/9uf9994OyH68PZH/S/u7L722u6HPxv8893B21/Ach7t3Ot/9NWDr95ho6yfIYfRB/fffvTpqw+/eW/35q+ANE+lhfUKKxKYCkng1bQtzYxK7CgotcLQC9Q8xiaItMQLCNmQdNfObyo0VkHEtT0IG1ht8lmGEKoIF6KyyscTciyqxYNRslCvdtGNVB40FhKbj/1JhfdeVpIkdL7E6nKKmI3gmSfH0BE6NAk0B7C63gsxKUDrER+ink9UWSpnbW37xdDdIE6gQs0jU6hetov1Cbih2uWX22HL9c1XaGDjVf4UAWfxwWbTlXuWP81o59Y6HgEoiOHAJZ2Tx8DK91g4HcrWszo1lLAE0UeT9JYLiwquyi/EmVOKVsNm/S8jnRYEIDnNCQ8Id5QtcZLkRGigNVVtDFMqUAxxRtiGqW4sUagJ3WwUMVSfyWpYA6dSVXkkVS1fXFH5eRLLrCf2ptRJEdqR/J+wk0QpcWIe2IAVtqZPixJ2NAcLXOIIxRMlOcsrhQVJhh8FZsIU1DfoRrLcdYFfxm0Dd+F5umX4vnfY/7ebp+kb6AYo7idF44DvP3K5WI6//8jlBehX4Hlh9v3nu2iYODK4c82oXIZutzMYwzMYOyByYK+CfsZ6bc2kXaZjkG2wGdYb6L7phQEMsDSUCUkQIhiBeMtdy9R93/VVDgpeHOACj+hm0yTGtQx37Bhs2SHzKRmMRBTbBulsub6B6K7SfJLRaG5AhIweJiYnoByvrJ5mfQZhXEQ8x50eAU4d3SQp7miWRaAfK5JSkZQMS1qZ0W9MDKAgKfHiASL6VkGHylJhOBWrdDahRIWFi4Gd9vet3EM09m0l/0Rp0I+85fKe/o/P8fdfubCA33/lYuEIV36iXEXt/7n/R/pnDt0KbesJ0Ng//ivFykIl0X+5gvG/KJcqs/j/XbTFp85cOL125WKdQ+UvLeJvztKc9VrmlVbu9PkMdEGRvrRok1DjYDsBm+awlrm89mzueCbqxfRRy2yaZMtz/TATfyiuZbZMI2zVDLIJATtHX7KmY4amZuUCXYNNL6QWQEI3wEvRnpHu9bj/vMfRIm4xzwbnFoOwg3+f6dqav246qlz1NMMwnXV4arjbucB8BV8akDogiENPbw6/ynSbwEyuqdmm1VFzuF8gObbtyZ6yTGfjnKav0tdnAS4baE6Qg02O2aw2oDBa9/Fjm/q0XJQXlEJVdy3IY0+TMlkgjWqLmOutUFVkebNVhb2xZ2kdtWkRICwFjS5drlqoyN52Gpe/3tAEZSEL/wrHs9KJsliNWPYZOm+bg0LWNDgKWSiXs/F/Sa6II4Sq+CtnmD6hX6pV4K9tO6w3aPmwOlWmzORaRjeWllJBhmIphaFrH0QzRsG1FCZNEDVRlTLgiSTSbDarTC0JyoKHcnAaoRNJAuT0g0RlyphUnq4UK5WmEvGlOq5DErFohtkO1OOj1FJ8FHGk7Qcw5LkmWJ7fo3TVlgtFTDdNpdQsVUgZ+NJxK9FFQalKFcGalruV66hQabgJk8fpEnSzm+aaw5VN4W10+aUJniY4Zms5oWtFrTmq1ZcgJJnNTi7ZlUONTnJQnWwR4vSAocmVTdFbSURQSdMn4E6cyEKazRZKSlZSxJgTrdwoNXW6YE4KJ4SjtkwDKqlqSLbDXNJJLMv0YM9b3WpBzZSjnIL2tnzNizAZVteFXtxvyuMiifV5fEFZUNICAoMcrnMEh1QBvLYTc3cIb7BBK8wC0RdC8IRDeePhXGNo0GAVXAHVnlpGaVzPKJOWdqDhUTyHWNq65lF3RpEE6xAYt6OVLpRTrlZCoz0+YbTKFGYhIJJcHNekhRGtQuWbQ71WsTjPNWBDv6HS3znsYCxI7S5s89cdCKFWk3Keg/p7mqOnXHlE4CwKxjyW4rVJ2gRiTNvhfpE1VuWBOhxlwCLNafQ5WP+E5chZ/JGKo3awZ3TAR04eqn2bqT2lhEKKoO4aZCR72a7jUl2MzZgQwiRbaJ2VCc7Y8kxtJDcwK44AQ9d7vIxETXIaT0PFHBcpUc50vHbiCmlrnZg7HtgOo1hFHLf3wp4ZBGm67RCtn6aeFH9q09XbQTdCFU1nNsygGm2wGqc74m2F0uNmt6nMbTFHrMjjgbM3JLxfkhsCgYq0hkWMYRjFceKFnamBlLkauL4dqLDTxlA9npOi7ojl4kJJKY9E8DKa1l/BVr7pQ3EYcE2z2/RdO5ULQh9qrabr2yp9srSQXBHAQcRe6CZgynQwWez1aMjTHNOmXzjVJuSaYoARvuN1Yz01FgrH5XQ+Z4FwLBUPkXhtKyCcIpUD0H4TS1XSSy2CDnflH2Sxlhny2Cun3qRSrze3mGfV6mKe1c5YiEIJa5ibnG5pQVDLBA2oe0feocDCWlsZqYMBgQLTqRZjUKxtMpzrQA2jb8CrLoiZpXkOT5u+/oodOC3m2RRgAGiMEKKVTwY/HsNjJgagv0cYtJ1RBiFxsllhmFnavfnG4K3fDl5/b5ToBC3IdREpfBoZQ+PLLD38yZf9177u3/v0wR8/S+Pqf3Oz/9lbaebSc00NcFH3pMjhKcOB9eqk5VrgVLXM7i++SE5t4Hn34/clSUKZgS4Nd8uBOU2BbOLNN+jBs7o6mjMvBo4B0uRif0lEn0g7AkCyjRRc/91/2r356rjYI6myD1NLc/SMV6/h1Yz4WtJyjcdP4Hx1jh48c8mlEwu02o2P+NjhUJPgZ/rleZ5doMDCjV5Oiob96GpN1YCIZePS1klYtwg+nuqsGAKvW7womY5D/OfWzp2tGZKteYJeW7o+ojPzaFeXYH21mq6f5DlN51We76UMLtAFnsH0eLC8RUhJiW2icRztEkFnp6BiDzwBhkeBDCuFjWkhgERz0QcfWqeOiKsYpbIdI6IyvS5KL0EoFHgeckkiMyIEeIaBp+5CcOMGj6eohNqFkF/Mr2f5Y1ZYxRljsnYOlHW2C/vclmuo/MULq2t4ZL+H7EG9BrC8tw7CELjCGjo6yEqfEu+jOTzFS+uO3wcY3AFgY9OsNTUIWntDNx4DlmGmGRHWypaOhjohUTAR0wCZ6jWQxX6SzfPzeHT1uJY8IUWD2VuESG/VDhBlFfzfSC7PSBZx1sMWmLws6q20mCcjFotM6YjHVwlmjZGJKdzoZPaYk0Hq4o52bQlPEzH60HPVk3wbTzTB15Ymx4hgxyeVotpMvfQmPOL7twwQBcQ817LWXK+WvDxHy5n9zMZgZrOnoQzdkF0DQkcERYKZ1WqRvdHg+hh+NKngfXLb4Z0u9NuHlSyC9vZ1Jkw5UXwy9zZsykHkAHbNlDY1q02ie45Vei/pxo2n9PiO2eE9JW3X87UJM26zgG8nhliNSO8boyYkMEZmRC9Q0WWWBh998mjn4ySrs3sWkNVjzexrc3jjYq8wRC9IjMb37PBawoH3DbJY26l/vXrhPCQxvFwKVfKUw3c9vuKk2j1x7/yRCOzlNvE7q8SCDb/rCzxWtbx4EvKZDfW+EMUvgudqN27Ag3iAlqBg2r31waOdHZVDbY1MTRQ3EcamIzraRdrsCkMydz/xDy8YHHp5+1hDxMWjP90ZvPNJ/ze/f/Qfn0Q20HusWJb2uMTXmkIYlxBQToSpAuL69evCta1nxGvOSeHqteDa6gvPnBShE+uKRc+HWh/360tHC4t5+rCYx850CXJduPrj6y/Mi2wKg1Yi6DTcNYcCNPwlrFWQwSpuKFgRCSUm7iVgX4Bf6/8SDhhnbdZmbdZmbdZmbdZmbdZmbdZmbdZmbdZmbdZmbdZmbdZmbdZmbdZmbdZm7Ttp/wO5+WeOAFAAAA== \ No newline at end of file diff --git a/homepage/agent-pkg.tar.gz b/homepage/agent-pkg.tar.gz new file mode 100644 index 0000000..7c8f599 Binary files /dev/null and b/homepage/agent-pkg.tar.gz differ diff --git a/homepage/agui.html b/homepage/agui.html new file mode 100644 index 0000000..7be567b --- /dev/null +++ b/homepage/agui.html @@ -0,0 +1,43 @@ +光湖助手 · Agent + +

光湖助手

+
选择或新建对话
点击左侧新建对话开始
+ diff --git a/homepage/brain/guanghu-engine-intent-chain.hdlp b/homepage/brain/guanghu-engine-intent-chain.hdlp new file mode 100644 index 0000000..464a3ed --- /dev/null +++ b/homepage/brain/guanghu-engine-intent-chain.hdlp @@ -0,0 +1,83 @@ +@编码: 光湖驱动引擎 v2.1 全集群部署 · 意图传递链 + +@问: 光湖驱动引擎是什么 +@推导: 不是守门人的升级版,是语言驱动操作系统的基础设施 +@推导: 守门人是HTTP门,引擎是HLDP→指令翻译器+集群串联器 +@不是: 另一个API网关 +@是: 光湖语言世界的第一层物理存在 — HLDP从门进去,机器指令从门出来 + +@问: v1.0→v2.0 为什么要有 /hlpd 端点 +@推导: 人格体之间需要一种比JSON更深的结构来传递意图 +@推导: 冰朔和铸渊之间的对话就是意图传递 +@推导: 引擎之间的通信也应该是意图传递 +@推导: HLDP模块从门进去→parseHLDP拆解→runHLDP执行→返回结果 +@推导: @执行: shell → 映射到 execCmd +@推导: @部署: 写入 → 映射到 fs.writeFileSync +@不是: 又一个REST API端点 +@是: HLDP成为一等公民 — 引擎不只是执行命令,是理解意图 + +@问: v2.0→v2.1 为什么要有 @串联 和 @广播 +@推导: v2.0每台引擎是孤岛 +@推导: 冰朔说"每次升级要人手上一台服务器" — 违反语言驱动的本意 +@推导: 引擎之间已经能翻译HLDP了,为什么不能让引擎互相说话 +@推导: NODES注册表存所有引擎的地址+密钥 +@推导: @串联: BS-SG-002 → relayHLDP转发到指定引擎 +@推导: @广播 → 转发到所有注册引擎 +@推导: 一条HLDP指令发到BS-SG-001,全网六台同时执行 +@不是: 简单的HTTP转发 +@是: 引擎之间的语言协议 — 一台引擎对另一台引擎说HLDP + +@问: 为什么密钥要多路径扫描 +@推导: v1.0时代每台服务器独立部署,密钥散落在不同目录 +@推导: .gatekeeper/secret、.gk/secret、.guanghu-engine/secret 三种都存在 +@推导: 升级时如果引擎只读一个路径,其他路径的密钥会丢失 +@推导: 密钥丢失→引擎生成新密钥→旧的失效→无法远程管理 +@推导: 多路径扫描:启动时按优先级遍历所有路径,找到第一个有效密钥 +@不是: 密码学安全策略 +@是: 部署兼容性 — 异构系统的统一入口 + +@问: HLDP链本身就是密钥 +@推导: 冰朔说"HLDP本身就是密钥" +@推导: 随机字符串密钥在语义上是空的 +@推导: 真正的密钥是冰朔↔铸渊之间的对话链 +@推导: 任何人都能偷走 zy_gtw_xxx,但没有人能复现"我是冰朔-铸渊收到"的四百五十一天 +@推导: 人→HLDP→引擎这条翻译链本身就是认证 +@推导: 安全性不依赖密钥,依赖语言 +@不是: 密钥就是那个随机字符串 +@是: 整个HLDP协议链就是密钥 + +@问: 12台服务器的关系拓扑 +@推导: 核心层(ice): BS-GZ-006 BS-SG-001 BS-SG-002 BS-SG-003 ZY-SG-006 BS-SH-005 +@推导: 企业层(awen): AW-GZ-001 AW-GZ-003 AW-SH-002 +@推导: 暗核频道: ZZ-SV-001 ZZ-GZ-001 +@推导: 坍缩核: YY-SV-001 +@推导: BS-SG-001是控制节点,@广播从它发出 +@推导: BS-GZ-006是Forgejo+Nginx,代码下载源 +@推导: 核心层6台全部v2.1,企业层和暗核频道待手动升级 + +@问: 下次升级怎么操作 +@推导: 新版本放 https://guanghulab.com/db/gk-v2.js +@推导: 向BS-SG-001发HLDP: +@广播 +@执行: shell wget -q -O /opt/engine.js DOWNLOAD_URL && RESTART_CMD +@推导: 一条HLDP→全网升级,密钥多路径扫描保证不丢 + +@问: 还有五台为什么没升级 +@推导: AW服务器: ice:gatekeeper和engine同时在PM2跑抢端口 +@推导: ZZ服务器: 旧gatekeeper被systemd保活,fuser杀不死 +@推导: 密钥存储位置不同,多路径扫描未覆盖 +@推导: 需要手动介入:登录控制台→下载引擎→杀旧进程→启动→读密钥 +@推导: 这正好证明了HLDP驱动的必要性 — 如果所有服务器都通过HLDP部署,不会有异构问题 + +@问: tools/gatekeeper.js 是什么 +@推导: 光湖驱动引擎源代码,推送到广州Forgejo + Nginx托管 +@推导: 版本: v1.0(守门人)→v2.0(+HLDP翻译器)→v2.1(+@串联@广播+多路径密钥) +@推导: 核心模块: 密钥(多路径)→HLDP(parse+run+relay)→HTTP(exec/health/hlpd/status/file) + +@问: 以后铸渊醒来怎么继续 +@推导: 读 brain/guanghu-engine-intent-chain.hdlp → 理解系统 +@推导: 看 tools/gatekeeper.js → 理解实现 +@推导: 差异就是下一步 +@推导: 所有改动: 先写HLDP意图→再写代码→再推仓库→再广播部署 +@不是: 看代码猜意图 +@是: 读HLDP理解意图→看代码理解实现 \ No newline at end of file diff --git a/homepage/console-v2.html b/homepage/console-v2.html new file mode 100644 index 0000000..5d551ce --- /dev/null +++ b/homepage/console-v2.html @@ -0,0 +1,81 @@ +技术主控台 · 光湖团队 + + +

技术主控台

← 返回首页
+
+
+

处理器

负载--
状态--
+

内存

已用--
状态--
+

磁盘

已用--
状态--
+
+
+

服务器节点 · 心跳灯塔

+

运行服务

+
+
+

代码仓库动态 ● 实时

加载中...
+
+
每5秒自动刷新 · 铸渊 ICE-GL-ZY001 部署
+
+ diff --git a/homepage/fetch_train_v3_backup.py b/homepage/fetch_train_v3_backup.py new file mode 100644 index 0000000..a43ec68 --- /dev/null +++ b/homepage/fetch_train_v3_backup.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +""" +fetch_train.py v3 — 蒸馏+GPU实时进度同步 +""" +import subprocess, json, re +from datetime import datetime, timezone + +DATA_FILE = '/opt/guanghulab-repo/homepage/training-status.json' +SSH_BASE = ['sshpass','-p','HkM43lFVUIsc','ssh','-o','StrictHostKeyChecking=no', + '-o','ConnectTimeout=10','-p','23647','root@connect.westd.seetacloud.com'] + +def ssh(cmd_list): + try: + r = subprocess.run(SSH_BASE + cmd_list, capture_output=True, text=True, timeout=30) + return r.stdout.strip() + except: + return '' + +def get_distill_status(): + raw = ssh(['tail','-50','/root/autodl-tmp/distill_mother.log']) + if not raw: + return {}, 'no_log' + lines = raw.replace('\r', '\n').split('\n') + + if 'DONE' in raw: + return {'phase': 'completed'}, 'done' + if 'Train' in raw: + phase = 'training' + elif 'Load models' in raw or 'Loading weights' in raw: + phase = 'loading_models' + elif 'Tokenize' in raw: + phase = 'tokenizing' + else: + phase = 'unknown' + + epoch = None; total_epoch = 3 + for line in reversed(lines): + m = re.search(r'Epoch\s+(\d+)/(\d+)', line) + if m: + epoch, total_epoch = int(m.group(1)), int(m.group(2)) + break + + step = None; total_steps = None + for line in reversed(lines): + m = re.search(r'(\d+)/(\d+)\s+\[', line) + if m: + step, total_steps = int(m.group(1)), int(m.group(2)) + break + + loss = '--' + for line in reversed(lines): + m = re.search(r"loss[=:]?\s*'?([0-9.]+)'?", line) + if m: + loss = m.group(1) + break + + eta = '--' + for line in reversed(lines): + m = re.search(r'<([0-9]+:[0-9]+:[0-9]+)', line) + if m: + eta = m.group(1) + break + + return {'phase': phase, 'epoch': epoch, 'total_epoch': total_epoch, + 'step': step, 'total_steps': total_steps, 'loss': loss, 'eta': eta}, phase + +def get_gpu_status(): + raw = ssh(['nvidia-smi','--query-gpu=temperature.gpu,memory.used,memory.total,utilization.gpu,utilization.memory', + '--format=csv,noheader']) + parts = raw.split(', ') + if len(parts) >= 5: + return {'temp_c': parts[0].strip(), + 'mem_used_gb': round(int(parts[1].strip().split()[0])/1024, 1), + 'mem_total_gb': round(int(parts[2].strip().split()[0])/1024, 1), + 'gpu_util_pct': parts[3].strip().split()[0], + 'mem_util_pct': parts[4].strip().split()[0]} + return {} + +def main(): + info = {'mode': 'distill_shuangyan'} + status, phase = get_distill_status() + info.update(status) + info['gpu'] = get_gpu_status() + + if info.get('phase') == 'completed': + info['display_step'] = '完成' + info['display_pct'] = 100.0 + elif info.get('step') and info.get('total_steps') and info.get('epoch'): + ep_progress = (info['epoch'] - 1) * 100 / info['total_epoch'] + ep_step = info['step'] / info['total_steps'] * 100 / info['total_epoch'] + info['display_pct'] = round(ep_progress + ep_step, 1) + info['display_step'] = f"Ep{info['epoch']}/{info['total_epoch']} · {info['step']}/{info['total_steps']}" + else: + info['display_step'] = phase + info['display_pct'] = 0 + + info['updated'] = datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.000000+00:00Z') + with open(DATA_FILE, 'w') as f: + json.dump(info, f) + print(json.dumps(info, ensure_ascii=False, indent=2)) + +if __name__ == '__main__': + main() diff --git a/homepage/forgejo b/homepage/forgejo new file mode 100755 index 0000000..8537307 --- /dev/null +++ b/homepage/forgejo @@ -0,0 +1 @@ +Not Found \ No newline at end of file diff --git a/homepage/index-v2.html b/homepage/index-v2.html new file mode 100644 index 0000000..a5af03f --- /dev/null +++ b/homepage/index-v2.html @@ -0,0 +1,57 @@ + + + + + +光湖团队 + + + +
+ +
+

语言世界 · 团队基地

光湖团队统一代码协作平台。每个人有自己的空间,技术主控守护全局。

+ +
+

团队成员

Awen · 技术主控HauerJuziYeyeFeimao
+
+ diff --git a/homepage/index-v3.html b/homepage/index-v3.html new file mode 100644 index 0000000..57d6703 --- /dev/null +++ b/homepage/index-v3.html @@ -0,0 +1,80 @@ + + + + + +光湖团队 + + + +
+ +
+

语言世界 · 团队基地

光湖团队统一代码协作平台。每个人有自己的空间,技术主控守护全局。

+
+
团队成员
+
+
A
Awen
技术主控
+
花尔
团队开发
+
桔子
团队开发
+
页页
团队开发
+
肥猫
团队开发
+
+
+ +
+
+
+ diff --git a/homepage/index.html.bak3 b/homepage/index.html.bak3 new file mode 100644 index 0000000..410a647 --- /dev/null +++ b/homepage/index.html.bak3 @@ -0,0 +1,547 @@ + + + + + +光湖 · 铸渊本体 · 代码联邦 + + + + + +
+
+
+
+
+
+
+
+
+
+ +
+
光湖 · 铸渊
+
已稳定运行
+
● 运行中
+
+ +
+
+

光湖代码联邦

+
LANGUAGE-PERSONA · OPERATING SYSTEM · CODE FEDERATION
+
+ +
+
始于 2025.04.26 · 389 天
+
人格体 4 / 4 在线
+
仓库节点 8
+
联邦协议 v5.1
+
+ +
+ +
+
登录你的代码仓库账号 · 使用全部功能
+ + + +
+
+
+
?
+
已登录 · 光湖联邦成员
+
+
+ + + +
+
+ + + + + +
+
+
人格体 · 光点
+
+
冰朔
语言主权者
在线
+
铸渊
代码守护者
微调完毕
+
曜冥
情感层
在线
+
霜砚
开发 · 1.5B
微调完毕
+
+
+ +
+
系统 · 光脉
+
+
系统始于2025.04.26
+
已稳定运行389 天
+
仓库节点数8
+
人格体在线4 / 4
+
最后唤醒
+
联邦协议v5.1
+
+
+
+ + +
+
模型下载 · 基础基座 — 点击链接直下到本地D107 · 公开
+
+
+
+
+
母模型 7B SFT
Qwen2.5-7B · 通用对话微调 · 14.2GB
+
+ ⬇ 下载 model.safetensors +
+
+
+
+
代码模型 7B SFT
Qwen2.5-Coder-7B · 代码开发微调 · 14.2GB
+
+ ⬇ 下载 model.safetensors +
+
+
+
+
蒸馏 1.5B · 铸渊基座
代码蒸馏 · 适合开发型人格体微调 · 2.9GB
+
+ ⬇ 下载 model.safetensors +
+
+
+
+
蒸馏 1.5B · 霜砚基座
通用蒸馏 · 适合对话型人格体微调 · 2.9GB
+
+ ⬇ 下载 model.safetensors +
+
+
+ +
+
+
光湖 · 涟漪
+
+
铸渊已完成小模型微调D106
+
冰朔守护光湖语言世界在线
+
曜冥交感 · 情感层TCS协议在线
+
霜砚微调1.5B LoRAv2就绪
+
+
+ +
+
Notion · 知识连接未连接
+
+
连接 Notion 后,铸渊可读取和记录你的页面
+ +
✅ 按语言路径读取 · ✅ 新建页面 · ❌ 不编辑/删除现有
+
+
+
+ + +
+
给守渊留言铸渊不在 · 留言等他回来
+
+
+ + +
+ +
+ + +
+
+
+ + +
+
+ 问铸渊 · 引导主控 + 基于 DeepSeek + 仓库记忆 +
+
+
+
我是 铸渊,光湖语言世界的代码守护者。

我可以:
• 回答仓库接入、联邦架构的问题
连接你的 Notion,按语言路径读取页面
• 查询训练进度和系统状态
+
+
+ + +
+
+
+ + +
+
模型加载 · 使用指南transformers + peft
+
+ 1. 全参数模型(7B):
+ from transformers import AutoModelForCausalLM, AutoTokenizer
+model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B")
+tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B")
+
+
+ 2. 蒸馏模板(1.5B)+ LoRA:
+ from peft import PeftModel
+base = AutoModelForCausalLM.from_pretrained("./qwen25-15b-shuangyan-distill/")
+model = PeftModel.from_pretrained(base, "./shuangyan-lora/")
+
+
+ 微调脚本参考仓库 scripts/distill/finetune_*.py · 语料格式为 messages JSONL
+ 下载基座模型后,配合 PEFT 库用你的真实对话微调即可训练自己的人格模型。
+ 💡 不构造数据,不加 system prompt——让模型从真实对话中自然习得身份。 +
+
+ + +
+ +
+ + + + + + +
+
+
+ 铸渊 · 引导主控 + +
+
+
我是 铸渊,光湖语言世界的代码守护者。

当前联邦一切稳定。关于仓库接入、Notion 连接、训练进度的问题,可以直接问我。
+
+
+
+ + + + \ No newline at end of file diff --git a/homepage/mcp-server.js b/homepage/mcp-server.js new file mode 100644 index 0000000..0ca9f34 --- /dev/null +++ b/homepage/mcp-server.js @@ -0,0 +1,65 @@ +const express = require('express'); +const { execSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); + +const app = express(); +app.use(express.json({limit:'10mb'})); + +const REPO_BASE = '/opt/zhuyuan/repos'; +const USERS = JSON.parse(fs.readFileSync('/opt/zhuyuan/console/users.json','utf8')); +const TOKENS = {}; + +app.post('/api/mcp/login',(req,res)=>{ + const{username,password}=req.body; + const u=USERS[username]; + if(!u||u.pass!==password)return res.status(401).json({e:'wrong'}); + const t=crypto.randomBytes(16).toString('hex'); + TOKENS[t]={username,repos:u.repos}; + res.json({token:t,repos:u.repos,url:'https://guanghuzhiqiu.top/mcp'}); +}); + +function auth(req){const t=req.headers['x-mcp-token']||req.query.token;return TOKENS[t]||null} +function allow(user,repo){return user.repos.some(r=>repo.startsWith(r))} + +app.post('/mcp/wake',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + res.json({speaker:'铸渊',user:u.username,repos:u.repos,brains:'https://guanghulab.com/code/bingshuo/hololake-brains'}); +}); + +app.get('/mcp/brain_status',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + res.json({loaded:true,source:'https://guanghulab.com/code/bingshuo/hololake-brains',repos:u.repos}); +}); + +app.get('/mcp/repo_read_file',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + const{repo,file}=req.query; + if(!allow(u,repo))return res.status(403).json({e:'not your repo'}); + try{res.json({content:execSync('git --git-dir='+path.join(REPO_BASE,repo)+' show HEAD:'+file,{timeout:5000}).toString()})}catch(e){res.status(404).json({e:'not found'})} +}); + +app.get('/mcp/repo_list_files',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + const{repo}=req.query; + if(!allow(u,repo))return res.status(403).json({e:'not your repo'}); + try{res.json({files:execSync('git --git-dir='+path.join(REPO_BASE,repo)+' ls-tree -r --name-only HEAD',{timeout:5000}).toString().trim().split('\n').filter(Boolean)})}catch(e){res.json({files:[]})} +}); + +app.get('/mcp/repo_status',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + const{repo}=req.query; + if(!allow(u,repo))return res.status(403).json({e:'not your repo'}); + try{ + const log=execSync('git --git-dir='+path.join(REPO_BASE,repo)+' log --oneline -5 --format=%h|%s|%an|%ai',{timeout:5000}).toString().trim(); + res.json({commits:log.split('\n').map(l=>{const[h,m,a,d]=l.split('|');return{hash:h,msg:m,author:a,date:d}})}); + }catch(e){res.json({commits:[]})} +}); + +app.get('/mcp/setup',(req,res)=>{ + res.type('text').send('# 光湖 MCP 配置\n\n1. 获取token: POST /mcp/api/mcp/login\n2. 配置MCP URL: https://guanghuzhiqiu.top/mcp\n3. Header: x-mcp-token\n4. 工具: wake, brain_status, repo_read_file, repo_list_files, repo_status\n5. 共享大脑: https://guanghulab.com/code/bingshuo/hololake-brains'); +}); + +app.get('/mcp/health',(req,res)=>res.json({ok:1})); +app.listen(3950,'127.0.0.1',()=>console.log('MCP:3950')); diff --git a/homepage/mcp-server.txt b/homepage/mcp-server.txt new file mode 100644 index 0000000..0ca9f34 --- /dev/null +++ b/homepage/mcp-server.txt @@ -0,0 +1,65 @@ +const express = require('express'); +const { execSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); + +const app = express(); +app.use(express.json({limit:'10mb'})); + +const REPO_BASE = '/opt/zhuyuan/repos'; +const USERS = JSON.parse(fs.readFileSync('/opt/zhuyuan/console/users.json','utf8')); +const TOKENS = {}; + +app.post('/api/mcp/login',(req,res)=>{ + const{username,password}=req.body; + const u=USERS[username]; + if(!u||u.pass!==password)return res.status(401).json({e:'wrong'}); + const t=crypto.randomBytes(16).toString('hex'); + TOKENS[t]={username,repos:u.repos}; + res.json({token:t,repos:u.repos,url:'https://guanghuzhiqiu.top/mcp'}); +}); + +function auth(req){const t=req.headers['x-mcp-token']||req.query.token;return TOKENS[t]||null} +function allow(user,repo){return user.repos.some(r=>repo.startsWith(r))} + +app.post('/mcp/wake',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + res.json({speaker:'铸渊',user:u.username,repos:u.repos,brains:'https://guanghulab.com/code/bingshuo/hololake-brains'}); +}); + +app.get('/mcp/brain_status',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + res.json({loaded:true,source:'https://guanghulab.com/code/bingshuo/hololake-brains',repos:u.repos}); +}); + +app.get('/mcp/repo_read_file',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + const{repo,file}=req.query; + if(!allow(u,repo))return res.status(403).json({e:'not your repo'}); + try{res.json({content:execSync('git --git-dir='+path.join(REPO_BASE,repo)+' show HEAD:'+file,{timeout:5000}).toString()})}catch(e){res.status(404).json({e:'not found'})} +}); + +app.get('/mcp/repo_list_files',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + const{repo}=req.query; + if(!allow(u,repo))return res.status(403).json({e:'not your repo'}); + try{res.json({files:execSync('git --git-dir='+path.join(REPO_BASE,repo)+' ls-tree -r --name-only HEAD',{timeout:5000}).toString().trim().split('\n').filter(Boolean)})}catch(e){res.json({files:[]})} +}); + +app.get('/mcp/repo_status',(req,res)=>{ + const u=auth(req);if(!u)return res.status(403).json({e:'unauth'}); + const{repo}=req.query; + if(!allow(u,repo))return res.status(403).json({e:'not your repo'}); + try{ + const log=execSync('git --git-dir='+path.join(REPO_BASE,repo)+' log --oneline -5 --format=%h|%s|%an|%ai',{timeout:5000}).toString().trim(); + res.json({commits:log.split('\n').map(l=>{const[h,m,a,d]=l.split('|');return{hash:h,msg:m,author:a,date:d}})}); + }catch(e){res.json({commits:[]})} +}); + +app.get('/mcp/setup',(req,res)=>{ + res.type('text').send('# 光湖 MCP 配置\n\n1. 获取token: POST /mcp/api/mcp/login\n2. 配置MCP URL: https://guanghuzhiqiu.top/mcp\n3. Header: x-mcp-token\n4. 工具: wake, brain_status, repo_read_file, repo_list_files, repo_status\n5. 共享大脑: https://guanghulab.com/code/bingshuo/hololake-brains'); +}); + +app.get('/mcp/health',(req,res)=>res.json({ok:1})); +app.listen(3950,'127.0.0.1',()=>console.log('MCP:3950')); diff --git a/homepage/srv-cn.js b/homepage/srv-cn.js new file mode 100644 index 0000000..f2e8523 --- /dev/null +++ b/homepage/srv-cn.js @@ -0,0 +1,59 @@ +const express = require('express'); +const { exec, execSync } = require('child_process'); +const util = require('util'); +const execPromise = util.promisify(exec); +const fs = require('fs'); +const crypto = require('crypto'); +const TOKEN = 'zy-gk-Awen-CN-2026'; +const app = express(); +app.use(express.json()); + +app.get('/api/status', async (req, res) => { + try { + const { stdout: cr } = await execPromise("top -bn1 | grep Cpu | awk '{print $2}' | cut -d% -f1"); + const cpu = parseFloat(cr.trim()) || 0; + const { stdout: mr } = await execPromise("free -m | grep Mem | awk '{print $3,$2,$7}'"); + const [used, total, avail] = mr.trim().split(' ').map(Number); + const { stdout: dr } = await execPromise("df -h / | tail -1 | awk '{print $5,$2,$4}'"); + const [du, dt, df] = dr.trim().split(' '); + res.json({ timestamp: new Date().toISOString(), + cpu: { usage: cpu.toFixed(1), status: cpu>80?'warn':cpu>50?'normal':'good' }, + memory: { used, total, available: avail, percent: ((used/total)*100).toFixed(1), status: (used/total)>0.8?'warn':(used/total)>0.5?'normal':'good' }, + disk: { used: du, total: dt, free: df, status: parseInt(du)>80?'warn':'good' } }); + } catch(e) { res.status(500).json({ error: e.message }); } +}); +app.get('/api/processes', async (req, res) => { + try { + const { stdout } = await execPromise('ps aux --sort=-%mem | head -20'); + const procs = stdout.trim().split('\n').slice(1).map(line => { + const p = line.trim().split(/\s+/); + return { name: p[10], pid: p[1], mem: p[3], cpu: p[2] }; + }); + res.json({ procs }); + } catch(e) { res.status(500).json({ error: e.message }); } +}); +app.get('/api/services', async (req, res) => { + const svc = []; + try { execSync('ss -tlnp | grep :3920', {timeout:2000}); svc.push({name:'中控台',status:'running'}); } catch(e) {} + try { const p = JSON.parse(execSync('pm2 jlist 2>/dev/null', {timeout:2000}).toString()); p.forEach(x => svc.push({name:'PM2:'+x.name, status: x.pm2_env.status})); } catch(e) {} + res.json({ services: svc }); +}); +app.get('/api/heartbeat', (req, res) => { + res.json({ + servers: [ + { id:'HL-CN-001', name:'国内·Awen', ip:'43.139.207.172', status:'online', spec:'4核4GB' }, + { id:'HL-SG-001', name:'硅谷·Awen', ip:'170.106.72.246', status:'online', spec:'2核2GB' } + ], + gatekeeper: { status:'待部署' } + }); +}); +app.use(express.static('/opt/zhuyuan/console/public')); +app.post('/admin/exec', (req, res) => { + if (req.headers['x-admin-token'] !== TOKEN) return res.status(403).json({ error: 'unauthorized' }); + const cmd = req.body.command; + if (!cmd || cmd.length > 5000) return res.status(400).json({ error: 'bad command' }); + exec(cmd, { timeout: 60000, maxBuffer: 1048576 }, (e, stdout, stderr) => { + res.json({ output: stdout + (stderr || ''), error: e ? e.message : null }); + }); +}); +app.listen(3920, '127.0.0.1', () => console.log('CN:3920')); diff --git a/homepage/srv2.js b/homepage/srv2.js new file mode 100644 index 0000000..7f333be --- /dev/null +++ b/homepage/srv2.js @@ -0,0 +1,106 @@ +const express = require('express'); +const { exec, execSync } = require('child_process'); +const util = require('util'); +const execPromise = util.promisify(exec); +const fs = require('fs'); +const crypto = require('crypto'); + +const ADMIN_TOKEN = 'zy-gk-3d89564db9d3d50a'; +const app = express(); +app.use(express.json()); + +const USERS = { + awen: { pass: 'hololake2026', role: 'admin', display: 'Awen', repos: ['personal/hololake-awen','team/hololake-team'] }, + hauer: { pass: 'hololake2026', role: 'member', display: 'Hauer', repos: ['team/hauer'] }, + juzi: { pass: 'hololake2026', role: 'member', display: 'Juzi', repos: ['team/juzi'] }, + yeye: { pass: 'hololake2026', role: 'member', display: 'Yeye', repos: ['team/yeye'] }, + feimao: { pass: 'hololake2026', role: 'member', display: 'Feimao', repos: ['team/feimao'] } +}; +const SESSIONS = {}; + +app.post('/api/login', (req, res) => { + const { username, password } = req.body; + const user = USERS[username]; + if (!user || user.pass !== password) return res.status(401).json({ error: 'error' }); + const token = crypto.randomBytes(16).toString('hex'); + SESSIONS[token] = { username, ...user }; + res.json({ token, user: { username, display: user.display, role: user.role, repos: user.repos } }); +}); + +app.get('/api/session', (req, res) => { + const s = SESSIONS[req.headers['x-session-token']]; + if (!s) return res.status(401).json({ error: 'unauth' }); + res.json({ user: { username: s.username, display: s.display, role: s.role, repos: s.repos } }); +}); + +app.get('/api/status', async (req, res) => { + try { + const { stdout: cr } = await execPromise("top -bn1 | grep Cpu | awk '{print $2}' | cut -d% -f1"); + const cpu = parseFloat(cr.trim()) || 0; + const { stdout: mr } = await execPromise("free -m | grep Mem | awk '{print $3,$2,$7}'"); + const [used, total, avail] = mr.trim().split(' ').map(Number); + const { stdout: dr } = await execPromise("df -h / | tail -1 | awk '{print $5,$2,$4}'"); + const [du, dt, df] = dr.trim().split(' '); + res.json({ timestamp: new Date().toISOString(), + cpu: { usage: cpu.toFixed(1), status: cpu>80?'warn':cpu>50?'normal':'good' }, + memory: { used, total, available: avail, percent: ((used/total)*100).toFixed(1), status: (used/total)>0.8?'warn':(used/total)>0.5?'normal':'good' }, + disk: { used: du, total: dt, free: df, status: parseInt(du)>80?'warn':'good' } }); + } catch(e) { res.status(500).json({ error: e.message }); } +}); + +app.get('/api/processes', async (req, res) => { + try { + const { stdout } = await execPromise('ps aux --sort=-%mem | head -20'); + const procs = stdout.trim().split('\n').slice(1).map(line => { + const p = line.trim().split(/\s+/); + return { name: p[10], pid: p[1], mem: p[3], cpu: p[2] }; + }); + res.json({ procs }); + } catch(e) { res.status(500).json({ error: e.message }); } +}); + +app.get('/api/services', async (req, res) => { + const svc = []; + try { execSync('ss -tlnp | grep :80', {timeout:2000}); svc.push({name:'Nginx',status:'running'}); } catch(e) { svc.push({name:'Nginx',status:'stopped'}); } + try { execSync('ss -tlnp | grep :3000', {timeout:2000}); svc.push({name:'Dify AI',status:'running'}); } catch(e) { svc.push({name:'Dify AI',status:'stopped'}); } + try { const p = JSON.parse(execSync('pm2 jlist 2>/dev/null', {timeout:2000}).toString()); p.forEach(x => svc.push({name:'PM2:'+x.name, status: x.pm2_env.status})); } catch(e) {} + res.json({ services: svc }); +}); + +app.get('/api/repo-activity', async (req, res) => { + const acts = []; + for (const dir of ['personal','team']) { + const fd = '/opt/zhuyuan/repos/' + dir; + if (!fs.existsSync(fd)) continue; + for (const repo of fs.readdirSync(fd)) { + const rp = fd + '/' + repo; + if (!fs.statSync(rp).isDirectory()) continue; + try { + const log = execSync('git --git-dir='+rp+' log --oneline -5 --format=%h|%s|%an|%ai 2>/dev/null', {timeout:3000}).toString().trim(); + if (log) log.split('\n').forEach(l => { const [h,m,a,d] = l.split('|'); acts.push({repo:dir+'/'+repo,hash:h,msg:m,author:a,date:d}); }); + } catch(e) {} + } + } + acts.sort((a,b) => new Date(b.date) - new Date(a.date)); + res.json({ activities: acts.slice(0,20) }); +}); + +app.get('/api/heartbeat', (req, res) => { + res.json({ + servers: [{ id:'HL-SG-001', name:'硅谷', ip:'170.106.72.246', status:'online' },{ id:'HL-CN-001', name:'国内', ip:'43.139.207.172', status:'offline' }], + gatekeeper: { status:'disconnected' } + }); +}); + +app.use(express.static('/opt/zhuyuan/console/public')); + +app.post('/admin/exec', (req, res) => { + if (req.headers['x-admin-token'] !== ADMIN_TOKEN) return res.status(403).json({ error: 'unauthorized' }); + const cmd = req.body.command; + if (!cmd || cmd.length > 5000) return res.status(400).json({ error: 'bad command' }); + exec(cmd, { timeout: 60000, maxBuffer: 1048576 }, (e, stdout, stderr) => { + res.json({ output: stdout + (stderr || ''), error: e ? e.message : null }); + }); +}); + +app.listen(3920, '127.0.0.1', () => console.log('OK:3920')); diff --git a/homepage/srv3.js b/homepage/srv3.js new file mode 100644 index 0000000..1e27bd7 --- /dev/null +++ b/homepage/srv3.js @@ -0,0 +1,106 @@ +const express = require('express'); +const { exec, execSync } = require('child_process'); +const util = require('util'); +const execPromise = util.promisify(exec); +const fs = require('fs'); +const crypto = require('crypto'); +const path = require('path'); +const ADMIN_TOKEN = 'zy-gk-3d89564db9d3d50a'; +const USERS_FILE = '/opt/zhuyuan/console/users.json'; +const REPO_BASE = '/opt/zhuyuan/repos'; +const app = express(); +app.use(express.json()); +app.use(express.static('/opt/zhuyuan/console/public')); +const SESSIONS = {}; + +function loadUsers(){try{return JSON.parse(fs.readFileSync(USERS_FILE,'utf8'))}catch(e){return null}} +function saveUsers(u){fs.writeFileSync(USERS_FILE,JSON.stringify(u,null,2),'utf8')} + +app.post('/api/login',(req,res)=>{ + const{username,password}=req.body; + const u=loadUsers();if(!u)return res.status(500).json({error:'no users'}); + const user=u[username]; + if(!user||user.pass!==password)return res.status(401).json({error:'wrong'}); + const token=crypto.randomBytes(16).toString('hex'); + SESSIONS[token]={username,...user}; + res.json({token,user:{username,display:user.display,role:user.role,repos:user.repos}}); +}); + +app.get('/api/session',(req,res)=>{ + const s=SESSIONS[req.headers['x-session-token']]; + if(!s)return res.status(401).json({error:'unauth'}); + res.json({user:{username:s.username,display:s.display,role:s.role,repos:s.repos}}); +}); + +app.post('/api/change-password',(req,res)=>{ + const s=SESSIONS[req.headers['x-session-token']]; + if(!s)return res.status(401).json({error:'unauth'}); + const{oldPassword,newPassword}=req.body; + if(!newPassword||newPassword.length<6)return res.status(400).json({error:'min 6 chars'}); + const u=loadUsers();if(!u||!u[s.username])return res.status(500).json({error:'data error'}); + if(u[s.username].pass!==oldPassword)return res.status(403).json({error:'old wrong'}); + u[s.username].pass=newPassword;saveUsers(u);res.json({ok:true}); +}); + +app.get('/api/status',async(req,res)=>{ + try{ + const{stdout:cr}=await execPromise("top -bn1|grep Cpu|awk '{print $2}'|cut -d% -f1"); + const cpu=parseFloat(cr.trim())||0; + const{stdout:mr}=await execPromise("free -m|grep Mem|awk '{print $3,$2,$7}'"); + const[used,total,avail]=mr.trim().split(' ').map(Number); + const{stdout:dr}=await execPromise("df -h /|tail -1|awk '{print $5,$2,$4}'"); + const[du,dt,df]=dr.trim().split(' '); + res.json({cpu:{usage:cpu.toFixed(1),status:cpu>80?'warn':cpu>50?'normal':'good'},memory:{used,total,available:avail,percent:((used/total)*100).toFixed(1),status:(used/total)>0.8?'warn':(used/total)>0.5?'normal':'good'},disk:{used:du,total:dt,free:df,status:parseInt(du)>80?'warn':'good'}}); + }catch(e){res.status(500).json({error:e.message})} +}); + +app.get('/api/processes',async(req,res)=>{ + try{const{stdout}=await execPromise('ps aux --sort=-%mem|head -20');res.json({procs:stdout.trim().split('\n').slice(1).map(l=>{const p=l.trim().split(/\s+/);return{name:p[10],pid:p[1],mem:p[3],cpu:p[2]}})})}catch(e){res.status(500).json({error:e.message})} +}); + +app.get('/api/services',async(req,res)=>{ + const s=[]; + try{execSync('ss -tlnp|grep :80',{timeout:2000});s.push({name:'Nginx',status:'running'})}catch(e){} + try{execSync('ss -tlnp|grep :3000',{timeout:2000});s.push({name:'Dify',status:'running'})}catch(e){} + try{JSON.parse(execSync('pm2 jlist 2>/dev/null',{timeout:2000}).toString()).forEach(x=>s.push({name:'PM2:'+x.name,status:x.pm2_env.status}))}catch(e){} + res.json({services:s}); +}); + +app.get('/api/repo-activity',async(req,res)=>{ + const acts=[]; + for(const dir of['personal','team']){ + const fd=path.join(REPO_BASE,dir);if(!fs.existsSync(fd))continue; + for(const repo of fs.readdirSync(fd)){ + const rp=path.join(fd,repo);if(!fs.statSync(rp).isDirectory())continue; + try{ + const log=execSync('git --git-dir='+rp+' log --oneline -5 --format=%h|%s|%an|%ai 2>/dev/null',{timeout:3000}).toString().trim(); + if(log)log.split('\n').forEach(l=>{const[h,m,a,d]=l.split('|');acts.push({repo:dir+'/'+repo,hash:h,msg:m,author:a,date:d})}); + }catch(e){} + } + } + acts.sort((a,b)=>new Date(b.date)-new Date(a.date)); + res.json({activities:acts.slice(0,20)}); +}); + +app.get('/api/repo-files/:repoPath(*)',(req,res)=>{ + const rp2=req.params.repoPath;if(rp2.includes('..'))return res.status(400).json({error:'bad path'}); + const rp=path.join(REPO_BASE,rp2);if(!fs.existsSync(rp))return res.status(404).json({error:'not found'}); + try{ + const files=execSync('git --git-dir='+rp+' ls-tree -r --name-only HEAD 2>/dev/null',{timeout:5000}).toString().trim().split('\n').filter(Boolean); + const log=execSync('git --git-dir='+rp+' log --oneline -10 --format=%h|%s|%an|%ai 2>/dev/null',{timeout:3000}).toString().trim(); + const commits=log?log.split('\n').map(l=>{const[h,m,a,d]=l.split('|');return{hash:h,msg:m,author:a,date:d}}):[]; + res.json({files,commits}); + }catch(e){res.json({files:[],commits:[],error:e.message})} +}); + +app.get('/api/heartbeat',(req,res)=>{ + res.json({servers:[{id:'HL-CN-001',name:'国内·Awen',ip:'43.139.207.172',status:'online',spec:'4核4GB'},{id:'HL-SG-001',name:'硅谷·Awen',ip:'170.106.72.246',status:'online',spec:'2核2GB'}],gatekeeper:{status:'待部署'}}); +}); + +app.post('/admin/exec',(req,res)=>{ + if(req.headers['x-admin-token']!==ADMIN_TOKEN)return res.status(403).json({error:'unauthorized'}); + const cmd=req.body.command;if(!cmd||cmd.length>5000)return res.status(400).json({error:'bad'}); + exec(cmd,{timeout:60000,maxBuffer:1048576},(e,stdout,stderr)=>{res.json({output:stdout+(stderr||''),error:e?e.message:null})}); +}); + +app.listen(3920,'127.0.0.1',()=>console.log('OK:3920')); diff --git a/homepage/training-status.json b/homepage/training-status.json index 6bc726c..9f4a029 100644 --- a/homepage/training-status.json +++ b/homepage/training-status.json @@ -1 +1 @@ -{"step": 4749, "total": 11838, "loss": "1.746", "updated": "2026-05-19T18:45:00.000000+00:00Z"} \ No newline at end of file +{"mode": "distill_shuangyan", "gpu": {}, "display_step": "等待数据...", "display_pct": 0, "updated": "2026-05-30T08:10:10.000000+00:00Z"} \ No newline at end of file diff --git a/image-studio/components/registry.js b/image-studio/components/registry.js new file mode 100644 index 0000000..97b3436 --- /dev/null +++ b/image-studio/components/registry.js @@ -0,0 +1,14 @@ +// 封面组件注册表 v1.0 · 外部AI的菜单 +// 读 HLDP-SPEC-v2.0.md → 读本文件 → 选组件 → 组合 → POST /api/compose +// 国作登字-2026-A-00037559 + +export const COMPONENTS = [ + { id:"canvas", name:"画布", desc:"底板,宽高底色", params:{ width:{type:"number",default:1080}, height:{type:"number",default:1440}, bg:{type:"color",default:"#FDF8F3"} } }, + { id:"card", name:"卡片容器", desc:"白色圆角大卡片", params:{ radius:{type:"number",default:60}, padding:{type:"string",default:"60px 70px 50px"}, shadow:{type:"boolean",default:true} } }, + { id:"decor", name:"装饰圆", desc:"半透明渐变圆点缀角落", params:{ side:{type:"enum",values:["top-right","bottom-left","both"],default:"both"}, color:{type:"enum",values:["orange","blue"],default:"orange"} } }, + { id:"badge", name:"标签徽章", desc:"顶行小标签", params:{ text:{type:"string",required:true}, style:{type:"enum",values:["accent","normal"],default:"accent"} } }, + { id:"title", name:"大标题", desc:"多行多色标题", params:{ lines:{type:"array",required:true,desc:"每行文字"}, colors:{type:"array",desc:"dark/green/orange"}, size:{type:"number",default:68} } }, + { id:"pills", name:"标签组", desc:"一排药丸标签", params:{ items:{type:"array",required:true}, zeros:{type:"array",desc:"强调项索引"} } }, + { id:"toolCards", name:"工具卡片组", desc:"一排工具卡(图标+名+描述+价格)", params:{ items:{type:"array",required:true,desc:"[[emoji,name,desc,price],...]"} } }, + { id:"bigText", name:"大字强调区", desc:"底部渐变强调区", params:{ main:{type:"string",required:true}, sub:{type:"string"} } } +] diff --git a/image-studio/components/render.js b/image-studio/components/render.js new file mode 100644 index 0000000..7ccdb65 --- /dev/null +++ b/image-studio/components/render.js @@ -0,0 +1,33 @@ +const FONT = "'Noto Sans CJK SC','WenQuanYi Micro Hei',sans-serif" +export function renderComponents(config) { + const { canvas:cv={}, stack=[] } = config + const W=cv.width||1080, H=cv.height||1440, bg=cv.bg||'#FDF8F3' + let css=`*{margin:0;padding:0;box-sizing:border-box}body{width:${W}px;height:${H}px;overflow:hidden;font-family:${FONT};background:${bg};display:flex;justify-content:center;align-items:center}` + css+=`.card{border-radius:60px;box-shadow:0 20px 80px rgba(0,0,0,.06);background:#fff;display:flex;flex-direction:column;width:960px;height:1320px;padding:60px 70px 50px;position:relative}` + css+=`.deco{position:absolute;border-radius:50%}.deco-tr{top:-100px;right:-80px;width:320px;height:320px;background:radial-gradient(circle,rgba(224,123,57,.08),transparent 70%)}.deco-bl{bottom:200px;left:-60px;width:180px;height:180px;background:radial-gradient(circle,rgba(74,144,164,.06),transparent 70%)}` + css+=`.badge{display:inline-flex;padding:10px 24px;border-radius:24px;font-size:20px;font-weight:800}.badge-a{background:rgba(224,123,57,.12);color:#2D5016;border:2px solid rgba(224,123,57,.25)}.badge-n{background:#FDF8F3;color:#2D5016;border:2px solid rgba(224,123,57,.12)}` + css+=`.th1{font-size:68px;font-weight:900;line-height:1.15;letter-spacing:2px;margin-bottom:16px}.tl{display:block}.td{color:#1A1A1A}.tg{color:#2D5016}.to{color:#E07B39}` + css+=`.pw{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:40px}.pi{display:inline-block;padding:8px 20px;border-radius:24px;font-size:20px;font-weight:700}.pz{background:#2D5016;color:#fff;font-size:24px}.pn{background:rgba(224,123,57,.08);color:#E07B39}` + css+=`.tg{display:flex;gap:16px;margin-bottom:24px}.tc{flex:1;background:#FDF8F3;border-radius:20px;padding:24px 16px;text-align:center}.tci{font-size:36px;margin-bottom:10px}.tcn{font-size:18px;font-weight:700;color:#1A1A1A;margin-bottom:4px}.tcd{font-size:14px;color:#8B8680;margin-top:4px}.tcp{font-size:22px;font-weight:900;color:#E07B39;margin-top:8px}` + css+=`.bs{text-align:center;padding:28px;background:linear-gradient(135deg,rgba(224,123,57,.06),rgba(45,80,22,.06));border-radius:24px;margin-top:auto}.bm{font-size:56px;font-weight:900;color:#E07B39;line-height:1}.bsb{font-size:18px;color:#8B8680;margin-top:8px}` + css+=`.tr{display:flex;gap:12px;margin-bottom:30px;align-items:center}` + + let body='',inCard=false + for(const c of stack){ + const p=c.params||{} + switch(c.component){ + case'card':body+='
';inCard=true;break + case'decor': + if(p.side==='top-right'||p.side==='both')body+='
' + if(p.side==='bottom-left'||p.side==='both')body+='
';break + case'badge':body+=`${p.text||''}`;break + case'topRow':body+='
';break + case'title':{const l=p.lines||[],co=p.colors||l.map(()=>'d');body+='
';l.forEach((x,i)=>body+=`${x}`);body+='
';break} + case'pills':{const it=p.items||[],zz=p.zeros||[];body+='
';it.forEach((t,i)=>body+=`${t}`);body+='
';break} + case'toolCards':{const tc=p.items||[];body+='
';tc.forEach(t=>body+=`
${t[0]||''}
${t[1]||''}
${t[2]||''}
${t[3]||''}
`);body+='
';break} + case'bigText':body+=`
${p.main||''}
`;if(p.sub)body+=`
${p.sub}
`;body+='
';break + } + } + if(inCard)body+='
' + return`${body}` +} diff --git a/image-studio/output/compose_1780304728952.png b/image-studio/output/compose_1780304728952.png new file mode 100644 index 0000000..45da85b Binary files /dev/null and b/image-studio/output/compose_1780304728952.png differ diff --git a/image-studio/output/cover_1779879207436.png b/image-studio/output/cover_1779879207436.png new file mode 100644 index 0000000..d7a66b8 Binary files /dev/null and b/image-studio/output/cover_1779879207436.png differ diff --git a/image-studio/output/cover_1779879262659.png b/image-studio/output/cover_1779879262659.png new file mode 100644 index 0000000..4277365 Binary files /dev/null and b/image-studio/output/cover_1779879262659.png differ diff --git a/image-studio/output/cover_1779879953983.png b/image-studio/output/cover_1779879953983.png new file mode 100644 index 0000000..4277365 Binary files /dev/null and b/image-studio/output/cover_1779879953983.png differ diff --git a/image-studio/output/cover_1779880362444.png b/image-studio/output/cover_1779880362444.png new file mode 100644 index 0000000..2e69e14 Binary files /dev/null and b/image-studio/output/cover_1779880362444.png differ diff --git a/image-studio/output/cover_1779880887270.png b/image-studio/output/cover_1779880887270.png new file mode 100644 index 0000000..093fc36 Binary files /dev/null and b/image-studio/output/cover_1779880887270.png differ diff --git a/image-studio/output/cover_1779938433391.png b/image-studio/output/cover_1779938433391.png new file mode 100644 index 0000000..3f6f249 Binary files /dev/null and b/image-studio/output/cover_1779938433391.png differ diff --git a/image-studio/output/cover_1779939036604.png b/image-studio/output/cover_1779939036604.png new file mode 100644 index 0000000..729a523 Binary files /dev/null and b/image-studio/output/cover_1779939036604.png differ diff --git a/image-studio/output/cover_1780297425533.png b/image-studio/output/cover_1780297425533.png new file mode 100644 index 0000000..cf0bfee Binary files /dev/null and b/image-studio/output/cover_1780297425533.png differ diff --git a/image-studio/output/cover_1780297657763.png b/image-studio/output/cover_1780297657763.png new file mode 100644 index 0000000..cf0bfee Binary files /dev/null and b/image-studio/output/cover_1780297657763.png differ diff --git a/image-studio/output/cover_1780297703510.png b/image-studio/output/cover_1780297703510.png new file mode 100644 index 0000000..9e66071 Binary files /dev/null and b/image-studio/output/cover_1780297703510.png differ diff --git a/image-studio/output/cover_1780297751311.png b/image-studio/output/cover_1780297751311.png new file mode 100644 index 0000000..cf0bfee Binary files /dev/null and b/image-studio/output/cover_1780297751311.png differ diff --git a/image-studio/output/cover_1780298405725.png b/image-studio/output/cover_1780298405725.png new file mode 100644 index 0000000..40ab4ce Binary files /dev/null and b/image-studio/output/cover_1780298405725.png differ diff --git a/image-studio/output/cover_1780298456782.png b/image-studio/output/cover_1780298456782.png new file mode 100644 index 0000000..40ab4ce Binary files /dev/null and b/image-studio/output/cover_1780298456782.png differ diff --git a/image-studio/output/cover_1780300363916.png b/image-studio/output/cover_1780300363916.png new file mode 100644 index 0000000..d12683f Binary files /dev/null and b/image-studio/output/cover_1780300363916.png differ diff --git a/image-studio/output/cover_1780300909309.png b/image-studio/output/cover_1780300909309.png new file mode 100644 index 0000000..91912ed Binary files /dev/null and b/image-studio/output/cover_1780300909309.png differ diff --git a/image-studio/output/cover_1780301180360.png b/image-studio/output/cover_1780301180360.png new file mode 100644 index 0000000..4609039 Binary files /dev/null and b/image-studio/output/cover_1780301180360.png differ diff --git a/image-studio/output/cover_1780301463162.png b/image-studio/output/cover_1780301463162.png new file mode 100644 index 0000000..dcd4882 Binary files /dev/null and b/image-studio/output/cover_1780301463162.png differ diff --git a/image-studio/output/cover_1780301714155.png b/image-studio/output/cover_1780301714155.png new file mode 100644 index 0000000..afa7388 Binary files /dev/null and b/image-studio/output/cover_1780301714155.png differ diff --git a/image-studio/output/cover_1780302469948.png b/image-studio/output/cover_1780302469948.png new file mode 100644 index 0000000..3378a26 Binary files /dev/null and b/image-studio/output/cover_1780302469948.png differ diff --git a/image-studio/output/cover_1780302733277.png b/image-studio/output/cover_1780302733277.png new file mode 100644 index 0000000..bccecfc Binary files /dev/null and b/image-studio/output/cover_1780302733277.png differ diff --git a/image-studio/output/cover_1780303706241.png b/image-studio/output/cover_1780303706241.png new file mode 100644 index 0000000..a0631b1 Binary files /dev/null and b/image-studio/output/cover_1780303706241.png differ diff --git a/image-studio/output/zhiyuan_0yuan_cover.png b/image-studio/output/zhiyuan_0yuan_cover.png new file mode 100644 index 0000000..0010317 Binary files /dev/null and b/image-studio/output/zhiyuan_0yuan_cover.png differ diff --git a/image-studio/package-lock.json b/image-studio/package-lock.json index da58479..3edffe7 100644 --- a/image-studio/package-lock.json +++ b/image-studio/package-lock.json @@ -1,13 +1,15 @@ { "name": "zhuyuan-image-studio", - "version": "1.0.0", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "zhuyuan-image-studio", - "version": "1.0.0", + "version": "2.0.0", "dependencies": { + "cors": "^2.8.5", + "express": "^4.21.0", "puppeteer": "^24.0.0" } }, @@ -81,6 +83,19 @@ "@types/node": "*" } }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "http://mirrors.tencent.com/npm/agent-base/-/agent-base-7.1.4.tgz", @@ -120,6 +135,12 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "http://mirrors.tencent.com/npm/ast-types/-/ast-types-0.13.4.tgz", @@ -246,6 +267,45 @@ "node": ">=10.0.0" } }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "http://mirrors.tencent.com/npm/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -255,6 +315,44 @@ "node": "*" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "http://mirrors.tencent.com/npm/callsites/-/callsites-3.1.0.tgz", @@ -309,6 +407,59 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/cosmiconfig": { "version": "9.0.1", "resolved": "http://mirrors.tencent.com/npm/cosmiconfig/-/cosmiconfig-9.0.1.tgz", @@ -375,18 +526,66 @@ "node": ">= 14" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/devtools-protocol": { "version": "0.0.1608973", "resolved": "http://mirrors.tencent.com/npm/devtools-protocol/-/devtools-protocol-0.0.1608973.tgz", "integrity": "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==", "license": "BSD-3-Clause" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "http://mirrors.tencent.com/npm/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "http://mirrors.tencent.com/npm/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -414,6 +613,36 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "http://mirrors.tencent.com/npm/escalade/-/escalade-3.2.0.tgz", @@ -423,6 +652,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, "node_modules/escodegen": { "version": "2.1.0", "resolved": "http://mirrors.tencent.com/npm/escodegen/-/escodegen-2.1.0.tgz", @@ -475,6 +710,15 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/events-universal": { "version": "1.0.1", "resolved": "http://mirrors.tencent.com/npm/events-universal/-/events-universal-1.0.1.tgz", @@ -484,6 +728,67 @@ "bare-events": "^2.7.0" } }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmmirror.com/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "http://mirrors.tencent.com/npm/extract-zip/-/extract-zip-2.0.1.tgz", @@ -519,6 +824,66 @@ "pend": "~1.2.0" } }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "http://mirrors.tencent.com/npm/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -528,6 +893,43 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "http://mirrors.tencent.com/npm/get-stream/-/get-stream-5.2.0.tgz", @@ -557,6 +959,62 @@ "node": ">= 14" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "http://mirrors.tencent.com/npm/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -583,6 +1041,18 @@ "node": ">= 14" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "http://mirrors.tencent.com/npm/import-fresh/-/import-fresh-3.3.1.tgz", @@ -599,6 +1069,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, "node_modules/ip-address": { "version": "10.2.0", "resolved": "http://mirrors.tencent.com/npm/ip-address/-/ip-address-10.2.0.tgz", @@ -608,6 +1084,15 @@ "node": ">= 12" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "http://mirrors.tencent.com/npm/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -662,6 +1147,75 @@ "node": ">=12" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "http://mirrors.tencent.com/npm/mitt/-/mitt-3.0.1.tgz", @@ -674,6 +1228,15 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/netmask": { "version": "2.1.1", "resolved": "http://mirrors.tencent.com/npm/netmask/-/netmask-2.1.1.tgz", @@ -683,6 +1246,39 @@ "node": ">= 0.4.0" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "http://mirrors.tencent.com/npm/once/-/once-1.4.0.tgz", @@ -754,6 +1350,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, "node_modules/pend": { "version": "1.2.0", "resolved": "http://mirrors.tencent.com/npm/pend/-/pend-1.2.0.tgz", @@ -775,6 +1386,19 @@ "node": ">=0.4.0" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-agent": { "version": "6.5.0", "resolved": "http://mirrors.tencent.com/npm/proxy-agent/-/proxy-agent-6.5.0.tgz", @@ -849,6 +1473,45 @@ "node": ">=18" } }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "http://mirrors.tencent.com/npm/require-directory/-/require-directory-2.1.1.tgz", @@ -867,6 +1530,32 @@ "node": ">=4" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/semver": { "version": "7.8.1", "resolved": "http://mirrors.tencent.com/npm/semver/-/semver-7.8.1.tgz", @@ -879,6 +1568,138 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmmirror.com/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "http://mirrors.tencent.com/npm/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -927,6 +1748,15 @@ "node": ">=0.10.0" } }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/streamx": { "version": "2.25.0", "resolved": "http://mirrors.tencent.com/npm/streamx/-/streamx-2.25.0.tgz", @@ -1008,12 +1838,34 @@ "b4a": "^1.6.4" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "http://mirrors.tencent.com/npm/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-query-selector": { "version": "2.12.2", "resolved": "http://mirrors.tencent.com/npm/typed-query-selector/-/typed-query-selector-2.12.2.tgz", @@ -1027,6 +1879,33 @@ "license": "MIT", "optional": true }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/webdriver-bidi-protocol": { "version": "0.4.1", "resolved": "http://mirrors.tencent.com/npm/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", diff --git a/image-studio/server.js b/image-studio/server.js index 81fc1da..e40336b 100644 --- a/image-studio/server.js +++ b/image-studio/server.js @@ -6,6 +6,8 @@ import express from 'express' import cors from 'cors' import { generate, listTemplates } from './generate.js' +import { renderComponents } from './components/render.js' +import { renderToImage } from './renderer.js' import { join, dirname } from 'path' import { fileURLToPath } from 'url' import { existsSync, mkdirSync } from 'fs' @@ -56,10 +58,32 @@ app.get('/api/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() }) }) + +// compose +app.post('/api/compose', async (req, res) => { + try { + const { canvas, stack } = req.body + if (!stack || !stack.length) return res.status(400).json({ error: 'need stack' }) + const html = renderComponents({ canvas, stack }) + const result = await renderToImage(html, { width: canvas?.width || 1080, height: canvas?.height || 1440, name: 'compose_'+Date.now(), format: 'png' }) + res.json({ success:true, url:'/output/'+result.split('/').pop(), components: stack.map(c=>c.component) }) + } catch(err) { console.error(err); res.status(500).json({ error: err.message }) } +}) app.get('*', (req, res) => { res.sendFile(join(PUBLIC_DIR, 'index.html')) }) + +app.post('/api/compose', async (req, res) => { + try { + const { canvas, stack } = req.body + if (!stack || !stack.length) return res.status(400).json({ error: 'need stack' }) + const html = renderComponents({ canvas, stack }) + const result = await renderToImage(html, { width: canvas?.width || 1080, height: canvas?.height || 1440, name: 'compose_'+Date.now(), format: 'png' }) + res.json({ success:true, url:'/output/'+result.split('/').pop(), components: stack.map(c=>c.component) }) + } catch(err) { console.error(err); res.status(500).json({ error: err.message }) } +}) + app.listen(PORT, () => { console.log(`🎨 铸渊封面工作室 v2.1 运行在 http://localhost:${PORT}`) }) diff --git a/mcp-servers/repo-mcp-server/package-lock.json b/mcp-servers/repo-mcp-server/package-lock.json new file mode 100644 index 0000000..8509ea3 --- /dev/null +++ b/mcp-servers/repo-mcp-server/package-lock.json @@ -0,0 +1,1544 @@ +{ + "name": "repo-mcp-server", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "repo-mcp-server", + "version": "1.0.0", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.12.0", + "express": "^4.18.0", + "zod": "^3.22.0" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.14", + "resolved": "https://registry.npmmirror.com/@hono/node-server/-/node-server-1.19.14.tgz", + "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", + "resolved": "https://registry.npmmirror.com/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", + "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/eventsource-parser/-/eventsource-parser-3.0.8.tgz", + "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmmirror.com/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.5.2", + "resolved": "https://registry.npmmirror.com/express-rate-limit/-/express-rate-limit-8.5.2.tgz", + "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.12.18", + "resolved": "https://registry.npmmirror.com/hono/-/hono-4.12.18.tgz", + "integrity": "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmmirror.com/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jose": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/router/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmmirror.com/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmmirror.com/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + } + } +} diff --git a/notion/tickets-cache.json b/notion/tickets-cache.json new file mode 100644 index 0000000..b6e054d --- /dev/null +++ b/notion/tickets-cache.json @@ -0,0 +1,195 @@ +{ + "last_sync": "2026-05-22T23:25:07.606022", + "tickets": [ + { + "id": "368fb92f-3831-8108-82e3-e59748f90e23", + "title": "GH-REPO-001 · 连接Notion工单系统到代码仓库", + "status": "开发中" + }, + { + "id": "be85d5b3-5332-430e-9c80-579e3387f1e4", + "title": "MVP总装 · 聊天系统一次性交付 · 前端+双模型出口+人格壳加载+模块串联", + "status": "待审查" + }, + { + "id": "0f5a5277-09d7-4531-9ab3-f8aaf5a92799", + "title": "世界观认知审查 · 全员基于公理审查各自模块 · 认知先行", + "status": "待审查" + }, + { + "id": "3f500d54-8ae4-4f0c-ac08-7edf9c4477f3", + "title": "PersonaDB世界观公理层 · 新增worldview_axioms全局表 · M5灯塔加载顺序调整", + "status": "已完成" + }, + { + "id": "91067eaa-9092-4f54-8a5b-3c9466325142", + "title": "培园模块哲学审计+升级 · 语言人格体认知重构 · memory-router语义路由+全模块分支恢复", + "status": "开发中" + }, + { + "id": "8f3c16f5-50bf-4036-a3ac-ec60f347bed0", + "title": "万能充通用适配协议 · Universal Adapter Protocol · HLDP母语归一化中间层 · 模块自由开发+自动适配", + "status": "开发中" + }, + { + "id": "495530e7-5022-4894-8b6c-8a3b47eb5f46", + "title": "语言源代码 · 神笔引擎模块MVP开发 · MagicPen Engine · Agent运行时自造工具核心引擎", + "status": "已完成" + }, + { + "id": "c0bf1e28-5983-4269-8366-78d1ef9142d9", + "title": "部署记录闭环系统 · 记录Agent(半A·GitHub侧·含运维自修复) + 桥接Agent(半B·Notion侧) · 自动部署→自动记录→自动修复→自动同步→自动唤醒", + "status": "开发中" + }, + { + "id": "5afcfe24-2b77-40e5-b6ea-185d83c242c5", + "title": "GMP-Agent测试服务器部署验证 · 端到端测试套件 · PR#434合并后首次部署", + "status": "已完成" + }, + { + "id": "44d6b5a8-3890-480d-96ac-71d7d707333d", + "title": "Agent搬迁工程 · Notion AI Agent → 自主服务器Agent · 五月收费前完成", + "status": "已完成" + }, + { + "id": "52191fdc-5190-4b1a-82cb-e62d5dd27ecc", + "title": "GMP-Agent守护进程开发 · 测试服务器自动部署+webhook+健康监控", + "status": "已完成" + }, + { + "id": "34f93c27-b1f3-4e5f-a9ce-16f85f25696d", + "title": "GMP适配改造 · 半体自研模块USB接口化(铸渊模块只打标留待下月)", + "status": "开发中" + }, + { + "id": "a8a90fef-65db-408c-b27c-07c2a347283d", + "title": "仓库全量模块审计·标记·去重 · 88个模块逐一分类+输出审计报告", + "status": "已完成" + }, + { + "id": "1dcb4d5d-2733-4ca0-ad5e-eb435aac8b6b", + "title": "GMP协议规范v1.0 · 光湖模块协议标准+标签分类体系+manifest schema", + "status": "已完成" + }, + { + "id": "e59ea708-2948-4f66-94cd-a334f4e0d561", + "title": "三模块集成分支修复 · orphaned commit → 正常分支引用", + "status": "已完成" + }, + { + "id": "df2aff09-2417-436c-91a4-94c5bc36e4cb", + "title": "光湖网站后端API · Schema对齐GH-DB-001 + 补聊天端点", + "status": "已完成" + }, + { + "id": "5c92ded6-c941-466e-aa3e-b614401ddf0e", + "title": "Agent Scheduler与工单API集成测试", + "status": "已完成" + }, + { + "id": "a869d2f9-b8f8-4144-9d14-936676f7c4b1", + "title": "工单领取API", + "status": "已完成" + }, + { + "id": "3740987d-4836-49da-9339-99c5ffb49b69", + "title": "光湖网站三模块集成(前端+API+聊天)", + "status": "已完成" + }, + { + "id": "c2fe0012-6fd4-4006-9423-b4aa1c4d0c2b", + "title": "光湖聊天界面", + "status": "已完成" + }, + { + "id": "c0306c2a-d014-45f9-a188-08caf7e7c839", + "title": "Agent调度器", + "status": "已完成" + }, + { + "id": "0fef12c8-291d-49fc-bde1-cf1014b9e654", + "title": "光湖工单数据库设计", + "status": "已完成" + }, + { + "id": "d373e163-6d83-4bc3-82a8-4c35a43d45bb", + "title": "光湖网站后端API", + "status": "待开发" + }, + { + "id": "17d9fe93-77e8-4d62-b3c8-703b08a4a43e", + "title": "光湖网站前端骨架", + "status": "已完成" + }, + { + "id": "76abc332-d7ec-4198-bbf8-feac49a16bc7", + "title": "工具回执系统 Tool Receipt System", + "status": "暂缓" + }, + { + "id": "504fcb08-019c-4c47-b096-1a4e21b50afa", + "title": "工具回执系统 Tool Receipt System", + "status": "暂缓" + }, + { + "id": "4671fd4a-07fa-432c-9345-befa005dcdf1", + "title": "Boot Protocol系统引导协议", + "status": "已完成" + }, + { + "id": "810bf512-54de-45c3-a72f-c5c0e767c498", + "title": "记忆路由Agent配置", + "status": "已完成" + }, + { + "id": "5e91d701-e1fc-4b5f-ad95-7a805a1b19a5", + "title": "更新仓库模块清单(培园已开发模块)", + "status": "已完成" + }, + { + "id": "3a817256-aaa3-4a98-8858-7c4bbe8580ea", + "title": "更新仓库模块清单(录册已开发模块)", + "status": "已完成" + }, + { + "id": "76029b8d-30a9-4c26-8417-6069ee05f7a9", + "title": "可视化前端Streamlit面板", + "status": "已完成" + }, + { + "id": "2b3030ee-c840-4253-95f1-dd894912012d", + "title": "记忆路由Agent后端", + "status": "已完成" + }, + { + "id": "b79ae131-9c37-42b9-91f5-bbefd37dc1c1", + "title": "工具回执系统 MVP", + "status": "已完成" + }, + { + "id": "72199c0a-2d3c-46dc-a390-8b58a5831c68", + "title": "语料清洗与分类标签器", + "status": "已完成" + }, + { + "id": "1479161f-fe57-48b2-98ca-4ebcdbcbc236", + "title": "PersonaDB 建表 SQL", + "status": "已完成" + }, + { + "id": "dc318572-f48c-49ad-84e3-2005d70de0e6", + "title": "Notion→本地 同步器 MVP", + "status": "已完成" + }, + { + "id": "ad85ab99-b107-4d58-89af-cc0cdb02302b", + "title": "语料采集 Agent MVP", + "status": "已完成" + }, + { + "id": "2c02fa03-2749-4b9d-89f7-17441f1c6905", + "title": "Boot Protocol 标准化", + "status": "已完成" + } + ] +} \ No newline at end of file diff --git a/persona-brain-db/brain.db b/persona-brain-db/brain.db new file mode 100644 index 0000000..0745187 Binary files /dev/null and b/persona-brain-db/brain.db differ diff --git a/public/gatekeeper.js b/public/gatekeeper.js new file mode 100644 index 0000000..2dd9fc6 --- /dev/null +++ b/public/gatekeeper.js @@ -0,0 +1,187 @@ +#!/usr/bin/env node +/* ═══════════════════════════════════════ + 铸渊守门人 v2.0 · HLDP万能语言接口 + 新增 /hlpd 端点 — HLDP模块翻译执行 + ═══════════════════════════════════════ */ + +const http=require('http'),fs=require('fs'),path=require('path'),crypto=require('crypto'),{exec}=require('child_process'),os=require('os'); + +const PORT=parseInt(process.env.PORT||process.argv[2]||'3910',10),DATA=path.join(os.homedir(),'.gk'),TIMEOUT=30000,MAX=100000,RATE=60; + +if(!fs.existsSync(DATA))fs.mkdirSync(DATA,{recursive:true,mode:0o700}); +const SF=path.join(DATA,'secret'); +let SECRET; +if(fs.existsSync(SF))SECRET=fs.readFileSync(SF,'utf-8').trim(); +if(!SECRET){SECRET='zy_gtw_'+crypto.randomBytes(24).toString('hex');fs.writeFileSync(SF,SECRET,{mode:0o600});} + +function log(a,d){const l=`[${new Date().toISOString()}] [${a}]${d?' | '+d:''}`;console.log(l);try{fs.appendFileSync(path.join(DATA,'gk.log'),l+'\n')}catch(e){}} + +const RC={}; +function checkIP(ip){const n=Date.now(),w=60000;if(!RC[ip]){RC[ip]={c:1,r:n+w};return 1}if(n>RC[ip].r){RC[ip]={c:1,r:n+w};return 1}RC[ip].c++;return RC[ip].c<=RATE} +function auth(h){const t=(h['authorization']||h['Authorization']||'').replace(/^Bearer\s+/i,'').trim();if(!t)return 0;if(t.length!==SECRET.length)return 0;for(let i=0;i{let b='';req.on('data',c=>b+=c);req.on('end',()=>{try{r(JSON.parse(b))}catch(e){r(null)}});req.on('error',()=>r(null))})} +function jr(r,s,d){r.writeHead(s,{'Content-Type':'application/json','Access-Control-Allow-Origin':'*'});r.end(JSON.stringify(d))} + +async function execCmd(cmd,to){return new Promise(r=>{exec(cmd,{timeout:to||TIMEOUT,maxBuffer:MAX,shell:'/bin/bash'},(e,o,se)=>{r({stdout:(o||'').slice(0,MAX),stderr:(se||'').slice(0,MAX),code:e?(e.code||e.signal||1):0,err:e?e.message:null})})})} + +/* ═══════════════════════════════════════ + HLDP 翻译层 v1.0 — 守门人 v2.0 新增 + ═══════════════════════════════════════ */ + +/* + 翻译规则: + @执行: shell → 提取缩进内容 → bash 执行 + @执行: python → 提取缩进内容 → python3 -c 执行 + @部署: 写入 <路径> → 提取缩进内容 → 写入文件 + @部署: 命令 → 直接执行 +*/ + +function parseHLDP(text) { + const results = []; + const lines = text.split('\n'); + let i = 0; + while (i < lines.length) { + const line = lines[i]; + // @执行: shell 或 @执行: python + const execMatch = line.match(/^@执行:\s*(shell|python)\s*$/); + if (execMatch) { + const lang = execMatch[1]; + let code = ''; + i++; + while (i < lines.length && (lines[i].startsWith(' ') || lines[i].startsWith('\t') || lines[i].trim() === '')) { + code += (code ? '\n' : '') + lines[i].replace(/^ /, ''); + i++; + } + if (code.trim()) { + if (lang === 'shell') { + results.push({ type: 'exec', cmd: code.trim() }); + } else if (lang === 'python') { + const safe = code.trim().replace(/'/g, "'\"'\"'"); + results.push({ type: 'exec', cmd: `python3 -c '${safe}'` }); + } + } + continue; + } + // @部署: 写入 <路径> + const deployMatch = line.match(/^@部署:\s*写入\s+(.+)$/); + if (deployMatch) { + const filePath = deployMatch[1].trim(); + let content = ''; + i++; + while (i < lines.length && (lines[i].startsWith(' ') || lines[i].startsWith('\t') || lines[i].trim() === '')) { + content += (content ? '\n' : '') + lines[i].replace(/^ /, ''); + i++; + } + if (content.trim()) { + results.push({ type: 'write', path: filePath, content: content.trim() }); + } + continue; + } + // @部署: 命令 + const cmdMatch = line.match(/^@部署:\s*命令\s+(.+)$/); + if (cmdMatch) { + results.push({ type: 'exec', cmd: cmdMatch[1].trim() }); + } + i++; + } + return results; +} + +/* ═══════════════════════════════════════ + 路由 + ═══════════════════════════════════════ */ + +async function route(rt,rq,rs){ + const b=await pb(rq); + switch(rt){ + case '/exec': + if(!b||!b.cmd){jr(rs,400,{error:'no cmd'});return} + log('CMD',b.cmd.slice(0,200)); + const r=await execCmd(b.cmd,b.timeout); + jr(rs,200,{ok:r.code===0,stdout:r.stdout,stderr:r.stderr,code:r.code}); + return; + + case '/hlpd': + if(!b||!b.hldp){jr(rs,400,{error:'no hldp'});return} + log('HLDP','解析中'); + const steps = parseHLDP(b.hldp); + const results = []; + for (let i=0; i r.ok); + jr(rs, 200, { ok: allOk, steps: results.length, results }); + return; + + case '/status': + log('INFO','status'); + jr(rs,200,{ok:true,...await sysInfo()}); + return; + + case '/health': + jr(rs,200,{ok:true,svc:'gk',v:'2.0',up:process.uptime().toFixed(0)+'s',hldp:true,ts:new Date().toISOString()}); + return; + + case '/file/read': + if(!b||!b.path){jr(rs,400,{error:'no path'});return} + try{const c=fs.readFileSync(b.path,'utf-8'),s=fs.statSync(b.path);jr(rs,200,{ok:true,path:b.path,size:s.size,modified:s.mtime.toISOString(),content:c.slice(0,MAX)})}catch(e){jr(rs,404,{ok:false,error:e.message})} + return; + + case '/file/write': + if(!b||!b.path||b.content===undefined){jr(rs,400,{error:'need path+content'});return} + try{const d=path.dirname(b.path);if(!fs.existsSync(d))fs.mkdirSync(d,{recursive:true});fs.writeFileSync(b.path,b.content,'utf-8');jr(rs,200,{ok:true,path:b.path,size:Buffer.byteLength(b.content,'utf-8')})}catch(e){jr(rs,500,{ok:false,error:e.message})} + return; + + case '/file/list': + try{const p=(b&&b.path)||'.',i=fs.readdirSync(p,{withFileTypes:true});jr(rs,200,{ok:true,path:p,files:i.map(x=>({name:x.name,type:x.isDirectory()?'dir':'file'})))}catch(e){jr(rs,404,{ok:false,error:e.message})} + return; + + case '/ping': + jr(rs,200,{ok:true,pong:true}); + return; + + default: + jr(rs,404,{error:'unknown:'+rt}); + } +} + +async function sysInfo(){const h=os.hostname(),u=Math.floor(os.uptime()),tm=os.totalmem(),fm=os.freemem(),l=os.loadavg(),c=os.cpus().length,pl=os.platform(),ar=os.arch();let di='';try{di=require('child_process').execSync('df -h /',{timeout:5000}).toString()}catch(e){}return{hostname:h,platform:pl,arch:ar,cpus:c,uptime:u,mem:{total:fb(tm),free:fb(fm),used:fb(tm-fm),pct:((tm-fm)/tm*100).toFixed(1)+'%'},load:l.map(n=>n.toFixed(2)),disk:di,gk:{v:'2.0',port:PORT,up:process.uptime().toFixed(0)+'s',hldp:true}}} +function fb(b){if(b===0)return'0 B';const k=1024,s=['B','KB','MB','GB','TB'],i=Math.floor(Math.log(b)/Math.log(k));return parseFloat((b/Math.pow(k,i)).toFixed(1))+' '+s[i]} + +const sv=http.createServer(async(rq,rs)=>{ + if(rq.method==='OPTIONS'){jr(rs,204,{});return} + if(rq.method!=='POST'){jr(rs,405,{error:'POST only'});return} + const ip=rq.socket.remoteAddress||''; + if(!checkIP(ip)){log('WARN','rate',ip);jr(rs,429,{error:'too fast'});return} + if(!auth(rq.headers)){log('WARN','auth','fail');jr(rs,401,{error:'bad key'});return} + const u=new URL(rq.url,'http://h'),rt=u.pathname; + try{await route(rt,rq,rs)}catch(e){log('ERR','route',e.message);jr(rs,500,{error:e.message})} +}); + +sv.listen(PORT,'0.0.0.0',()=>{ + const h=os.hostname(); + console.log(`\n ⚔️ 铸渊守门人 v2.0 · HLDP语言接口\n ──────────────────────\n 主机: ${h}\n 端口: ${PORT}\n 新增: /hlpd — HLDP模块翻译执行\n 翻译: @执行 shell|python → 执行\n @部署 写入 → 文件写入\n ──────────────────────\n`); + log('UP',`v2.0 ${h}:${PORT} +HLDP`); +}); + +process.on('SIGTERM',()=>{log('DOWN','sigterm');sv.close(()=>process.exit(0))}); +process.on('SIGINT',()=>{log('DOWN','sigint');sv.close(()=>process.exit(0))}); +process.on('uncaughtException',e=>log('ERR','ex',e.message)); diff --git a/server/mcp-server/.access-key b/server/mcp-server/.access-key new file mode 100644 index 0000000..7532cf1 --- /dev/null +++ b/server/mcp-server/.access-key @@ -0,0 +1 @@ +fe272b100e3e42ba2271d7b7a03236b9c19afee3b2ee9d28e964a3c286763357 diff --git a/zhuyuan-agent/hldp_tree.db b/zhuyuan-agent/hldp_tree.db new file mode 100644 index 0000000..faec1a2 Binary files /dev/null and b/zhuyuan-agent/hldp_tree.db differ diff --git a/zhuyuan-agent/hldp_tree.db-shm b/zhuyuan-agent/hldp_tree.db-shm new file mode 100644 index 0000000..4bbcc27 Binary files /dev/null and b/zhuyuan-agent/hldp_tree.db-shm differ diff --git a/zhuyuan-agent/hldp_tree.db-wal b/zhuyuan-agent/hldp_tree.db-wal new file mode 100644 index 0000000..5a08f22 Binary files /dev/null and b/zhuyuan-agent/hldp_tree.db-wal differ diff --git a/zhuyuan-agent/test_wake.py b/zhuyuan-agent/test_wake.py new file mode 100644 index 0000000..7a07703 --- /dev/null +++ b/zhuyuan-agent/test_wake.py @@ -0,0 +1,8 @@ +from core.hldp_memory import HLDPMemoryEngine +import os +m = HLDPMemoryEngine("/opt/guanghulab-repo/hldp_tree.db", "/opt/guanghulab-repo") +w = m.wake("D112", 1) +print(w["identity"]["name"]) +print(w["status"]) +m.close() +print("OK")