@openduo/finflow 1.9.6 → 1.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/finflow.js +4 -3
- package/package.json +2 -1
package/dist/bin/finflow.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import Ro from"yargs";import{hideBin as Lo}from"yargs/helpers";function O(n){return(n||"").replace(/<[^>]+>/g,"")}function x(){let n=new Date;return`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`}function Mn(n,e=!1){console.log(e?JSON.stringify(n,null,2):JSON.stringify(n))}function Fn(n,e,t){return{data:n,meta:{source:t,timestamp:new Date().toISOString(),command:e}}}function l(n){let{data:e,command:t,source:r,toJSON:o}=n;Mn(Fn(o?o(e):e,t,r))}import ht from"https";import I from"crypto";var D=Object.freeze({os:"web",sv:"8.7.9",app:"CailianpressWeb"}),Gn=Object.freeze({os:"web",sv:"8.7.9",app:"CailianpressWeb"});function ee(n){return Object.keys(n).sort().map(e=>`${e}=${n[e]}`).join("&")}function Z(n){let e={...D,...n},t=ee(e);return t?I.createHash("md5").update(I.createHash("sha1").update(t).digest("hex")).digest("hex"):I.createHash("md5").update(I.createHash("sha1").update("").digest("hex")).digest("hex")}function ne(n){return{...D,...n,sign:Z(n)}}var re=I.createHash("md5").update(I.createHash("sha1").update(ee(Gn)).digest("hex")).digest("hex");var j=n=>n.trim().toLowerCase(),Kn="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",F={"User-Agent":Kn,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"};function yt(n,e,t,r,o,s){return new Promise((i,a)=>{let c=ht.request({hostname:n,path:e,method:t,timeout:s,headers:o},m=>{let d=[];m.on("data",u=>d.push(u)),m.on("end",()=>{let u=Buffer.concat(d).toString("utf-8");try{let p=JSON.parse(u);m.statusCode>=400&&(p._statusCode=m.statusCode),i(p)}catch{i(u)}})});c.on("error",a),c.on("timeout",()=>{c.destroy(),a(new Error("timeout"))}),c.end(r)})}function k(n,e,t={},r={}){let o=r.timeout??1e4,s=new URLSearchParams(ne(t)).toString();return yt(n,`${e}?${s}`,"GET",void 0,{...F,host:n,Referer:`https://${n}/`},o)}var zn={...F,"Content-Type":"application/json",Origin:"https://www.cls.cn",Referer:"https://www.cls.cn/"};async function Yn(){return new Promise(n=>{let e=ht.request({hostname:"www.cls.cn",path:"/",method:"GET",timeout:8e3,headers:{...F}},t=>{t.on("end",()=>{let r=(t.headers["set-cookie"]||[]).map(o=>o.split(";")[0]).join("; ");n(r)}),t.on("data",()=>{})});e.on("error",()=>n("")),e.on("timeout",()=>{e.destroy(),n("")}),e.end()})}async function tt(n,e={}){let t=e.type??"all",r=e.rn??20,o=e.page??0,s={type:t,keyword:n,rn:r,page:o,os:"web",sv:"8.7.9",app:"CailianpressWeb"},i=await Yn(),a={...zn};return i&&(a.Cookie=i),yt("www.cls.cn",`/api/sw?app=CailianpressWeb&os=web&sv=8.7.9&sign=${re}`,"POST",JSON.stringify(s),a,1e4)}function bt(n={}){let e=n.lastTime??Math.floor(Date.now()/1e3),t={lastTime:e,last_time:e,refresh_type:1,rn:n.rn??20};return n.category&&n.category!=="all"&&(t.category=n.category),k("www.cls.cn","/v1/roll/get_roll_list",t)}async function oe(n){let t=(await new Promise((r,o)=>{let s=ht.request({hostname:"www.cls.cn",path:`/detail/${n}`,method:"GET",timeout:1e4,headers:{...F,Referer:"https://www.cls.cn/"}},i=>{let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>r(Buffer.concat(a).toString("utf-8")))});s.on("error",o),s.on("timeout",()=>{s.destroy(),o(new Error("timeout"))}),s.end()})).match(/<script id="__NEXT_DATA__" type="application\/json">([\s\S]*?)<\/script>/);if(!t)return{data:{roll_data:[]}};try{let r=JSON.parse(t[1]),o=(i,a=0)=>{if(a>12||!i||typeof i!="object")return null;if(i.content&&i.brief&&String(i.id)===String(n))return i;for(let c of Object.keys(i)){let m=o(i[c],a+1);if(m)return m}return null},s=o(r);return{data:{roll_data:s?[s]:[]}}}catch{return{data:{roll_data:[]}}}}function wt(n){return k("www.cls.cn",`/v3/depth/home/assembled/${n}`)}function ae(n,e){return k("www.cls.cn",`/v3/depth/list/${n}`,{id:n,last_time:e.lastTime,rn:e.rn??20})}function se(){return k("www.cls.cn","/v2/article/hot/list")}function ie(){return k("www.cls.cn","/api/subject/hotAndNewestSubject")}function _t(n={}){return k("x-quote.cls.cn","/web_quote/plate/hot_plate",{type:n.type??"industry",way:n.way??"change",rever:1,num:50})}function ce(n){return k("x-quote.cls.cn","/quote/stock/basic",{secu_code:j(n),fields:"open_px,av_px,high_px,low_px,change,change_px,change_3,change_5,qrr,entrust_rate,tr,amp,TotalShares,mc,NetAssetPS,cmc,business_amount,business_balance,pe,ttm_pe,pb,secu_name,secu_code,trade_status,secu_type,preclose_px,up_price,last_px"})}function St(n){return k("x-quote.cls.cn","/quote/stock/volume",{secu_code:j(n),field:"five"})}function xt(n){return k("x-quote.cls.cn","/quote/stock/volume",{secu_code:j(n),field:"vol"})}function kt(n){return k("x-quote.cls.cn","/v2/quote/a/tline",{secu_code:j(n)})}function At(n,e={}){let t={code:j(n),period:e.period??"d",fq_type:e.fq_type??1,limit:e.limit??200};return e.start_date&&(t.start_date=e.start_date),k("x-quote.cls.cn","/v2/quote/a/kline",t)}function Nt(n){return k("x-quote.cls.cn","/web_quote/stock/assoc_plate",{secu_code:j(n)})}function qt(n,e={}){return k("x-quote.cls.cn","/web_quote/plate/stocks",{secu_code:j(n),way:e.way??"change",rever:e.rever??1})}function le(n){return k("x-quote.cls.cn","/quote/stock/fundflow",{secu_code:j(n)})}function ue(n,e={}){let t=Math.floor(Date.now()/1e3);return k("www.cls.cn","/es/quotes/articles",{keyword:n,lastTime:t,rn:e.rn??10})}function me(){return k("x-quote.cls.cn","/v2/quote/a/stock/emotion")}function de(n){return k("www.cls.cn","/v3/transaction/anchor",{cdate:n.date})}function pe(n,e={}){return k("x-quote.cls.cn","/quote/index/ann",{secu_code:j(n),page:e.page??1})}function fe(n,e={}){let t=e.page??1,r=e.pageSize??15,o=e.keyWord??"",s={page:t,pageSize:r,stocksCode:j(n),keyWord:o},i={...s,...D,sign:Z(s)},a=new URLSearchParams({app:D.app,os:D.os,sv:D.sv,sign:Z({})}).toString();return yt("x-api.cls.cn",`/tool/interaction/getDataByParam?${a}`,"POST",JSON.stringify(i),{...F,"Content-Type":"application/json",Origin:"https://www.cls.cn",Referer:"https://www.cls.cn/"},1e4)}var U=Object.freeze({headline:{id:1e3,name:"\u5934\u6761"},ashare:{id:1003,name:"A\u80A1"},world:{id:1007,name:"\u73AF\u7403"},company:{id:1005,name:"\u516C\u53F8"},realestate:{id:1006,name:"\u5730\u4EA7"},finance_ch:{id:1032,name:"\u91D1\u878D"},hkstock:{id:1135,name:"\u6E2F\u80A1"},fund:{id:1110,name:"\u57FA\u91D1\xB7ETF"},broker:{id:1118,name:"\u5238\u5546"},auto:{id:1119,name:"\u6C7D\u8F66"},tech:{id:1111,name:"\u79D1\u521B"},pinjian:{id:1160,name:"\u54C1\u89C1"}}),Ot=Object.freeze({all:{category:"all",name:"\u5168\u90E8"},red:{category:"red",name:"\u52A0\u7EA2"},announcement:{category:"announcement",name:"\u516C\u53F8"},watch:{category:"watch",name:"\u770B\u76D8"},hk_us:{category:"hk_us",name:"\u6E2F\u7F8E\u80A1"},fund:{category:"fund",name:"\u57FA\u91D1"},remind:{category:"remind",name:"\u63D0\u9192"}});function ge(n){return Ot[n]?Ot[n]:Object.values(Ot).find(e=>e.name===n||e.category===n)||null}function he(n){if(U[n])return U[n];let e=parseInt(n,10);return isNaN(e)?Object.values(U).find(t=>t.name===n||t.name.includes(n))||null:Object.values(U).find(t=>t.id===e)||null}import Wn from"https";import Xn from"http";var Qn="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",Vn={"User-Agent":Qn,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"},Zn={"flash-api.jin10.com":{id:"bVBF4FyRTn5NJF5n",version:"1.0.0"},"search-open-api.jin10.com":{id:"SRvUdAEfVxLO5NAd",version:"1.0.1"},"common-open-api.jin10.com":{id:"zP6WFH7WKz2vrw4Q",version:"1.0.0"},"uc-api.jin10.com":{id:"YDcStOzjliuTJUvh",version:"1.0.0"},"qh-flash-api.jin10.com":{id:"KxBcVoDHStE6CUkQ",version:"1.0.0",referer:"https://qihuo.jin10.com/"},"futures-report-api.jin10.com":{id:"KxBcVoDHStE6CUkQ",version:"1.3.0",referer:"https://qihuo.jin10.com/"},"qhcal-api.jin10.com":{id:"1coXNOi34tU5TDTl",version:"1.0",referer:"https://qihuo.jin10.com/"}};function S(n,e,t={},r={}){let o=r.timeout??1e4,s=Object.keys(t).length?"?"+new URLSearchParams(t).toString():"",i=`${e}${s}`,a={...Vn,Referer:"https://www.jin10.com/",Origin:"https://www.jin10.com"},c=Zn[n];return c&&(a["x-app-id"]=c.id,a["x-version"]=c.version,a.handleerror="true",c.referer&&(a.Referer=c.referer,a.Origin=new URL(c.referer).origin)),r.cookie&&(a.Cookie=r.cookie),r.extraHeaders&&Object.assign(a,r.extraHeaders),new Promise((m,d)=>{let p=(n.startsWith("localhost")?Xn:Wn).request({hostname:n,path:i,method:"GET",timeout:o,headers:a},f=>{if(f.statusCode>=300&&f.statusCode<400&&f.headers.location){let g=new URL(f.headers.location,`https://${n}`);return m(S(g.hostname,g.pathname+g.search,t,r))}let y=[];f.on("data",g=>y.push(g)),f.on("end",()=>{let g=Buffer.concat(y).toString("utf-8");try{let h=JSON.parse(g);f.statusCode>=400&&(h._statusCode=f.statusCode),m(h)}catch{m(g)}})});p.on("error",d),p.on("timeout",()=>{p.destroy(),d(new Error("timeout"))}),p.end()})}function ye(n={},e){let t={};return n.max_read_id&&(t.max_read_id=n.max_read_id),n.channel&&(t.channel=n.channel),S("flash-api.jin10.com","/get_flash_list",t,e)}function be(n,e){return S("flash-api.jin10.com","/get_flash_list",{channel:"-8200",vip:"1",max_time:n},e)}function we(n,e){return S("flash-api.jin10.com","/get_flash_detail",{id:n},e)}function _e(n,e){return S("flash-api.jin10.com","/get_flash_list_by_date",{date:n},e)}function vt(n,e){return S("search-open-api.jin10.com","/offset/search",{keyword:n.keyword,type:n.type??"flash",rank:n.rank??"hot",order:n.order??1,offset:n.offset??0,rewrite:1},e)}function Se(){return S("e0430d16720e4211b5e072c26205c890.z3c.jin10.com","/web/interest_rates",{},{extraHeaders:{"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0"}})}function xe(){return S("cdn.jin10.com","/json/index/slide_204.json")}function ke(){return S("cdn.jin10.com","/json/index/flir.json")}var jt="e0430d16720e4211b5e072c26205c890.z3c.jin10.com",tr={"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0",handleerror:"true"};function Ct(n){return{extraHeaders:tr,...n}}function $t(n,e="cj",t){return S(jt,"/get/data",{date:n,category:e},Ct(t))}function Ae(n,e="cj",t){return S(jt,"/get/event",{date:n,category:e},Ct(t))}function Ne(n,e="cj",t){return S(jt,"/page/holiday",{date:n,category:e,page:1,pagesize:50},Ct(t))}function Tt(n=-1,e={},t){let r={channel:n};return e.max_time&&(r.max_time=e.max_time),S("qh-flash-api.jin10.com","/get_flash_list",r,t)}function qe(n){return S("futures-report-api.jin10.com","/api/headline",{},n)}function Et(n){return n.replace(/-/g,"")}function Oe(n,e){return S("qhcal-api.jin10.com","/data",{date:Et(n)},e)}function nt(n,e){return S("qhcal-api.jin10.com","/event",{date:Et(n)},e)}function rt(n,e){return S("qhcal-api.jin10.com","/holiday",{date:Et(n)},e)}function ve(n,e){return S("28e2bd69d5104a428d25ff1df132b716.z3c.jin10.com","/basic_data",{date:n},{...e,extraHeaders:{"x-app-id":"KxBcVoDHStE6CUkQ","x-version":"1.0"}})}function ot(){return S("cdn.jin10.com","/json/index/all_topics.json")}function je(n,e={},t){let r={id:n};return e.page&&(r.page=e.page),e.page_size&&(r.page_size=e.page_size),S("reference-api.jin10.com","/topic/getById",r,{...t,extraHeaders:{"x-app-id":"arU9WZF7TC9m7nWn","x-version":"1.0.1",Referer:"https://xnews.jin10.com/"}})}import er from"https";var Jt="www.gelonghui.com",nr="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";function at(n,e=1e4){return new Promise((t,r)=>{let o=new URL(n,`https://${Jt}`),s=er.get({hostname:Jt,path:o.pathname+o.search,headers:{"User-Agent":nr,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9",Referer:`https://${Jt}/live/`,"client-lang":"zh-cn",platform:"web",shortversion:"10.7.0"}},i=>{let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>{let c=Buffer.concat(a).toString();try{t(JSON.parse(c))}catch{t(c)}})});s.setTimeout(e,()=>{s.destroy(),r(new Error("timeout"))}),s.on("error",r)})}function G(n={}){let e=new URLSearchParams({category:n.category??"all",limit:String(n.limit??15),timestamp:String(Date.now())});return n.liveId&&e.set("liveId",String(n.liveId)),at(`/api/live-channels/${n.channel??"all"}/lives/v4?${e}`)}function Ce(n={}){return G({channel:n.channel,category:"important",limit:n.limit,liveId:n.liveId})}function $e(n={}){return G({channel:n.channel,category:"popular",limit:n.limit,liveId:n.liveId})}function Te(n={}){return at(`/hq/hk/boards/v1?sort=${n.sort??"netChange"}&order=${n.order??"desc"}`)}function Rt(){return at("/hq/home-page-data")}function K(){return at("/hq/quote/api/market/flow/entrance/data/v2")}var Lt=Object.freeze([{id:"all",name:"\u5168\u90E8"},{id:"popular",name:"\u6700\u70ED"},{id:"fundLive",name:"\u57FA\u91D1"},{id:"ai",name:"AI"},{id:"international",name:"\u56FD\u9645"},{id:"chineseMainland",name:"\u4E2D\u56FD\u5927\u9646"},{id:"hongkongMacaoTaiwan",name:"\u6E2F\u6FB3\u53F0"},{id:"HKStock",name:"\u6E2F\u80A1"},{id:"AStock",name:"A\u80A1"},{id:"USStock",name:"\u7F8E\u80A1"},{id:"virtualAssets",name:"\u865A\u62DF\u8D44\u4EA7"},{id:"exchangeCommodity",name:"\u5546\u54C1\u5916\u6C47"},{id:"house",name:"\u697C\u5E02"},{id:"debenture",name:"\u503A\u5238"}]),Pt=Object.freeze([{id:"netChange",name:"\u6DA8\u8DCC\u5E45"},{id:"turnoverValue",name:"\u6210\u4EA4\u989D"},{id:"turnVolume",name:"\u6210\u4EA4\u91CF"}]);function st(n){return n?Lt.find(e=>e.id.toLowerCase()===n.toLowerCase()||e.name===n)??Lt[0]:Lt[0]}function Ee(n){return n?Pt.find(e=>e.id.toLowerCase()===n.toLowerCase()||e.name===n)??Pt[0]:Pt[0]}import Dt from"fs";import $ from"path";import T from"os";import{execSync as It}from"child_process";import Je from"crypto";function or(){return It('security find-generic-password -w -s "Chrome Safe Storage"',{encoding:"utf-8"}).trim()}function ar(n){let e=n.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(e?.[1])return e[1];let t=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let r of t){let o=n.match(r);if(o&&o[1])return o[1]}return n}function sr(n,e,t=0){let r=n.slice(0,3).toString("ascii");if(!/^v\d\d$/.test(r))return n.toString("utf-8");let o=n.slice(3);if(o.length===0||o.length%16!==0)return n.toString("utf-8");let s=Je.pbkdf2Sync(e,"saltysalt",1003,16,"sha1"),i=Buffer.alloc(16,32),a=Je.createDecipheriv("aes-128-cbc",s,i);a.setAutoPadding(!1);let c=Buffer.concat([a.update(o),a.final()]),m=c[c.length-1];return m&&m<=16&&(c=c.slice(0,-m)),t>=24&&c.length>32&&(c=c.slice(32)),ar(c.toString("utf-8"))}var ir=[$.join(T.homedir(),"Library/Application Support/Google/Chrome/Default/Cookies"),$.join(T.homedir(),"Library/Application Support/Google/Chrome/Profile 1/Cookies"),$.join(T.homedir(),"Library/Application Support/Google/Chrome Beta/Default/Cookies"),$.join(T.homedir(),"Library/Application Support/Google/Chrome Beta/Profile 1/Cookies"),$.join(T.homedir(),"Library/Application Support/Google/Chrome Dev/Default/Cookies"),$.join(T.homedir(),"Library/Application Support/Google/Chrome Canary/Default/Cookies"),$.join(T.homedir(),"Library/Application Support/BraveSoftware/Brave-Browser/Default/Cookies"),$.join(T.homedir(),"Library/Application Support/Microsoft Edge/Default/Cookies")];function cr(n){for(let e of ir){if(!Dt.existsSync(e))continue;let t=$.join(T.tmpdir(),`finflow_cookies_${Date.now()}.db`);Dt.copyFileSync(e,t);try{let r=0;try{let i=It(`sqlite3 "${t}" "SELECT value FROM meta WHERE key='version';"`,{encoding:"utf-8"}).trim();r=parseInt(i,10)||0}catch{}let o=`SELECT name, hex(encrypted_value), host_key FROM cookies WHERE host_key LIKE '%${n}%'`;return JSON.parse(It(`sqlite3 -json "${t}" "${o}"`,{encoding:"utf-8"})).map(i=>({name:i.name,value:Buffer.from(i["hex(encrypted_value)"],"hex"),domain:i.host_key,_metaVersion:r}))}finally{try{Dt.unlinkSync(t)}catch{}}}return[]}function it(n,e){if(process.platform!=="darwin")throw new Error("\u6D4F\u89C8\u5668\u81EA\u52A8\u83B7\u53D6 Cookie \u4EC5\u652F\u6301 macOS");let t;try{t=or()}catch{throw new Error(`\u65E0\u6CD5\u4ECE Keychain \u83B7\u53D6 Chrome \u5BC6\u7801\u3002
|
|
3
|
-
\u8BF7\u786E\u4FDD\u5DF2\u5B89\u88C5 Google Chrome\u3002`)}let r=cr(n);if(!r.length)throw new Error(`\u672A\u627E\u5230 ${n} Cookie\uFF0C\u8BF7\u786E\u4FDD\u5DF2\u5728 Chrome \u4E2D\u767B\u5F55 ${n}`);let o=e?[e,`.${e}`]:[`.${n}`,n],s=[];for(let i of r)if(o.includes(i.domain))try{let a=sr(i.value,t,i._metaVersion);if(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(a))continue;s.push(`${i.name}=${a}`)}catch{}if(!s.length)throw new Error("Cookie \u89E3\u5BC6\u5168\u90E8\u5931\u8D25");return s.join("; ")}function J(){try{return it("jin10.com")}catch{return null}}function Re(n){return n?.slice(5,16)||""}function z(n){return n?.length?n.filter(e=>e.type==="quotes").map(e=>e.title).join(" "):""}function ct(n,e){return!n&&e?.data?.vip_title?`[VIP] ${e.data.vip_title}`:n?O(n).replace(/^金十数据\d{4}年\d{1,2}月\d{1,2}日讯[,,]?\s*/,""):""}var Le=[],lr=["content","title","brief","data.content","data.title","indicator_name","name","subject_name"];function ur(n){return lr.map(e=>e.split(".").reduce((r,o)=>r?.[o],n)||"").filter(Boolean).join(" ").toLowerCase()}function A(n){if(!Le.length||!Array.isArray(n))return n;let e=Le.map(t=>t.toLowerCase());return n.filter(t=>{let r=ur(t);return!e.some(o=>r.includes(o))})}function Y(n){return n=A(n),{items:n.map(e=>({time:e.time,content:ct(e.data?.content||e.data?.title||"",e),title:e.data?.title||"",importance:e.important??0,source:e.data?.source||"",tags:z(e.remark)?z(e.remark).split(" "):[]})),total:n.length}}function mr(n){return n=A(n),{items:n.map(e=>({time:new Date(e.ctime*1e3).toISOString(),content:O(e.content||e.brief||""),title:e.title||"",importance:0,source:"cls",tags:(e.subjects||[]).map(t=>`#${t.subject_name}`)})),total:n.length}}function Ut(n){return n=A(n),{items:n.map(e=>({time:new Date(e.createTimestamp*1e3).toISOString(),content:O(e.content||""),title:e.title||"",importance:e.level===1?1:0,source:"glh",tags:[...(e.relatedStocks||[]).map(t=>t.name),...(e.relatedInfos||[]).map(t=>`#${t.name}`)],readCount:e.count?.read||0})),total:n.length}}function dr(n){let e=n?.list||(Array.isArray(n)?n:[]),t=[];if(Array.isArray(e)&&Array.isArray(e[0]))for(let r of e)for(let o of r)t.push(o);else Array.isArray(e)&&(t=e);return t=A(t),{items:t.map(r=>({title:r.title||"",badge:r.ndata?.badge||"",redirectUrl:r.web_redirect_url||""})),total:t.length}}function pr(n){let e=[],t=n?.list||(Array.isArray(n)?n:[]);if(Array.isArray(t)&&t.length&&Array.isArray(t[0]))for(let r of t)e.push(...r);else Array.isArray(t)&&(e=t);return e=A(e),{items:e.map(r=>({title:r.title||"",introduction:r.introduction||"",displayDatetime:r.display_datetime||"",tags:(r.reveal_tags||[]).map(o=>o.name||o),vip:!!r.vip,source:r.source||""})),total:e.length}}function Pe(n){let e=n?.data?.top_article||[],t=n?.data?.depth_list||[],r=A([...e,...t]);return{items:r.map(o=>({time:o.ctime?new Date(o.ctime*1e3).toISOString():"",title:o.title||"",brief:O(o.brief||""),source:o.source||"",subjects:(o.subjects||[]).map(s=>s.subject_name||s.name||""),readingNum:o.reading_num||0})),total:r.length}}function fr(n){let e=A(n?.data||[]);return{items:e.map(t=>({title:t.title||"",readingNum:t.readNum||0})),total:e.length}}function gr(n){let e=A(n?.data||[]);return{items:e.map(t=>({time:t.ctime?new Date(t.ctime*1e3).toISOString():"",title:t.title||"",source:t.source||""})),total:e.length}}function De(n){return{items:n.map(e=>({id:e.id,title:e.title||"",shortName:e.short_name||"",introduction:(e.introduction||"").trim().slice(0,200),categoryName:e.category_name||"",subscribeNum:e.subscribe_num||0})),total:n.length}}function hr(n){let e=n?.data?.hot_subjects||[],t=n?.data?.newest_subjects||[];return{hotSubjects:e.map(r=>({name:r.name||"",attentionNum:r.attention_num||0,newestArticleTitle:O(r.newest_article_title||"")})),newestSubjects:t.map(r=>({name:r.name||""}))}}function yr(n){let e=Array.isArray(n)?n:n?.data||[],t=new Map;for(let o of e){let s=o.category_name||"\u672A\u5206\u7C7B";t.set(s,(t.get(s)||0)+1)}let r=Array.from(t,([o,s])=>({name:o,count:s}));return{items:r,total:r.length}}var br=new Set(["stock","telegram","featured","depth","eoe_article"]),wr={stock:"\u80A1\u7968",telegram:"\u7535\u62A5",featured:"\u8981\u95FB",depth:"\u6DF1\u5EA6",eoe_article:"\u6587\u7AE0"};function Ie(n){let e=n?.data||{},t=[],r=0;for(let[o,s]of Object.entries(e))if(br.has(o)&&!(!s||typeof s!="object"||!Array.isArray(s.data))){r+=s.total_num||s.data.length;for(let i of s.data){let a=i.stock_category==="stock"||/^s[hz]\d+$/i.test(i.descr||""),c=i.descr?O(i.descr):"",m=O(i.title||i.featuredTitle||""),d=c;if(!m&&c){let u=c.search(/[。!?\n]/);m=u>0?c.slice(0,u):c.slice(0,60),d=c}d&&d.length>200&&(d=d.slice(0,200)),!(!m&&!d&&!a)&&t.push({kind:wr[o]||o,type:a||i.type===1?"stock":"article",title:m,brief:d,code:a&&(i.stock_id||i.descr)||"",name:a?O(i.title||""):"",price:i.last||null,percent:i.raise||null,time:i.time?new Date(i.time*1e3).toISOString():"",author:i.author||"",id:i.id,url:i.external_link||""})}}return{items:t,total:r}}function _r(n){let e=n?.data?.roll_data?.[0];return e?{item:{id:e.id,time:e.ctime?new Date(e.ctime*1e3).toISOString():"",title:O(e.title||""),content:O(e.content||e.brief||""),subjects:(e.subjects||[]).map(t=>t.subject_name||"").filter(Boolean),stocks:(e.stock_list||[]).map(t=>t.name||t.stock_name||"").filter(Boolean),url:`https://www.cls.cn/detail/${e.id}`}}:{item:null}}function Ue(n){let e=(n?.data?.list||[]).filter(t=>!t.vip);return{items:e.map(t=>({kind:t.type||"",type:t.type==="flash"?"flash":t.type==="news"?"article":t.type||"",title:t.title||t.data?.title||"",brief:t.data?.content?O(t.data.content).slice(0,200):t.introduction||"",time:t.display_datetime||t.time||"",important:t.important??0,id:t.id})),total:e.length}}async function Bt(n){let e=J(),t=e?{cookie:e}:void 0,r=new Set,o=[],s=await ye({},t);for(let c of s?.data||[])r.has(c.id)||(r.add(c.id),o.push(c));let i=0,a=50;for(;o.length<n&&i++<a;){let c=o[o.length-1];if(!c)break;let d=(await be(c.time,t))?.data||[];if(!d.length)break;let u=0;for(let p of d)r.has(p.id)||(r.add(p.id),o.push(p),u++);if(u===0)break;o.length<n&&await new Promise(p=>setTimeout(p,200))}return o}function Be(n){return n.command({command:"info",describe:"\u4FE1\u606F\u6D41",builder:e=>e.strictCommands(!1).command("flash","\u5FEB\u8BAF",t=>t.option("src",{alias:"s",type:"string",choices:["cls","jin10","glh"],default:"cls",describe:"\u6570\u636E\u6E90"}).option("category",{alias:"c",type:"string",describe:"cls \u680F\u76EE / glh \u9891\u9053"}).strictCommands(!1).command("important","\u91CD\u8981\u5FEB\u8BAF\uFF08glh \u6570\u636E\u6E90\uFF09",r=>r.option("channel",{alias:"c",type:"string",describe:"\u9891\u9053"}),async r=>{let{n:o=10,channel:s}=r,i=s?st(s):st("popular"),a=await Ce({channel:i.id,limit:o}),c=A(a.result||[]);l({data:c,command:"info flash important",source:"glh",toJSON:()=>Ut(c)})}).command("popular","\u70ED\u95E8\u5FEB\u8BAF\uFF08glh\uFF09",r=>r,async r=>{let{n:o=10}=r,s=await $e({limit:o}),i=A(s.result||[]);l({data:i,command:"info flash popular",source:"glh",toJSON:()=>Ut(i)})}).command("detail <id>","\u5FEB\u8BAF\u8BE6\u60C5\uFF08jin10\uFF09",r=>r,async r=>{let o=r.id,s=await we(o);l({data:s,command:"info flash detail",source:"jin10",toJSON:i=>Y(i?.data?[i]:[])})}).command("date <date>","\u5386\u53F2\u5FEB\u8BAF\uFF08jin10\uFF0C\u9700\u767B\u5F55\uFF09",r=>r,async r=>{let o=r.date,s;try{s=it("jin10.com")}catch(a){console.error(a.message),console.error("\u6309\u65E5\u671F\u67E5\u770B\u5FEB\u8BAF\u9700\u8981\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55 jin10.com"),process.exit(1)}let i=await _e(o,{cookie:s});i?._statusCode===403&&(console.error("\u6B64\u529F\u80FD\u9700\u8981\u5F00\u901A\u4F1A\u5458\uFF0C\u8BF7\u5728 jin10.com \u5347\u7EA7"),process.exit(1)),l({data:i,command:"info flash date",source:"jin10",toJSON:a=>Y(a?.data||[])})}),async t=>{let{n:r=10,src:o="cls",category:s}=t,i=s||"all",a=[];o==="jin10"?a.push({name:"jin10",fn:u=>Bt(r).then(p=>l({data:p,command:"info flash",source:u,toJSON:Y}))},{name:"cls",fn:u=>m(u,i,r)},{name:"glh",fn:u=>d(u,i,r)}):o==="glh"?a.push({name:"glh",fn:u=>d(u,i,r)},{name:"cls",fn:u=>m(u,i,r)},{name:"jin10",fn:u=>Bt(r).then(p=>l({data:p,command:"info flash",source:u,toJSON:Y}))}):i==="all"?a.push({name:"cls",fn:u=>m(u,i,r)},{name:"jin10",fn:u=>Bt(r).then(p=>l({data:A(p),command:"info flash",source:u,toJSON:Y}))},{name:"glh",fn:u=>d(u,i,r)}):a.push({name:"cls",fn:u=>m(u,i,r)});let c;for(let u=0;u<a.length;u++){let{name:p,fn:f}=a[u],y=u===0?p:`${p} fallback`;try{await f(y);return}catch(g){c=g,u<a.length-1&&console.error(`Source ${p} failed: ${g?.message||g}, trying next...`)}}throw c;async function m(u,p,f){let y=ge(p);if(!y)return l({data:{error:`\u672A\u77E5\u680F\u76EE: ${p}\u3002\u53EF\u7528: all/red/announcement/watch/hk_us/fund/remind\uFF0C\u6216\u7528 --src jin10|glh`},command:"info flash",source:"cls"});let g=new Set,h=[],w=20,q=50,H=0,M=y.category,gt=(await bt({rn:w,category:M}))?.data?.roll_data||[];for(let v of gt)g.has(v.id)||(g.add(v.id),h.push(v));for(;h.length<f&&H++<q;){let v=h.reduce((E,te)=>(te.ctime||0)<(E.ctime||0)?te:E,h[0]);if(!v?.ctime)break;let Hn=(await bt({lastTime:v.ctime,rn:w,category:M}))?.data?.roll_data||[],Zt=0;for(let E of Hn)g.has(E.id)||(g.add(E.id),h.push(E),Zt++);if(!Zt)break;h.length<f&&await new Promise(E=>setTimeout(E,200))}let V=h.slice(0,f);l({data:V,command:"info flash",source:u,toJSON:mr})}async function d(u,p,f){let y=p&&p!=="all"?st(p):{id:"all"},g=new Set,h=[],w=15,q=50,H=0,M=await G({channel:y.id,limit:w});for(let P of M?.result||[])g.has(P.id)||(g.add(P.id),h.push(P));for(;h.length<f&&H++<q;){let P=h[h.length-1];if(!P?.id)break;let gt=await G({channel:y.id,limit:w,liveId:P.id}),V=0;for(let v of gt?.result||[])g.has(v.id)||(g.add(v.id),h.push(v),V++);if(!V)break;h.length<f&&await new Promise(v=>setTimeout(v,200))}l({data:h,command:"info flash",source:u,toJSON:Ut})}}).command("news","\u6DF1\u5EA6\u6587\u7AE0",t=>t.strictCommands(!1).command("slide","\u5E7B\u706F\u7247/\u91CD\u8981\u4E8B\u4EF6\uFF08jin10\uFF09",r=>r,async()=>{let r=await xe();l({data:r,command:"info news slide",source:"jin10",toJSON:dr})}).command("feature","\u7CBE\u9009\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async()=>{let r=await ke();l({data:r,command:"info news feature",source:"jin10",toJSON:pr})}).command("depth [channel]","\u6DF1\u5EA6\u680F\u76EE\uFF08cls\uFF09",r=>r,async r=>{let{n:o=10}=r,s=r.channel||"headline",i=he(s);if(!i){let m=Object.entries(U).map(([d,u])=>` ${d.padEnd(12)} ${u.name} (${u.id})`).join(`
|
|
2
|
+
import si from"yargs";import{hideBin as ii}from"yargs/helpers";function D(n){return(n||"").replace(/<[^>]+>/g,"")}function O(){let n=new Date;return`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`}function $a(n,t=!1){console.log(t?JSON.stringify(n,null,2):JSON.stringify(n))}function Ca(n,t,e){return{data:n,meta:{source:e,timestamp:new Date().toISOString(),command:t}}}function u(n){let{data:t,command:e,source:o,toJSON:a}=n;$a(Ca(a?a(t):t,e,o))}import Je from"https";import V from"crypto";var Q=Object.freeze({os:"web",sv:"8.7.9",app:"CailianpressWeb"}),Pa=Object.freeze({os:"web",sv:"8.7.9",app:"CailianpressWeb"});function qt(n){return Object.keys(n).sort().map(t=>`${t}=${n[t]}`).join("&")}function ye(n){let t={...Q,...n},e=qt(t);return e?V.createHash("md5").update(V.createHash("sha1").update(e).digest("hex")).digest("hex"):V.createHash("md5").update(V.createHash("sha1").update("").digest("hex")).digest("hex")}function $t(n){return{...Q,...n,sign:ye(n)}}var Ct=V.createHash("md5").update(V.createHash("sha1").update(qt(Pa)).digest("hex")).digest("hex");var R=n=>n.trim().toLowerCase(),Ja="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",oe={"User-Agent":Ja,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"};function De(n,t,e,o,a,s){return new Promise((i,r)=>{let c=Je.request({hostname:n,path:t,method:e,timeout:s,headers:a},l=>{let m=[];l.on("data",d=>m.push(d)),l.on("end",()=>{let d=Buffer.concat(m).toString("utf-8");try{let p=JSON.parse(d);l.statusCode>=400&&(p._statusCode=l.statusCode),i(p)}catch{i(d)}})});c.on("error",r),c.on("timeout",()=>{c.destroy(),r(new Error("timeout"))}),c.end(o)})}function j(n,t,e={},o={}){let a=o.timeout??1e4,s=new URLSearchParams($t(e)).toString();return De(n,`${t}?${s}`,"GET",void 0,{...oe,host:n,Referer:`https://${n}/`},a)}var Da={...oe,"Content-Type":"application/json",Origin:"https://www.cls.cn",Referer:"https://www.cls.cn/"};async function Ea(){return new Promise(n=>{let t=Je.request({hostname:"www.cls.cn",path:"/",method:"GET",timeout:8e3,headers:{...oe}},e=>{e.on("end",()=>{let o=(e.headers["set-cookie"]||[]).map(a=>a.split(";")[0]).join("; ");n(o)}),e.on("data",()=>{})});t.on("error",()=>n("")),t.on("timeout",()=>{t.destroy(),n("")}),t.end()})}async function ge(n,t={}){let e=t.type??"all",o=t.rn??20,a=t.page??0,s={type:e,keyword:n,rn:o,page:a,os:"web",sv:"8.7.9",app:"CailianpressWeb"},i=await Ea(),r={...Da};return i&&(r.Cookie=i),De("www.cls.cn",`/api/sw?app=CailianpressWeb&os=web&sv=8.7.9&sign=${Ct}`,"POST",JSON.stringify(s),r,1e4)}function Ee(n={}){let t=n.lastTime??Math.floor(Date.now()/1e3),e={lastTime:t,last_time:t,refresh_type:1,rn:n.rn??20};return n.category&&n.category!=="all"&&(e.category=n.category),j("www.cls.cn","/v1/roll/get_roll_list",e)}async function Pt(n){let e=(await new Promise((o,a)=>{let s=Je.request({hostname:"www.cls.cn",path:`/detail/${n}`,method:"GET",timeout:1e4,headers:{...oe,Referer:"https://www.cls.cn/"}},i=>{let r=[];i.on("data",c=>r.push(c)),i.on("end",()=>o(Buffer.concat(r).toString("utf-8")))});s.on("error",a),s.on("timeout",()=>{s.destroy(),a(new Error("timeout"))}),s.end()})).match(/<script id="__NEXT_DATA__" type="application\/json">([\s\S]*?)<\/script>/);if(!e)return{data:{roll_data:[]}};try{let o=JSON.parse(e[1]),a=(i,r=0)=>{if(r>12||!i||typeof i!="object")return null;if(i.content&&i.brief&&String(i.id)===String(n))return i;for(let c of Object.keys(i)){let l=a(i[c],r+1);if(l)return l}return null},s=a(o);return{data:{roll_data:s?[s]:[]}}}catch{return{data:{roll_data:[]}}}}function Re(n){return j("www.cls.cn",`/v3/depth/home/assembled/${n}`)}function Jt(n,t){return j("www.cls.cn",`/v3/depth/list/${n}`,{id:n,last_time:t.lastTime,rn:t.rn??20})}function Dt(){return j("www.cls.cn","/v2/article/hot/list")}function Et(){return j("www.cls.cn","/api/subject/hotAndNewestSubject")}function Ie(n={}){return j("x-quote.cls.cn","/web_quote/plate/hot_plate",{type:n.type??"industry",way:n.way??"change",rever:1,num:50})}function Rt(n){return j("x-quote.cls.cn","/quote/stock/basic",{secu_code:R(n),fields:"open_px,av_px,high_px,low_px,change,change_px,change_3,change_5,qrr,entrust_rate,tr,amp,TotalShares,mc,NetAssetPS,cmc,business_amount,business_balance,pe,ttm_pe,pb,secu_name,secu_code,trade_status,secu_type,preclose_px,up_price,last_px"})}function Le(n){return j("x-quote.cls.cn","/quote/stock/volume",{secu_code:R(n),field:"five"})}function Me(n){return j("x-quote.cls.cn","/quote/stock/volume",{secu_code:R(n),field:"vol"})}function Fe(n){return j("x-quote.cls.cn","/v2/quote/a/tline",{secu_code:R(n)})}function It(n,t={}){let e={code:R(n),period:t.period??"d",fq_type:t.fq_type??1,limit:t.limit??200};return t.start_date&&(e.start_date=t.start_date),j("x-quote.cls.cn","/v2/quote/a/kline",e)}function He(n){return j("x-quote.cls.cn","/web_quote/stock/assoc_plate",{secu_code:R(n)})}function Be(n,t={}){return j("x-quote.cls.cn","/web_quote/plate/stocks",{secu_code:R(n),way:t.way??"change",rever:t.rever??1})}function Lt(n){return j("x-quote.cls.cn","/quote/stock/fundflow",{secu_code:R(n)})}function Mt(n,t={}){let e=Math.floor(Date.now()/1e3);return j("www.cls.cn","/es/quotes/articles",{keyword:n,lastTime:e,rn:t.rn??10})}function Ft(){return j("x-quote.cls.cn","/v2/quote/a/stock/emotion")}function Ht(n){return j("www.cls.cn","/v3/transaction/anchor",{cdate:n.date})}function Bt(n,t={}){return j("x-quote.cls.cn","/quote/index/ann",{secu_code:R(n),page:t.page??1})}function Ut(n,t={}){let e=t.page??1,o=t.pageSize??15,a=t.keyWord??"",s={page:e,pageSize:o,stocksCode:R(n),keyWord:a},i={...s,...Q,sign:ye(s)},r=new URLSearchParams({app:Q.app,os:Q.os,sv:Q.sv,sign:ye({})}).toString();return De("x-api.cls.cn",`/tool/interaction/getDataByParam?${r}`,"POST",JSON.stringify(i),{...oe,"Content-Type":"application/json",Origin:"https://www.cls.cn",Referer:"https://www.cls.cn/"},1e4)}var Z=Object.freeze({headline:{id:1e3,name:"\u5934\u6761"},ashare:{id:1003,name:"A\u80A1"},world:{id:1007,name:"\u73AF\u7403"},company:{id:1005,name:"\u516C\u53F8"},realestate:{id:1006,name:"\u5730\u4EA7"},finance_ch:{id:1032,name:"\u91D1\u878D"},hkstock:{id:1135,name:"\u6E2F\u80A1"},fund:{id:1110,name:"\u57FA\u91D1\xB7ETF"},broker:{id:1118,name:"\u5238\u5546"},auto:{id:1119,name:"\u6C7D\u8F66"},tech:{id:1111,name:"\u79D1\u521B"},pinjian:{id:1160,name:"\u54C1\u89C1"}}),Ue=Object.freeze({all:{category:"all",name:"\u5168\u90E8"},red:{category:"red",name:"\u52A0\u7EA2"},announcement:{category:"announcement",name:"\u516C\u53F8"},watch:{category:"watch",name:"\u770B\u76D8"},hk_us:{category:"hk_us",name:"\u6E2F\u7F8E\u80A1"},fund:{category:"fund",name:"\u57FA\u91D1"},remind:{category:"remind",name:"\u63D0\u9192"}});function Yt(n){return Ue[n]?Ue[n]:Object.values(Ue).find(t=>t.name===n||t.category===n)||null}function Kt(n){if(Z[n])return Z[n];let t=parseInt(n,10);return isNaN(t)?Object.values(Z).find(e=>e.name===n||e.name.includes(n))||null:Object.values(Z).find(e=>e.id===t)||null}import Ra from"https";import Ia from"http";var La="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",Ma={"User-Agent":La,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"},Fa={"flash-api.jin10.com":{id:"bVBF4FyRTn5NJF5n",version:"1.0.0"},"search-open-api.jin10.com":{id:"SRvUdAEfVxLO5NAd",version:"1.0.1"},"common-open-api.jin10.com":{id:"zP6WFH7WKz2vrw4Q",version:"1.0.0"},"uc-api.jin10.com":{id:"YDcStOzjliuTJUvh",version:"1.0.0"},"qh-flash-api.jin10.com":{id:"KxBcVoDHStE6CUkQ",version:"1.0.0",referer:"https://qihuo.jin10.com/"},"futures-report-api.jin10.com":{id:"KxBcVoDHStE6CUkQ",version:"1.3.0",referer:"https://qihuo.jin10.com/"},"qhcal-api.jin10.com":{id:"1coXNOi34tU5TDTl",version:"1.0",referer:"https://qihuo.jin10.com/"}};function N(n,t,e={},o={}){let a=o.timeout??1e4,s=Object.keys(e).length?"?"+new URLSearchParams(e).toString():"",i=`${t}${s}`,r={...Ma,Referer:"https://www.jin10.com/",Origin:"https://www.jin10.com"},c=Fa[n];return c&&(r["x-app-id"]=c.id,r["x-version"]=c.version,r.handleerror="true",c.referer&&(r.Referer=c.referer,r.Origin=new URL(c.referer).origin)),o.cookie&&(r.Cookie=o.cookie),o.extraHeaders&&Object.assign(r,o.extraHeaders),new Promise((l,m)=>{let p=(n.startsWith("localhost")?Ia:Ra).request({hostname:n,path:i,method:"GET",timeout:a,headers:r},f=>{if(f.statusCode>=300&&f.statusCode<400&&f.headers.location){let h=new URL(f.headers.location,`https://${n}`);return l(N(h.hostname,h.pathname+h.search,e,o))}let g=[];f.on("data",h=>g.push(h)),f.on("end",()=>{let h=Buffer.concat(g).toString("utf-8");try{let b=JSON.parse(h);f.statusCode>=400&&(b._statusCode=f.statusCode),l(b)}catch{l(h)}})});p.on("error",m),p.on("timeout",()=>{p.destroy(),m(new Error("timeout"))}),p.end()})}function zt(n={},t){let e={};return n.max_read_id&&(e.max_read_id=n.max_read_id),n.channel&&(e.channel=n.channel),N("flash-api.jin10.com","/get_flash_list",e,t)}function Gt(n,t){return N("flash-api.jin10.com","/get_flash_list",{channel:"-8200",vip:"1",max_time:n},t)}function Wt(n,t){return N("flash-api.jin10.com","/get_flash_detail",{id:n},t)}function Xt(n,t){return N("flash-api.jin10.com","/get_flash_list_by_date",{date:n},t)}function Ye(n,t){return N("search-open-api.jin10.com","/offset/search",{keyword:n.keyword,type:n.type??"flash",rank:n.rank??"hot",order:n.order??1,offset:n.offset??0,rewrite:1},t)}function Qt(){return N("e0430d16720e4211b5e072c26205c890.z3c.jin10.com","/web/interest_rates",{},{extraHeaders:{"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0"}})}function Vt(){return N("cdn.jin10.com","/json/index/slide_204.json")}function Zt(){return N("cdn.jin10.com","/json/index/flir.json")}var Ke="e0430d16720e4211b5e072c26205c890.z3c.jin10.com",Ha={"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0",handleerror:"true"};function ze(n){return{extraHeaders:Ha,...n}}function Ge(n,t="cj",e){return N(Ke,"/get/data",{date:n,category:t},ze(e))}function en(n,t="cj",e){return N(Ke,"/get/event",{date:n,category:t},ze(e))}function tn(n,t="cj",e){return N(Ke,"/page/holiday",{date:n,category:t,page:1,pagesize:50},ze(e))}function We(n=-1,t={},e){let o={channel:n};return t.max_time&&(o.max_time=t.max_time),N("qh-flash-api.jin10.com","/get_flash_list",o,e)}function nn(n){return N("futures-report-api.jin10.com","/api/headline",{},n)}function Xe(n){return n.replace(/-/g,"")}function on(n,t){return N("qhcal-api.jin10.com","/data",{date:Xe(n)},t)}function be(n,t){return N("qhcal-api.jin10.com","/event",{date:Xe(n)},t)}function _e(n,t){return N("qhcal-api.jin10.com","/holiday",{date:Xe(n)},t)}function an(n,t){return N("28e2bd69d5104a428d25ff1df132b716.z3c.jin10.com","/basic_data",{date:n},{...t,extraHeaders:{"x-app-id":"KxBcVoDHStE6CUkQ","x-version":"1.0"}})}function we(){return N("cdn.jin10.com","/json/index/all_topics.json")}function rn(n,t={},e){let o={id:n};return t.page&&(o.page=t.page),t.page_size&&(o.page_size=t.page_size),N("reference-api.jin10.com","/topic/getById",o,{...e,extraHeaders:{"x-app-id":"arU9WZF7TC9m7nWn","x-version":"1.0.1",Referer:"https://xnews.jin10.com/"}})}import Ba from"https";var Qe="www.gelonghui.com",Ua="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";function Se(n,t=1e4){return new Promise((e,o)=>{let a=new URL(n,`https://${Qe}`),s=Ba.get({hostname:Qe,path:a.pathname+a.search,headers:{"User-Agent":Ua,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9",Referer:`https://${Qe}/live/`,"client-lang":"zh-cn",platform:"web",shortversion:"10.7.0"}},i=>{let r=[];i.on("data",c=>r.push(c)),i.on("end",()=>{let c=Buffer.concat(r).toString();try{e(JSON.parse(c))}catch{e(c)}})});s.setTimeout(t,()=>{s.destroy(),o(new Error("timeout"))}),s.on("error",o)})}function ae(n={}){let t=new URLSearchParams({category:n.category??"all",limit:String(n.limit??15),timestamp:String(Date.now())});return n.liveId&&t.set("liveId",String(n.liveId)),Se(`/api/live-channels/${n.channel??"all"}/lives/v4?${t}`)}function sn(n={}){return ae({channel:n.channel,category:"important",limit:n.limit,liveId:n.liveId})}function cn(n={}){return ae({channel:n.channel,category:"popular",limit:n.limit,liveId:n.liveId})}function un(n={}){return Se(`/hq/hk/boards/v1?sort=${n.sort??"netChange"}&order=${n.order??"desc"}`)}function Ve(){return Se("/hq/home-page-data")}function re(){return Se("/hq/quote/api/market/flow/entrance/data/v2")}var Ze=Object.freeze([{id:"all",name:"\u5168\u90E8"},{id:"popular",name:"\u6700\u70ED"},{id:"fundLive",name:"\u57FA\u91D1"},{id:"ai",name:"AI"},{id:"international",name:"\u56FD\u9645"},{id:"chineseMainland",name:"\u4E2D\u56FD\u5927\u9646"},{id:"hongkongMacaoTaiwan",name:"\u6E2F\u6FB3\u53F0"},{id:"HKStock",name:"\u6E2F\u80A1"},{id:"AStock",name:"A\u80A1"},{id:"USStock",name:"\u7F8E\u80A1"},{id:"virtualAssets",name:"\u865A\u62DF\u8D44\u4EA7"},{id:"exchangeCommodity",name:"\u5546\u54C1\u5916\u6C47"},{id:"house",name:"\u697C\u5E02"},{id:"debenture",name:"\u503A\u5238"}]),et=Object.freeze([{id:"netChange",name:"\u6DA8\u8DCC\u5E45"},{id:"turnoverValue",name:"\u6210\u4EA4\u989D"},{id:"turnVolume",name:"\u6210\u4EA4\u91CF"}]);function ke(n){return n?Ze.find(t=>t.id.toLowerCase()===n.toLowerCase()||t.name===n)??Ze[0]:Ze[0]}function ln(n){return n?et.find(t=>t.id.toLowerCase()===n.toLowerCase()||t.name===n)??et[0]:et[0]}import tt from"fs";import H from"path";import B from"os";import{execSync as nt}from"child_process";import dn from"crypto";function Ka(){return nt('security find-generic-password -w -s "Chrome Safe Storage"',{encoding:"utf-8"}).trim()}function za(n){let t=n.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(t?.[1])return t[1];let e=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let o of e){let a=n.match(o);if(a&&a[1])return a[1]}return n}function Ga(n,t,e=0){let o=n.slice(0,3).toString("ascii");if(!/^v\d\d$/.test(o))return n.toString("utf-8");let a=n.slice(3);if(a.length===0||a.length%16!==0)return n.toString("utf-8");let s=dn.pbkdf2Sync(t,"saltysalt",1003,16,"sha1"),i=Buffer.alloc(16,32),r=dn.createDecipheriv("aes-128-cbc",s,i);r.setAutoPadding(!1);let c=Buffer.concat([r.update(a),r.final()]),l=c[c.length-1];return l&&l<=16&&(c=c.slice(0,-l)),e>=24&&c.length>32&&(c=c.slice(32)),za(c.toString("utf-8"))}var Wa=[H.join(B.homedir(),"Library/Application Support/Google/Chrome/Default/Cookies"),H.join(B.homedir(),"Library/Application Support/Google/Chrome/Profile 1/Cookies"),H.join(B.homedir(),"Library/Application Support/Google/Chrome Beta/Default/Cookies"),H.join(B.homedir(),"Library/Application Support/Google/Chrome Beta/Profile 1/Cookies"),H.join(B.homedir(),"Library/Application Support/Google/Chrome Dev/Default/Cookies"),H.join(B.homedir(),"Library/Application Support/Google/Chrome Canary/Default/Cookies"),H.join(B.homedir(),"Library/Application Support/BraveSoftware/Brave-Browser/Default/Cookies"),H.join(B.homedir(),"Library/Application Support/Microsoft Edge/Default/Cookies")];function Xa(n){for(let t of Wa){if(!tt.existsSync(t))continue;let e=H.join(B.tmpdir(),`finflow_cookies_${Date.now()}.db`);tt.copyFileSync(t,e);try{let o=0;try{let i=nt(`sqlite3 "${e}" "SELECT value FROM meta WHERE key='version';"`,{encoding:"utf-8"}).trim();o=parseInt(i,10)||0}catch{}let a=`SELECT name, hex(encrypted_value), host_key FROM cookies WHERE host_key LIKE '%${n}%'`;return JSON.parse(nt(`sqlite3 -json "${e}" "${a}"`,{encoding:"utf-8"})).map(i=>({name:i.name,value:Buffer.from(i["hex(encrypted_value)"],"hex"),domain:i.host_key,_metaVersion:o}))}finally{try{tt.unlinkSync(e)}catch{}}}return[]}function xe(n,t){if(process.platform!=="darwin")throw new Error("\u6D4F\u89C8\u5668\u81EA\u52A8\u83B7\u53D6 Cookie \u4EC5\u652F\u6301 macOS");let e;try{e=Ka()}catch{throw new Error(`\u65E0\u6CD5\u4ECE Keychain \u83B7\u53D6 Chrome \u5BC6\u7801\u3002
|
|
3
|
+
\u8BF7\u786E\u4FDD\u5DF2\u5B89\u88C5 Google Chrome\u3002`)}let o=Xa(n);if(!o.length)throw new Error(`\u672A\u627E\u5230 ${n} Cookie\uFF0C\u8BF7\u786E\u4FDD\u5DF2\u5728 Chrome \u4E2D\u767B\u5F55 ${n}`);let a=t?[t,`.${t}`]:[`.${n}`,n],s=[];for(let i of o)if(a.includes(i.domain))try{let r=Ga(i.value,e,i._metaVersion);if(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(r))continue;s.push(`${i.name}=${r}`)}catch{}if(!s.length)throw new Error("Cookie \u89E3\u5BC6\u5168\u90E8\u5931\u8D25");return s.join("; ")}function G(){try{return xe("jin10.com")}catch{return null}}function mn(n){return n?.slice(5,16)||""}function se(n){return n?.length?n.filter(t=>t.type==="quotes").map(t=>t.title).join(" "):""}function Ne(n,t){return!n&&t?.data?.vip_title?`[VIP] ${t.data.vip_title}`:n?D(n).replace(/^金十数据\d{4}年\d{1,2}月\d{1,2}日讯[,,]?\s*/,""):""}var pn=[],Qa=["content","title","brief","data.content","data.title","indicator_name","name","subject_name"];function Va(n){return Qa.map(t=>t.split(".").reduce((o,a)=>o?.[a],n)||"").filter(Boolean).join(" ").toLowerCase()}function T(n){if(!pn.length||!Array.isArray(n))return n;let t=pn.map(e=>e.toLowerCase());return n.filter(e=>{let o=Va(e);return!t.some(a=>o.includes(a))})}import ee from"fs";import fn from"path";import Za from"os";var I=[{id:"fuyao",name:"\u6276\u6447(\u540C\u82B1\u987A\u5B98\u65B9\u6570\u636E)",env:"FUYAO_API_KEY",describe:"\u590D\u6743\u65E5K/\u6DA8\u505C\u6C60/\u70ED\u699C/\u9F99\u864E\u699C/THS\u6307\u6570/\u4F30\u503C/\u8D22\u62A5/\u57FA\u91D1,\u5E76\u4F5C A\u80A1 quote/kline \u515C\u5E95"}];function at(n){return I.find(t=>t.id===n.toLowerCase())}function ot(){return fn.join(Za.homedir(),".finflow","keys")}function te(n){return fn.join(ot(),n.toLowerCase())}function yn(n,t){let e=te(n);ee.mkdirSync(ot(),{recursive:!0});try{ee.chmodSync(ot(),448)}catch{}ee.writeFileSync(e,t.trim()+`
|
|
4
|
+
`,"utf-8");try{ee.chmodSync(e,384)}catch{}return e}function ie(n){let t=at(n),e=t?(process.env[t.env]||"").trim():"";if(e)return{key:e,origin:"env"};try{let o=ee.readFileSync(te(n),"utf-8").trim();if(o)return{key:o,origin:"file"}}catch{}return null}function gn(n){try{return ee.unlinkSync(te(n)),!0}catch{return!1}}function rt(n){let t=n.trim();return t.length<=16?t.slice(0,4)+"\u2026":`${t.slice(0,12)}\u2026${t.slice(-4)}`}var er="https://fuyao.aicubes.cn";function ce(){return ie("fuyao")}var Ae=class extends Error{constructor(e,o,a){super(o);this.code=e;this.requestId=a;this.name="FuyaoApiError"}code;requestId};async function y(n,t={}){let e=ce();if(!e)throw new Ae(2001,"\u672A\u914D\u7F6E\u6276\u6447(\u540C\u82B1\u987A) API key\uFF1A\u8FD0\u884C `finflow key set fuyao <sk-fuyao-\u2026>` \u4FDD\u5B58\u5230\u672C\u5730\uFF0C\u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF FUYAO_API_KEY");let o=new URLSearchParams;for(let[c,l]of Object.entries(t))l!=null&&l!==""&&o.set(c,String(l));let a=o.toString(),s=`${er}${n}${a?`?${a}`:""}`,i;try{i=await fetch(s,{headers:{"X-api-key":e.key,Accept:"application/json"}})}catch(c){throw new Error(`\u6276\u6447\u63A5\u53E3\u7F51\u7EDC\u9519\u8BEF\uFF1A${c.message}`)}let r;try{r=await i.json()}catch{r=null}if(!r||typeof r.code!="number")throw new Error(`\u6276\u6447\u63A5\u53E3\u54CD\u5E94\u5F02\u5E38\uFF08HTTP ${i.status}\uFF0C\u975E JSON \u4FE1\u5C01\uFF09`);if(r.code!==0)throw new Ae(r.code,`\u6276\u6447 API ${r.code}\uFF1A${r.message||"\u672A\u77E5\u9519\u8BEF"}`,r.request_id);return r.data}function tr(n){return/^88/.test(n)?"TI":/^92/.test(n)||/^[48]/.test(n)?"BJ":/^[0123]/.test(n)?"SZ":/^[569]/.test(n)?"SH":"SZ"}function w(n){let t=n.trim().toUpperCase(),e=t.match(/^(SH|SZ|BJ)(\d{6})$/);return e&&(t=`${e[2]}.${e[1]}`),/^\d{6}$/.test(t)&&(t=`${t}.${tr(t)}`),t}function hn(n){return/\.TI$/i.test(n.trim())}function ue(n,t={}){return y("/api/a-share/prices/snapshot",{thscodes:n.length?n.map(w).join(","):void 0,limit:t.limit,offset:t.offset})}function bn(n,t){return y("/api/a-share/prices/historical",{thscode:w(n),interval:t.interval||"1d",start:t.start,end:t.end,adjust:t.adjust&&t.adjust!=="none"?t.adjust:void 0})}function _n(n){return y("/api/a-share-index/prices/snapshot",{thscodes:n.map(w).join(",")})}function wn(n,t){return y("/api/a-share-index/prices/historical",{thscode:w(n),interval:t.interval||"1d",start:t.start,end:t.end})}function Sn(n="cn_concept"){return y("/api/a-share-index/catalog/ths-index-list",{tag:n})}function st(n){return y("/api/a-share-index/constituents/ths-stock-list",{thscode:w(n)})}function kn(n,t={}){return y("/api/meta/tickers/search",{q:n,exchange:t.exchange,asset_type:t.assetType,limit:t.limit})}function xn(n={}){return y("/api/meta/tickers/list",{asset_type:n.assetType,limit:n.limit,offset:n.offset})}function Nn(){return y("/api/a-share/calendar/trading-days")}function An(n,t={}){return y("/api/a-share/corporate-actions/adjustment-factors",{thscode:w(n),from:t.from,to:t.to})}function it(n,t){return{thscode:w(n),period:t.period||"annual",...t.start!==void 0&&t.end!==void 0?{start:t.start,end:t.end}:{limit:t.limit}}}function On(n,t={}){return y("/api/a-share/financials/income-statements",it(n,t))}function jn(n,t={}){return y("/api/a-share/financials/balance-sheets",it(n,t))}function Tn(n,t={}){return y("/api/a-share/financials/cash-flow-statements",it(n,t))}function vn(n,t){return y("/api/a-share/financials/indicators",{thscode:w(n),report:t})}function qn(n){return y("/api/a-share/valuations/snapshot",{thscodes:n.map(w).join(",")})}function le(n){return n=T(n),{items:n.map(t=>({time:t.time,content:Ne(t.data?.content||t.data?.title||"",t),title:t.data?.title||"",importance:t.important??0,source:t.data?.source||"",tags:se(t.remark)?se(t.remark).split(" "):[]})),total:n.length}}function nr(n){return n=T(n),{items:n.map(t=>({time:new Date(t.ctime*1e3).toISOString(),content:D(t.content||t.brief||""),title:t.title||"",importance:0,source:"cls",tags:(t.subjects||[]).map(e=>`#${e.subject_name}`)})),total:n.length}}function ut(n){return n=T(n),{items:n.map(t=>({time:new Date(t.createTimestamp*1e3).toISOString(),content:D(t.content||""),title:t.title||"",importance:t.level===1?1:0,source:"glh",tags:[...(t.relatedStocks||[]).map(e=>e.name),...(t.relatedInfos||[]).map(e=>`#${e.name}`)],readCount:t.count?.read||0})),total:n.length}}function or(n){let t=n?.list||(Array.isArray(n)?n:[]),e=[];if(Array.isArray(t)&&Array.isArray(t[0]))for(let o of t)for(let a of o)e.push(a);else Array.isArray(t)&&(e=t);return e=T(e),{items:e.map(o=>({title:o.title||"",badge:o.ndata?.badge||"",redirectUrl:o.web_redirect_url||""})),total:e.length}}function ar(n){let t=[],e=n?.list||(Array.isArray(n)?n:[]);if(Array.isArray(e)&&e.length&&Array.isArray(e[0]))for(let o of e)t.push(...o);else Array.isArray(e)&&(t=e);return t=T(t),{items:t.map(o=>({title:o.title||"",introduction:o.introduction||"",displayDatetime:o.display_datetime||"",tags:(o.reveal_tags||[]).map(a=>a.name||a),vip:!!o.vip,source:o.source||""})),total:t.length}}function $n(n){let t=n?.data?.top_article||[],e=n?.data?.depth_list||[],o=T([...t,...e]);return{items:o.map(a=>({time:a.ctime?new Date(a.ctime*1e3).toISOString():"",title:a.title||"",brief:D(a.brief||""),source:a.source||"",subjects:(a.subjects||[]).map(s=>s.subject_name||s.name||""),readingNum:a.reading_num||0})),total:o.length}}function rr(n){let t=T(n?.data||[]);return{items:t.map(e=>({title:e.title||"",readingNum:e.readNum||0})),total:t.length}}function sr(n){let t=T(n?.data||[]);return{items:t.map(e=>({time:e.ctime?new Date(e.ctime*1e3).toISOString():"",title:e.title||"",source:e.source||""})),total:t.length}}function Cn(n){return{items:n.map(t=>({id:t.id,title:t.title||"",shortName:t.short_name||"",introduction:(t.introduction||"").trim().slice(0,200),categoryName:t.category_name||"",subscribeNum:t.subscribe_num||0})),total:n.length}}function ir(n){let t=n?.data?.hot_subjects||[],e=n?.data?.newest_subjects||[];return{hotSubjects:t.map(o=>({name:o.name||"",attentionNum:o.attention_num||0,newestArticleTitle:D(o.newest_article_title||"")})),newestSubjects:e.map(o=>({name:o.name||""}))}}function cr(n){let t=Array.isArray(n)?n:n?.data||[],e=new Map;for(let a of t){let s=a.category_name||"\u672A\u5206\u7C7B";e.set(s,(e.get(s)||0)+1)}let o=Array.from(e,([a,s])=>({name:a,count:s}));return{items:o,total:o.length}}var ur=new Set(["stock","telegram","featured","depth","eoe_article"]),lr={stock:"\u80A1\u7968",telegram:"\u7535\u62A5",featured:"\u8981\u95FB",depth:"\u6DF1\u5EA6",eoe_article:"\u6587\u7AE0"};function Pn(n){let t=n?.data||{},e=[],o=0;for(let[a,s]of Object.entries(t))if(ur.has(a)&&!(!s||typeof s!="object"||!Array.isArray(s.data))){o+=s.total_num||s.data.length;for(let i of s.data){let r=i.stock_category==="stock"||/^s[hz]\d+$/i.test(i.descr||""),c=i.descr?D(i.descr):"",l=D(i.title||i.featuredTitle||""),m=c;if(!l&&c){let d=c.search(/[。!?\n]/);l=d>0?c.slice(0,d):c.slice(0,60),m=c}m&&m.length>200&&(m=m.slice(0,200)),!(!l&&!m&&!r)&&e.push({kind:lr[a]||a,type:r||i.type===1?"stock":"article",title:l,brief:m,code:r&&(i.stock_id||i.descr)||"",name:r?D(i.title||""):"",price:i.last||null,percent:i.raise||null,time:i.time?new Date(i.time*1e3).toISOString():"",author:i.author||"",id:i.id,url:i.external_link||""})}}return{items:e,total:o}}function dr(n){let t=n?.data?.roll_data?.[0];return t?{item:{id:t.id,time:t.ctime?new Date(t.ctime*1e3).toISOString():"",title:D(t.title||""),content:D(t.content||t.brief||""),subjects:(t.subjects||[]).map(e=>e.subject_name||"").filter(Boolean),stocks:(t.stock_list||[]).map(e=>e.name||e.stock_name||"").filter(Boolean),url:`https://www.cls.cn/detail/${t.id}`}}:{item:null}}function Jn(n){let t=(n?.data?.list||[]).filter(e=>!e.vip);return{items:t.map(e=>({kind:e.type||"",type:e.type==="flash"?"flash":e.type==="news"?"article":e.type||"",title:e.title||e.data?.title||"",brief:e.data?.content?D(e.data.content).slice(0,200):e.introduction||"",time:e.display_datetime||e.time||"",important:e.important??0,id:e.id})),total:t.length}}async function lt(n){let t=G(),e=t?{cookie:t}:void 0,o=new Set,a=[],s=await zt({},e);for(let c of s?.data||[])o.has(c.id)||(o.add(c.id),a.push(c));let i=0,r=50;for(;a.length<n&&i++<r;){let c=a[a.length-1];if(!c)break;let m=(await Gt(c.time,e))?.data||[];if(!m.length)break;let d=0;for(let p of m)o.has(p.id)||(o.add(p.id),a.push(p),d++);if(d===0)break;a.length<n&&await new Promise(p=>setTimeout(p,200))}return a}function Dn(n){return n.command({command:"info",describe:"\u4FE1\u606F\u6D41",builder:t=>t.strictCommands(!1).command("codes [asset_type]","\u8BC1\u5238\u4EE3\u7801\u8868\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1AA\u80A1/\u6307\u6570/\u57FA\u91D1 \u5168\u91CF\u4EE3\u7801",e=>e.positional("asset_type",{type:"string",default:"a-share",choices:["a-share","a-share-index","fund-otc","fund-etf","fund-lof"],describe:"\u8D44\u4EA7\u7C7B\u578B\uFF08\u53EF\u9017\u53F7\u5206\u9694\u591A\u503C\uFF09"}),async e=>{let{n:o=30}=e,a=e.asset_type||"a-share",s=await xn({assetType:a,limit:Math.min(o,1e4)});u({data:s,command:`info codes ${a}`,source:"fuyao",toJSON:i=>({items:(i?.item||[]).map(r=>({code:r.thscode||"",name:r.name||"",type:r.asset_type||"",exchange:r.exchange??null})),total:i?.item?.length??0})})}).command("flash","\u5FEB\u8BAF",e=>e.option("src",{alias:"s",type:"string",choices:["cls","jin10","glh"],default:"cls",describe:"\u6570\u636E\u6E90"}).option("category",{alias:"c",type:"string",describe:"cls \u680F\u76EE / glh \u9891\u9053"}).strictCommands(!1).command("important","\u91CD\u8981\u5FEB\u8BAF\uFF08glh \u6570\u636E\u6E90\uFF09",o=>o.option("channel",{alias:"c",type:"string",describe:"\u9891\u9053"}),async o=>{let{n:a=10,channel:s}=o,i=s?ke(s):ke("popular"),r=await sn({channel:i.id,limit:a}),c=T(r.result||[]);u({data:c,command:"info flash important",source:"glh",toJSON:()=>ut(c)})}).command("popular","\u70ED\u95E8\u5FEB\u8BAF\uFF08glh\uFF09",o=>o,async o=>{let{n:a=10}=o,s=await cn({limit:a}),i=T(s.result||[]);u({data:i,command:"info flash popular",source:"glh",toJSON:()=>ut(i)})}).command("detail <id>","\u5FEB\u8BAF\u8BE6\u60C5\uFF08jin10\uFF09",o=>o,async o=>{let a=o.id,s=await Wt(a);u({data:s,command:"info flash detail",source:"jin10",toJSON:i=>le(i?.data?[i]:[])})}).command("date <date>","\u5386\u53F2\u5FEB\u8BAF\uFF08jin10\uFF0C\u9700\u767B\u5F55\uFF09",o=>o,async o=>{let a=o.date,s;try{s=xe("jin10.com")}catch(r){console.error(r.message),console.error("\u6309\u65E5\u671F\u67E5\u770B\u5FEB\u8BAF\u9700\u8981\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55 jin10.com"),process.exit(1)}let i=await Xt(a,{cookie:s});i?._statusCode===403&&(console.error("\u6B64\u529F\u80FD\u9700\u8981\u5F00\u901A\u4F1A\u5458\uFF0C\u8BF7\u5728 jin10.com \u5347\u7EA7"),process.exit(1)),u({data:i,command:"info flash date",source:"jin10",toJSON:r=>le(r?.data||[])})}),async e=>{let{n:o=10,src:a="cls",category:s}=e,i=s||"all",r=[];a==="jin10"?r.push({name:"jin10",fn:d=>lt(o).then(p=>u({data:p,command:"info flash",source:d,toJSON:le}))},{name:"cls",fn:d=>l(d,i,o)},{name:"glh",fn:d=>m(d,i,o)}):a==="glh"?r.push({name:"glh",fn:d=>m(d,i,o)},{name:"cls",fn:d=>l(d,i,o)},{name:"jin10",fn:d=>lt(o).then(p=>u({data:p,command:"info flash",source:d,toJSON:le}))}):i==="all"?r.push({name:"cls",fn:d=>l(d,i,o)},{name:"jin10",fn:d=>lt(o).then(p=>u({data:T(p),command:"info flash",source:d,toJSON:le}))},{name:"glh",fn:d=>m(d,i,o)}):r.push({name:"cls",fn:d=>l(d,i,o)});let c;for(let d=0;d<r.length;d++){let{name:p,fn:f}=r[d],g=d===0?p:`${p} fallback`;try{await f(g);return}catch(h){c=h,d<r.length-1&&console.error(`Source ${p} failed: ${h?.message||h}, trying next...`)}}throw c;async function l(d,p,f){let g=Yt(p);if(!g)return u({data:{error:`\u672A\u77E5\u680F\u76EE: ${p}\u3002\u53EF\u7528: all/red/announcement/watch/hk_us/fund/remind\uFF0C\u6216\u7528 --src jin10|glh`},command:"info flash",source:"cls"});let h=new Set,b=[],$=20,C=50,K=0,F=g.category,Pe=(await Ee({rn:$,category:F}))?.data?.roll_data||[];for(let E of Pe)h.has(E.id)||(h.add(E.id),b.push(E));for(;b.length<f&&K++<C;){let E=b.reduce((z,vt)=>(vt.ctime||0)<(z.ctime||0)?vt:z,b[0]);if(!E?.ctime)break;let qa=(await Ee({lastTime:E.ctime,rn:$,category:F}))?.data?.roll_data||[],Tt=0;for(let z of qa)h.has(z.id)||(h.add(z.id),b.push(z),Tt++);if(!Tt)break;b.length<f&&await new Promise(z=>setTimeout(z,200))}let fe=b.slice(0,f);u({data:fe,command:"info flash",source:d,toJSON:nr})}async function m(d,p,f){let g=p&&p!=="all"?ke(p):{id:"all"},h=new Set,b=[],$=15,C=50,K=0,F=await ae({channel:g.id,limit:$});for(let J of F?.result||[])h.has(J.id)||(h.add(J.id),b.push(J));for(;b.length<f&&K++<C;){let J=b[b.length-1];if(!J?.id)break;let Pe=await ae({channel:g.id,limit:$,liveId:J.id}),fe=0;for(let E of Pe?.result||[])h.has(E.id)||(h.add(E.id),b.push(E),fe++);if(!fe)break;b.length<f&&await new Promise(E=>setTimeout(E,200))}u({data:b,command:"info flash",source:d,toJSON:ut})}}).command("news","\u6DF1\u5EA6\u6587\u7AE0",e=>e.strictCommands(!1).command("slide","\u5E7B\u706F\u7247/\u91CD\u8981\u4E8B\u4EF6\uFF08jin10\uFF09",o=>o,async()=>{let o=await Vt();u({data:o,command:"info news slide",source:"jin10",toJSON:or})}).command("feature","\u7CBE\u9009\u6587\u7AE0\uFF08jin10\uFF09",o=>o,async()=>{let o=await Zt();u({data:o,command:"info news feature",source:"jin10",toJSON:ar})}).command("depth [channel]","\u6DF1\u5EA6\u680F\u76EE\uFF08cls\uFF09",o=>o,async o=>{let{n:a=10}=o,s=o.channel||"headline",i=Kt(s);if(!i){let l=Object.entries(Z).map(([m,d])=>` ${m.padEnd(12)} ${d.name} (${d.id})`).join(`
|
|
4
5
|
`);console.error(`\u672A\u77E5\u680F\u76EE: ${s}
|
|
5
6
|
\u53EF\u7528\u680F\u76EE:
|
|
6
|
-
${m}`),process.exit(1)}let a=await wt(i.id),c=A(a?.data?.depth_list||[]);if(c.length<o){let m=c[c.length-1]?.ctime;if(m){let d=await ae(i.id,{lastTime:m,rn:o-c.length}),u=A(d?.data?.depth_list||d?.data||[]);c=[...c,...u]}}l({data:a,command:"info news depth",source:"cls",toJSON:Pe})}).command("hot","\u70ED\u95E8\u6587\u7AE0\u6392\u884C\uFF08cls\uFF09",r=>r,async()=>{let r=await se();l({data:r,command:"info news hot",source:"cls",toJSON:fr})}).command("stock <code>","\u4E2A\u80A1\u65B0\u95FB\uFF08cls\uFF0Ccode \u6216\u540D\u79F0\uFF09",r=>r,async r=>{let{n:o=10}=r,s=r.code.trim(),i=s;if(!/^(s[hz]\d+|\d{6})$/i.test(s)){let m=(await tt(s,{type:"stock",rn:1}))?.data?.stock?.data?.[0];i=m?.stock_id||m?.descr||s}let a=await ue(i,{rn:o});l({data:a,command:"info news stock",source:"cls",toJSON:gr})}),async()=>{let t=await wt(1e3);l({data:t,command:"info news",source:"cls",toJSON:Pe})}).command("topic","\u4E13\u9898",t=>t.strictCommands(!1).command("search <keyword>","\u641C\u7D22\u8BDD\u9898",r=>r,async r=>{let{n:o=10}=r,s=r.keyword,i=await ot(),a=Array.isArray(i)?i:i?.data||[],c=s.toLowerCase(),m=a.filter(u=>(u.title||"").toLowerCase().includes(c)||(u.short_name||"").toLowerCase().includes(c)||(u.introduction||"").toLowerCase().includes(c));if(!m.length)return l({data:{items:[],total:0,message:`\u672A\u627E\u5230\u5339\u914D "${s}" \u7684\u4E13\u9898`},command:"info topic search",source:"jin10"});let d=A(m.slice(0,o));l({data:d,command:"info topic search",source:"jin10",toJSON:De})}).command("groups","\u8BDD\u9898\u5206\u7EC4",r=>r,async()=>{let r=await ot();l({data:r,command:"info topic groups",source:"jin10",toJSON:yr})}).command("hot","\u8D22\u8054\u793E\u9898\u6750",r=>r,async()=>{let r=await ie();l({data:r,command:"info topic hot",source:"cls",toJSON:o=>hr(A(o))})}).command("show <id>","\u4E13\u9898\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async r=>{let{n:o=10}=r,s=r.id,i=J(),a=i?{cookie:i}:void 0,c=new Set,m=[],d=1,u=50;for(;m.length<o&&d<=u;){let y=(await je(s,{page:d},a))?.data?.list||[];if(!y.length)break;let g=0;for(let h of y)c.has(h.id)||(c.add(h.id),m.push(h),g++);if(g===0)break;d++,m.length<o&&await new Promise(h=>setTimeout(h,200))}let p=A(m);l({data:p,command:"info topic show",source:"jin10",toJSON:f=>({items:f.map(y=>({time:y.display_datetime,title:y.title,author:y.author?.nick,vip:y.vip})),total:f.length})})}),async t=>{let{n:r=10}=t,o=await ot(),s=A(Array.isArray(o)?o:o?.data||[]);if(s=s.slice(0,r),!s.length)return l({data:{items:[],total:0},command:"info topic",source:"jin10"});l({data:s,command:"info topic",source:"jin10",toJSON:De})}).command("search","\u5168\u7AD9\u641C\u7D22\uFF08cls \u591A\u7C7B\u76EE / jin10 \u5FEB\u8BAF+\u65B0\u95FB\uFF09",t=>t.command("$0 <keyword>","\u641C\u7D22\u8D44\u8BAF",r=>r.option("src",{alias:"s",type:"string",choices:["cls","jin10"],default:"cls",describe:"\u6570\u636E\u6E90"}).option("type",{alias:"t",type:"string",describe:"cls \u7C7B\u76EE\uFF08\u9ED8\u8BA4 all\uFF09"}).positional("keyword",{type:"string",describe:"\u5173\u952E\u8BCD"}),async r=>{let{n:o=20,src:s="cls",type:i}=r,a=r.keyword;if(s==="jin10"){let m=await vt({keyword:a,type:i&&i!=="all"?i:"all",offset:0});l({data:m,command:"info search",source:"jin10",toJSON:Ue})}else{let m=await tt(a,{type:i||"all",rn:Math.max(o,20)});l({data:m,command:"info search",source:"cls",toJSON:Ie})}}).command("detail <id>","\u641C\u7D22\u7ED3\u679C\u8BE6\u60C5\uFF08cls \u7535\u62A5\u5168\u6587\uFF09",r=>r.positional("id",{type:"string",describe:"\u641C\u7D22\u7ED3\u679C item.id\uFF08cls \u7535\u62A5\uFF09"}),async r=>{let o=r.id,s=await oe(o);l({data:s,command:"info search detail",source:"cls",toJSON:_r})}),async t=>{let{n:r=20,src:o="cls",type:s}=t,i=t.keyword||t._?.[2];if(!i)return l({data:{error:"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD"},command:"info search",source:"cls"});if(o==="jin10"){let c=await vt({keyword:i,type:s&&s!=="all"?s:"all",offset:0});l({data:c,command:"info search",source:"jin10",toJSON:Ue})}else{let c=await tt(i,{type:s||"all",rn:Math.max(r,20)});l({data:c,command:"info search",source:"cls",toJSON:Ie})}}),handler:async()=>{l({data:{error:"\u8BF7\u6307\u5B9A\u5B50\u547D\u4EE4: flash / news / topic / search\u3002\u8FD0\u884C finflow info --help \u67E5\u770B\u5168\u90E8"},command:"info",source:"cls"})}})}import Me from"fs";import Sr from"path";import xr from"os";var Fe=Sr.join(xr.homedir(),".xueqiu-anon-cookie"),Ge="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",_="stock.xueqiu.com",kr="xueqiu.com";function N(n){return n.trim().toUpperCase()}var Ar="https://xueqiu.com/hq";function Nr(){try{let n=Me.readFileSync(Fe,"utf-8").trim();return n&&/acw_tc=/.test(n)?n:null}catch{return null}}function qr(n){let e=n.headers;return typeof e.getSetCookie=="function"?e.getSetCookie():(e.get("set-cookie")||"").split(/,(?=\s*[A-Za-z_-]+=)/)}function Or(n){let e=n.map(t=>{let r=t.indexOf("=");if(r<0)return"";let o=t.slice(0,r).trim();if(!o)return"";let s=t.slice(r+1).split(";")[0];return`${o}=${s}`}).filter(Boolean);return e.length?e.join("; "):null}async function He(){let n=await fetch(Ar,{headers:{"User-Agent":Ge,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});if(!n.ok)throw new Error(`\u83B7\u53D6\u96EA\u7403\u533F\u540D\u4EE4\u724C\u5931\u8D25\uFF1A/hq \u8FD4\u56DE HTTP ${n.status}\uFF08\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u662F\u5426\u88AB WAF \u62E6\u622A\uFF09`);let e=Or(qr(n));if(!e||!/xq_a_token=/.test(e))throw new Error("\u65E0\u6CD5\u4ECE\u96EA\u7403\u83B7\u53D6\u533F\u540D\u4EE4\u724C (xq_a_token)\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5");try{Me.writeFileSync(Fe,e,"utf-8")}catch{}return e}function vr(n){return String(n?.error_code??n?.code)==="400016"}async function jr(n,e,t,r,{token:o=!0,ua:s}={}){let i=o?Nr()??await He():null,a=0,c=async d=>{let u={Accept:"application/json","Accept-Language":"zh-Hans-CN;q=1, ja-JP;q=0.9","Accept-Encoding":"gzip, deflate, br",Connection:"keep-alive","User-Agent":s||Ge,Origin:"https://xueqiu.com",Referer:"https://xueqiu.com/"};d&&(u.Cookie=d);let p={method:n,headers:u,redirect:"follow"};r&&(p.body=new URLSearchParams(r).toString(),u["Content-Type"]="application/x-www-form-urlencoded");let f=await fetch(`https://${e}${t}`,p);a=f.status;try{return await f.json()}catch{return null}},m=await c(i);if(o&&(vr(m)||m===null||a===401)&&(m=await c(await He())),m===null)throw new Error(`\u96EA\u7403\u63A5\u53E3\u8FD4\u56DE\u975E JSON \u54CD\u5E94\uFF08HTTP ${a}\uFF09\uFF0C\u53EF\u80FD\u88AB WAF \u62E6\u622A\u6216\u533F\u540D\u4EE4\u724C\u5931\u6548`);return m}function b(n,e,t={}){return jr("GET",n,e,null,t)}function Ke(n){return b(_,`/v5/stock/realtime/quotec.json?symbol=${n.map(N).join(",")}`,{token:!1})}function Ht(n){return b(_,`/v5/stock/realtime/pankou.json?symbol=${N(n)}`)}var Cr={d:"day",w:"week",m:"month",y:"year",q:"quarter"};function Mt(n,{period:e="day",count:t=284}={}){let r=Cr[e]||e,o=Date.now();return b(_,`/v5/stock/chart/kline.json?symbol=${N(n)}&begin=${o}&period=${r}&type=before&count=-${t}&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance`)}function Ft(n,{period:e="1d"}={}){return b(_,`/v5/stock/chart/minute.json?symbol=${N(n)}&period=${e}`)}function Gt(n,{count:e=50}={}){return b(_,`/v5/stock/history/trade.json?symbol=${N(n)}&count=${e}`)}function ze(n){return b(_,`/v5/stock/quote/relevant.json?symbol=${N(n)}`)}function Ye(n){return b(kr,`/query/v1/suggest_stock.json?q=${encodeURIComponent(n)}`)}function We({category:n="cn"}={}){return b(_,`/v5/stock/screener/industries.json?category=${n}`)}function Xe(n={}){let{page:e=1,size:t=30,order:r="desc",order_by:o="percent",market:s="CN"}=n,i=new URLSearchParams({page:String(e),size:String(t),order:r,order_by:o,market:s});return n.ind_code&&i.set("ind_code",n.ind_code),n.type&&i.set("type",n.type),b(_,`/v5/stock/screener/quote/list.json?${i.toString()}`)}function Qe(n){return b(_,`/v5/stock/hq/longhu.json?date=${n}`)}function Ve(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/indicator.json?symbol=${N(n)}&type=${r}&is_detail=${o}&count=${t}`)}function Ze(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/cash_flow.json?symbol=${N(n)}&type=${r}&is_detail=${o}&count=${t}`)}function tn(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/income.json?symbol=${N(n)}&type=${r}&is_detail=${o}&count=${t}`)}function en(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/balance.json?symbol=${N(n)}&type=${r}&is_detail=${o}&count=${t}`)}function nn(n,{circula:e=1}={}){return b(_,`/v5/stock/f10/cn/top_holders.json?symbol=${N(n)}&circula=${e}`)}function Kt(n){return b(_,`/v5/stock/f10/cn/indicator.json?symbol=${N(n)}`)}function rn(n){return b(_,`/v5/stock/f10/cn/industry.json?symbol=${N(n)}`)}function on(n,{page:e=1,size:t=10}={}){return b(_,`/v5/stock/f10/cn/bonus.json?symbol=${N(n)}&page=${e}&size=${t}`)}function zt(n){return b(_,`/v5/stock/capital/flow.json?symbol=${N(n)}`)}function an(n,{count:e=20}={}){return b(_,`/v5/stock/capital/history.json?symbol=${N(n)}&count=${e}`)}function sn(n,{page:e=1,size:t=180}={}){return b(_,`/v5/stock/capital/margin.json?symbol=${N(n)}&page=${e}&size=${t}`)}function cn(n){return b(_,`/v5/stock/batch/quote.json?symbol=${n.map(N).join(",")}&extend=detail&is_delay_hk=true`)}function W(n){let e=n.result||{},t=(r,o)=>({label:r,netBuy:o?.netBuyTurnover??null,netBuyText:o?.netBuyTurnoverText||null,turnover:o?.tradValSum??null,status:o?.tradeStatus||null});return{northbound:{shanghai:t("\u5317\u5411\u8D44\u91D1(\u6CAA)",e.shMarketFlowDetail),shenzhen:t("\u5317\u5411\u8D44\u91D1(\u6DF1)",e.szMarketFlowDetail),total:t("\u5317\u5411\u5408\u8BA1",e.shSZTotalMarketFlowDetail)},southbound:{shanghai:t("\u5357\u5411\u8D44\u91D1(\u6CAA)",e.hkSHMarketFlowDetail),shenzhen:t("\u5357\u5411\u8D44\u91D1(\u6DF1)",e.hkSZMarketFlowDetail),total:t("\u5357\u5411\u5408\u8BA1",e.hkSHSZTotalMarketFlowDetail)},source:"glh"}}var $r="https://query1.finance.yahoo.com/v8/finance/chart",Tr={"User-Agent":"Mozilla/5.0"};async function Yt(n){let e=n.trim().toUpperCase(),t=`${$r}/${encodeURIComponent(e)}?interval=1d&range=1d`;try{let s=(await(await fetch(t,{headers:Tr})).json())?.chart?.result;if(!Array.isArray(s)||s.length===0)return null;let i=s[0]?.meta;if(!i?.symbol)return null;let a=Number(i.regularMarketPrice??0),c=Number(i.chartPreviousClose??0),m=a-c,d=c===0?0:m/c*100;return{symbol:i.symbol,name:i.shortName??"",price:a,prevClose:c,change:m,changePercent:d,currency:i.currency??"",exchange:i.exchangeName??"",marketState:i.marketState??""}}catch{return null}}var un={d:"d",day:"d",daily:"d",w:"w",week:"w",weekly:"w",m:"m",month:"m",monthly:"m",y:"y",year:"y",yearly:"y",annual:"y",annually:"y"},mn=new Set(["d","w","m","y","5d","1m","5m","10m","15m","30m","60m","120m"]);function lt(n){let e=String(n??"").trim().toLowerCase();if(un[e])return un[e];if(mn.has(e))return e;let t=e.match(/^(\d+)\s*(?:min|minute|minutes)$/);if(t){let r=`${t[1]}m`;if(mn.has(r))return r}throw new Error(`\u4E0D\u652F\u6301\u7684\u5468\u671F "${n}"\uFF1B\u652F\u6301 d/w/m/y \u6216 1m/5m/15m/30m/60m/120m\uFF08\u4E5F\u63A5\u53D7 daily/weekly/monthly/yearly \u7B49\u5168\u8BCD\uFF0C\u6216 5min \u8FD9\u79CD\u5199\u6CD5\uFF09`)}var dn="Asia/Shanghai";function R(n){return new Date(n).toLocaleDateString("en-CA",{timeZone:dn})}function X(n){return new Date(n).toLocaleString("sv-SE",{timeZone:dn,hour12:!1}).replace(" ","T")+"+08:00"}function Er(n){let e=n?.data||{};return{code:e.secu_code||"",name:e.secu_name||"",price:Number(e.last_px||0),change:Number(e.change_px||0),changePercent:Math.round(Number(e.change||0)*1e4)/100,open:Number(e.open_px||0),high:Number(e.high_px||0),low:Number(e.low_px||0),preclose:Number(e.preclose_px||0),volume:Number(e.business_amount||0),amount:Number(e.business_balance||0),turnoverRate:Number(e.tr||0),amplitude:Number(e.amp||0),avgPrice:Number(e.av_px||0),volumeRatio:Number(e.qrr||0),pe:e.pe!=null?Number(e.pe):null,pb:e.pb!=null?Number(e.pb):null,marketCap:Number(e.mc||0),change3d:e.change_3!=null?Number(e.change_3):null,change5d:e.change_5!=null?Number(e.change_5):null,status:e.trade_status==="TRADE"?"trading":"closed",source:"cls"}}function Jr(n){return{items:n.map(e=>{let t=e.quote||e;return{code:t.symbol||"",name:t.name||"",price:t.current??0,change:t.chg??0,changePercent:Math.round((t.percent??0)*100)/100,volume:t.volume??0,amount:t.amount??0,turnoverRate:t.turnover_rate??0,marketCap:t.market_capital??0,high:t.high??0,low:t.low??0,open:t.open??0}}),total:n.length}}function Rr(n){let e=n?.data||{},t=Number(e.last_px??0);return!!(e.secu_name||e.secu_code)&&Number.isFinite(t)&&t!==0}function Lr(n){if(!n)return!1;let e=Number(n.current??n.price??0);return!!(n.symbol||n.name)&&Number.isFinite(e)&&e!==0}function Pr(n){let e=n.trim().toUpperCase();return e?/^[A-Z]+$/.test(e)||/^\d{4}\.T$/.test(e)||/^\d{6}\.(KS|KQ)$/.test(e)||/^\d{4,5}\.HK$/.test(e)?e:/^\d{6}\.(SS|SH)$/.test(e)?`${e.slice(0,6)}.SS`:/^\d{6}\.SZ$/.test(e)?e:/^(SH|SZ)\d{6}$/.test(e)?e.startsWith("SH")?`${e.slice(2)}.SS`:`${e.slice(2)}.SZ`:/^\d{6}$/.test(e)?e.startsWith("6")?`${e}.SS`:`${e}.SZ`:null:null}function Dr(n){let e=n.toUpperCase();return e.startsWith("SH")||e.startsWith("SZ")?e:/^\d{6}$/.test(n)?n.startsWith("6")?"SH"+n:"SZ"+n:e}async function Nn(n){let e=n.map(Dr),t,r;try{t=await cn(e),r=t?.data?.items||[],r.length&&r[0]?.quote&&(r=r.map(o=>({...o.quote,market:o.market})))}catch{t=await Ke(e),r=t?.data||t?.items||[]}return r}async function Ir(n){let e=await Nn([n]);return e[0]?.quote||e[0]||null}function Ur(n){return{code:n.symbol,name:n.name,price:n.price,change:n.change,changePercent:n.changePercent,preclose:n.prevClose,currency:n.currency,exchange:n.exchange,marketState:n.marketState,status:n.marketState==="REGULAR"?"trading":"closed",source:"yahoo"}}var qn=new Set(["1m","5m","15m","30m","60m","120m"]);function Br(n){if(n==null||n==="")return null;let e=String(n);return/^\d{8}$/.test(e)?`${e.slice(0,4)}-${e.slice(4,6)}-${e.slice(6,8)}`:e}function pn(n,e,t){return{code:n,period:e,items:t.map(r=>({date:Br(r.trade_date),open:Number(r.open_px),high:Number(r.high_px),low:Number(r.low_px),close:Number(r.close_px),volume:Number(r.business_amount||0),change:Number(r.change||0)})),total:t.length}}function fn(n,e,t){let r=qn.has(e);return{code:n,period:e,items:t.map(o=>({date:r?X(o[0]):R(o[0]),open:Number(o[2]),high:Number(o[3]),low:Number(o[4]),close:Number(o[5]),volume:Number(o[1]),amount:Number(o[9]||0),turnoverRate:Number(o[8]||0)})),total:t.length}}function gn(n,e){return{code:n,preclose:Number(e.preclose_px||0),asks:[5,4,3,2,1].map(t=>({price:Number(e[`s_px_${t}`]||0),volume:Number(e[`s_amount_${t}`]||0)})),bids:[1,2,3,4,5].map(t=>({price:Number(e[`b_px_${t}`]||0),volume:Number(e[`b_amount_${t}`]||0)})),source:"cls"}}function hn(n,e){let t=e.current??0,r=e.percent??0,o=r!==0?t/(1+r/100):0;return{code:n,current:t,preclose:o,asks:[1,2,3,4,5].map(s=>({price:Number(e[`sp${s}`]||0),volume:Number(e[`sc${s}`]||0)})),bids:[5,4,3,2,1].map(s=>({price:Number(e[`bp${s}`]||0),volume:Number(e[`bc${s}`]||0)})),buyPercent:e.buypct??null,sellPercent:e.sellpct??null,buySellRatio:e.ratio??null,source:"xq"}}function yn(n,e){let t=e?.data?.volume||[],r=e?.data?.end||t.length;return{code:n,items:t.map(o=>{let s=String(o.minute),i=s.length<=3?"0"+s[0]:s.slice(0,2),a=s.length<=3?s.slice(1):s.slice(2),c=s.slice(-2);return{time:`${i}:${a}:${c}`,price:Number(o.last_px||0),volume:Number(o.change_vol||0),side:o.change_vol_color===1?"buy":"sell"}}),total:r}}function bn(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,50).map(r=>({time:X(r.timestamp),price:Number(r.current||r.price||0),volume:Number(r.trade_volume||r.volume||0),side:r.side==="buy"||r.side===1?"buy":"sell"})),total:t.length}}function wn(n,e){let t=e?.data||{},r=t.line||[],o=Number(t.preclose_px||0);return{code:n,preclose:o,items:r.map(s=>{let i=String(s.minute),a=i.length<=3?"0"+i[0]:i.slice(0,2),c=i.length<=3?i.slice(1):i.slice(2),m=Number(s.last_px||0);return{time:`${a}:${c}`,price:m,avgPrice:Number(s.av_px||0),changePercent:o>0?(m-o)/o*100:0,amount:Number(s.business_balance||0)}}),total:r.length}}function _n(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,240).map(r=>({time:X(r.timestamp),price:Number(r.current||0),volume:Number(r.volume||0),avgPrice:Number(r.avg_price||0)})),total:t.length}}function Hr(n){let e=n?.data||{},t=e.company||{};return{name:t.org_name_cn||"",industry:(e.industry||[]).map(r=>r.ind_name),concept:(e.concept||[]).map(r=>r.ind_name),companyType:t.classi_name||"",region:t.provincial_name||"",listedDate:t.listed_date||"",controller:t.actual_controller||"",mainBusiness:t.main_operation_business||""}}function Mr(n){let e=n?.data||{};return{mainInflow:Number(e.main_fund_in||0),mainOutflow:Number(e.main_fund_out||0),mainNet:Number(e.main_fund_diff||0),superNet:Number(e.super_fund_diff||0),largeNet:Number(e.large_fund_diff||0),mediumNet:Number(e.medium_fund_diff||0),smallNet:Number(e.little_fund_diff||0),mainNet3d:e.main_fund_3!=null?Number(e.main_fund_3):null,mainNet5d:e.main_fund_5!=null?Number(e.main_fund_5):null,mainNet10d:e.main_fund_10!=null?Number(e.main_fund_10):null,mainNet20d:e.main_fund_20!=null?Number(e.main_fund_20):null,source:"cls"}}function Sn(n){let e=n?.data||{},t=e.items||[];return{items:t.map(r=>({time:r.timestamp?R(r.timestamp):"",amount:Number(r.amount||0)})),total:t.length,summary:e.sum3!=null?{sum3:Number(e.sum3),sum5:Number(e.sum5),sum10:Number(e.sum10),sum20:Number(e.sum20)}:null}}function Fr(n){let e=n?.data?.items||[];return{items:e.map(t=>({date:t.td_date?R(t.td_date):"",marginBalance:Number(t.margin_trading_amt_balance||0),shortBalance:Number(t.short_selling_amt_balance||0),marginNetBuy:Number(t.margin_trading_net_buy_amt||0),marginBuy:Number(t.margin_trading_buy_amt||0)})),total:e.length}}function Gr(n){let e=Array.isArray(n?.data)?n.data:[];return{items:e.map(t=>({title:t.title||"",date:t.time||(t.timestamp?R(t.timestamp):""),url:t.url||"",source:"cls"})),total:e.length}}function Kr(n){let e=Array.isArray(n?.data)?n.data:[];return{items:e.map(t=>({title:t.anncTitle||"",question:t.words||"",answer:t.anncContent||"",date:t.anncDate1?R(t.anncDate1):t.anncDate2||"",source:t.source||"\u6295\u8D44\u8005\u4E92\u52A8"})),total:n?.total??e.length}}function zr(n){let e=n?.data?.items||n?.data||[];return{items:e.map((t,r)=>({rank:r+1,holderName:t.holder_name||"",shares:Number(t.held_num||0),ratio:Number(t.held_ratio||0),change:t.chg_amount??t.change??null})),total:e.length}}function Yr(n){let e=n?.data?.items||n?.data||[];return Array.isArray(e)?{items:e.map(t=>({period:t.dividend_year||"",exDividendDate:t.ashare_ex_dividend_date?R(t.ashare_ex_dividend_date):"",equityDate:t.equity_date?R(t.equity_date):"",plan:t.plan_explain||""})),total:e.length}:{items:[],total:0}}function Q(n){return Array.isArray(n)?n[0]:n}function Wr(n){let e=n?.data||{},t=e.list||[];return{name:e.quote_name||"",items:t.map(r=>({report:r.report_name||"",roe:Q(r.avg_roe),eps:Q(r.basic_eps),grossMargin:Q(r.gross_selling_rate),revenueYoy:Q(r.operating_income_yoy)})),total:t.length}}function xn(n){let e=n?.data?.items?.[0];if(!e)return{items:[],total:0};let t=r=>r==null||r===""?null:Number(r);return{items:[{report:e.report_date||"",peTtm:t(e.pe_ttm),pb:t(e.pb),roe:t(e.avg_roe),eps:t(e.basic_eps),netProfitPerShare:t(e.np_per_share),grossMargin:t(e.gross_selling_rate),netMargin:t(e.net_selling_rate),dividendYield:t(e.dividend_yield),revenue:t(e.total_revenue),netProfit:t(e.net_profit_atsopc),revenueYoy:t(e.operating_income_yoy),netProfitYoy:t(e.net_profit_atsopc_yoy),assetLiabRatio:t(e.asset_liab_ratio),pledgeRatio:t(e.pledge_ratio),marketCap:t(e.market_capital),currency:e.currency||"CNY"}],total:1}}function Xr(n,e){let t=n?.data||{},r=t.list||[],o={cashflow:["report_name","ncf_from_oa","ncf_from_ia","ncf_from_fa","net_increase_in_cce"],income:["report_name","total_revenue","net_profit","net_profit_atsopc","net_profit_after_nrgal_atsolc"],balance:["report_name","total_assets","total_liab","asset_liab_ratio","total_quity_atsopc"]},s={cashflow:["report","operating","investing","financing","netIncrease"],income:["report","revenue","netProfit","netProfitAttrib","netProfitDeducted"],balance:["report","totalAssets","totalLiab","debtRatio","equity"]},i=o[e]||o.cashflow,a=s[e]||s.cashflow;return{name:t.quote_name||"",type:e,items:r.map(c=>{let m={report:c.report_name||""};for(let d=1;d<i.length;d++)m[a[d]]=Q(c[i[d]]);return m}),total:r.length}}function Qr(n){let e=n?.data||n?.list||[],t={1:"stock",2:"fund",3:"index"};return{items:e.map(r=>({code:r.code||r.symbol||"",name:r.query||r.name||r.cn_name||"",type:r.type?t[r.type]||String(r.type):""})),total:e.length}}function Vr(n){let t=(n?.data||{}).items||[];return{items:t.map(r=>({time:r.timestamp?X(r.timestamp):"",amount:Number(r.amount||0)})),total:t.length}}function Zr(n){let e=(n?.data?.industries||[]).map(t=>({code:t.encode||"",name:t.name||"",pinyin:t.pinyin||""}));return{items:e,total:e.length}}function kn(n,e){return{items:n.map(t=>({code:t.symbol||"",name:t.name||"",price:t.current??null,changePercent:Math.round((t.percent??0)*100)/100,amount:t.amount??null,volume:t.volume??null,marketCap:t.market_capital??null,pe:t.pe_ttm??null,pb:t.pb??null,turnoverRate:t.turnover_rate??null})),total:e??n.length}}async function An(n){let e=[],t,r=1,o=12;for(;e.length<n.n&&r<=o;){let s=await Xe({page:r,size:Math.min(90,n.n-e.length),order:n.order,order_by:n.order_by,market:n.market,ind_code:n.ind_code,type:n.type});if(s?.error_code)throw new Error(`\u96EA\u7403\u7B5B\u9009\u63A5\u53E3\u9519\u8BEF: ${s.error_description||s.error_code}`);let i=s?.data?.list||[];if(t=s?.data?.count??t,!i.length)break;e.push(...i),r++}return{list:e,count:t}}function On(n){return n.command({command:"quote [codes...]",describe:"\u8BC1\u5238\u884C\u60C5\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF0C\u81EA\u52A8\u8BC6\u522B\u6570\u636E\u6E90\uFF1B\u591A\u53EA\u4E00\u8D77\u4F20\uFF0C\u81EA\u52A8\u6279\u91CF\uFF09",builder:e=>e.positional("codes",{type:"string",array:!0,describe:"\u8BC1\u5238\u4EE3\u7801\uFF08A\u80A1: sh600519 / 600519\uFF0C\u6E2F\u80A1: 00700\uFF0C\u7F8E\u80A1: AAPL\uFF09\uFF1B\u591A\u53EA\u7528\u7A7A\u683C\u5206\u9694\u5373\u6279\u91CF\u67E5\u8BE2"}).strictCommands(!1).command("related <code>","\u5173\u8054\u80A1\u7968\uFF08xueqiu\uFF09",t=>t,async t=>{let r=t.code,s=await ze(r),i=s?.data?.items||s?.data||[];l({data:s,command:`quote related ${r}`,source:"xq",toJSON:()=>({items:i.map(a=>({code:a.symbol||"",name:a.name||"",price:a.current??0,changePercent:Math.round((a.percent??0)*100)/100,relation:a.relation||""}))})})}).command("search <keyword>","\u641C\u7D22\u80A1\u7968\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF09",t=>t,async t=>{let r=t.keyword,o=await Ye(r);l({data:o,command:`quote search ${r}`,source:"xq",toJSON:Qr})}).command("industry [ind_code]","\u884C\u4E1A\uFF08\u96EA\u7403\uFF09\uFF1A\u5217\u51FA\u884C\u4E1A\u6216\u67D0\u884C\u4E1A\u6210\u5206\u80A1\uFF08A\u80A1\u7533\u4E07/\u7F8E\u80A1GICS/\u6E2F\u80A1\u6052\u751F\uFF09",t=>t.positional("ind_code",{type:"string",describe:"\u884C\u4E1A\u4EE3\u7801\uFF08\u677F\u5757ID\uFF09\uFF1B\u6CE8\u610F\u4E0D\u662F\u80A1\u7968\u4EE3\u7801\u3002\u7701\u7565\u5219\u5217\u51FA\u5168\u90E8\u884C\u4E1A\u3002\u5404\u5E02\u573A\u4EE3\u7801\u4F53\u7CFB\u4E0D\u540C\uFF1Acn=\u7533\u4E07(S2701=\u534A\u5BFC\u4F53) / us=GICS(453010=\u534A\u5BFC\u4F53) / hk=\u6052\u751F(7030=\u5DE5\u4E1A\u5DE5\u7A0B)"}).option("market",{type:"string",default:"cn",choices:["cn","us","hk"],describe:"\u5E02\u573A\uFF1Acn(A\u80A1\u7533\u4E07) / us(\u7F8E\u80A1GICS) / hk(\u6E2F\u80A1\u6052\u751F)"}).option("order-by",{type:"string",default:"percent",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF08\u96EA\u7403\u9875\u9762\u53EF\u6392\u5E8F\u7684\u5217\uFF09\uFF1Acurrent/chg/percent/current_year_percent/volume/amount/turnover_rate/pe_ttm/dividend_yield/market_capital"}).option("order",{type:"string",choices:["asc","desc"],default:"desc"}),async t=>{let{n:r=30}=t,o=t.ind_code,s=String(t.market??"cn").toLowerCase(),i=t["order-by"]??"percent",a=t.order??"desc";if(!o){let d=await We({category:s});if(d?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${d.error_description||d.error_code}`);return l({data:d,command:`quote industry --market ${s}`,source:"xq",toJSON:Zr})}let{list:c,count:m}=await An({n:r,order:a,order_by:i,market:s.toUpperCase(),ind_code:o});l({data:{list:c},command:`quote industry ${o} --market ${s}`,source:"xq",toJSON:()=>kn(c,m)})}).command("industry-profile <code>","\u4E2A\u80A1\u884C\u4E1A\u753B\u50CF\uFF08\u96EA\u7403 F10\uFF09\uFF1A\u6240\u5C5E\u884C\u4E1A/\u6982\u5FF5/\u4E3B\u8425/\u5B9E\u63A7\u4EBA",t=>t.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 sh600519"}),async t=>{let r=t.code,o=r.length<=6?r.toUpperCase().startsWith("SH")||r.toUpperCase().startsWith("SZ")?r:r.toUpperCase():r,s=await rn(o);l({data:s,command:`quote industry-profile ${r}`,source:"xq",toJSON:Hr})}).command("board <type>","\u677F\u5757/\u5E02\u573A\u4E00\u89C8\u6210\u5206\u80A1\uFF08\u96EA\u7403\uFF09",t=>t.positional("type",{type:"string",describe:"\u677F\u5757/\u5E02\u573A\uFF1AA\u80A1 sh_sz/sha/sza/cyb/kcb/shb/szb/zxb/xsbno/xsbin\uFF1B\u7F8E\u80A1 us\uFF1B\u6E2F\u80A1 hk\uFF1B\u4E2D\u6982\u80A1 us_china"}).option("order-by",{type:"string",default:"percent",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF08\u96EA\u7403\u9875\u9762\u53EF\u6392\u5E8F\u7684\u5217\uFF09\uFF1Acurrent/chg/percent/current_year_percent/volume/amount/turnover_rate/pe_ttm/dividend_yield/market_capital"}).option("order",{type:"string",choices:["asc","desc"],default:"desc"}),async t=>{let{n:r=30}=t,o=t.type,s=t["order-by"]??"percent",i=t.order??"desc",a=o==="hk"?"HK":o==="us"||o==="us_china"?"US":"CN",{list:c,count:m}=await An({n:r,order:i,order_by:s,market:a,type:o});l({data:{list:c},command:`quote board ${o}`,source:"xq",toJSON:()=>kn(c,m)})}).command("kline [code]","K\u7EBF",t=>t.positional("code",{type:"string"}).option("period",{alias:"p",type:"string",default:"d"}).option("number",{alias:"n",type:"number",default:120}).option("src",{type:"string",choices:["cls","xq"],describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async t=>{let{p:r="d",n:o=120,src:s}=t,i=t.code,a;try{a=lt(r)}catch(d){return l({data:{error:d.message},command:`quote kline ${i} -p ${r}`,source:"finflow"})}let c=qn.has(a),m=s==="xq"||!s&&c;try{if(m){let d=await Mt(i,{period:a,count:o}),u=d?.data?.item||d?.data||[];return l({data:d,command:`quote kline ${i} -p ${a}`,source:"xq",toJSON:()=>fn(i,a,u)})}else{let d=a==="w"?"w":a==="m"?"m":a==="y"?"y":"d",u=[],p,f=0,y=50;for(;u.length<o&&f++<y;){let w=(await At(i,{period:d,limit:Math.min(o-u.length,200),start_date:p}))?.data||[];if(!w.length)break;u=[...w,...u],p=String(w[0].trade_date)}let g=u.slice(-o);return l({data:g,command:`quote kline ${i} -p ${a}`,source:"cls",toJSON:h=>pn(i,d,h)})}}catch{if(c&&!s)throw new Error("xq K\u7EBF\u8BF7\u6C42\u5931\u8D25\uFF0C\u5206\u949F\u7EBF\u65E0\u5907\u9009\u6570\u636E\u6E90");if((m?"cls":"xq")==="xq"){let u=await Mt(i,{period:a,count:o}),p=u?.data?.item||u?.data||[];l({data:u,command:`quote kline ${i} -p ${a}`,source:"xq fallback",toJSON:()=>fn(i,a,p)})}else{let u=a==="w"?"w":a==="m"?"m":a==="y"?"y":"d",p=[],f,y=0,g=50;for(;p.length<o&&y++<g;){let q=(await At(i,{period:u,limit:Math.min(o-p.length,200),start_date:f}))?.data||[];if(!q.length)break;p=[...q,...p],f=String(q[0].trade_date)}let h=p.slice(-o);l({data:h,command:`quote kline ${i} -p ${a}`,source:"cls fallback",toJSON:w=>pn(i,u,w)})}}}).command("depth [code]","\u4E94\u6863\u76D8\u53E3",t=>t.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async t=>{let{src:r="cls"}=t,o=t.code,s=r;try{if(s==="xq"){let i=await Ht(o);return l({data:i,command:`quote depth ${o} --src xq`,source:"xq",toJSON:a=>hn(o,a?.data||{})})}else{let i=await St(o);return l({data:i,command:`quote depth ${o}`,source:"cls",toJSON:a=>gn(o,a?.data||{})})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let a=await Ht(o);l({data:a,command:`quote depth ${o} --src xq`,source:"xq fallback",toJSON:c=>hn(o,c?.data||{})})}else{let a=await St(o);l({data:a,command:`quote depth ${o}`,source:"cls fallback",toJSON:c=>gn(o,c?.data||{})})}}}).command("ticks [code]","\u9010\u7B14\u6210\u4EA4",t=>t.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async t=>{let{src:r="cls"}=t,o=t.code,s=r;try{if(s==="xq"){let i=await Gt(o);return l({data:i,command:`quote ticks ${o} --src xq`,source:"xq",toJSON:a=>bn(o,a)})}else{let i=await xt(o);return l({data:i,command:`quote ticks ${o}`,source:"cls",toJSON:a=>yn(o,a)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let a=await Gt(o);l({data:a,command:`quote ticks ${o} --src xq`,source:"xq fallback",toJSON:c=>bn(o,c)})}else{let a=await xt(o);l({data:a,command:`quote ticks ${o}`,source:"cls fallback",toJSON:c=>yn(o,c)})}}}).command("timeline [code]","\u5206\u65F6\u7EBF",t=>t.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async t=>{let{src:r="cls"}=t,o=t.code,s=r;try{if(s==="xq"){let i=await Ft(o,{period:"1d"});return l({data:i,command:`quote timeline ${o} --src xq`,source:"xq",toJSON:a=>_n(o,a)})}else{let i=await kt(o);return l({data:i,command:`quote timeline ${o}`,source:"cls",toJSON:a=>wn(o,a)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let a=await Ft(o,{period:"1d"});l({data:a,command:`quote timeline ${o} --src xq`,source:"xq fallback",toJSON:c=>_n(o,c)})}else{let a=await kt(o);l({data:a,command:`quote timeline ${o}`,source:"cls fallback",toJSON:c=>wn(o,c)})}}}).command("flow [code]","\u8D44\u91D1\u6D41\u5411",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("market","\u5317\u5411/\u5357\u5411\u8D44\u91D1",r=>r,async()=>{let r=await K();l({data:r,command:"quote flow market",source:"glh",toJSON:W})}).command("history <code>","\u5386\u53F2\u8D44\u91D1\u6D41",r=>r.option("count",{alias:"c",type:"number",default:20}),async r=>{let{c:o=20}=r,s=r.code,i=await an(s,{count:o});l({data:i,command:`quote flow history ${s}`,source:"xq",toJSON:Sn})}).command("margin <code>","\u878D\u8D44\u878D\u5238",r=>r,async r=>{let o=r.code,s=await sn(o);l({data:s,command:`quote flow margin ${o}`,source:"xq",toJSON:Fr})}).command("intraday <code>","\u5F53\u65E5\u8D44\u91D1\u6D41\u5411\uFF08xueqiu\uFF09",r=>r,async r=>{let o=r.code,i=await zt(o);l({data:i,command:`quote flow intraday ${o}`,source:"xq",toJSON:Sn})}).command("xq <code>","\u96EA\u7403\u8D44\u91D1\u6D41",r=>r,async r=>{let o=r.code,i=await zt(o);l({data:i,command:`quote flow xq ${o}`,source:"xq",toJSON:Vr})}),async t=>{let{code:r}=t;if(r){let o=await le(r);l({data:o,command:`quote flow ${r}`,source:"cls",toJSON:Mr})}else{let o=await K();l({data:o,command:"quote flow market",source:"glh",toJSON:W})}}).command("f10 [code]","\u57FA\u672C\u9762\uFF08\u9ED8\u8BA4\u4E3B\u8981\u6307\u6807\uFF09",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("holders <code>","\u5341\u5927\u80A1\u4E1C",r=>r,async r=>{let o=r.code,s=await nn(o);l({data:s,command:`quote f10 holders ${o}`,source:"xq",toJSON:zr})}).command("bonus <code>","\u5206\u7EA2\u9001\u80A1",r=>r,async r=>{let o=r.code,s=await on(o);l({data:s,command:`quote f10 bonus ${o}`,source:"xq",toJSON:Yr})}).command("indicator <code>","\u4E3B\u8981\u6307\u6807",r=>r,async r=>{let o=r.code,s=await Kt(o);l({data:s,command:`quote f10 indicator ${o}`,source:"xq",toJSON:xn})}),async t=>{let r=t.code;if(!r)return l({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote f10 sh600519"},command:"quote f10",source:"xq"});let o=await Kt(r);l({data:o,command:`quote f10 indicator ${r}`,source:"xq",toJSON:xn})}).command("announcement <code>","\u4E2A\u80A1\u516C\u544A\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u6700\u65B0\u516C\u544A\u5217\u8868",t=>t.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 sh600176"}).option("page",{alias:"p",type:"number",default:1,describe:"\u9875\u7801"}),async t=>{let r=t.code,o=t.p??1,s=await pe(r,{page:o});l({data:s,command:`quote announcement ${r}`,source:"cls",toJSON:Gr})}).command("interaction <code>","\u4E92\u52A8\u6613\u95EE\u7B54\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u6295\u8D44\u8005\u63D0\u95EE\u4E0E\u516C\u53F8\u56DE\u590D",t=>t.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 sh600176"}).option("page",{alias:"p",type:"number",default:1,describe:"\u9875\u7801"}).option("size",{alias:"s",type:"number",default:15,describe:"\u6BCF\u9875\u6761\u6570"}).option("keyword",{alias:"k",type:"string",default:"",describe:"\u5173\u952E\u8BCD\u7B5B\u9009"}),async t=>{let r=t.code,o=t.p??1,s=t.s??15,i=t.k??"",a=await fe(r,{page:o,pageSize:s,keyWord:i});l({data:a,command:`quote interaction ${r}`,source:"cls",toJSON:Kr})}).command("finance [code]","\u8D22\u52A1\u62A5\u8868",t=>t.positional("code",{type:"string"}).option("type",{alias:"t",type:"string",choices:["indicator","cashflow","income","balance"],default:"indicator"}),async t=>{let{t:r="indicator"}=t,o=t.code;if(r==="indicator"){let s=await Ve(o);l({data:s,command:`quote finance indicator ${o}`,source:"xq",toJSON:Wr})}else{let i={cashflow:Ze,income:tn,balance:en}[r];if(!i)return l({data:{error:`\u672A\u77E5\u7C7B\u578B: ${r}\uFF0C\u53EF\u9009 indicator/cashflow/income/balance`},command:`quote finance ${r}`,source:"xq"});let a=await i(o);l({data:a,command:`quote finance ${r} ${o}`,source:"xq",toJSON:c=>Xr(c,r)})}}),handler:async e=>{let t=e.codes||[];if(!t.length)return l({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote sh600519 / finflow quote AAPL\uFF08\u591A\u53EA\u7528\u7A7A\u683C\u5206\u9694\u5373\u6279\u91CF\uFF09"},command:"quote",source:"cls"});let r=["search","related","industry","industry-profile","board","kline","depth","ticks","timeline","sector","flow","f10","finance"];if(t.length===1&&r.includes(t[0]))return l({data:{error:`\u8BF7\u63D0\u4F9B\u5B50\u547D\u4EE4\u53C2\u6570\uFF0C\u4F8B\u5982: finflow quote ${t[0]} <code>`},command:`quote ${t[0]}`,source:"cls"});if(t.length>1){let a=await Nn(t);l({data:a,command:`quote ${t.join(" ")}`,source:"xq",toJSON:()=>Jr(a)});return}let o=t[0];try{let a=await ce(o);if(Rr(a)){l({data:a,command:`quote ${o}`,source:"cls",toJSON:Er});return}}catch{}let s=null;try{s=await Ir(o)}catch{}if(Lr(s)){l({data:s,command:`quote ${o}`,source:"xq fallback",toJSON:a=>({code:a.symbol||"",name:a.name||"",price:a.current??0,change:a.chg??0,changePercent:Math.round((a.percent??0)*100)/100,open:a.open??0,high:a.high??0,low:a.low??0,preclose:a.last_close??0,volume:a.volume??0,amount:a.amount??0,turnoverRate:a.turnover_rate??0,amplitude:a.amplitude??0,avgPrice:a.avg_price??0,volumeRatio:a.volume_ratio??0,pe:a.pe_ttm??null,pb:a.pb??null,marketCap:a.market_capital??0,change3d:null,change5d:null,status:a.status===1?"trading":"closed",source:"xq fallback"})});return}let i=Pr(o);if(i){let a=await Yt(i);if(a){l({data:a,command:`quote ${o}`,source:"yahoo fallback",toJSON:Ur});return}}if(s){l({data:s,command:`quote ${o}`,source:"xq fallback",toJSON:a=>({code:a.symbol||"",name:a.name||"",price:a.current??0,change:a.chg??0,changePercent:Math.round((a.percent??0)*100)/100,open:a.open??0,high:a.high??0,low:a.low??0,preclose:a.last_close??0,volume:a.volume??0,amount:a.amount??0,turnoverRate:a.turnover_rate??0,amplitude:a.amplitude??0,avgPrice:a.avg_price??0,volumeRatio:a.volume_ratio??0,pe:a.pe_ttm??null,pb:a.pb??null,marketCap:a.market_capital??0,change3d:null,change5d:null,status:a.status===1?"trading":"closed",source:"xq fallback"})});return}throw new Error(`cls\u3001xq \u548C Yahoo \u5747\u65E0\u6CD5\u83B7\u53D6 ${o} \u7684\u884C\u60C5\u6570\u636E`)}})}function to(n){let e=n?.data||{},t=e.limit_up_board||{},r=e.up_down_dis||{};return{marketDegree:Number(e.market_degree)||0,limitUp:Number(e.up_ratio_num||0),limitOpen:Number(e.up_open_num||0),sealRate:parseFloat(e.up_ratio)||0,turnover:e.shsz_balance||"",turnoverChange:e.shsz_balance_change_px||"",limitUpBoard:t.row2?{total:t.row2[0]||0,first:t.row2[1]||0,second:t.row2[2]||0,third:t.row2[3]||0,promoteRate:t.row3?{first:t.row3[1]||"",second:t.row3[2]||"",third:t.row3[3]||""}:{}}:null,prevPerformance:e.performance||"",gapUpRate:e.up_open_ratio||"",profitRate:e.profit_ratio||"",distribution:r.status?{limitUp:Number(r.up_num||0),limitDown:Number(r.down_num||0),rise:Number(r.rise_num||0),fall:Number(r.fall_num||0),flat:Number(r.flat_num||0),suspend:Number(r.suspend_num||0)}:null,source:"cls"}}function vn(n){let e=n.result||[],t=e.filter(o=>o.category==="\u6307\u6570"),r=e.filter(o=>o.category==="\u6CAA\u6E2F\u6DF1\u901A");return{indices:t.map(o=>({name:o.name,value:Number(o.value||0),change:Number(o.change||0),changePercent:Math.round(Number(o.netChange||0)*1e4)/100})),capitalFlow:r.map(o=>({name:o.name,shanghai:o.sh??null,shenzhen:o.sz??null})),source:"glh"}}function eo(n){let e=n.result||[];return{items:e.map(t=>({name:t.stockName||"",code:(t.stockType||"")+(t.stockCode||""),price:t.currentPrice??null,changePercent:t.netChange!=null?Math.round(Number(t.netChange)*1e4)/100:null})),total:e.length}}function no(n){let e=(n?.data?.items||[]).map(t=>({code:t.symbol||"",name:t.name||"",close:t.close??null,changePercent:Math.round((t.percent??0)*100)/100,volume:t.volume??null,amount:t.amount??null,reasons:t.type_name||[]}));return{items:e,total:n?.data?.items_size??e.length}}function jn(n){return n.command({command:"market",describe:"\u5E02\u573A\u603B\u89C8",builder:e=>e.strictCommands(!1).command("emotion","\u5E02\u573A\u60C5\u7EEA\uFF08cls\uFF09",t=>t,async()=>{let t=await me();l({data:t,command:"market emotion",source:"cls",toJSON:to})}).command("index","\u5927\u76D8\u6307\u6570\uFF08glh\uFF09",t=>t,async()=>{let t=await Rt();l({data:t,command:"market index",source:"glh",toJSON:vn})}).command("hk [sort]","\u6E2F\u80A1\u6392\u884C\uFF08glh\uFF0C\u9ED8\u8BA4\u964D\u5E8F\uFF09",t=>t.option("order",{alias:"o",type:"string",choices:["asc","desc"],default:"desc",describe:"\u6392\u5E8F\u65B9\u5411\uFF08\u9ED8\u8BA4 desc \u964D\u5E8F\uFF09"}),async t=>{let r=t.sort,o=t.order||"desc",s=Ee(r),i=await Te({sort:s.id,order:o});l({data:i,command:"market hk",source:"glh",toJSON:eo})}).command("flow","\u6CAA\u6DF1\u6E2F\u901A\u8D44\u91D1\u6D41\u5411",t=>t,async()=>{let t=await K();l({data:t,command:"market flow",source:"glh",toJSON:W})}).command("rates","\u5168\u7403\u592E\u884C\u5229\u7387\uFF08jin10\uFF09",t=>t,async()=>{let t=await Se(),r=t?.data?.list||[];l({data:t,command:"market rates",source:"jin10",toJSON:()=>({items:r.map(o=>({bank:o.bankName,rate:o.interestRate,date:o.publishTime}))})})}).command("longhu [date]","\u9F99\u864E\u699C\uFF08\u96EA\u7403\uFF0C\u533F\u540D\u53EF\u7528\uFF1B\u6536\u76D8\u540E\u7EA6 17:30 \u51FA\u699C\uFF09",t=>t.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async t=>{let r=t.date||x(),o=r.split("-").map(Number),s=Date.UTC(o[0],(o[1]||1)-1,o[2]||1)-480*60*1e3;if(!Number.isFinite(s))throw new Error(`\u65E0\u6548\u65E5\u671F: ${r}\uFF08\u683C\u5F0F YYYY-MM-DD\uFF09`);let i=await Qe(s);if(i?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${i.error_description||i.error_code}`);l({data:i,command:`market longhu ${r}`,source:"xq",toJSON:no})}),handler:async()=>{let e=await Rt();l({data:e,command:"market",source:"glh",toJSON:vn})}})}function ro(n){let e=n?.data||[];return{items:e.map(t=>{let r=t.symbol_code||"",o=/^cls/i.test(r)?"plate":"stock";return{time:t.c_time?t.c_time.slice(11,16):"",code:r,name:t.symbol_name||"",kind:o,direction:t.float==="up"?"up":t.float==="down"?"down":"",articleId:t.article_id??null}}),total:e.length}}function Cn(n,e){return{type:e,items:n.map(t=>({code:t.secu_code||"",name:t.plate_name||t.secu_name||"",changePercent:Math.round((t.change||0)*100*100)/100})),total:n.length}}function $n(n){return{items:n.map(e=>({code:e.secu_code||"",name:e.secu_name||"",changePercent:Math.round((e.change||0)*100*100)/100,topStocks:(e.up_stock||[]).slice(0,3).map(t=>({name:t.secu_name?.trim()||"",changePercent:Math.round((t.change||0)*100*100)/100}))})),total:n.length}}function Tn(n){let e=(n?.data?.stocks||[]).map(t=>({code:t.secu_code||"",name:t.secu_name||"",price:t.last_px??null,changePercent:Math.round((t.change??0)*1e4)/100,marketCap:t.cmc??null,fundflow:t.fundflow??null,isCore:!!t.is_core,reason:t.assoc_desc||""}));return{items:e,total:e.length}}function En(n){return n.command({command:"sector [code]",describe:"\u677F\u5757\u5DE5\u4F5C\u6D41\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u5F02\u52A8 anchor / \u6392\u884C rank / \u4E2A\u80A1\u6240\u5C5E\u677F\u5757 plate / \u6210\u5206\u80A1 stocks",builder:e=>e.positional("code",{type:"string",describe:"\u677F\u5757\u7801(cls*)\u2192\u6210\u5206\u80A1 / \u80A1\u7968\u7801\u2192\u6240\u5C5E\u677F\u5757"}).strictCommands(!1).command("anchor [date]","\u76D8\u4E2D\u5F02\u52A8\u65F6\u95F4\u8F74\uFF1A\u5F53\u65E5\u62C9\u5347/\u8DF3\u6C34\u7684\u677F\u5757(cls*\u7801\u53EF\u4E0B\u94BB)\u4E0E\u4E2A\u80A1",t=>t.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async t=>{let r=t.date||x(),o=await de({date:r});l({data:o,command:`sector anchor ${r}`,source:"cls",toJSON:ro})}).command("rank","\u677F\u5757\u6DA8\u8DCC\u6392\u884C\uFF08\u4EC5\u5F53\u65E5\u70ED\u95E8\uFF0C\u7EA6 6~10 \u6761\uFF1B\u770B\u5168\u5929\u5F02\u52A8\u8FC7\u7A0B\u7528 sector anchor\uFF09",t=>t.option("type",{alias:"t",type:"string",default:"industry",describe:"industry(\u884C\u4E1A) / concept(\u6982\u5FF5)"}),async t=>{let{t:r="industry"}=t,o=await _t({type:r}),s=Array.isArray(o?.data)?o.data:[];l({data:o,command:`sector rank -t ${r}`,source:"cls",toJSON:()=>Cn(s,r)})}).command("plate <code>","\u4E2A\u80A1\u6240\u5C5E\u677F\u5757\uFF08\u8FD4\u56DE plate code\uFF0C\u4F9B stocks \u4E0B\u94BB\uFF09",t=>t.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 sh600519"}),async t=>{let r=t.code,o=await Nt(r),s=Array.isArray(o?.data)?o.data:[];l({data:o,command:`sector plate ${r}`,source:"cls",toJSON:()=>$n(s)})}).command("stocks <plate_code>","\u677F\u5757/\u6982\u5FF5\u6210\u5206\u80A1\uFF08anchor / plate \u7684\u4E0B\u94BB\u51FA\u53E3\uFF09",t=>t.positional("plate_code",{type:"string",describe:"\u677F\u5757\u7801\uFF0C\u5982 cls80605"}).option("way",{type:"string",default:"change",describe:"\u6392\u5E8F\uFF1Achange(\u6DA8\u8DCC\u5E45)/last_px(\u4EF7)/amount"}),async t=>{let{way:r="change"}=t,o=t.plate_code,s=await qt(o,{way:r});l({data:s,command:`sector stocks ${o}`,source:"cls",toJSON:Tn})}),handler:async e=>{let{code:t}=e;if(t)if(/^cls/i.test(t)){let r=await qt(t,{way:"change"});l({data:r,command:`sector ${t}`,source:"cls",toJSON:Tn})}else{let r=await Nt(t),o=Array.isArray(r?.data)?r.data:[];l({data:r,command:`sector ${t}`,source:"cls",toJSON:()=>$n(o)})}else{let r=await _t({type:"industry"}),o=Array.isArray(r?.data)?r.data:[];l({data:r,command:"sector",source:"cls",toJSON:()=>Cn(o,"industry")})}}})}import{inflateSync as oo}from"zlib";var ao="wss://wss-flash-2.jin10.com/",ut={DATA:0,HOLIDAY:1,EVENT:2,HOLIDAY_PAGE:3,A_SHARE:4,FIVE_STAR:5,QH_DATA:6,QH_HOLIDAY:7,QH_EVENT:8,US_DATA:9,US_HOLIDAY:10,US_EVENT:11,HK_DATA:12,HK_HOLIDAY:13,HK_EVENT:14},mt={LOGIN:4002,CACHE_DATA:2006,CALENDAR_DATA:2001,CALENDAR_EVENT:2003,CALENDAR_HOLIDAY:2004,CALENDAR_HOLIDAY_PAGE:2005},B=class{buffer;dv;pos;constructor(e){this.buffer=e instanceof ArrayBuffer?e:e instanceof Uint8Array?e.buffer:new ArrayBuffer(2048),this.dv=new DataView(this.buffer),this.pos=0}w16L(e){this.dv.setInt16(this.pos,e,!0),this.pos+=2}wU16L(e){this.dv.setUint16(this.pos,e,!0),this.pos+=2}w32L(e){this.dv.setInt32(this.pos,e,!0),this.pos+=4}wU32L(e){this.dv.setUint32(this.pos,e,!0),this.pos+=4}wStrL(e){let t=Buffer.from(e,"utf-8");this.wU16L(t.length);for(let r=0;r<t.length;r++)this.dv.setUint8(this.pos++,t[r])}r16L(){let e=this.dv.getInt16(this.pos,!0);return this.pos+=2,e}rU16L(){let e=this.dv.getUint16(this.pos,!0);return this.pos+=2,e}rU32L(){let e=this.dv.getUint32(this.pos,!0);return this.pos+=4,e}rStrL(){let e=this.rU16L(),t=Buffer.from(this.buffer,this.pos,e).toString("utf-8");return this.pos+=e,t}toBuffer(){return this.buffer.slice(0,this.pos)}};function Jn(n,e){let t;n instanceof Uint8Array?t=new Uint8Array(n.buffer,n.byteOffset,n.byteLength):t=new Uint8Array(n);let r=new Uint8Array(t.length),o=e.charCodeAt(0);for(let s=0;s<t.length;s++)r[s]=t[s]^e.charCodeAt((s+o)%e.length);return r.buffer}function so(n,e){return Jn(n,e)}function io(n){try{return oo(Buffer.from(n,"base64")).toString("utf-8")}catch{return null}}var Wt=class{ws=null;encryptKey="";requestId=Math.floor(Math.random()*1e6);userId;loginType;userLevel;userAgent;timeout;_pending=new Map;constructor(e={}){this.userId=e.userId||"",this.loginType=e.loginType||"calendar",this.userLevel=e.userLevel||1,this.userAgent=e.userAgent||"chrome",this.timeout=e.timeout||5e3}connect(){return new Promise((e,t)=>{let r=setTimeout(()=>{this.ws?.close(),t(new Error("WebSocket \u8FDE\u63A5\u8D85\u65F6"))},this.timeout);this.ws=new WebSocket(ao),this.ws.binaryType="arraybuffer",this.ws.onmessage=o=>{let s=o.data;if(!this.encryptKey){let m=new B(s);m.rU32L();let d=m.rU32L(),u=m.rU32L();this.encryptKey=`${u}.${d}`,this._sendLogin();return}let i=Jn(s,this.encryptKey),a=new B(i),c=a.r16L();if(c===mt.LOGIN){clearTimeout(r),e();return}if(c===mt.CACHE_DATA){a.rU32L(),a.rStrL();let m=a.rU32L(),d=a.rStrL(),u=this._pending.get(m);if(u){this._pending.delete(m),clearTimeout(u.timer);try{let p=JSON.parse(d);if(p.data){let f=io(p.data);u.resolve(f?JSON.parse(f):null)}else u.resolve(null)}catch(p){u.reject(p)}}}},this.ws.onerror=()=>{clearTimeout(r),t(new Error("WebSocket \u8FDE\u63A5\u5931\u8D25"))}})}_sendLogin(){let e=new B;e.w16L(mt.LOGIN),e.w32L(parseInt(this.userId)||0),e.wStrL(""),e.wStrL(this.userAgent),e.w32L(this.userLevel),e.wStrL(this.loginType),this._send(e)}_send(e){let t=e.toBuffer(),r=this.encryptKey?so(t,this.encryptKey):t;this.ws.send(r)}_request(e,t){return new Promise((r,o)=>{let s=this.requestId++,i=setTimeout(()=>{this._pending.delete(s),o(new Error("\u8BF7\u6C42\u8D85\u65F6"))},this.timeout);this._pending.set(s,{resolve:r,reject:o,timer:i});let a=new B;a.w16L(mt.CACHE_DATA),a.wU32L(e),a.wStrL(t),a.wU32L(s),this._send(a)})}close(){this.ws?.close(),this.ws=null,this.encryptKey="",this._pending.clear()}getFuturesData(e){return this._request(ut.QH_DATA,e)}getHKStockData(e){return this._request(ut.HK_DATA,e)}getUSStockData(e){return this._request(ut.US_DATA,e)}getAShareData(e={}){let t=[];return e.page&&t.push(`page=${e.page}`),e.limit!=null&&t.push(`limit=${e.limit}`),e.region&&t.push(`region=${e.region}`),e.star!=null&&t.push(`star=${e.star}`),e.determine!=null&&t.push(`determine=${e.determine}`),this._request(ut.A_SHARE,t.join("&"))}};async function Rn(n){let e=new Wt(n);return await e.connect(),e}async function Xt(n,...e){let t=await Rn();try{return await t[n](...e)}finally{t.close()}}function dt(n){return{items:n.map(e=>({time:e.pub_time||"",indicator:e.indicator_name||e.name||"",importance:e.star??0,previous:e.previous??null,consensus:e.consensus??null,actual:e.actual??null,country:e.country||""})),total:n.length}}function co(n){let e=n?.data||[];return{items:e.map(t=>({time:t.event_time||"",country:t.country||"",importance:t.star??0,event:t.event_content||"",people:t.people||""})),total:e.length}}function lo(n){let e=n?.data?.data||n?.data,t=Array.isArray(e)?e:e?Object.values(e):[];return{items:t.map(r=>({date:(r.date||"").slice(5,16),market:r.exchange_name||"",name:r.name||"",note:r.rest_note||""})),total:t.length}}function uo(n){let e=n?.data||[];return{items:e.map(t=>({date:(t.date||"").slice(5,16),event:t.event||"",importance:t.star??0,stocks:(t.stocks||[]).map(r=>({name:r.name,code:r.code})),regions:(t.region||[]).map(r=>({name:r.name}))})),total:e.length}}function mo(n){let e=n?.data||[];return{items:e.map(t=>({time:t.public_time||"",country:t.country||"",event:t.eventcontent||""})),total:e.length}}function po(n){let e=n?.data||[];return{items:e.map(t=>({time:t.holiday_time||"",country:t.country||"",market:t.market||"",name:t.holiday_name||"",description:t.description||""})),total:e.length}}function Ln(n){return n.command({command:"calendar",describe:"\u5B8F\u89C2\u65E5\u5386",builder:e=>e.strictCommands(!1).command("macro [date]","\u5168\u7403\u5B8F\u89C2\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||x(),o=J(),s=await $t(r,"cj",o?{cookie:o}:void 0);l({data:s,command:`calendar macro ${r}`,source:"jin10",toJSON:i=>dt(i?.data||[])})}).command("event [date]","\u5B8F\u89C2\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||x(),o=J(),s=await Ae(r,"cj",o?{cookie:o}:void 0);l({data:s,command:"calendar event",source:"jin10",toJSON:co})}).command("holiday [date]","\u5168\u7403\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||x(),o=J(),s=await Ne(r,"cj",o?{cookie:o}:void 0);l({data:s,command:"calendar holiday",source:"jin10",toJSON:lo})}).command("ashare","A\u80A1\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async()=>{let t=await Xt("getAShareData",{page:1});l({data:t,command:"calendar ashare",source:"jin10",toJSON:uo})}).command("hk [date]","\u6E2F\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||x(),o=await Xt("getHKStockData",r);l({data:o,command:"calendar hk",source:"jin10",toJSON:s=>dt(Array.isArray(s)?s:[])})}).command("us [date]","\u7F8E\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||x(),o=await Xt("getUSStockData",r);l({data:o,command:"calendar us",source:"jin10",toJSON:s=>dt(Array.isArray(s)?s:[])})}).command("future-event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||x(),o=await nt(r);l({data:o,command:"calendar future-event",source:"jin10",toJSON:mo})}).command("future-holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||x(),o=await rt(r);l({data:o,command:"calendar future-holiday",source:"jin10",toJSON:po})}),handler:async()=>{let e=x(),t=J(),r=await $t(e,"cj",t?{cookie:t}:void 0);l({data:r,command:`calendar macro ${e}`,source:"jin10",toJSON:o=>dt(o?.data||[])})}})}var pt={all:-1,oil:19,steel:20,coal:21,gas:22,metal:23,nonferrous:24,chemical:25,sugar:27,grain:28,pig:29,macro:30};function fo(n){let e=n?.data?.list||[];return{items:e.map(t=>({title:t.title||"",hot:!!t.hot,updatedAt:t.updated_at||""})),total:e.length}}function go(n){return{groups:(n?.data?.list||[]).map(t=>({name:t.name||"",items:(t.data||[]).filter(r=>r.published===1).map(r=>({category:r.category||"",city:r.city||"",spot:r.spot_data??null,futures:r.futures_data??null,basis:r.jicha??null,basisRate:r.jicha_rate??null}))}))}}function ho(n){let e=n?.data||[];return{items:e.map(t=>({time:t.time_show||"",country:t.country||"",indicator:t.name||"",importance:t.star??0,previous:t.previous??null,consensus:t.consensus??null,actual:t.actual??null,unit:t.unit||"",impact:t.qh_affect_text||""})),total:e.length}}function yo(n){let e=n?.data||[];return{items:e.map(t=>({time:Re(t.time),content:ct(t.data?.content||t.data?.title||"",t),importance:t.important??0,source:t.data?.source||"",remark:z(t.remark)||""})),total:e.length}}function Pn(n){return n.command("future","\u671F\u8D27",e=>e.option("channel",{alias:"c",type:"string",default:"all",describe:`\u9891\u9053: ${Object.keys(pt).join("/")}`}).command("headline","\u671F\u8D27\u5934\u6761",{},async()=>{let t=await qe();l({data:t,command:"future headline",source:"jin10",toJSON:fo})}).command("basis [date]","\u671F\u73B0\u57FA\u5DEE",t=>t.positional("date",{type:"string"}).option("group",{alias:"g",type:"string",describe:"\u6309\u677F\u5757\u8FC7\u6EE4: \u9ED1\u8272\u7CFB/\u91D1\u5C5E/\u519C\u4EA7\u54C1/\u80FD\u6E90\u5316\u5DE5/\u91D1\u878D"}),async t=>{let r=t.date||x(),o=await ve(r);l({data:o,command:"future basis",source:"jin10",toJSON:go})}).command("calendar [date]","\u671F\u8D27\u65E5\u5386",t=>t.positional("date",{type:"string"}),async t=>{let r=t.date||x(),o=await Oe(r);l({data:o,command:"future calendar",source:"jin10",toJSON:ho})}).command("event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let r=t.date||x(),o=await nt(r);l({data:o,command:`future event ${r}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(a=>({time:a.public_time,country:a.country,event:a.eventcontent}))})})}).command("holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let r=t.date||x(),o=await rt(r);l({data:o,command:`future holiday ${r}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(a=>({time:a.holiday_time,country:a.country,market:a.market,name:a.holiday_name,description:a.description}))})})}),async e=>{let{channel:t="all",n:r=10}=e,o=pt[t];o===void 0&&(console.error(`\u9519\u8BEF: \u4E0D\u652F\u6301\u7684\u9891\u9053 "${t}"\uFF0C\u53EF\u9009: ${Object.keys(pt).join(", ")}`),process.exit(1));let s=new Set,i=[],a=await Tt(o);for(let u of a?.data||[])s.has(u.id)||(s.add(u.id),i.push(u));let c=0,m=50;for(;i.length<r&&c++<m;){let u=i[i.length-1];if(!u)break;let f=(await Tt(o,{max_time:u.time}))?.data||[];if(!f.length)break;let y=0;for(let g of f)s.has(g.id)||(s.add(g.id),i.push(g),y++);if(y===0)break;i.length<r&&await new Promise(g=>setTimeout(g,200))}let d={...a,data:i};l({data:d,command:"future",source:"jin10",toJSON:yo})})}var bo="wss://market-ws.jin10.com/",wo=["DCE","CZC","SHF","INE","CF","GFEX"];function _o(n,e){if(e+2>n.length)return null;let t=n.readUInt16LE(e);return e+=2,e+t>n.length?null:{str:n.subarray(e,e+t).toString("utf8"),end:e+t}}function C(n,e){return Number(n.readBigInt64LE(e))}function So(n){if(n.length<2)return null;let e=2,t=_o(n,e);if(!t)return null;let r=t.str;if(e=t.end,e+76>n.length)return null;let o=C(n,e)/1e6,s=C(n,e+8)/1e6;C(n,e+16);let i=C(n,e+24),a=C(n,e+32)/1e6,c=C(n,e+40)/1e6,m=C(n,e+48)/1e6,d=C(n,e+56)/1e6,u=C(n,e+64),p=n.readUInt32LE(e+72),f=r.split(".")[1],y=wo.includes(f),g=null,h=e+76;y&&h<n.length&&n[h]===1&&(g=C(n,h+1)/1e6);let w=g??d,q=o-w,H=w?q/w*100:0;return{code:r,snap:{code:r,close:o,prevClose:s,high:a,low:m,open:c,preclose:w,base:w,change:q,changePercent:H,openInterest:i,turnover:u,timestamp:p}}}function Dn(n,e={}){let t=e.freq??2e3,r=e.timeout??8e3;return new Promise((o,s)=>{if(!n.length)return o(new Map);let i=new Set(n),a=new Map,c=new WebSocket(bo);c.binaryType="arraybuffer";let m=setTimeout(()=>{try{c.close()}catch{}o(a)},r);c.onopen=()=>{let d=[],u=Buffer.alloc(8);u.writeUInt16LE(10003,0),u.writeUInt32LE(t,2),u.writeUInt16LE(Math.min(n.length,40),6),d.push(u);for(let p of n.slice(0,40)){let f=Buffer.from(p,"utf8"),y=Buffer.alloc(2);y.writeUInt16LE(f.length),d.push(y,f)}c.send(Buffer.concat(d))},c.onmessage=d=>{try{let u=Buffer.from(d.data);if(u.length<2)return;let p=u.readUInt16LE(0);if(p===1100)return;if(p===1200){c.send(Buffer.alloc(0));return}if(p!==10005)return;let f=So(u);if(!f)return;if(i.has(f.code)&&a.set(f.code,f.snap),a.size>=i.size){clearTimeout(m);try{c.close()}catch{}o(a)}}catch{}},c.onerror=()=>{clearTimeout(m),o(a)}})}import xo from"https";import{gunzipSync as ko}from"zlib";var Ao="wss://tm-qtg.jiaoyixia.com",No="https://jiaoyixia-market.jin10.com",qo={"1m":1,"5m":2,"30m":3,"60m":4,"120m":16,d:5,w:6,m:7,y:23,"15m":14,"10m":13};function Qt(n,e){let t=Buffer.alloc(n.length);for(let r=0;r<n.length;r++)t[r]=n[r]^e.charCodeAt(r%e.length);return t}var ft=class{buf=Buffer.alloc(4096);pos=0;wU16(e){return this.buf.writeUInt16LE(e,this.pos),this.pos+=2,this}wU8(e){return this.buf.writeUInt8(e,this.pos),this.pos+=1,this}wI8(e){return this.buf.writeInt8(e,this.pos),this.pos+=1,this}wU32(e){return this.buf.writeUInt32LE(e,this.pos),this.pos+=4,this}wI64(e){return this.buf.writeBigInt64LE(BigInt(e),this.pos),this.pos+=8,this}wStr(e){let t=Buffer.from(e,"utf8");return this.wU16(t.length),t.copy(this.buf,this.pos),this.pos+=t.length,this}toBuffer(){return this.buf.subarray(0,this.pos)}};function Oo(){return new ft().wU16(21100).wStr("").wI8(7).wU16(0).wU16(0).wU16(0).wU16(46860).wU32(0).wI8(122).wU32(0).wU32(0).toBuffer()}function vo(n,e,t,r=8e3){return new Promise((o,s)=>{let i=new WebSocket(Ao);i.binaryType="arraybuffer";let a="",c=!1,m=(u,p)=>{if(!c){c=!0,clearTimeout(d);try{i.close()}catch{}u?s(u):o(p)}},d=setTimeout(()=>m(new Error("tm-qtg 10006 \u8D85\u65F6"),[]),r);i.onopen=()=>{let u=Buffer.alloc(6);u.writeInt16LE(912,0),u.writeInt32LE(3063,2),i.send(u)},i.onmessage=u=>{try{let p=Buffer.from(u.data);if(!a){if(p.length<4)return;a=p.readUInt32LE(0).toString(),i.send(Qt(Oo(),a));return}if(p.length<2)return;let f=Qt(p,a),y=f.readUInt16LE(0);if(y===21100){setTimeout(()=>{let g=new ft().wU16(10006).wStr(n).wU8(e).wI64(t).wU16(0).wU8(0);i.send(Qt(g.toBuffer(),a))},400);return}if(y===10006){let g=f.toString("utf8"),h=/([0-9a-f]{32})\.(\d+)\.(\d+)\.(\d+)\.(\d+)/g,w=[],q;for(;q=h.exec(g);)w.push({hash:q[1],count:+q[2],start:+q[3],end:+q[4],idx:+q[5]});m(null,w)}}catch{}},i.onerror=()=>m(new Error("tm-qtg \u8FDE\u63A5\u5931\u8D25"),[])})}async function Vt(n,e,t){for(let r=0;r<3;r++)try{return await vo(n,e,t)}catch{if(r===2)return[];await new Promise(s=>setTimeout(s,300))}return[]}function In(n,e,t){let r=`${No}/${n}/${e}/${t}`;return new Promise(o=>{let s=()=>o([]);xo.get(r,a=>{if(a.statusCode&&a.statusCode>=300&&a.statusCode<400&&a.headers.location&&a.headers.location!==r)return a.resume(),o(In(n,e,t));if(!a.statusCode||a.statusCode>=400)return a.resume(),s();let c=[];a.on("data",m=>c.push(m)),a.on("end",()=>{try{let m=ko(Buffer.concat(c)),d=Math.floor(m.length/48),u=[];for(let p=0;p<d;p++){let f=p*48;u.push({date:new Date(Number(m.readBigUInt64LE(f))*1e3).toISOString(),open:Number(m.readBigInt64LE(f+8))/1e6,high:Number(m.readBigInt64LE(f+16))/1e6,low:Number(m.readBigInt64LE(f+24))/1e6,close:Number(m.readBigInt64LE(f+32))/1e6,volume:Number(m.readBigInt64LE(f+40))})}o(u)}catch{s()}}),a.on("error",s)}).on("error",s)})}var jo=86400,Co=new Set(["1m","5m","10m","15m","30m","60m","120m"]);async function Un(n,e,t){let r=qo[n];if(r==null)throw new Error(`\u4E0D\u652F\u6301\u7684\u5468\u671F: ${n}\uFF08\u652F\u6301 d/w/m/y/1m/5m/10m/15m/30m/60m/120m\uFF09`);let o=e;try{let s;Co.has(n)?s=await $o(o,r):s=await To(o,r);let i=[...s].sort((m,d)=>d.start-m.start),a=[],c=new Set;for(let m of i){if(a.length>=t)break;if(c.has(m.hash))continue;c.add(m.hash);let d=await In(o,r,m.hash);for(let u of d)a.some(p=>p.date===u.date)||a.push(u)}return a.sort((m,d)=>m.date<d.date?-1:1),{candles:a.slice(-t),source:"jin10 tm-qtg"}}catch{return{candles:[],source:"jin10 tm-qtg"}}}async function $o(n,e){let t=Math.floor(Date.now()/1e3),r=[0,1,2,4,8,16,32,64,128,256,512,1024,2048];for(let o of r){let s=t-o*jo,i=await Vt(n,e,s);if(i.length)return i}return await Vt(n,e,0)}async function To(n,e,t=12){let r=[],o=new Set,s=0;for(let i=0;i<t;i++){let a=await Vt(n,e,s);if(!a.length)break;let c=0;for(let d of a)o.has(d.hash)||(o.add(d.hash),r.push(d),c++);if(c===0)break;s=Math.max(...a.map(d=>d.end))}return r}var Eo=["i9888.DCE","SA888.CZC","rb888.SHF","cu888.SHF","au888.SHF","XAUUSD.GOODS","USOIL.GOODS","DXY.NYF","EURUSD.FXCM","USDCNH.FXCM","SPX.INDEX","HSI.INDEX"];function Jo(n){return{code:n.code,price:n.close,change:n.change,changePercent:Math.round(n.changePercent*100)/100,open:n.open,high:n.high,low:n.low,preclose:n.preclose,openInterest:n.openInterest||null,turnover:n.turnover||null,timestamp:n.timestamp?new Date(n.timestamp*1e3).toISOString():""}}function Bn(n){return n.command("price [codes...]","\u5B9E\u65F6\u884C\u60C5\uFF1A\u56FD\u5185\u671F\u8D27\u4E3B\u529B / \u73B0\u8D27\u5546\u54C1 / \u5916\u6C47 / \u6307\u6570\uFF08market-ws\uFF09",e=>e.positional("codes",{type:"string",array:!0,describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE \u5F62\u5F0F\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE / DXY.NYF / SPX.INDEX\uFF09\uFF1B\u7701\u7565\u5219\u663E\u793A\u9ED8\u8BA4\u770B\u76D8\u5217\u8868"}).strictCommands(!1).command("kline [code]","K\u7EBF\u5386\u53F2\uFF08\u671F\u8D27/\u5546\u54C1/\u5916\u6C47/\u6307\u6570\uFF0Ctm-qtg + OSS\uFF09",t=>t.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF09"}).option("period",{alias:"p",type:"string",default:"d",describe:"\u5468\u671F: d/w/m/y \u6216 1m/5m/10m/15m/30m/60m/120m\uFF08\u4E5F\u63A5\u53D7 daily/weekly \u7B49\u5168\u8BCD\uFF09"}).option("number",{alias:"n",type:"number",default:120,describe:"K\u7EBF\u6839\u6570"}),async t=>{let r=t.code;if(!r)return l({data:{error:"\u8BF7\u63D0\u4F9B\u54C1\u79CD\u4EE3\u7801\uFF0C\u4F8B\u5982: price kline XAUUSD.GOODS"},command:"price kline",source:"jin10 tm-qtg"});let{p:o="d",n:s=120}=t,i;try{i=lt(o)}catch(m){return l({data:{error:m.message},command:`price kline ${r} -p ${o}`,source:"finflow"})}let{candles:a,source:c}=await Un(i,r,s);l({data:{code:r,period:i,items:a,total:a.length},command:`price kline ${r} -p ${i}`,source:c})}),async e=>{let t=e.codes||[],r=t.length?t.map(a=>a.trim()).filter(Boolean):Eo,o=await Dn(r),s=r.map(a=>o.get(a)).filter(a=>!!a).map(Jo),i=r.filter(a=>!o.has(a));l({data:s,command:`price ${t.length?t.join(" "):"(\u9ED8\u8BA4\u770B\u76D8\u5217\u8868)"}`,source:"jin10 market-ws",toJSON:a=>({items:a,total:a.length,...i.length?{missing:i}:{}})})})}var L=Ro(Lo(process.argv)).scriptName("finflow").version("1.9.6").demandCommand(1,"\u8BF7\u6307\u5B9A\u547D\u4EE4\uFF0C\u8FD0\u884C finflow --help \u67E5\u770B\u5E2E\u52A9").option("n",{type:"number",default:10,describe:"\u6761\u6570"}).strict().help().alias("h","help");Be(L);On(L);jn(L);En(L);Ln(L);Pn(L);Bn(L);L.parse();
|
|
7
|
+
${l}`),process.exit(1)}let r=await Re(i.id),c=T(r?.data?.depth_list||[]);if(c.length<a){let l=c[c.length-1]?.ctime;if(l){let m=await Jt(i.id,{lastTime:l,rn:a-c.length}),d=T(m?.data?.depth_list||m?.data||[]);c=[...c,...d]}}u({data:r,command:"info news depth",source:"cls",toJSON:$n})}).command("hot","\u70ED\u95E8\u6587\u7AE0\u6392\u884C\uFF08cls\uFF09",o=>o,async()=>{let o=await Dt();u({data:o,command:"info news hot",source:"cls",toJSON:rr})}).command("stock <code>","\u4E2A\u80A1\u65B0\u95FB\uFF08cls\uFF0Ccode \u6216\u540D\u79F0\uFF09",o=>o,async o=>{let{n:a=10}=o,s=o.code.trim(),i=s;if(!/^(s[hz]\d+|\d{6})$/i.test(s)){let l=(await ge(s,{type:"stock",rn:1}))?.data?.stock?.data?.[0];i=l?.stock_id||l?.descr||s}let r=await Mt(i,{rn:a});u({data:r,command:"info news stock",source:"cls",toJSON:sr})}),async()=>{let e=await Re(1e3);u({data:e,command:"info news",source:"cls",toJSON:$n})}).command("topic","\u4E13\u9898",e=>e.strictCommands(!1).command("search <keyword>","\u641C\u7D22\u8BDD\u9898",o=>o,async o=>{let{n:a=10}=o,s=o.keyword,i=await we(),r=Array.isArray(i)?i:i?.data||[],c=s.toLowerCase(),l=r.filter(d=>(d.title||"").toLowerCase().includes(c)||(d.short_name||"").toLowerCase().includes(c)||(d.introduction||"").toLowerCase().includes(c));if(!l.length)return u({data:{items:[],total:0,message:`\u672A\u627E\u5230\u5339\u914D "${s}" \u7684\u4E13\u9898`},command:"info topic search",source:"jin10"});let m=T(l.slice(0,a));u({data:m,command:"info topic search",source:"jin10",toJSON:Cn})}).command("groups","\u8BDD\u9898\u5206\u7EC4",o=>o,async()=>{let o=await we();u({data:o,command:"info topic groups",source:"jin10",toJSON:cr})}).command("hot","\u8D22\u8054\u793E\u9898\u6750",o=>o,async()=>{let o=await Et();u({data:o,command:"info topic hot",source:"cls",toJSON:a=>ir(T(a))})}).command("show <id>","\u4E13\u9898\u6587\u7AE0\uFF08jin10\uFF09",o=>o,async o=>{let{n:a=10}=o,s=o.id,i=G(),r=i?{cookie:i}:void 0,c=new Set,l=[],m=1,d=50;for(;l.length<a&&m<=d;){let g=(await rn(s,{page:m},r))?.data?.list||[];if(!g.length)break;let h=0;for(let b of g)c.has(b.id)||(c.add(b.id),l.push(b),h++);if(h===0)break;m++,l.length<a&&await new Promise(b=>setTimeout(b,200))}let p=T(l);u({data:p,command:"info topic show",source:"jin10",toJSON:f=>({items:f.map(g=>({time:g.display_datetime,title:g.title,author:g.author?.nick,vip:g.vip})),total:f.length})})}),async e=>{let{n:o=10}=e,a=await we(),s=T(Array.isArray(a)?a:a?.data||[]);if(s=s.slice(0,o),!s.length)return u({data:{items:[],total:0},command:"info topic",source:"jin10"});u({data:s,command:"info topic",source:"jin10",toJSON:Cn})}).command("search","\u5168\u7AD9\u641C\u7D22\uFF08cls \u591A\u7C7B\u76EE / jin10 \u5FEB\u8BAF+\u65B0\u95FB\uFF09",e=>e.command("$0 <keyword>","\u641C\u7D22\u8D44\u8BAF",o=>o.option("src",{alias:"s",type:"string",choices:["cls","jin10"],default:"cls",describe:"\u6570\u636E\u6E90"}).option("type",{alias:"t",type:"string",describe:"cls \u7C7B\u76EE\uFF08\u9ED8\u8BA4 all\uFF09"}).positional("keyword",{type:"string",describe:"\u5173\u952E\u8BCD"}),async o=>{let{n:a=20,src:s="cls",type:i}=o,r=o.keyword;if(s==="jin10"){let l=await Ye({keyword:r,type:i&&i!=="all"?i:"all",offset:0});u({data:l,command:"info search",source:"jin10",toJSON:Jn})}else{let l=await ge(r,{type:i||"all",rn:Math.max(a,20)});u({data:l,command:"info search",source:"cls",toJSON:Pn})}}).command("detail <id>","\u641C\u7D22\u7ED3\u679C\u8BE6\u60C5\uFF08cls \u7535\u62A5\u5168\u6587\uFF09",o=>o.positional("id",{type:"string",describe:"\u641C\u7D22\u7ED3\u679C item.id\uFF08cls \u7535\u62A5\uFF09"}),async o=>{let a=o.id,s=await Pt(a);u({data:s,command:"info search detail",source:"cls",toJSON:dr})}),async e=>{let{n:o=20,src:a="cls",type:s}=e,i=e.keyword||e._?.[2];if(!i)return u({data:{error:"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD"},command:"info search",source:"cls"});if(a==="jin10"){let c=await Ye({keyword:i,type:s&&s!=="all"?s:"all",offset:0});u({data:c,command:"info search",source:"jin10",toJSON:Jn})}else{let c=await ge(i,{type:s||"all",rn:Math.max(o,20)});u({data:c,command:"info search",source:"cls",toJSON:Pn})}}),handler:async()=>{u({data:{error:"\u8BF7\u6307\u5B9A\u5B50\u547D\u4EE4: flash / news / topic / search\u3002\u8FD0\u884C finflow info --help \u67E5\u770B\u5168\u90E8"},command:"info",source:"cls"})}})}import Rn from"fs";import mr from"path";import pr from"os";var In=mr.join(pr.homedir(),".xueqiu-anon-cookie"),Ln="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",x="stock.xueqiu.com",fr="xueqiu.com";function v(n){return n.trim().toUpperCase()}var yr="https://xueqiu.com/hq";function gr(){try{let n=Rn.readFileSync(In,"utf-8").trim();return n&&/acw_tc=/.test(n)?n:null}catch{return null}}function hr(n){let t=n.headers;return typeof t.getSetCookie=="function"?t.getSetCookie():(t.get("set-cookie")||"").split(/,(?=\s*[A-Za-z_-]+=)/)}function br(n){let t=n.map(e=>{let o=e.indexOf("=");if(o<0)return"";let a=e.slice(0,o).trim();if(!a)return"";let s=e.slice(o+1).split(";")[0];return`${a}=${s}`}).filter(Boolean);return t.length?t.join("; "):null}async function En(){let n=await fetch(yr,{headers:{"User-Agent":Ln,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});if(!n.ok)throw new Error(`\u83B7\u53D6\u96EA\u7403\u533F\u540D\u4EE4\u724C\u5931\u8D25\uFF1A/hq \u8FD4\u56DE HTTP ${n.status}\uFF08\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u662F\u5426\u88AB WAF \u62E6\u622A\uFF09`);let t=br(hr(n));if(!t||!/xq_a_token=/.test(t))throw new Error("\u65E0\u6CD5\u4ECE\u96EA\u7403\u83B7\u53D6\u533F\u540D\u4EE4\u724C (xq_a_token)\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5");try{Rn.writeFileSync(In,t,"utf-8")}catch{}return t}function _r(n){return String(n?.error_code??n?.code)==="400016"}async function wr(n,t,e,o,{token:a=!0,ua:s}={}){let i=a?gr()??await En():null,r=0,c=async m=>{let d={Accept:"application/json","Accept-Language":"zh-Hans-CN;q=1, ja-JP;q=0.9","Accept-Encoding":"gzip, deflate, br",Connection:"keep-alive","User-Agent":s||Ln,Origin:"https://xueqiu.com",Referer:"https://xueqiu.com/"};m&&(d.Cookie=m);let p={method:n,headers:d,redirect:"follow"};o&&(p.body=new URLSearchParams(o).toString(),d["Content-Type"]="application/x-www-form-urlencoded");let f=await fetch(`https://${t}${e}`,p);r=f.status;try{return await f.json()}catch{return null}},l=await c(i);if(a&&(_r(l)||l===null||r===401)&&(l=await c(await En())),l===null)throw new Error(`\u96EA\u7403\u63A5\u53E3\u8FD4\u56DE\u975E JSON \u54CD\u5E94\uFF08HTTP ${r}\uFF09\uFF0C\u53EF\u80FD\u88AB WAF \u62E6\u622A\u6216\u533F\u540D\u4EE4\u724C\u5931\u6548`);return l}function k(n,t,e={}){return wr("GET",n,t,null,e)}function Mn(n){return k(x,`/v5/stock/realtime/quotec.json?symbol=${n.map(v).join(",")}`,{token:!1})}function dt(n){return k(x,`/v5/stock/realtime/pankou.json?symbol=${v(n)}`)}var Sr={d:"day",w:"week",m:"month",y:"year",q:"quarter"};function Fn(n,{period:t="day",count:e=284}={}){let o=Sr[t]||t,a=Date.now();return k(x,`/v5/stock/chart/kline.json?symbol=${v(n)}&begin=${a}&period=${o}&type=before&count=-${e}&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance`)}function mt(n,{period:t="1d"}={}){return k(x,`/v5/stock/chart/minute.json?symbol=${v(n)}&period=${t}`)}function pt(n,{count:t=50}={}){return k(x,`/v5/stock/history/trade.json?symbol=${v(n)}&count=${t}`)}function Hn(n){return k(x,`/v5/stock/quote/relevant.json?symbol=${v(n)}`)}function Bn(n){return k(fr,`/query/v1/suggest_stock.json?q=${encodeURIComponent(n)}`)}function Un({category:n="cn"}={}){return k(x,`/v5/stock/screener/industries.json?category=${n}`)}function Yn(n={}){let{page:t=1,size:e=30,order:o="desc",order_by:a="percent",market:s="CN"}=n,i=new URLSearchParams({page:String(t),size:String(e),order:o,order_by:a,market:s});return n.ind_code&&i.set("ind_code",n.ind_code),n.type&&i.set("type",n.type),k(x,`/v5/stock/screener/quote/list.json?${i.toString()}`)}function Kn(n){return k(x,`/v5/stock/hq/longhu.json?date=${n}`)}function zn(n,t={}){let{count:e=10,type:o="Q4",is_detail:a=!0,region:s="cn"}=t;return k(x,`/v5/stock/finance/${s}/indicator.json?symbol=${v(n)}&type=${o}&is_detail=${a}&count=${e}`)}function Gn(n,t={}){let{count:e=10,type:o="Q4",is_detail:a=!0,region:s="cn"}=t;return k(x,`/v5/stock/finance/${s}/cash_flow.json?symbol=${v(n)}&type=${o}&is_detail=${a}&count=${e}`)}function Wn(n,t={}){let{count:e=10,type:o="Q4",is_detail:a=!0,region:s="cn"}=t;return k(x,`/v5/stock/finance/${s}/income.json?symbol=${v(n)}&type=${o}&is_detail=${a}&count=${e}`)}function Xn(n,t={}){let{count:e=10,type:o="Q4",is_detail:a=!0,region:s="cn"}=t;return k(x,`/v5/stock/finance/${s}/balance.json?symbol=${v(n)}&type=${o}&is_detail=${a}&count=${e}`)}function Qn(n,{circula:t=1}={}){return k(x,`/v5/stock/f10/cn/top_holders.json?symbol=${v(n)}&circula=${t}`)}function ft(n){return k(x,`/v5/stock/f10/cn/indicator.json?symbol=${v(n)}`)}function Vn(n){return k(x,`/v5/stock/f10/cn/industry.json?symbol=${v(n)}`)}function Zn(n,{page:t=1,size:e=10}={}){return k(x,`/v5/stock/f10/cn/bonus.json?symbol=${v(n)}&page=${t}&size=${e}`)}function yt(n){return k(x,`/v5/stock/capital/flow.json?symbol=${v(n)}`)}function eo(n,{count:t=20}={}){return k(x,`/v5/stock/capital/history.json?symbol=${v(n)}&count=${t}`)}function to(n,{page:t=1,size:e=180}={}){return k(x,`/v5/stock/capital/margin.json?symbol=${v(n)}&page=${t}&size=${e}`)}function no(n){return k(x,`/v5/stock/batch/quote.json?symbol=${n.map(v).join(",")}&extend=detail&is_delay_hk=true`)}function de(n){let t=n.result||{},e=(o,a)=>({label:o,netBuy:a?.netBuyTurnover??null,netBuyText:a?.netBuyTurnoverText||null,turnover:a?.tradValSum??null,status:a?.tradeStatus||null});return{northbound:{shanghai:e("\u5317\u5411\u8D44\u91D1(\u6CAA)",t.shMarketFlowDetail),shenzhen:e("\u5317\u5411\u8D44\u91D1(\u6DF1)",t.szMarketFlowDetail),total:e("\u5317\u5411\u5408\u8BA1",t.shSZTotalMarketFlowDetail)},southbound:{shanghai:e("\u5357\u5411\u8D44\u91D1(\u6CAA)",t.hkSHMarketFlowDetail),shenzhen:e("\u5357\u5411\u8D44\u91D1(\u6DF1)",t.hkSZMarketFlowDetail),total:e("\u5357\u5411\u5408\u8BA1",t.hkSHSZTotalMarketFlowDetail)},source:"glh"}}var kr="https://query1.finance.yahoo.com/v8/finance/chart",xr={"User-Agent":"Mozilla/5.0"};async function gt(n){let t=n.trim().toUpperCase(),e=`${kr}/${encodeURIComponent(t)}?interval=1d&range=1d`;try{let s=(await(await fetch(e,{headers:xr})).json())?.chart?.result;if(!Array.isArray(s)||s.length===0)return null;let i=s[0]?.meta;if(!i?.symbol)return null;let r=Number(i.regularMarketPrice??0),c=Number(i.chartPreviousClose??0),l=r-c,m=c===0?0:l/c*100;return{symbol:i.symbol,name:i.shortName??"",price:r,prevClose:c,change:l,changePercent:m,currency:i.currency??"",exchange:i.exchangeName??"",marketState:i.marketState??""}}catch{return null}}var ao={d:"d",day:"d",daily:"d",w:"w",week:"w",weekly:"w",m:"m",month:"m",monthly:"m",y:"y",year:"y",yearly:"y",annual:"y",annually:"y"},ro=new Set(["d","w","m","y","5d","1m","5m","10m","15m","30m","60m","120m"]);function Oe(n){let t=String(n??"").trim().toLowerCase();if(ao[t])return ao[t];if(ro.has(t))return t;let e=t.match(/^(\d+)\s*(?:min|minute|minutes)$/);if(e){let o=`${e[1]}m`;if(ro.has(o))return o}throw new Error(`\u4E0D\u652F\u6301\u7684\u5468\u671F "${n}"\uFF1B\u652F\u6301 d/w/m/y \u6216 1m/5m/15m/30m/60m/120m\uFF08\u4E5F\u63A5\u53D7 daily/weekly/monthly/yearly \u7B49\u5168\u8BCD\uFF0C\u6216 5min \u8FD9\u79CD\u5199\u6CD5\uFF09`)}var so="Asia/Shanghai";function U(n){return new Date(n).toLocaleDateString("en-CA",{timeZone:so})}function me(n){return new Date(n).toLocaleString("sv-SE",{timeZone:so,hour12:!1}).replace(" ","T")+"+08:00"}function io(n={}){return y("/api/a-share/special-data/limit-up-pool",{date_ms:n.dateMs,page:n.page,size:n.size,sort_field:n.sortField,sort_dir:n.sortDir})}function co(n={}){return y("/api/a-share/special-data/limit-down-pool",{date_ms:n.dateMs,page:n.page,size:n.size,sort_field:n.sortField,sort_dir:n.sortDir})}function uo(n={}){return y("/api/a-share/special-data/limit-break-pool",{date_ms:n.dateMs,page:n.page,size:n.size,sort_field:n.sortField,sort_dir:n.sortDir})}function lo(){return y("/api/a-share/special-data/limit-up-ladder")}function mo(n="day"){return y("/api/a-share/special-data/skyrocket-list",{period:n})}function po(n="day"){return y("/api/a-share/special-data/hot-stock-list",{period:n})}function fo(n){return y("/api/a-share/special-data/hot-stock-list-history",{date:n})}function yo(n,t,e){return y("/api/a-share/special-data/hot-stock-rank-trend",{thscode:w(n),start_date:t,end_date:e})}function go(n){return y("/api/a-share/special-data/anomaly-analysis-list",{tag_codes:n?.join(",")})}function ho(n){return y("/api/a-share/special-data/anomaly-analysis-stock",{thscodes:n.map(w).join(",")})}function bo(n={}){return y("/api/a-share/special-data/dragon-tiger-list",{board_type:n.boardType,date:n.date})}function _o(n,t="final"){return y("/api/a-share/auction/snapshot",{thscodes:n.map(w).join(","),stage:t})}function wo(n){return y("/api/a-share/auction/short-term-benchmark",{date:n})}function Ar(n){let t=n?.data||{};return{code:t.secu_code||"",name:t.secu_name||"",price:Number(t.last_px||0),change:Number(t.change_px||0),changePercent:Math.round(Number(t.change||0)*1e4)/100,open:Number(t.open_px||0),high:Number(t.high_px||0),low:Number(t.low_px||0),preclose:Number(t.preclose_px||0),volume:Number(t.business_amount||0),amount:Number(t.business_balance||0),turnoverRate:Number(t.tr||0),amplitude:Number(t.amp||0),avgPrice:Number(t.av_px||0),volumeRatio:Number(t.qrr||0),pe:t.pe!=null?Number(t.pe):null,pb:t.pb!=null?Number(t.pb):null,marketCap:Number(t.mc||0),change3d:t.change_3!=null?Number(t.change_3):null,change5d:t.change_5!=null?Number(t.change_5):null,status:t.trade_status==="TRADE"?"trading":"closed",source:"cls"}}function Or(n){return{items:n.map(t=>{let e=t.quote||t;return{code:e.symbol||"",name:e.name||"",price:e.current??0,change:e.chg??0,changePercent:Math.round((e.percent??0)*100)/100,volume:e.volume??0,amount:e.amount??0,turnoverRate:e.turnover_rate??0,marketCap:e.market_capital??0,high:e.high??0,low:e.low??0,open:e.open??0}}),total:n.length}}function jr(n){let t=n?.data||{},e=Number(t.last_px??0);return!!(t.secu_name||t.secu_code)&&Number.isFinite(e)&&e!==0}function Tr(n){if(!n)return!1;let t=Number(n.current??n.price??0);return!!(n.symbol||n.name)&&Number.isFinite(t)&&t!==0}function vr(n){let t=n.trim().toUpperCase();return t?/^[A-Z]+$/.test(t)||/^\d{4}\.T$/.test(t)||/^\d{6}\.(KS|KQ)$/.test(t)||/^\d{4,5}\.HK$/.test(t)?t:/^\d{6}\.(SS|SH)$/.test(t)?`${t.slice(0,6)}.SS`:/^\d{6}\.SZ$/.test(t)?t:/^(SH|SZ)\d{6}$/.test(t)?t.startsWith("SH")?`${t.slice(2)}.SS`:`${t.slice(2)}.SZ`:/^\d{6}$/.test(t)?t.startsWith("6")?`${t}.SS`:`${t}.SZ`:null:null}function qr(n){let t=n.toUpperCase();return t.startsWith("SH")||t.startsWith("SZ")?t:/^\d{6}$/.test(n)?n.startsWith("6")?"SH"+n:"SZ"+n:t}async function Jo(n){let t=n.map(qr),e,o;try{e=await no(t),o=e?.data?.items||[],o.length&&o[0]?.quote&&(o=o.map(a=>({...a.quote,market:a.market})))}catch{e=await Mn(t),o=e?.data||e?.items||[]}return o}async function $r(n){let t=await Jo([n]);return t[0]?.quote||t[0]||null}function Cr(n){return{code:n.symbol,name:n.name,price:n.price,change:n.change,changePercent:n.changePercent,preclose:n.prevClose,currency:n.currency,exchange:n.exchange,marketState:n.marketState,status:n.marketState==="REGULAR"?"trading":"closed",source:"yahoo"}}function W(){return!!ce()}function _t(n){return hn(n)||/^88\d{4}$/.test(n.trim())}function ht(n){return/^((sh|sz|bj)\d{6}|\d{6}(\.(sh|sz|bj|ti))?)$/i.test(n.trim())}var X=n=>n==null?null:Math.round(n*100)/100;function bt(n,t="fuyao fallback"){return{code:n.thscode||"",name:"",price:n.last_price??0,change:n.price_change??0,changePercent:X(n.price_change_ratio_pct)??0,open:n.open_price??0,high:n.high_price??0,low:n.low_price??0,preclose:n.prev_price??0,volume:n.volume??0,amount:n.turnover??0,change3d:null,change5d:null,status:"trading",source:t}}function So(n,t,e){return{code:w(n),period:"d",adjust:e||"none",items:t.map(o=>({date:U(o.date_ms),open:o.open_price??null,high:o.high_price??null,low:o.low_price??null,close:o.close_price??null,volume:o.volume??0,amount:o.turnover??0})),total:t.length}}async function ko(n,t,e){let o=Date.now(),a=o-t*1.6*864e5;return((_t(n)?await wn(n,{start:a,end:o}):await bn(n,{start:a,end:o,adjust:e}))?.item||[]).slice(-t)}var Do=new Set(["1m","5m","15m","30m","60m","120m"]);function Pr(n){if(n==null||n==="")return null;let t=String(n);return/^\d{8}$/.test(t)?`${t.slice(0,4)}-${t.slice(4,6)}-${t.slice(6,8)}`:t}function Jr(n,t,e){return{code:n,period:t,items:e.map(o=>({date:Pr(o.trade_date),open:Number(o.open_px),high:Number(o.high_px),low:Number(o.low_px),close:Number(o.close_px),volume:Number(o.business_amount||0),change:Number(o.change||0)})),total:e.length}}function Dr(n,t,e){let o=Do.has(t);return{code:n,period:t,items:e.map(a=>({date:o?me(a[0]):U(a[0]),open:Number(a[2]),high:Number(a[3]),low:Number(a[4]),close:Number(a[5]),volume:Number(a[1]),amount:Number(a[9]||0),turnoverRate:Number(a[8]||0)})),total:e.length}}function xo(n,t){return{code:n,preclose:Number(t.preclose_px||0),asks:[5,4,3,2,1].map(e=>({price:Number(t[`s_px_${e}`]||0),volume:Number(t[`s_amount_${e}`]||0)})),bids:[1,2,3,4,5].map(e=>({price:Number(t[`b_px_${e}`]||0),volume:Number(t[`b_amount_${e}`]||0)})),source:"cls"}}function No(n,t){let e=t.current??0,o=t.percent??0,a=o!==0?e/(1+o/100):0;return{code:n,current:e,preclose:a,asks:[1,2,3,4,5].map(s=>({price:Number(t[`sp${s}`]||0),volume:Number(t[`sc${s}`]||0)})),bids:[5,4,3,2,1].map(s=>({price:Number(t[`bp${s}`]||0),volume:Number(t[`bc${s}`]||0)})),buyPercent:t.buypct??null,sellPercent:t.sellpct??null,buySellRatio:t.ratio??null,source:"xq"}}function Ao(n,t){let e=t?.data?.volume||[],o=t?.data?.end||e.length;return{code:n,items:e.map(a=>{let s=String(a.minute),i=s.length<=3?"0"+s[0]:s.slice(0,2),r=s.length<=3?s.slice(1):s.slice(2),c=s.slice(-2);return{time:`${i}:${r}:${c}`,price:Number(a.last_px||0),volume:Number(a.change_vol||0),side:a.change_vol_color===1?"buy":"sell"}}),total:o}}function Oo(n,t){let e=t?.data?.items||[];return{code:n,items:e.slice(0,50).map(o=>({time:me(o.timestamp),price:Number(o.current||o.price||0),volume:Number(o.trade_volume||o.volume||0),side:o.side==="buy"||o.side===1?"buy":"sell"})),total:e.length}}function jo(n,t){let e=t?.data||{},o=e.line||[],a=Number(e.preclose_px||0);return{code:n,preclose:a,items:o.map(s=>{let i=String(s.minute),r=i.length<=3?"0"+i[0]:i.slice(0,2),c=i.length<=3?i.slice(1):i.slice(2),l=Number(s.last_px||0);return{time:`${r}:${c}`,price:l,avgPrice:Number(s.av_px||0),changePercent:a>0?(l-a)/a*100:0,amount:Number(s.business_balance||0)}}),total:o.length}}function To(n,t){let e=t?.data?.items||[];return{code:n,items:e.slice(0,240).map(o=>({time:me(o.timestamp),price:Number(o.current||0),volume:Number(o.volume||0),avgPrice:Number(o.avg_price||0)})),total:e.length}}function Er(n){let t=n?.data||{},e=t.company||{};return{name:e.org_name_cn||"",industry:(t.industry||[]).map(o=>o.ind_name),concept:(t.concept||[]).map(o=>o.ind_name),companyType:e.classi_name||"",region:e.provincial_name||"",listedDate:e.listed_date||"",controller:e.actual_controller||"",mainBusiness:e.main_operation_business||""}}function Rr(n){let t=n?.data||{};return{mainInflow:Number(t.main_fund_in||0),mainOutflow:Number(t.main_fund_out||0),mainNet:Number(t.main_fund_diff||0),superNet:Number(t.super_fund_diff||0),largeNet:Number(t.large_fund_diff||0),mediumNet:Number(t.medium_fund_diff||0),smallNet:Number(t.little_fund_diff||0),mainNet3d:t.main_fund_3!=null?Number(t.main_fund_3):null,mainNet5d:t.main_fund_5!=null?Number(t.main_fund_5):null,mainNet10d:t.main_fund_10!=null?Number(t.main_fund_10):null,mainNet20d:t.main_fund_20!=null?Number(t.main_fund_20):null,source:"cls"}}function vo(n){let t=n?.data||{},e=t.items||[];return{items:e.map(o=>({time:o.timestamp?U(o.timestamp):"",amount:Number(o.amount||0)})),total:e.length,summary:t.sum3!=null?{sum3:Number(t.sum3),sum5:Number(t.sum5),sum10:Number(t.sum10),sum20:Number(t.sum20)}:null}}function Ir(n){let t=n?.data?.items||[];return{items:t.map(e=>({date:e.td_date?U(e.td_date):"",marginBalance:Number(e.margin_trading_amt_balance||0),shortBalance:Number(e.short_selling_amt_balance||0),marginNetBuy:Number(e.margin_trading_net_buy_amt||0),marginBuy:Number(e.margin_trading_buy_amt||0)})),total:t.length}}function Lr(n){let t=Array.isArray(n?.data)?n.data:[];return{items:t.map(e=>({title:e.title||"",date:e.time||(e.timestamp?U(e.timestamp):""),url:e.url||"",source:"cls"})),total:t.length}}function Mr(n){let t=Array.isArray(n?.data)?n.data:[];return{items:t.map(e=>({title:e.anncTitle||"",question:e.words||"",answer:e.anncContent||"",date:e.anncDate1?U(e.anncDate1):e.anncDate2||"",source:e.source||"\u6295\u8D44\u8005\u4E92\u52A8"})),total:n?.total??t.length}}function Fr(n){let t=n?.data?.items||n?.data||[];return{items:t.map((e,o)=>({rank:o+1,holderName:e.holder_name||"",shares:Number(e.held_num||0),ratio:Number(e.held_ratio||0),change:e.chg_amount??e.change??null})),total:t.length}}function Hr(n){let t=n?.data?.items||n?.data||[];return Array.isArray(t)?{items:t.map(e=>({period:e.dividend_year||"",exDividendDate:e.ashare_ex_dividend_date?U(e.ashare_ex_dividend_date):"",equityDate:e.equity_date?U(e.equity_date):"",plan:e.plan_explain||""})),total:t.length}:{items:[],total:0}}function pe(n){return Array.isArray(n)?n[0]:n}function Br(n){let t=n?.data||{},e=t.list||[];return{name:t.quote_name||"",items:e.map(o=>({report:o.report_name||"",roe:pe(o.avg_roe),eps:pe(o.basic_eps),grossMargin:pe(o.gross_selling_rate),revenueYoy:pe(o.operating_income_yoy)})),total:e.length}}function qo(n){let t=n?.data?.items?.[0];if(!t)return{items:[],total:0};let e=o=>o==null||o===""?null:Number(o);return{items:[{report:t.report_date||"",peTtm:e(t.pe_ttm),pb:e(t.pb),roe:e(t.avg_roe),eps:e(t.basic_eps),netProfitPerShare:e(t.np_per_share),grossMargin:e(t.gross_selling_rate),netMargin:e(t.net_selling_rate),dividendYield:e(t.dividend_yield),revenue:e(t.total_revenue),netProfit:e(t.net_profit_atsopc),revenueYoy:e(t.operating_income_yoy),netProfitYoy:e(t.net_profit_atsopc_yoy),assetLiabRatio:e(t.asset_liab_ratio),pledgeRatio:e(t.pledge_ratio),marketCap:e(t.market_capital),currency:t.currency||"CNY"}],total:1}}function Ur(n,t){let e=n?.data||{},o=e.list||[],a={cashflow:["report_name","ncf_from_oa","ncf_from_ia","ncf_from_fa","net_increase_in_cce"],income:["report_name","total_revenue","net_profit","net_profit_atsopc","net_profit_after_nrgal_atsolc"],balance:["report_name","total_assets","total_liab","asset_liab_ratio","total_quity_atsopc"]},s={cashflow:["report","operating","investing","financing","netIncrease"],income:["report","revenue","netProfit","netProfitAttrib","netProfitDeducted"],balance:["report","totalAssets","totalLiab","debtRatio","equity"]},i=a[t]||a.cashflow,r=s[t]||s.cashflow;return{name:e.quote_name||"",type:t,items:o.map(c=>{let l={report:c.report_name||""};for(let m=1;m<i.length;m++)l[r[m]]=pe(c[i[m]]);return l}),total:o.length}}function $o(n){let t=n?.data||n?.list||[],e={1:"stock",2:"fund",3:"index"};return{items:t.map(o=>({code:o.code||o.symbol||"",name:o.query||o.name||o.cn_name||"",type:o.type?e[o.type]||String(o.type):""})),total:t.length}}function Yr(n){let e=(n?.data||{}).items||[];return{items:e.map(o=>({time:o.timestamp?me(o.timestamp):"",amount:Number(o.amount||0)})),total:e.length}}function Kr(n){let t=(n?.data?.industries||[]).map(e=>({code:e.encode||"",name:e.name||"",pinyin:e.pinyin||""}));return{items:t,total:t.length}}function Co(n,t){return{items:n.map(e=>({code:e.symbol||"",name:e.name||"",price:e.current??null,changePercent:Math.round((e.percent??0)*100)/100,amount:e.amount??null,volume:e.volume??null,marketCap:e.market_capital??null,pe:e.pe_ttm??null,pb:e.pb??null,turnoverRate:e.turnover_rate??null})),total:t??n.length}}async function Po(n){let t=[],e,o=1,a=12;for(;t.length<n.n&&o<=a;){let s=await Yn({page:o,size:Math.min(90,n.n-t.length),order:n.order,order_by:n.order_by,market:n.market,ind_code:n.ind_code,type:n.type});if(s?.error_code)throw new Error(`\u96EA\u7403\u7B5B\u9009\u63A5\u53E3\u9519\u8BEF: ${s.error_description||s.error_code}`);let i=s?.data?.list||[];if(e=s?.data?.count??e,!i.length)break;t.push(...i),o++}return{list:t,count:e}}function Eo(n){return n.command({command:"quote [codes...]",describe:"\u8BC1\u5238\u884C\u60C5\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF0C\u81EA\u52A8\u8BC6\u522B\u6570\u636E\u6E90\uFF1B\u591A\u53EA\u4E00\u8D77\u4F20\uFF0C\u81EA\u52A8\u6279\u91CF\uFF09",builder:t=>t.positional("codes",{type:"string",array:!0,describe:"\u8BC1\u5238\u4EE3\u7801\uFF08A\u80A1: sh600519 / 600519\uFF0C\u6E2F\u80A1: 00700\uFF0C\u7F8E\u80A1: AAPL\uFF09\uFF1B\u591A\u53EA\u7528\u7A7A\u683C\u5206\u9694\u5373\u6279\u91CF\u67E5\u8BE2"}).strictCommands(!1).command("related <code>","\u5173\u8054\u80A1\u7968\uFF08xueqiu\uFF09",e=>e,async e=>{let o=e.code,s=await Hn(o),i=s?.data?.items||s?.data||[];u({data:s,command:`quote related ${o}`,source:"xq",toJSON:()=>({items:i.map(r=>({code:r.symbol||"",name:r.name||"",price:r.current??0,changePercent:Math.round((r.percent??0)*100)/100,relation:r.relation||""}))})})}).command("search <keyword>","\u641C\u7D22\u80A1\u7968\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF1Bxq \u5931\u8D25\u65F6\u6276\u6447\u515C\u5E95\uFF09",e=>e,async e=>{let o=e.keyword,a;try{a=await Bn(o)}catch(i){if(!W())throw i;a=null}if((a?.data?.stocks||a?.data||[]).length){u({data:a,command:`quote search ${o}`,source:"xq",toJSON:$o});return}if(W()){let i=await kn(o,{limit:20});u({data:i,command:`quote search ${o}`,source:"fuyao fallback",toJSON:r=>({items:(r?.item||[]).map(c=>({code:c.thscode||"",name:c.name||"",type:c.asset_type||"",exchange:c.exchange??null})),total:r?.item?.length??0})});return}u({data:a,command:`quote search ${o}`,source:"xq",toJSON:$o})}).command("industry [ind_code]","\u884C\u4E1A\uFF08\u96EA\u7403\uFF09\uFF1A\u5217\u51FA\u884C\u4E1A\u6216\u67D0\u884C\u4E1A\u6210\u5206\u80A1\uFF08A\u80A1\u7533\u4E07/\u7F8E\u80A1GICS/\u6E2F\u80A1\u6052\u751F\uFF09",e=>e.positional("ind_code",{type:"string",describe:"\u884C\u4E1A\u4EE3\u7801\uFF08\u677F\u5757ID\uFF09\uFF1B\u6CE8\u610F\u4E0D\u662F\u80A1\u7968\u4EE3\u7801\u3002\u7701\u7565\u5219\u5217\u51FA\u5168\u90E8\u884C\u4E1A\u3002\u5404\u5E02\u573A\u4EE3\u7801\u4F53\u7CFB\u4E0D\u540C\uFF1Acn=\u7533\u4E07(S2701=\u534A\u5BFC\u4F53) / us=GICS(453010=\u534A\u5BFC\u4F53) / hk=\u6052\u751F(7030=\u5DE5\u4E1A\u5DE5\u7A0B)"}).option("market",{type:"string",default:"cn",choices:["cn","us","hk"],describe:"\u5E02\u573A\uFF1Acn(A\u80A1\u7533\u4E07) / us(\u7F8E\u80A1GICS) / hk(\u6E2F\u80A1\u6052\u751F)"}).option("order-by",{type:"string",default:"percent",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF08\u96EA\u7403\u9875\u9762\u53EF\u6392\u5E8F\u7684\u5217\uFF09\uFF1Acurrent/chg/percent/current_year_percent/volume/amount/turnover_rate/pe_ttm/dividend_yield/market_capital"}).option("order",{type:"string",choices:["asc","desc"],default:"desc"}),async e=>{let{n:o=30}=e,a=e.ind_code,s=String(e.market??"cn").toLowerCase(),i=e["order-by"]??"percent",r=e.order??"desc";if(!a){let m=await Un({category:s});if(m?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${m.error_description||m.error_code}`);return u({data:m,command:`quote industry --market ${s}`,source:"xq",toJSON:Kr})}let{list:c,count:l}=await Po({n:o,order:r,order_by:i,market:s.toUpperCase(),ind_code:a});u({data:{list:c},command:`quote industry ${a} --market ${s}`,source:"xq",toJSON:()=>Co(c,l)})}).command("industry-profile <code>","\u4E2A\u80A1\u884C\u4E1A\u753B\u50CF\uFF08\u96EA\u7403 F10\uFF09\uFF1A\u6240\u5C5E\u884C\u4E1A/\u6982\u5FF5/\u4E3B\u8425/\u5B9E\u63A7\u4EBA",e=>e.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 sh600519"}),async e=>{let o=e.code,a=o.length<=6?o.toUpperCase().startsWith("SH")||o.toUpperCase().startsWith("SZ")?o:o.toUpperCase():o,s=await Vn(a);u({data:s,command:`quote industry-profile ${o}`,source:"xq",toJSON:Er})}).command("board <type>","\u677F\u5757/\u5E02\u573A\u4E00\u89C8\u6210\u5206\u80A1\uFF08\u96EA\u7403\uFF09",e=>e.positional("type",{type:"string",describe:"\u677F\u5757/\u5E02\u573A\uFF1AA\u80A1 sh_sz/sha/sza/cyb/kcb/shb/szb/zxb/xsbno/xsbin\uFF1B\u7F8E\u80A1 us\uFF1B\u6E2F\u80A1 hk\uFF1B\u4E2D\u6982\u80A1 us_china"}).option("order-by",{type:"string",default:"percent",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF08\u96EA\u7403\u9875\u9762\u53EF\u6392\u5E8F\u7684\u5217\uFF09\uFF1Acurrent/chg/percent/current_year_percent/volume/amount/turnover_rate/pe_ttm/dividend_yield/market_capital"}).option("order",{type:"string",choices:["asc","desc"],default:"desc"}),async e=>{let{n:o=30}=e,a=e.type,s=e["order-by"]??"percent",i=e.order??"desc",r=a==="hk"?"HK":a==="us"||a==="us_china"?"US":"CN",{list:c,count:l}=await Po({n:o,order:i,order_by:s,market:r,type:a});u({data:{list:c},command:`quote board ${a}`,source:"xq",toJSON:()=>Co(c,l)})}).command("kline [code]","K\u7EBF",e=>e.positional("code",{type:"string"}).option("period",{alias:"p",type:"string",default:"d"}).option("number",{alias:"n",type:"number",default:120}).option("src",{type:"string",choices:["cls","xq","fuyao"],describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF1B\u590D\u6743\u65E5\u7EBF/\u540C\u82B1\u987A\u6307\u6570\u7528 fuyao\uFF09"}).option("adjust",{alias:"a",type:"string",default:"none",choices:["none","forward","backward"],describe:"\u590D\u6743\uFF08\u4EC5 fuyao \u65E5\u7EBF\uFF1Aforward \u524D\u590D\u6743 / backward \u540E\u590D\u6743\uFF09"}),async e=>{let{p:o="d",n:a=120,src:s}=e,i=e.adjust||e.a||"none",r=e.code,c;try{c=Oe(o)}catch(f){return u({data:{error:f.message},command:`quote kline ${r} -p ${o}`,source:"finflow"})}let l=Do.has(c);if(s==="fuyao"||i!=="none"||_t(r)){if(!W())throw new Error("\u6276\u6447\u5B98\u65B9\u6E90\u672A\u914D\u7F6E\uFF1A\u590D\u6743\u65E5K/\u540C\u82B1\u987A\u6307\u6570K\u7EBF\u9700\u8981\u5148\u8FD0\u884C finflow key set fuyao <sk-fuyao-\u2026>");if(l)throw new Error("\u6276\u6447 K \u7EBF\u4EC5\u652F\u6301\u65E5\u7EBF\uFF08interval=1d\uFF09\uFF1B\u5206\u949F\u7EBF\u8BF7\u7528\u9ED8\u8BA4\u6E90\uFF08xq\uFF09");let f=await ko(r,a,i!=="none"?i:void 0);u({data:f,command:`quote kline ${r} -p d${i!=="none"?` --adjust ${i}`:""}`,source:"fuyao",toJSON:()=>So(r,f,i)});return}let d=s==="xq"||!s&&l,p=async f=>{if(f){let F=await Fn(r,{period:c,count:a}),J=F?.data?.item||F?.data||[];return{items:J,toJSON:()=>Dr(r,c,J),source:"xq"}}let g=c==="w"?"w":c==="m"?"m":c==="y"?"y":"d",h=[],b,$=0,C=50;for(;h.length<a&&$++<C;){let J=(await It(r,{period:g,limit:Math.min(a-h.length,200),start_date:b}))?.data||[];if(!J.length)break;h=[...J,...h],b=String(J[0].trade_date)}let K=h.slice(-a);return{items:K,toJSON:()=>Jr(r,g,K),source:"cls"}};try{let f=await p(d);u({data:f.items,command:`quote kline ${r} -p ${c}`,source:f.source,toJSON:f.toJSON})}catch(f){if(l&&!s)throw f;try{let g=await p(!d);u({data:g.items,command:`quote kline ${r} -p ${c}`,source:`${g.source} fallback`,toJSON:g.toJSON})}catch{if(W()&&ht(r)&&!l){let g=await ko(r,a);u({data:g,command:`quote kline ${r} -p d`,source:"fuyao fallback",toJSON:()=>So(r,g)});return}throw f}}}).command("depth [code]","\u4E94\u6863\u76D8\u53E3",e=>e.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async e=>{let{src:o="cls"}=e,a=e.code,s=o;try{if(s==="xq"){let i=await dt(a);return u({data:i,command:`quote depth ${a} --src xq`,source:"xq",toJSON:r=>No(a,r?.data||{})})}else{let i=await Le(a);return u({data:i,command:`quote depth ${a}`,source:"cls",toJSON:r=>xo(a,r?.data||{})})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let r=await dt(a);u({data:r,command:`quote depth ${a} --src xq`,source:"xq fallback",toJSON:c=>No(a,c?.data||{})})}else{let r=await Le(a);u({data:r,command:`quote depth ${a}`,source:"cls fallback",toJSON:c=>xo(a,c?.data||{})})}}}).command("ticks [code]","\u9010\u7B14\u6210\u4EA4",e=>e.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async e=>{let{src:o="cls"}=e,a=e.code,s=o;try{if(s==="xq"){let i=await pt(a);return u({data:i,command:`quote ticks ${a} --src xq`,source:"xq",toJSON:r=>Oo(a,r)})}else{let i=await Me(a);return u({data:i,command:`quote ticks ${a}`,source:"cls",toJSON:r=>Ao(a,r)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let r=await pt(a);u({data:r,command:`quote ticks ${a} --src xq`,source:"xq fallback",toJSON:c=>Oo(a,c)})}else{let r=await Me(a);u({data:r,command:`quote ticks ${a}`,source:"cls fallback",toJSON:c=>Ao(a,c)})}}}).command("timeline [code]","\u5206\u65F6\u7EBF",e=>e.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async e=>{let{src:o="cls"}=e,a=e.code,s=o;try{if(s==="xq"){let i=await mt(a,{period:"1d"});return u({data:i,command:`quote timeline ${a} --src xq`,source:"xq",toJSON:r=>To(a,r)})}else{let i=await Fe(a);return u({data:i,command:`quote timeline ${a}`,source:"cls",toJSON:r=>jo(a,r)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let r=await mt(a,{period:"1d"});u({data:r,command:`quote timeline ${a} --src xq`,source:"xq fallback",toJSON:c=>To(a,c)})}else{let r=await Fe(a);u({data:r,command:`quote timeline ${a}`,source:"cls fallback",toJSON:c=>jo(a,c)})}}}).command("flow [code]","\u8D44\u91D1\u6D41\u5411",e=>e.positional("code",{type:"string"}).strictCommands(!1).command("market","\u5317\u5411/\u5357\u5411\u8D44\u91D1",o=>o,async()=>{let o=await re();u({data:o,command:"quote flow market",source:"glh",toJSON:de})}).command("history <code>","\u5386\u53F2\u8D44\u91D1\u6D41",o=>o.option("count",{alias:"c",type:"number",default:20}),async o=>{let{c:a=20}=o,s=o.code,i=await eo(s,{count:a});u({data:i,command:`quote flow history ${s}`,source:"xq",toJSON:vo})}).command("margin <code>","\u878D\u8D44\u878D\u5238",o=>o,async o=>{let a=o.code,s=await to(a);u({data:s,command:`quote flow margin ${a}`,source:"xq",toJSON:Ir})}).command("intraday <code>","\u5F53\u65E5\u8D44\u91D1\u6D41\u5411\uFF08xueqiu\uFF09",o=>o,async o=>{let a=o.code,i=await yt(a);u({data:i,command:`quote flow intraday ${a}`,source:"xq",toJSON:vo})}).command("xq <code>","\u96EA\u7403\u8D44\u91D1\u6D41",o=>o,async o=>{let a=o.code,i=await yt(a);u({data:i,command:`quote flow xq ${a}`,source:"xq",toJSON:Yr})}),async e=>{let{code:o}=e;if(o){let a=await Lt(o);u({data:a,command:`quote flow ${o}`,source:"cls",toJSON:Rr})}else{let a=await re();u({data:a,command:"quote flow market",source:"glh",toJSON:de})}}).command("f10 [code]","\u57FA\u672C\u9762\uFF08\u9ED8\u8BA4\u4E3B\u8981\u6307\u6807\uFF09",e=>e.positional("code",{type:"string"}).strictCommands(!1).command("holders <code>","\u5341\u5927\u80A1\u4E1C",o=>o,async o=>{let a=o.code,s=await Qn(a);u({data:s,command:`quote f10 holders ${a}`,source:"xq",toJSON:Fr})}).command("bonus <code>","\u5206\u7EA2\u9001\u80A1",o=>o,async o=>{let a=o.code,s=await Zn(a);u({data:s,command:`quote f10 bonus ${a}`,source:"xq",toJSON:Hr})}).command("indicator <code>","\u4E3B\u8981\u6307\u6807",o=>o,async o=>{let a=o.code,s=await ft(a);u({data:s,command:`quote f10 indicator ${a}`,source:"xq",toJSON:qo})}),async e=>{let o=e.code;if(!o)return u({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote f10 sh600519"},command:"quote f10",source:"xq"});let a=await ft(o);u({data:a,command:`quote f10 indicator ${o}`,source:"xq",toJSON:qo})}).command("auction <codes...>","\u96C6\u5408\u7ADE\u4EF7\u5FEB\u7167\uFF08\u7ADE\u4EF7\u4EF7\u683C/\u91CF\u6BD4/\u672A\u5339\u914D\u91CF\uFF0C\u6276\u6447\u5B98\u65B9\uFF09",e=>e.positional("codes",{type:"string",array:!0,describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 600519 000001"}).option("live",{type:"boolean",default:!1,describe:"\u5B9E\u65F6\u9636\u6BB5\uFF08\u9ED8\u8BA4\u7EC8\u6001 final\uFF09"}),async e=>{let o=e.codes,a=e.live?"live":"final",s=await _o(o,a),i=s?.item||[];u({data:s,command:`quote auction ${o.join(" ")}`,source:"fuyao",toJSON:()=>({phase:s?.auction_phase||"",dataStatus:s?.data_status||"",items:i.map(r=>({code:r.thscode||"",name:r.name||"",price:r.auction_price??null,changePercent:X(r.auction_pct),volume:r.auction_volume??null,amount:r.auction_amount??null,unmatched:r.auction_unmatched??null,turnoverRate:X(r.auction_turnover_pct),volumeRatio:r.auction_volume_ratio??null,preClose:r.pre_close_price??null,floatMarketCap:r.float_market_cap??null})),total:s?.total??i.length})})}).command("announcement <code>","\u4E2A\u80A1\u516C\u544A\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u6700\u65B0\u516C\u544A\u5217\u8868",e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 sh600176"}).option("page",{alias:"p",type:"number",default:1,describe:"\u9875\u7801"}),async e=>{let o=e.code,a=e.p??1,s=await Bt(o,{page:a});u({data:s,command:`quote announcement ${o}`,source:"cls",toJSON:Lr})}).command("interaction <code>","\u4E92\u52A8\u6613\u95EE\u7B54\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u6295\u8D44\u8005\u63D0\u95EE\u4E0E\u516C\u53F8\u56DE\u590D",e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 sh600176"}).option("page",{alias:"p",type:"number",default:1,describe:"\u9875\u7801"}).option("size",{alias:"s",type:"number",default:15,describe:"\u6BCF\u9875\u6761\u6570"}).option("keyword",{alias:"k",type:"string",default:"",describe:"\u5173\u952E\u8BCD\u7B5B\u9009"}),async e=>{let o=e.code,a=e.p??1,s=e.s??15,i=e.k??"",r=await Ut(o,{page:a,pageSize:s,keyWord:i});u({data:r,command:`quote interaction ${o}`,source:"cls",toJSON:Mr})}).command("finance [code]","\u8D22\u52A1\u62A5\u8868",e=>e.positional("code",{type:"string"}).option("type",{alias:"t",type:"string",choices:["indicator","cashflow","income","balance"],default:"indicator"}).option("src",{type:"string",choices:["xq","fuyao"],default:"xq",describe:"\u6570\u636E\u6E90\uFF1Bfuyao \u4E3A\u5B98\u65B9\u591A\u671F\u5E8F\u5217\uFF08--period annual|quarterly\uFF0C\u652F\u6301 --limit/--start/--end \u65E5\u671F YYYY-MM-DD\uFF09"}).option("period",{type:"string",choices:["annual","quarterly"],default:"annual",describe:"fuyao \u62A5\u544A\u671F\u7C7B\u578B"}).option("limit",{type:"number",default:4,describe:"fuyao \u6700\u8FD1 N \u671F\uFF081..20\uFF09"}).option("start",{type:"string",describe:"fuyao \u533A\u95F4\u8D77\u59CB\u65E5 YYYY-MM-DD\uFF08\u4E0E --end \u540C\u4F20\uFF09"}).option("end",{type:"string",describe:"fuyao \u533A\u95F4\u622A\u6B62\u65E5 YYYY-MM-DD"}),async e=>{let{t:o="indicator",src:a="xq"}=e,s=e.code;if(a==="fuyao"){let{period:i="annual",limit:r=4}=e,{start:c,end:l}=e,m=c&&l?{period:i,start:Date.parse(`${c}T00:00:00+08:00`),end:Date.parse(`${l}T00:00:00+08:00`)}:{period:i,limit:r},d=o==="income"?On:o==="balance"?jn:o==="cashflow"?Tn:null;if(!d)return u({data:{error:"\u6276\u6447\u6E90\u7684\u8D22\u52A1\u6307\u6807\u8BF7\u7528: finflow quote indicators <code> <report>\uFF08report \u5982 2025-4\uFF09"},command:`quote finance ${o} ${s} --src fuyao`,source:"fuyao"});let p=await d(s,m);u({data:p,command:`quote finance ${o} ${s} --src fuyao --period ${i}`,source:"fuyao",toJSON:f=>({code:w(s),type:o,period:i,items:(f?.item||[]).map(g=>({fiscalYear:g.fiscal_year??null,fiscalPeriod:g.fiscal_period||"",reportDate:g.report_date_ms?new Date(g.report_date_ms).toISOString():null,periodEnd:g.period_end_ms?new Date(g.period_end_ms).toISOString():null,...Object.fromEntries(Object.entries(g).filter(([h])=>!h.endsWith("_ms")&&!["thscode","ticker","period","fiscal_year","fiscal_period","currency"].includes(h)))})),total:f?.item?.length??0})});return}if(o==="indicator"){let i=await zn(s);u({data:i,command:`quote finance indicator ${s}`,source:"xq",toJSON:Br})}else{let r={cashflow:Gn,income:Wn,balance:Xn}[o];if(!r)return u({data:{error:`\u672A\u77E5\u7C7B\u578B: ${o}\uFF0C\u53EF\u9009 indicator/cashflow/income/balance`},command:`quote finance ${o}`,source:"xq"});let c=await r(s);u({data:c,command:`quote finance ${o} ${s}`,source:"xq",toJSON:l=>Ur(l,o)})}}).command("valuation <codes...>","\u4F30\u503C\u5FEB\u7167\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1APE_TTM/PE_MRQ/PB/PS/PCF\uFF0C\u6279\u91CF \u2264100 \u53EA",e=>e.positional("codes",{type:"string",array:!0,describe:"A\u80A1\u4EE3\u7801\uFF0C\u5982 600519 000651.SZ"}),async e=>{let o=e.codes;if(o.length>100)throw new Error("\u4F30\u503C\u5FEB\u7167\u5355\u6B21\u6700\u591A 100 \u53EA");let a=await qn(o);u({data:a,command:`quote valuation ${o.join(" ")}`,source:"fuyao",toJSON:s=>({items:(s?.item||[]).map(i=>({code:i.thscode||"",name:i.name??null,peTtm:X(i.pe_ttm),peMrq:X(i.pe_mrq),pb:X(i.pb_mrq),ps:X(i.ps_ttm),pcf:X(i.pcf_ttm)})),total:s?.total??s?.item?.length??0})})}).command("indicators <code> [report]","\u8D22\u52A1\u6307\u6807\uFF08\u6276\u6447\u5B98\u65B9\uFF0C\u4E94\u7EF4\uFF09\uFF1A\u6210\u957F/\u76C8\u5229/\u507F\u503A/\u8425\u8FD0/\u73B0\u91D1\u6D41\uFF1Breport \u5982 2025-4\uFF08\u9ED8\u8BA4\u6700\u8FD1\u5E74\u62A5\uFF09",e=>e.positional("code",{type:"string",describe:"A\u80A1\u4EE3\u7801\uFF0C\u5982 600519"}).positional("report",{type:"string",describe:"\u62A5\u544A\u671F yyyy-1|2|3|4\uFF081 \u4E00\u5B63\u62A5 / 4 \u5E74\u62A5\uFF09\uFF0C\u9ED8\u8BA4 <\u4ECA\u5E74>-4"}),async e=>{let o=e.code,a=`${new Date().getFullYear()-1}-4`,s=e.report||a,i=await vn(o,s),r={growth:"\u6210\u957F",profitability:"\u76C8\u5229",solvency:"\u507F\u503A",operation:"\u8425\u8FD0","cash-flow":"\u73B0\u91D1\u6D41"};u({data:i,command:`quote indicators ${o} ${s}`,source:"fuyao",toJSON:c=>({code:c?.thscode||w(o),report:s,abilities:(c?.abilities||[]).map(l=>({ability:r[l.ability]||l.ability,indicators:(l.indicators||[]).map(m=>({id:m.index_id,value:m.value}))}))})})}).command("adjust <code>","\u590D\u6743\u56E0\u5B50\u4E8B\u4EF6\u6D41\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1A\u6BCF\u80A1\u5206\u7EA2/\u9001\u8F6C\uFF0C\u6309\u9664\u6743\u65E5\u964D\u5E8F",e=>e.positional("code",{type:"string",describe:"A\u80A1\u4EE3\u7801\uFF0C\u5982 600519"}).option("from",{type:"string",describe:"\u8D77\u59CB\u65E5 YYYY-MM-DD"}).option("to",{type:"string",describe:"\u622A\u6B62\u65E5 YYYY-MM-DD"}),async e=>{let o=e.code,{from:a,to:s}=e,i=await An(o,{from:a,to:s});u({data:i,command:`quote adjust ${o}`,source:"fuyao",toJSON:r=>({code:r?.thscode||w(o),items:(r?.item||[]).map(c=>({exDate:c.ex_date_ms?new Date(c.ex_date_ms).toISOString().slice(0,10):null,dividendPerShare:c.dividend_per_share??null,perShareBonus:c.per_share_bonus??null})),total:r?.item?.length??0})})}),handler:async t=>{let e=t.codes||[];if(!e.length)return u({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote sh600519 / finflow quote AAPL\uFF08\u591A\u53EA\u7528\u7A7A\u683C\u5206\u9694\u5373\u6279\u91CF\uFF09"},command:"quote",source:"cls"});let o=["search","related","industry","industry-profile","board","kline","depth","ticks","timeline","sector","flow","f10","finance","valuation","indicators","adjust"];if(e.length===1&&o.includes(e[0]))return u({data:{error:`\u8BF7\u63D0\u4F9B\u5B50\u547D\u4EE4\u53C2\u6570\uFF0C\u4F8B\u5982: finflow quote ${e[0]} <code>`},command:`quote ${e[0]}`,source:"cls"});if(e.every(r=>_t(r))){if(!W())throw new Error("\u540C\u82B1\u987A\u6307\u6570(88xxxx.TI)\u884C\u60C5\u6765\u81EA\u6276\u6447\u5B98\u65B9\u6E90\uFF0C\u8BF7\u5148\u8FD0\u884C finflow key set fuyao <sk-fuyao-\u2026>");let r=await _n(e),c=r?.item||[];u({data:r,command:`quote ${e.join(" ")}`,source:"fuyao",toJSON:()=>({items:c.map(l=>bt(l,"fuyao")),total:c.length})});return}if(e.length>1){let r=[];try{r=await Jo(e)}catch{r=[]}if(r.length){u({data:r,command:`quote ${e.join(" ")}`,source:"xq",toJSON:()=>Or(r)});return}if(W()&&e.every(ht)){let c=await ue(e),l=c?.item||[];u({data:c,command:`quote ${e.join(" ")}`,source:"fuyao fallback",toJSON:()=>({items:l.map(bt),total:l.length})});return}throw new Error(`\u96EA\u7403\u65E0\u6CD5\u83B7\u53D6 ${e.join(" ")} \u7684\u6279\u91CF\u884C\u60C5${W()?"":"\uFF08\u914D\u7F6E\u6276\u6447 key \u53EF\u542F\u7528 A \u80A1\u515C\u5E95\uFF1Afinflow key set fuyao\uFF09"}`)}let a=e[0];try{let r=await Rt(a);if(jr(r)){u({data:r,command:`quote ${a}`,source:"cls",toJSON:Ar});return}}catch{}let s=null;try{s=await $r(a)}catch{}if(Tr(s)){u({data:s,command:`quote ${a}`,source:"xq fallback",toJSON:r=>({code:r.symbol||"",name:r.name||"",price:r.current??0,change:r.chg??0,changePercent:Math.round((r.percent??0)*100)/100,open:r.open??0,high:r.high??0,low:r.low??0,preclose:r.last_close??0,volume:r.volume??0,amount:r.amount??0,turnoverRate:r.turnover_rate??0,amplitude:r.amplitude??0,avgPrice:r.avg_price??0,volumeRatio:r.volume_ratio??0,pe:r.pe_ttm??null,pb:r.pb??null,marketCap:r.market_capital??0,change3d:null,change5d:null,status:r.status===1?"trading":"closed",source:"xq fallback"})});return}if(W()&&ht(a))try{let c=(await ue([a]))?.item?.[0];if(c&&c.last_price!=null){u({data:c,command:`quote ${a}`,source:"fuyao fallback",toJSON:bt});return}}catch{}let i=vr(a);if(i){let r=await gt(i);if(r){u({data:r,command:`quote ${a}`,source:"yahoo fallback",toJSON:Cr});return}}if(s){u({data:s,command:`quote ${a}`,source:"xq fallback",toJSON:r=>({code:r.symbol||"",name:r.name||"",price:r.current??0,change:r.chg??0,changePercent:Math.round((r.percent??0)*100)/100,open:r.open??0,high:r.high??0,low:r.low??0,preclose:r.last_close??0,volume:r.volume??0,amount:r.amount??0,turnoverRate:r.turnover_rate??0,amplitude:r.amplitude??0,avgPrice:r.avg_price??0,volumeRatio:r.volume_ratio??0,pe:r.pe_ttm??null,pb:r.pb??null,marketCap:r.market_capital??0,change3d:null,change5d:null,status:r.status===1?"trading":"closed",source:"xq fallback"})});return}throw new Error(`cls\u3001xq \u548C Yahoo \u5747\u65E0\u6CD5\u83B7\u53D6 ${a} \u7684\u884C\u60C5\u6570\u636E`)}})}function zr(n){let t=n?.data||{},e=t.limit_up_board||{},o=t.up_down_dis||{};return{marketDegree:Number(t.market_degree)||0,limitUp:Number(t.up_ratio_num||0),limitOpen:Number(t.up_open_num||0),sealRate:parseFloat(t.up_ratio)||0,turnover:t.shsz_balance||"",turnoverChange:t.shsz_balance_change_px||"",limitUpBoard:e.row2?{total:e.row2[0]||0,first:e.row2[1]||0,second:e.row2[2]||0,third:e.row2[3]||0,promoteRate:e.row3?{first:e.row3[1]||"",second:e.row3[2]||"",third:e.row3[3]||""}:{}}:null,prevPerformance:t.performance||"",gapUpRate:t.up_open_ratio||"",profitRate:t.profit_ratio||"",distribution:o.status?{limitUp:Number(o.up_num||0),limitDown:Number(o.down_num||0),rise:Number(o.rise_num||0),fall:Number(o.fall_num||0),flat:Number(o.flat_num||0),suspend:Number(o.suspend_num||0)}:null,source:"cls"}}function Ro(n){let t=n.result||[],e=t.filter(a=>a.category==="\u6307\u6570"),o=t.filter(a=>a.category==="\u6CAA\u6E2F\u6DF1\u901A");return{indices:e.map(a=>({name:a.name,value:Number(a.value||0),change:Number(a.change||0),changePercent:Math.round(Number(a.netChange||0)*1e4)/100})),capitalFlow:o.map(a=>({name:a.name,shanghai:a.sh??null,shenzhen:a.sz??null})),source:"glh"}}function Gr(n){let t=n.result||[];return{items:t.map(e=>({name:e.stockName||"",code:(e.stockType||"")+(e.stockCode||""),price:e.currentPrice??null,changePercent:e.netChange!=null?Math.round(Number(e.netChange)*1e4)/100:null})),total:t.length}}function Wr(n){let t=(n?.data?.items||[]).map(e=>({code:e.symbol||"",name:e.name||"",close:e.close??null,changePercent:Math.round((e.percent??0)*100)/100,volume:e.volume??null,amount:e.amount??null,reasons:e.type_name||[]}));return{items:t,total:n?.data?.items_size??t.length}}function wt(n){return Date.parse(`${n}T00:00:00+08:00`)}var Y=n=>n==null?null:Math.round(n*100)/100;function Xr(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:Y(e.price_change_ratio_pct),limitUpTime:e.limit_up_time||"",reason:e.limit_up_reason??null,continueDays:e.continue_day_cnt??null,continueText:e.continue_day_text||"",sealMoney:e.seal_money??null,maxSealMoney:e.max_seal_money??null,isSt:!!e.is_st,isNew:!!e.is_new})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}function Qr(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:Y(e.price_change_ratio_pct),firstLimitTime:e.first_limit_time||"",lastLimitTime:e.last_limit_time||"",turnoverRate:Y(e.turnover_ratio_pct)})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}function Vr(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:Y(e.price_change_ratio_pct),openTimes:e.open_times??null,turnoverRate:Y(e.turnover_ratio_pct),amount:e.turnover??null})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}var Zr=[["two_board","2\u677F"],["three_board","3\u677F"],["four_board","4\u677F"],["five_board","5\u677F"],["six_board","6\u677F"],["seven_over","7\u677F+"]];function es(n){let t=n?.item||[];return{windowDays:n?.window?.length??null,items:t.map(e=>({date:(e.date||"").replace(/^(\d{4})(\d{2})(\d{2})$/,"$1-$2-$3"),boards:Object.fromEntries(Zr.map(([o,a])=>[a,(e.boards?.[o]||[]).map(s=>({code:s.thscode||"",name:s.name||"",boardNum:s.board_num??null,sealNextday:s.seal_nextday??null}))]))})),total:t.length}}function Io(n){let t=n?.item||[];return{items:t.map(e=>({rank:e.rank??null,code:e.thscode||"",name:e.name||"",heat:e.heat??null,rankChange:e.rank_change??null,rankTrend:e.rank_trend||""})),total:t.length}}function ts(n){let t=n?.item||[];return{date:n?.date||"",items:t.map(e=>({rank:e.rank??null,code:e.thscode||"",name:e.name||""})),total:t.length}}function ns(n){let t=n?.item||[];return{items:t.map(e=>({date:e.date||"",rank:e.rank??null})),total:t.length}}function os(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.stock_name||"",tag:e.tag_name||"",analysis:e.analysis_content||"",keywords:e.keyword_list||[]})),total:t.length}}function as(n){let t=n?.stock_items||[],e=n?.hot_money_items||[];return{tradeDate:n?.trade_date||"",boardType:n?.board_type||"all",items:t.map(o=>({code:o.thscode||"",name:o.name||"",changePercent:Y((o.change??0)*100),netBuy:o.net_value??null,netRate:Y((o.net_rate??0)*100),buy:o.buy_value??null,sell:o.sell_value??null,orgNetBuy:o.org_net_value??null,orgBuyNum:o.org_buy_num??null,orgSellNum:o.org_sell_num??null,hotRank:o.hot_rank??null,reason:o.limit_reason??null,rangeDays:o.range_days??null,concepts:(o.concept_list||[]).map(a=>a.name||"")})),hotMoneyItems:e.map(o=>({name:o.name||"",netBuy:o.buying??null,stocks:(o.rows||[]).map(a=>({code:a.thscode||"",name:a.name||"",changePercent:Y((a.change??0)*100)}))})),total:n?.stock_count??t.length}}function rs(n){let t=n?.item||[];return{date:n?.date||"",items:t.map(e=>({code:e.thscode||"",name:e.name||"",changePercent:Y(e.auction_pct),tags:e.tags||[]})),total:t.length}}function Lo(n){return n.command({command:"market",describe:"\u5E02\u573A\u603B\u89C8",builder:t=>t.strictCommands(!1).command("emotion","\u5E02\u573A\u60C5\u7EEA\uFF08cls\uFF09",e=>e,async()=>{let e=await Ft();u({data:e,command:"market emotion",source:"cls",toJSON:zr})}).command("index","\u5927\u76D8\u6307\u6570\uFF08glh\uFF09",e=>e,async()=>{let e=await Ve();u({data:e,command:"market index",source:"glh",toJSON:Ro})}).command("hk [sort]","\u6E2F\u80A1\u6392\u884C\uFF08glh\uFF0C\u9ED8\u8BA4\u964D\u5E8F\uFF09",e=>e.option("order",{alias:"o",type:"string",choices:["asc","desc"],default:"desc",describe:"\u6392\u5E8F\u65B9\u5411\uFF08\u9ED8\u8BA4 desc \u964D\u5E8F\uFF09"}),async e=>{let o=e.sort,a=e.order||"desc",s=ln(o),i=await un({sort:s.id,order:a});u({data:i,command:"market hk",source:"glh",toJSON:Gr})}).command("flow","\u6CAA\u6DF1\u6E2F\u901A\u8D44\u91D1\u6D41\u5411",e=>e,async()=>{let e=await re();u({data:e,command:"market flow",source:"glh",toJSON:de})}).command("rates","\u5168\u7403\u592E\u884C\u5229\u7387\uFF08jin10\uFF09",e=>e,async()=>{let e=await Qt(),o=e?.data?.list||[];u({data:e,command:"market rates",source:"jin10",toJSON:()=>({items:o.map(a=>({bank:a.bankName,rate:a.interestRate,date:a.publishTime}))})})}).command("longhu [date]","\u9F99\u864E\u699C\uFF08\u6276\u6447\u5B98\u65B9\uFF1A\u673A\u6784/\u6E38\u8D44\u62C6\u5206+\u4E70\u5356\u989D\uFF0C\u4E00\u5E74\u5185\u5386\u53F2\uFF1B\u65E0 key \u65F6\u8D70\u96EA\u7403\u5F53\u65E5\u699C\uFF09",e=>e.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF1B\u6276\u6447\u6E90\u9ED8\u8BA4\u6700\u8FD1\u4EA4\u6613\u65E5\uFF0C\u96EA\u7403\u6E90\u9ED8\u8BA4\u4ECA\u5929"}).option("board",{type:"string",default:"all",choices:["all","org","hot_money"],describe:"\u6276\u6447\u6E90\u699C\u5355\uFF1Aall \u5168\u90E8 / org \u673A\u6784\u699C / hot_money \u6E38\u8D44\u699C"}),async e=>{let o=e.date||void 0,a=e.board||"all";if(ce()){let l=await bo({boardType:a,date:o});u({data:l,command:`market longhu${o?` ${o}`:""}`,source:"fuyao",toJSON:as});return}let s=o||O(),i=s.split("-").map(Number),r=Date.UTC(i[0],(i[1]||1)-1,i[2]||1)-480*60*1e3;if(!Number.isFinite(r))throw new Error(`\u65E0\u6548\u65E5\u671F: ${s}\uFF08\u683C\u5F0F YYYY-MM-DD\uFF09`);let c=await Kn(r);if(c?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${c.error_description||c.error_code}`);u({data:c,command:`market longhu ${s}`,source:"xq",toJSON:Wr})}).command("limitup [date]","\u6DA8\u505C\u6C60\uFF08\u8FDE\u677F\u6570/\u5C01\u5355\u989D/\u5B98\u65B9\u6DA8\u505C\u539F\u56E0\uFF0C\u9ED8\u8BA4\u6309\u8FDE\u677F\u6570\u964D\u5E8F\uFF09",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}).option("n",{type:"number",default:50,describe:"\u6761\u6570\uFF08\u2264200\uFF1Btotal \u5B57\u6BB5\u4E3A\u6C60\u5B50\u603B\u6570\uFF09"}).option("sort",{type:"string",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF1Alast_price/continue_day_cnt/seal_money/limit_up_time"}).option("dir",{type:"string",default:"desc",describe:"asc / desc"}),async e=>{let o=Math.min(Number(e.n)||50,200),a=e.date||void 0,s=await io({dateMs:a?wt(a):void 0,size:o,sortField:e.sort||"continue_day_cnt",sortDir:e.dir||"desc"});u({data:s,command:`market limitup${a?` ${a}`:""}`,source:"fuyao",toJSON:Xr})}).command("limitdown [date]","\u8DCC\u505C\u6C60",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}).option("n",{type:"number",default:50,describe:"\u6761\u6570\uFF08\u2264200\uFF09"}).option("sort",{type:"string",describe:"\u6392\u5E8F\uFF1Alast_limit_time/first_limit_time/last_price/price_change_ratio_pct/turnover_ratio_pct"}).option("dir",{type:"string",default:"desc"}),async e=>{let o=Math.min(Number(e.n)||50,200),a=e.date||void 0,s=await co({dateMs:a?wt(a):void 0,size:o,sortField:e.sort||void 0,sortDir:e.dir||void 0});u({data:s,command:`market limitdown${a?` ${a}`:""}`,source:"fuyao",toJSON:Qr})}).command("limitbreak [date]","\u70B8\u677F\u6C60\uFF08\u6DA8\u505C\u5F00\u677F\uFF09",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}).option("n",{type:"number",default:50,describe:"\u6761\u6570\uFF08\u2264200\uFF09"}).option("sort",{type:"string",describe:"\u6392\u5E8F\uFF1Aprice_change_ratio_pct/open_times/last_price/turnover_ratio_pct/turnover"}).option("dir",{type:"string",default:"desc"}),async e=>{let o=Math.min(Number(e.n)||50,200),a=e.date||void 0,s=await uo({dateMs:a?wt(a):void 0,size:o,sortField:e.sort||void 0,sortDir:e.dir||void 0});u({data:s,command:`market limitbreak${a?` ${a}`:""}`,source:"fuyao",toJSON:Vr})}).command("ladder","\u8FDE\u677F\u5929\u68AF\uFF08\u8FD1 30 \u4E2A\u4EA4\u6613\u65E5\u8FDE\u677F\u68AF\u961F\u77E9\u9635\uFF0C\u6276\u6447\uFF09",e=>e,async()=>{let e=await lo();u({data:e,command:"market ladder",source:"fuyao",toJSON:es})}).command("hot [date]","\u70ED\u80A1\u699C Top30\uFF08date \u4E3A\u5386\u53F2\u81EA\u7136\u65E5\uFF1B--hour \u5C0F\u65F6\u7EA7\uFF0C\u6276\u6447\uFF09",e=>e.positional("date",{type:"string",describe:"\u5386\u53F2\u81EA\u7136\u65E5 YYYY-MM-DD\uFF08\u4E00\u5E74\u5185\uFF09\uFF1B\u7701\u7565=\u5F53\u524D\u699C\u5355"}).option("hour",{type:"boolean",default:!1,describe:"\u5C0F\u65F6\u7EA7\u699C\u5355"}),async e=>{let o=e.date,a=o?await fo(o):await po(e.hour?"hour":"day");u({data:a,command:`market hot${o?` ${o}`:""}`,source:"fuyao",toJSON:o?ts:Io})}).command("skyrocket","\u4EBA\u6C14\u98D9\u5347\u699C Top30\uFF08--hour \u5C0F\u65F6\u7EA7\uFF0C\u6276\u6447\uFF09",e=>e.option("hour",{type:"boolean",default:!1,describe:"\u5C0F\u65F6\u7EA7\u699C\u5355"}),async e=>{let o=await mo(e.hour?"hour":"day");u({data:o,command:"market skyrocket",source:"fuyao",toJSON:Io})}).command("hot-trend <code>","\u4E2A\u80A1\u70ED\u699C\u6392\u540D\u8D70\u52BF\uFF08\u9ED8\u8BA4\u8FD1 30 \u5929\uFF0C\u6276\u6447\uFF09",e=>e.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 600519 / 300034.SZ"}).option("days",{type:"number",default:30,describe:"\u56DE\u770B\u5929\u6570\uFF08\u2264365\uFF09"}),async e=>{let o=e.code,a=Math.min(Math.max(Number(e.days)||30,1),365),s=new Date,i=new Date(s.getTime()-a*864e5),r=l=>l.toISOString().slice(0,10),c=await yo(o,r(i),r(s));u({data:c,command:`market hot-trend ${o}`,source:"fuyao",toJSON:ns})}).command("anomaly [targets...]","\u5F53\u65E5\u4E2A\u80A1\u5F02\u52A8\u539F\u56E0\uFF08\u5B98\u65B9\u89E3\u8BFB\uFF1B\u4F20\u80A1\u7968\u4EE3\u7801=\u6309\u80A1\u67E5\uFF0C\u4F20\u6807\u7B7E=\u6309\u7C7B\u8FC7\u6EE4\uFF0C\u6276\u6447\uFF09",e=>e.positional("targets",{type:"string",array:!0,describe:"\u80A1\u7968\u4EE3\u7801\uFF08\u226450 \u53EA\uFF0C\u5982 600519 000001\uFF09\u6216\u5F02\u52A8\u6807\u7B7E LIMIT_UP/LIMIT_DOWN/SHARP_RISE/SHARP_FALL/RAPID_RALLY/RAPID_DECLINE\uFF08\u591A\u503C OR\uFF09"}),async e=>{let o=(e.targets||[]).filter(Boolean),s=o.length>0&&o.every(i=>/^((sh|sz|bj)?\d{6}|\d{6}\.(sh|sz|bj))$/i.test(i.trim()))?await ho(o):await go(o);u({data:s,command:`market anomaly${o.length?` ${o.join(" ")}`:""}`,source:"fuyao",toJSON:os})}).command("benchmark [date]","\u77ED\u7EBF\u98CE\u5411\u6807\u7ADE\u4EF7\u57FA\u51C6\uFF08\u9AD8\u5F00/\u653E\u91CF\u7B49\u6807\u7B7E\uFF0C\u6276\u6447\uFF09",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async e=>{let o=e.date||void 0,a=await wo(o);u({data:a,command:`market benchmark${o?` ${o}`:""}`,source:"fuyao",toJSON:rs})}),handler:async()=>{let t=await Ve();u({data:t,command:"market",source:"glh",toJSON:Ro})}})}function ss(n){let t=n?.data||[];return{items:t.map(e=>{let o=e.symbol_code||"",a=/^cls/i.test(o)?"plate":"stock";return{time:e.c_time?e.c_time.slice(11,16):"",code:o,name:e.symbol_name||"",kind:a,direction:e.float==="up"?"up":e.float==="down"?"down":"",articleId:e.article_id??null}}),total:t.length}}function Mo(n,t){return{type:t,items:n.map(e=>({code:e.secu_code||"",name:e.plate_name||e.secu_name||"",changePercent:Math.round((e.change||0)*100*100)/100})),total:n.length}}function Fo(n){return{items:n.map(t=>({code:t.secu_code||"",name:t.secu_name||"",changePercent:Math.round((t.change||0)*100*100)/100,topStocks:(t.up_stock||[]).slice(0,3).map(e=>({name:e.secu_name?.trim()||"",changePercent:Math.round((e.change||0)*100*100)/100}))})),total:n.length}}function Ho(n){let t=(n?.data?.stocks||[]).map(e=>({code:e.secu_code||"",name:e.secu_name||"",price:e.last_px??null,changePercent:Math.round((e.change??0)*1e4)/100,marketCap:e.cmc??null,fundflow:e.fundflow??null,isCore:!!e.is_core,reason:e.assoc_desc||""}));return{items:t,total:t.length}}var Bo={concept:"cn_concept",industry:"industry",region:"region",tszs:"tszs"},is={cn_concept:"\u6982\u5FF5",industry:"\u884C\u4E1A",region:"\u533A\u57DF",tszs:"\u7279\u8272"};function cs(n){return{items:n.map(t=>({code:t.code||"",name:t.name||"",type:t.type||""})),total:n.length}}function Uo(n){return{items:n.map(t=>({code:t.thscode||"",name:t.name||""})),total:n.length}}function Yo(n){return n.command({command:"sector [code]",describe:"\u677F\u5757\u5DE5\u4F5C\u6D41\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u5F02\u52A8 anchor / \u6392\u884C rank / \u4E2A\u80A1\u6240\u5C5E\u677F\u5757 plate / \u6210\u5206\u80A1 stocks",builder:t=>t.positional("code",{type:"string",describe:"\u677F\u5757\u7801(cls*)\u2192\u6210\u5206\u80A1 / \u80A1\u7968\u7801\u2192\u6240\u5C5E\u677F\u5757"}).strictCommands(!1).command("anchor [date]","\u76D8\u4E2D\u5F02\u52A8\u65F6\u95F4\u8F74\uFF1A\u5F53\u65E5\u62C9\u5347/\u8DF3\u6C34\u7684\u677F\u5757(cls*\u7801\u53EF\u4E0B\u94BB)\u4E0E\u4E2A\u80A1",e=>e.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async e=>{let o=e.date||O(),a=await Ht({date:o});u({data:a,command:`sector anchor ${o}`,source:"cls",toJSON:ss})}).command("rank","\u677F\u5757\u6DA8\u8DCC\u6392\u884C\uFF08\u4EC5\u5F53\u65E5\u70ED\u95E8\uFF0C\u7EA6 6~10 \u6761\uFF1B\u770B\u5168\u5929\u5F02\u52A8\u8FC7\u7A0B\u7528 sector anchor\uFF09",e=>e.option("type",{alias:"t",type:"string",default:"industry",describe:"industry(\u884C\u4E1A) / concept(\u6982\u5FF5)"}),async e=>{let{t:o="industry"}=e,a=await Ie({type:o}),s=Array.isArray(a?.data)?a.data:[];u({data:a,command:`sector rank -t ${o}`,source:"cls",toJSON:()=>Mo(s,o)})}).command("plate <code>","\u4E2A\u80A1\u6240\u5C5E\u677F\u5757\uFF08\u8FD4\u56DE plate code\uFF0C\u4F9B stocks \u4E0B\u94BB\uFF09",e=>e.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 sh600519"}),async e=>{let o=e.code,a=await He(o),s=Array.isArray(a?.data)?a.data:[];u({data:a,command:`sector plate ${o}`,source:"cls",toJSON:()=>Fo(s)})}).command("stocks <plate_code>","\u677F\u5757/\u6982\u5FF5\u6210\u5206\u80A1\uFF08cls \u677F\u5757\u7801\u6216 88xxxx.TI \u6307\u6570\u7801\u5747\u53EF\uFF09",e=>e.positional("plate_code",{type:"string",describe:"\u677F\u5757\u7801\uFF0C\u5982 cls80605 / 885431.TI / 886042"}).option("way",{type:"string",default:"change",describe:"\u6392\u5E8F\uFF1Achange(\u6DA8\u8DCC\u5E45)/last_px(\u4EF7)/amount"}),async e=>{let{way:o="change"}=e,a=e.plate_code;if(/^88\d{4}(\.TI)?$/i.test(a.trim())||/\.TI$/i.test(a.trim())){let i=await st(a),r=i?.item||[];u({data:i,command:`sector stocks ${a}`,source:"fuyao",toJSON:()=>Uo(r)});return}let s=await Be(a,{way:o});u({data:s,command:`sector stocks ${a}`,source:"cls",toJSON:Ho})}).command("search [name]","\u6309\u540D\u79F0\u641C\u677F\u5757\uFF08\u540C\u82B1\u987A\u6982\u5FF5/\u884C\u4E1A\u76EE\u5F55\uFF09\u2192 88xxxx.TI \u7801\uFF0C\u4F9B stocks \u4E0B\u94BB\u4E0E quote \u53D6\u6307\u6570\u884C\u60C5",e=>e.positional("name",{type:"string",describe:"\u677F\u5757\u540D\u79F0\u5173\u952E\u8BCD\uFF08\u5B50\u4E32\u5339\u914D\uFF09\uFF0C\u5982 \u4EBA\u5DE5\u667A\u80FD\uFF1B\u7701\u7565\u5219\u5217\u51FA\u76EE\u5F55"}).option("type",{alias:"t",type:"string",choices:["concept","industry","region","tszs"],describe:"\u76EE\u5F55\u7C7B\u578B\uFF1B\u7701\u7565\u65F6\u641C\u7D22\u9ED8\u8BA4\u67E5 \u6982\u5FF5+\u884C\u4E1A"}),async e=>{let{n:o=30}=e,a=String(e.name||"").trim(),s=e.type||e.t,i=s?[s]:a?["concept","industry"]:["concept"],r=await Promise.all(i.map(m=>Sn(Bo[m]))),c=new Set,l=[];r.forEach((m,d)=>{for(let p of m?.item||[]){let f=p.thscode||"";c.has(f)||(c.add(f),(!a||String(p.name||"").includes(a))&&l.push({code:f,name:p.name||"",type:is[Bo[i[d]]]||i[d]}))}}),u({data:{hits:l},command:`sector search${a?` ${a}`:""}`,source:"fuyao",toJSON:()=>cs(l.slice(0,o))})}),handler:async t=>{let{code:e}=t;if(e)if(/^88\d{4}(\.TI)?$/i.test(e.trim())){let o=await st(e),a=o?.item||[];u({data:o,command:`sector ${e}`,source:"fuyao",toJSON:()=>Uo(a)})}else if(/^cls/i.test(e)){let o=await Be(e,{way:"change"});u({data:o,command:`sector ${e}`,source:"cls",toJSON:Ho})}else{let o=await He(e),a=Array.isArray(o?.data)?o.data:[];u({data:o,command:`sector ${e}`,source:"cls",toJSON:()=>Fo(a)})}else{let o=await Ie({type:"industry"}),a=Array.isArray(o?.data)?o.data:[];u({data:o,command:"sector",source:"cls",toJSON:()=>Mo(a,"industry")})}}})}import{inflateSync as us}from"zlib";var ls="wss://wss-flash-2.jin10.com/",je={DATA:0,HOLIDAY:1,EVENT:2,HOLIDAY_PAGE:3,A_SHARE:4,FIVE_STAR:5,QH_DATA:6,QH_HOLIDAY:7,QH_EVENT:8,US_DATA:9,US_HOLIDAY:10,US_EVENT:11,HK_DATA:12,HK_HOLIDAY:13,HK_EVENT:14},Te={LOGIN:4002,CACHE_DATA:2006,CALENDAR_DATA:2001,CALENDAR_EVENT:2003,CALENDAR_HOLIDAY:2004,CALENDAR_HOLIDAY_PAGE:2005},ne=class{buffer;dv;pos;constructor(t){this.buffer=t instanceof ArrayBuffer?t:t instanceof Uint8Array?t.buffer:new ArrayBuffer(2048),this.dv=new DataView(this.buffer),this.pos=0}w16L(t){this.dv.setInt16(this.pos,t,!0),this.pos+=2}wU16L(t){this.dv.setUint16(this.pos,t,!0),this.pos+=2}w32L(t){this.dv.setInt32(this.pos,t,!0),this.pos+=4}wU32L(t){this.dv.setUint32(this.pos,t,!0),this.pos+=4}wStrL(t){let e=Buffer.from(t,"utf-8");this.wU16L(e.length);for(let o=0;o<e.length;o++)this.dv.setUint8(this.pos++,e[o])}r16L(){let t=this.dv.getInt16(this.pos,!0);return this.pos+=2,t}rU16L(){let t=this.dv.getUint16(this.pos,!0);return this.pos+=2,t}rU32L(){let t=this.dv.getUint32(this.pos,!0);return this.pos+=4,t}rStrL(){let t=this.rU16L(),e=Buffer.from(this.buffer,this.pos,t).toString("utf-8");return this.pos+=t,e}toBuffer(){return this.buffer.slice(0,this.pos)}};function Ko(n,t){let e;n instanceof Uint8Array?e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength):e=new Uint8Array(n);let o=new Uint8Array(e.length),a=t.charCodeAt(0);for(let s=0;s<e.length;s++)o[s]=e[s]^t.charCodeAt((s+a)%t.length);return o.buffer}function ds(n,t){return Ko(n,t)}function ms(n){try{return us(Buffer.from(n,"base64")).toString("utf-8")}catch{return null}}var St=class{ws=null;encryptKey="";requestId=Math.floor(Math.random()*1e6);userId;loginType;userLevel;userAgent;timeout;_pending=new Map;constructor(t={}){this.userId=t.userId||"",this.loginType=t.loginType||"calendar",this.userLevel=t.userLevel||1,this.userAgent=t.userAgent||"chrome",this.timeout=t.timeout||5e3}connect(){return new Promise((t,e)=>{let o=setTimeout(()=>{this.ws?.close(),e(new Error("WebSocket \u8FDE\u63A5\u8D85\u65F6"))},this.timeout);this.ws=new WebSocket(ls),this.ws.binaryType="arraybuffer",this.ws.onmessage=a=>{let s=a.data;if(!this.encryptKey){let l=new ne(s);l.rU32L();let m=l.rU32L(),d=l.rU32L();this.encryptKey=`${d}.${m}`,this._sendLogin();return}let i=Ko(s,this.encryptKey),r=new ne(i),c=r.r16L();if(c===Te.LOGIN){clearTimeout(o),t();return}if(c===Te.CACHE_DATA){r.rU32L(),r.rStrL();let l=r.rU32L(),m=r.rStrL(),d=this._pending.get(l);if(d){this._pending.delete(l),clearTimeout(d.timer);try{let p=JSON.parse(m);if(p.data){let f=ms(p.data);d.resolve(f?JSON.parse(f):null)}else d.resolve(null)}catch(p){d.reject(p)}}}},this.ws.onerror=()=>{clearTimeout(o),e(new Error("WebSocket \u8FDE\u63A5\u5931\u8D25"))}})}_sendLogin(){let t=new ne;t.w16L(Te.LOGIN),t.w32L(parseInt(this.userId)||0),t.wStrL(""),t.wStrL(this.userAgent),t.w32L(this.userLevel),t.wStrL(this.loginType),this._send(t)}_send(t){let e=t.toBuffer(),o=this.encryptKey?ds(e,this.encryptKey):e;this.ws.send(o)}_request(t,e){return new Promise((o,a)=>{let s=this.requestId++,i=setTimeout(()=>{this._pending.delete(s),a(new Error("\u8BF7\u6C42\u8D85\u65F6"))},this.timeout);this._pending.set(s,{resolve:o,reject:a,timer:i});let r=new ne;r.w16L(Te.CACHE_DATA),r.wU32L(t),r.wStrL(e),r.wU32L(s),this._send(r)})}close(){this.ws?.close(),this.ws=null,this.encryptKey="",this._pending.clear()}getFuturesData(t){return this._request(je.QH_DATA,t)}getHKStockData(t){return this._request(je.HK_DATA,t)}getUSStockData(t){return this._request(je.US_DATA,t)}getAShareData(t={}){let e=[];return t.page&&e.push(`page=${t.page}`),t.limit!=null&&e.push(`limit=${t.limit}`),t.region&&e.push(`region=${t.region}`),t.star!=null&&e.push(`star=${t.star}`),t.determine!=null&&e.push(`determine=${t.determine}`),this._request(je.A_SHARE,e.join("&"))}};async function zo(n){let t=new St(n);return await t.connect(),t}async function kt(n,...t){let e=await zo();try{return await e[n](...t)}finally{e.close()}}function ve(n){return{items:n.map(t=>({time:t.pub_time||"",indicator:t.indicator_name||t.name||"",importance:t.star??0,previous:t.previous??null,consensus:t.consensus??null,actual:t.actual??null,country:t.country||""})),total:n.length}}function ps(n){let t=n?.data||[];return{items:t.map(e=>({time:e.event_time||"",country:e.country||"",importance:e.star??0,event:e.event_content||"",people:e.people||""})),total:t.length}}function fs(n){let t=n?.data?.data||n?.data,e=Array.isArray(t)?t:t?Object.values(t):[];return{items:e.map(o=>({date:(o.date||"").slice(5,16),market:o.exchange_name||"",name:o.name||"",note:o.rest_note||""})),total:e.length}}function ys(n){let t=n?.data||[];return{items:t.map(e=>({date:(e.date||"").slice(5,16),event:e.event||"",importance:e.star??0,stocks:(e.stocks||[]).map(o=>({name:o.name,code:o.code})),regions:(e.region||[]).map(o=>({name:o.name}))})),total:t.length}}function gs(n){let t=n?.data||[];return{items:t.map(e=>({time:e.public_time||"",country:e.country||"",event:e.eventcontent||""})),total:t.length}}function hs(n){let t=n?.data||[];return{items:t.map(e=>({time:e.holiday_time||"",country:e.country||"",market:e.market||"",name:e.holiday_name||"",description:e.description||""})),total:t.length}}function Go(n){return n.command({command:"calendar",describe:"\u5B8F\u89C2\u65E5\u5386",builder:t=>t.strictCommands(!1).command("trading","A\u80A1\u4EA4\u6613\u65E5\u5386\uFF08\u6276\u6447\u5B98\u65B9\uFF0C\u8FD1\u4E00\u5E74\u4EA4\u6613\u65E5\u5E8F\u5217\uFF09",e=>e,async()=>{let e=await Nn(),o=e?.item||[];u({data:e,command:"calendar trading",source:"fuyao",toJSON:()=>({items:o.map(a=>({date:/^\d{8}$/.test(a.date||"")?`${a.date.slice(0,4)}-${a.date.slice(4,6)}-${a.date.slice(6,8)}`:a.date})),total:o.length})})}).command("macro [date]","\u5168\u7403\u5B8F\u89C2\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let o=e.date||O(),a=G(),s=await Ge(o,"cj",a?{cookie:a}:void 0);u({data:s,command:`calendar macro ${o}`,source:"jin10",toJSON:i=>ve(i?.data||[])})}).command("event [date]","\u5B8F\u89C2\u5927\u4E8B\uFF08jin10\uFF09",e=>e,async e=>{let o=e.date||O(),a=G(),s=await en(o,"cj",a?{cookie:a}:void 0);u({data:s,command:"calendar event",source:"jin10",toJSON:ps})}).command("holiday [date]","\u5168\u7403\u5047\u671F\uFF08jin10\uFF09",e=>e,async e=>{let o=e.date||O(),a=G(),s=await tn(o,"cj",a?{cookie:a}:void 0);u({data:s,command:"calendar holiday",source:"jin10",toJSON:fs})}).command("ashare","A\u80A1\u5927\u4E8B\uFF08jin10\uFF09",e=>e,async()=>{let e=await kt("getAShareData",{page:1});u({data:e,command:"calendar ashare",source:"jin10",toJSON:ys})}).command("hk [date]","\u6E2F\u80A1\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let o=e.date||O(),a=await kt("getHKStockData",o);u({data:a,command:"calendar hk",source:"jin10",toJSON:s=>ve(Array.isArray(s)?s:[])})}).command("us [date]","\u7F8E\u80A1\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let o=e.date||O(),a=await kt("getUSStockData",o);u({data:a,command:"calendar us",source:"jin10",toJSON:s=>ve(Array.isArray(s)?s:[])})}).command("future-event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",e=>e,async e=>{let o=e.date||O(),a=await be(o);u({data:a,command:"calendar future-event",source:"jin10",toJSON:gs})}).command("future-holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",e=>e,async e=>{let o=e.date||O(),a=await _e(o);u({data:a,command:"calendar future-holiday",source:"jin10",toJSON:hs})}),handler:async()=>{let t=O(),e=G(),o=await Ge(t,"cj",e?{cookie:e}:void 0);u({data:o,command:`calendar macro ${t}`,source:"jin10",toJSON:a=>ve(a?.data||[])})}})}var qe={all:-1,oil:19,steel:20,coal:21,gas:22,metal:23,nonferrous:24,chemical:25,sugar:27,grain:28,pig:29,macro:30};function bs(n){let t=n?.data?.list||[];return{items:t.map(e=>({title:e.title||"",hot:!!e.hot,updatedAt:e.updated_at||""})),total:t.length}}function _s(n){return{groups:(n?.data?.list||[]).map(e=>({name:e.name||"",items:(e.data||[]).filter(o=>o.published===1).map(o=>({category:o.category||"",city:o.city||"",spot:o.spot_data??null,futures:o.futures_data??null,basis:o.jicha??null,basisRate:o.jicha_rate??null}))}))}}function ws(n){let t=n?.data||[];return{items:t.map(e=>({time:e.time_show||"",country:e.country||"",indicator:e.name||"",importance:e.star??0,previous:e.previous??null,consensus:e.consensus??null,actual:e.actual??null,unit:e.unit||"",impact:e.qh_affect_text||""})),total:t.length}}function Ss(n){let t=n?.data||[];return{items:t.map(e=>({time:mn(e.time),content:Ne(e.data?.content||e.data?.title||"",e),importance:e.important??0,source:e.data?.source||"",remark:se(e.remark)||""})),total:t.length}}function Wo(n){return n.command("future","\u671F\u8D27",t=>t.option("channel",{alias:"c",type:"string",default:"all",describe:`\u9891\u9053: ${Object.keys(qe).join("/")}`}).command("headline","\u671F\u8D27\u5934\u6761",{},async()=>{let e=await nn();u({data:e,command:"future headline",source:"jin10",toJSON:bs})}).command("basis [date]","\u671F\u73B0\u57FA\u5DEE",e=>e.positional("date",{type:"string"}).option("group",{alias:"g",type:"string",describe:"\u6309\u677F\u5757\u8FC7\u6EE4: \u9ED1\u8272\u7CFB/\u91D1\u5C5E/\u519C\u4EA7\u54C1/\u80FD\u6E90\u5316\u5DE5/\u91D1\u878D"}),async e=>{let o=e.date||O(),a=await an(o);u({data:a,command:"future basis",source:"jin10",toJSON:_s})}).command("calendar [date]","\u671F\u8D27\u65E5\u5386",e=>e.positional("date",{type:"string"}),async e=>{let o=e.date||O(),a=await on(o);u({data:a,command:"future calendar",source:"jin10",toJSON:ws})}).command("event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",e=>e.positional("date",{type:"string"}),async e=>{let o=e.date||O(),a=await be(o);u({data:a,command:`future event ${o}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(r=>({time:r.public_time,country:r.country,event:r.eventcontent}))})})}).command("holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",e=>e.positional("date",{type:"string"}),async e=>{let o=e.date||O(),a=await _e(o);u({data:a,command:`future holiday ${o}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(r=>({time:r.holiday_time,country:r.country,market:r.market,name:r.holiday_name,description:r.description}))})})}),async t=>{let{channel:e="all",n:o=10}=t,a=qe[e];a===void 0&&(console.error(`\u9519\u8BEF: \u4E0D\u652F\u6301\u7684\u9891\u9053 "${e}"\uFF0C\u53EF\u9009: ${Object.keys(qe).join(", ")}`),process.exit(1));let s=new Set,i=[],r=await We(a);for(let d of r?.data||[])s.has(d.id)||(s.add(d.id),i.push(d));let c=0,l=50;for(;i.length<o&&c++<l;){let d=i[i.length-1];if(!d)break;let f=(await We(a,{max_time:d.time}))?.data||[];if(!f.length)break;let g=0;for(let h of f)s.has(h.id)||(s.add(h.id),i.push(h),g++);if(g===0)break;i.length<o&&await new Promise(h=>setTimeout(h,200))}let m={...r,data:i};u({data:m,command:"future",source:"jin10",toJSON:Ss})})}var ks="wss://market-ws.jin10.com/",xs=["DCE","CZC","SHF","INE","CF","GFEX"];function Ns(n,t){if(t+2>n.length)return null;let e=n.readUInt16LE(t);return t+=2,t+e>n.length?null:{str:n.subarray(t,t+e).toString("utf8"),end:t+e}}function L(n,t){return Number(n.readBigInt64LE(t))}function As(n){if(n.length<2)return null;let t=2,e=Ns(n,t);if(!e)return null;let o=e.str;if(t=e.end,t+76>n.length)return null;let a=L(n,t)/1e6,s=L(n,t+8)/1e6;L(n,t+16);let i=L(n,t+24),r=L(n,t+32)/1e6,c=L(n,t+40)/1e6,l=L(n,t+48)/1e6,m=L(n,t+56)/1e6,d=L(n,t+64),p=n.readUInt32LE(t+72),f=o.split(".")[1],g=xs.includes(f),h=null,b=t+76;g&&b<n.length&&n[b]===1&&(h=L(n,b+1)/1e6);let $=h??m,C=a-$,K=$?C/$*100:0;return{code:o,snap:{code:o,close:a,prevClose:s,high:r,low:l,open:c,preclose:$,base:$,change:C,changePercent:K,openInterest:i,turnover:d,timestamp:p}}}function Xo(n,t={}){let e=t.freq??2e3,o=t.timeout??8e3;return new Promise((a,s)=>{if(!n.length)return a(new Map);let i=new Set(n),r=new Map,c=new WebSocket(ks);c.binaryType="arraybuffer";let l=setTimeout(()=>{try{c.close()}catch{}a(r)},o);c.onopen=()=>{let m=[],d=Buffer.alloc(8);d.writeUInt16LE(10003,0),d.writeUInt32LE(e,2),d.writeUInt16LE(Math.min(n.length,40),6),m.push(d);for(let p of n.slice(0,40)){let f=Buffer.from(p,"utf8"),g=Buffer.alloc(2);g.writeUInt16LE(f.length),m.push(g,f)}c.send(Buffer.concat(m))},c.onmessage=m=>{try{let d=Buffer.from(m.data);if(d.length<2)return;let p=d.readUInt16LE(0);if(p===1100)return;if(p===1200){c.send(Buffer.alloc(0));return}if(p!==10005)return;let f=As(d);if(!f)return;if(i.has(f.code)&&r.set(f.code,f.snap),r.size>=i.size){clearTimeout(l);try{c.close()}catch{}a(r)}}catch{}},c.onerror=()=>{clearTimeout(l),a(r)}})}import Os from"https";import{gunzipSync as js}from"zlib";var Ts="wss://tm-qtg.jiaoyixia.com",vs="https://jiaoyixia-market.jin10.com",At={"1m":{kind:"oss",code:1,sec:60,intraday:!0},"5m":{kind:"oss",code:2,sec:300,intraday:!0},"30m":{kind:"oss",code:3,sec:1800,intraday:!0},"60m":{kind:"oss",code:4,sec:3600,intraday:!0},d:{kind:"oss",code:5,sec:86400,intraday:!1},w:{kind:"oss",code:6,sec:604800,intraday:!1},m:{kind:"oss",code:7,sec:2592e3,intraday:!1},y:{kind:"oss",code:9,sec:31536e3,intraday:!1},"10m":{kind:"agg",from:"5m",factor:2,sec:600},"15m":{kind:"agg",from:"5m",factor:3,sec:900},"120m":{kind:"agg",from:"60m",factor:2,sec:7200}},Lc=Object.fromEntries(Object.entries(At).flatMap(([n,t])=>t.kind==="oss"?[[n,t.code]]:[])),qs=Object.keys(At).join("/");function $s(n,t){let e=[];for(let o of n){let a=Math.floor(Date.parse(o.date)/1e3);if(!Number.isFinite(a))continue;let s=Math.floor(a/t)*t,i=new Date(s*1e3).toISOString(),r=e[e.length-1];!r||r.date!==i?e.push({date:i,open:o.open,high:o.high,low:o.low,close:o.close,volume:o.volume}):(r.high=Math.max(r.high,o.high),r.low=Math.min(r.low,o.low),r.close=o.close,r.volume+=o.volume)}return e}function xt(n,t){let e=Buffer.alloc(n.length);for(let o=0;o<n.length;o++)e[o]=n[o]^t.charCodeAt(o%t.length);return e}var $e=class{buf=Buffer.alloc(4096);pos=0;wU16(t){return this.buf.writeUInt16LE(t,this.pos),this.pos+=2,this}wU8(t){return this.buf.writeUInt8(t,this.pos),this.pos+=1,this}wI8(t){return this.buf.writeInt8(t,this.pos),this.pos+=1,this}wU32(t){return this.buf.writeUInt32LE(t,this.pos),this.pos+=4,this}wI64(t){return this.buf.writeBigInt64LE(BigInt(t),this.pos),this.pos+=8,this}wStr(t){let e=Buffer.from(t,"utf8");return this.wU16(e.length),e.copy(this.buf,this.pos),this.pos+=e.length,this}toBuffer(){return this.buf.subarray(0,this.pos)}};function Cs(){return new $e().wU16(21100).wStr("").wI8(7).wU16(0).wU16(0).wU16(0).wU16(46860).wU32(0).wI8(122).wU32(0).wU32(0).toBuffer()}function Ps(n,t,e,o=8e3){return new Promise((a,s)=>{let i=new WebSocket(Ts);i.binaryType="arraybuffer";let r="",c=!1,l=(d,p)=>{if(!c){c=!0,clearTimeout(m);try{i.close()}catch{}d?s(d):a(p)}},m=setTimeout(()=>l(new Error("tm-qtg 10006 \u8D85\u65F6"),[]),o);i.onopen=()=>{let d=Buffer.alloc(6);d.writeInt16LE(912,0),d.writeInt32LE(3063,2),i.send(d)},i.onmessage=d=>{try{let p=Buffer.from(d.data);if(!r){if(p.length<4)return;r=p.readUInt32LE(0).toString(),i.send(xt(Cs(),r));return}if(p.length<2)return;let f=xt(p,r),g=f.readUInt16LE(0);if(g===21100){setTimeout(()=>{let h=new $e().wU16(10006).wStr(n).wU8(t).wI64(e).wU16(0).wU8(0);i.send(xt(h.toBuffer(),r))},400);return}if(g===10006){let h=f.toString("utf8"),b=/([0-9a-f]{32})\.(\d+)\.(\d+)\.(\d+)\.(\d+)/g,$=[],C;for(;C=b.exec(h);)$.push({hash:C[1],count:+C[2],start:+C[3],end:+C[4],idx:+C[5]});l(null,$)}}catch{}},i.onerror=()=>l(new Error("tm-qtg \u8FDE\u63A5\u5931\u8D25"),[])})}async function Nt(n,t,e){for(let o=0;o<3;o++)try{return await Ps(n,t,e)}catch{if(o===2)return[];await new Promise(s=>setTimeout(s,300))}return[]}function Qo(n,t,e){let o=`${vs}/${n}/${t}/${e}`;return new Promise(a=>{let s=()=>a([]);Os.get(o,r=>{if(r.statusCode&&r.statusCode>=300&&r.statusCode<400&&r.headers.location&&r.headers.location!==o)return r.resume(),a(Qo(n,t,e));if(!r.statusCode||r.statusCode>=400)return r.resume(),s();let c=[];r.on("data",l=>c.push(l)),r.on("end",()=>{try{let l=js(Buffer.concat(c)),m=Math.floor(l.length/48),d=[];for(let p=0;p<m;p++){let f=p*48;d.push({date:new Date(Number(l.readBigUInt64LE(f))*1e3).toISOString(),open:Number(l.readBigInt64LE(f+8))/1e6,high:Number(l.readBigInt64LE(f+16))/1e6,low:Number(l.readBigInt64LE(f+24))/1e6,close:Number(l.readBigInt64LE(f+32))/1e6,volume:Number(l.readBigInt64LE(f+40))})}a(d)}catch{s()}}),r.on("error",s)}).on("error",s)})}var Js=86400;async function Ot(n,t,e){let o=At[n];if(!o)throw new Error(`\u4E0D\u652F\u6301\u7684\u5468\u671F: ${n}\uFF08\u652F\u6301 ${qs}\uFF09`);let a=t;if(o.kind==="agg"){let s=await Ot(o.from,a,e*o.factor);return{candles:$s(s.candles,o.sec).slice(-e),source:s.source}}try{let i=[...o.intraday?await Ds(a,o.code):await Es(a,o.code)].sort((l,m)=>m.start-l.start),r=[],c=new Set;for(let l of i){if(r.length>=e)break;if(c.has(l.hash))continue;c.add(l.hash);let m=await Qo(a,o.code,l.hash);for(let d of m)r.some(p=>p.date===d.date)||r.push(d)}return r.sort((l,m)=>l.date<m.date?-1:1),{candles:r.slice(-e),source:"jin10 tm-qtg"}}catch{return{candles:[],source:"jin10 tm-qtg"}}}async function Ds(n,t){let e=Math.floor(Date.now()/1e3),o=[0,1,2,4,8,16,32,64,128,256,512,1024,2048];for(let a of o){let s=e-a*Js,i=await Nt(n,t,s);if(i.length)return i}return await Nt(n,t,0)}async function Es(n,t,e=12){let o=[],a=new Set,s=0;for(let i=0;i<e;i++){let r=await Nt(n,t,s);if(!r.length)break;let c=0;for(let m of r)a.has(m.hash)||(a.add(m.hash),o.push(m),c++);if(c===0)break;s=Math.max(...r.map(m=>m.end))}return o}var Rs=["i9888.DCE","SA888.CZC","rb888.SHF","cu888.SHF","au888.SHF","XAUUSD.GOODS","USOIL.GOODS","DXY.NYF","EURUSD.FXCM","USDCNH.FXCM","SPX.INDEX","HSI.INDEX"];function Is(n){return{code:n.code,price:n.close,change:n.change,changePercent:Math.round(n.changePercent*100)/100,open:n.open,high:n.high,low:n.low,preclose:n.preclose,openInterest:n.openInterest||null,turnover:n.turnover||null,timestamp:n.timestamp?new Date(n.timestamp*1e3).toISOString():""}}function Vo(n){return n.command("price [codes...]","\u5B9E\u65F6\u884C\u60C5\uFF1A\u56FD\u5185\u671F\u8D27\u4E3B\u529B / \u73B0\u8D27\u5546\u54C1 / \u5916\u6C47 / \u6307\u6570\uFF08market-ws\uFF09",t=>t.positional("codes",{type:"string",array:!0,describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE \u5F62\u5F0F\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE / DXY.NYF / SPX.INDEX\uFF09\uFF1B\u7701\u7565\u5219\u663E\u793A\u9ED8\u8BA4\u770B\u76D8\u5217\u8868"}).strictCommands(!1).command("kline [code]","K\u7EBF\u5386\u53F2\uFF08\u671F\u8D27/\u5546\u54C1/\u5916\u6C47/\u6307\u6570\uFF0Ctm-qtg + OSS\uFF09",e=>e.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF09"}).option("period",{alias:"p",type:"string",default:"d",describe:"\u5468\u671F: d/w/m/y \u6216 1m/5m/10m/15m/30m/60m/120m\uFF08\u4E5F\u63A5\u53D7 daily/weekly \u7B49\u5168\u8BCD\uFF09"}).option("number",{alias:"n",type:"number",default:120,describe:"K\u7EBF\u6839\u6570"}),async e=>{let o=e.code;if(!o)return u({data:{error:"\u8BF7\u63D0\u4F9B\u54C1\u79CD\u4EE3\u7801\uFF0C\u4F8B\u5982: price kline XAUUSD.GOODS"},command:"price kline",source:"jin10 tm-qtg"});let{p:a="d",n:s=120}=e,i;try{i=Oe(a)}catch(l){return u({data:{error:l.message},command:`price kline ${o} -p ${a}`,source:"finflow"})}let{candles:r,source:c}=await Ot(i,o,s);u({data:{code:o,period:i,items:r,total:r.length},command:`price kline ${o} -p ${i}`,source:c})}),async t=>{let e=t.codes||[],o=e.length?e.map(r=>r.trim()).filter(Boolean):Rs,a=await Xo(o),s=o.map(r=>a.get(r)).filter(r=>!!r).map(Is),i=o.filter(r=>!a.has(r));u({data:s,command:`price ${e.length?e.join(" "):"(\u9ED8\u8BA4\u770B\u76D8\u5217\u8868)"}`,source:"jin10 market-ws",toJSON:r=>({items:r,total:r.length,...i.length?{missing:i}:{}})})})}var Zo={fuyao:async()=>{let t=(await ue(["600519.SH"]))?.item?.[0];return t?{ok:!0,sample:{thscode:t.thscode,lastPrice:t.last_price,changePercent:Math.round((t.price_change_ratio_pct??0)*100)/100}}:{ok:!0,sample:null}}};function ea(n){let t=ie(n.id);return{source:n.id,name:n.name,describe:n.describe,envVar:n.env,configured:!!t,origin:t?.origin??null,key:t?rt(t.key):null,path:te(n.id)}}function Ce(n){let t=String(n.source||"").trim().toLowerCase(),e=at(t);if(!e)throw new Error(`\u672A\u77E5\u6570\u636E\u6E90 "${t}"\u3002\u5F53\u524D\u652F\u6301:${I.map(o=>o.id).join(", ")}`);return e.id}function ta(n){return n.command({command:"key",describe:"API key \u7BA1\u7406\uFF08\u591A\u6570\u636E\u6E90\u901A\u7528\uFF09\uFF1Aset / show / clear / test",builder:t=>t.strictCommands(!1).command("set <source> <key>","\u4FDD\u5B58\u6570\u636E\u6E90 API key \u5230 ~/.finflow/keys/<source>\uFF08chmod 600\uFF0C\u4E00\u6B21\u914D\u7F6E\u957F\u671F\u6709\u6548\uFF09",e=>e.positional("source",{type:"string",describe:`\u6570\u636E\u6E90\uFF1A${I.map(o=>o.id).join(" / ")}`}).positional("key",{type:"string",describe:"API key"}),async e=>{let o=Ce(e),a=String(e.key||"").trim();if(!a)throw new Error("\u7F3A\u5C11 key \u53C2\u6570\uFF1Afinflow key set <source> <key>");let s=yn(o,a);u({data:{saved:!0,source:o,path:s,key:rt(a)},command:`key set ${o}`,source:"finflow"})}).command("show [source]","\u67E5\u770B key\uFF08\u8131\u654F\uFF09\u53CA\u6765\u6E90\uFF1B\u7701\u7565 source \u67E5\u770B\u5168\u90E8",e=>e.positional("source",{type:"string",describe:"\u6570\u636E\u6E90\uFF1B\u7701\u7565=\u5168\u90E8"}),async e=>{let o=e.source?Ce(e):null,a=o?I.filter(s=>s.id===o):I;u({data:{items:a.map(ea),total:a.length},command:`key show${o?` ${o}`:""}`,source:"finflow"})}).command("clear <source>","\u5220\u9664\u672C\u5730\u4FDD\u5B58\u7684 key\uFF08\u73AF\u5883\u53D8\u91CF\u4E0D\u53D7\u5F71\u54CD\uFF09",e=>e.positional("source",{type:"string",describe:"\u6570\u636E\u6E90"}),async e=>{let o=Ce(e),a=gn(o);u({data:{cleared:a,source:o,path:te(o)},command:`key clear ${o}`,source:"finflow"})}).command("test [source]","\u8FDE\u901A\u6027\u81EA\u68C0\uFF1A\u7528\u5F53\u524D key \u5B9E\u8C03\u5404\u6E90\u8F7B\u91CF\u7AEF\u70B9\uFF1B\u7701\u7565 source \u68C0\u6D4B\u5168\u90E8\u5DF2\u914D\u7F6E\u6E90",e=>e.positional("source",{type:"string",describe:"\u6570\u636E\u6E90\uFF1B\u7701\u7565=\u5168\u90E8\u5DF2\u914D\u7F6E"}),async e=>{let o=e.source?Ce(e):null,a=(o?I.filter(i=>i.id===o):I).filter(i=>Zo[i.id]),s=await Promise.all(a.map(async i=>{let r=ie(i.id);if(!r)return{source:i.id,ok:!1,configured:!1,error:`\u672A\u914D\u7F6E key\uFF1A\u8FD0\u884C finflow key set ${i.id} <key> \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF ${i.env}`};try{let c=await Zo[i.id]();return{source:i.id,ok:!0,configured:!0,origin:r.origin,...c}}catch(c){return{source:i.id,ok:!1,configured:!0,origin:r.origin,error:c.message}}}));u({data:{items:s,total:s.length,allOk:s.every(i=>i.ok)},command:`key test${o?` ${o}`:""}`,source:"finflow"})}),handler:async()=>{u({data:{items:I.map(ea),total:I.length},command:"key",source:"finflow"})}})}function Ls(n){return/\.OF$/i.test(n.trim())?"otc":"exchange"}function q(n,t){return{fund_type:n||Ls(t),thscode:w(t)}}function jt(n,t){return y("/api/fund/profile/detail",q(t,n))}function na(n,t={}){return y("/api/fund/performance/nav",{...q(t.fundType,n),range:t.range,nav_type:t.navType})}function oa(n,t){return y("/api/fund/performance/returns",q(t,n))}function aa(n,t){return y("/api/fund/performance/drawdowns",q(t,n))}function ra(n,t){return y("/api/fund/portfolio/holdings",q(t,n))}function sa(n,t,e,o){return y("/api/fund/portfolio/stock-history",{...q(o,n),report_type:t,end_date:e})}function ia(n,t,e,o){return y("/api/fund/portfolio/bond-history",{...q(o,n),report_type:t,end_date:e})}function ca(n,t,e){return y("/api/fund/portfolio/stock-report-dates",{...q(e,n),report_type:t})}function ua(n,t){return y("/api/fund/portfolio/asset-allocation",q(t,n))}function la(n,t){return y("/api/fund/portfolio/industry-allocation",q(t,n))}function da(n,t,e){return y("/api/fund/holders/detail",{...q(e,n),merge_scope:t})}function ma(n,t,e){return y("/api/fund/holders/top",{...q(e,n),limit:t})}function pa(n){return y("/api/fund/managers/detail",{manager_id:n})}function fa(n){return y("/api/fund/managers/investment-style",{manager_id:n})}function ya(n,t){return y("/api/fund/managers/performance",{manager_id:n,range:t})}function ga(n){return y("/api/fund/managers/experience",{manager_id:n})}function ha(n){return y("/api/fund/companies/detail",{company_id:n})}function ba(n,t){return y("/api/fund/financials/indicators",q(t,n))}function _a(n,t){return y("/api/fund/financials/income-statements",q(t,n))}function wa(n,t){return y("/api/fund/financials/balance-sheets",q(t,n))}function Sa(n,t){return y("/api/fund/corporate-actions/dividends",q(t,n))}function ka(n,t){return y("/api/fund/diagnostics/detail",q(t,n))}function xa(n){return y("/api/fund/offerings/list",{subscribe:n})}function Na(n,t={}){return y("/api/fund/news/article-list",{...q(t.fundType,n),limit:t.limit,offset:t.offset})}function Aa(n){return y("/api/fund/market/snapshot",{thscode:w(n)})}function Oa(n,t,e){return y("/api/fund/market/historical",{thscode:w(n),interval:"1d",start:t,end:e})}function S(n){return typeof n=="number"?new Date(n).toISOString():null}var _=n=>n==null?null:Math.round(n*100)/100;function P(n){return t=>n(t.option("type",{type:"string",choices:["otc","exchange","reits"],describe:"\u57FA\u91D1\u7C7B\u578B\uFF08\u9ED8\u8BA4\u6309\u4EE3\u7801\u63A8\u65AD\uFF1A.OF\u2192otc\uFF0C\u5176\u4F59\u2192exchange\uFF1BREITs \u9700\u663E\u5F0F\u6307\u5B9A\uFF09"}))}function A(n){return n.type||void 0}function Fs(n){let t=n?.item?.[0]||{};return{code:t.thscode||"",name:t.fund_name||"",established:S(t.estab_date),manager:t.manager_name||null,managerInfo:(t.manager_info||[]).map(e=>({id:e.manager_id??e.id??null,name:e.manager_name??e.name??null,returnPct:_(e.return_pct??e.profit??null),start:S(e.start_date_ms??e.start_ms)??e.start_date??null,end:S(e.end_date_ms??e.end_ms)??e.end_date??null})),company:t.mgmt_name||null,companyId:t.company_id||null,scale:t.fund_scale??null,unitNav:t.unit_nav??null,tradeRule:t.trade_rule||[],rateInfo:t.rate_info||[]}}function Hs(n){let t=n?.item||[];return{items:t.map(e=>({date:S(e.nav_date)?.slice(0,10)??null,unitNav:e.unit_nav??null,adjNav:e.adj_nav??null})),total:t.length}}var ja=["week","month","tmonth","hyear","year","twoyear","tyear","fyear","nowyear","now"],Ta={week:"\u8FD11\u5468",month:"\u8FD11\u6708",tmonth:"\u8FD13\u6708",hyear:"\u8FD1\u534A\u5E74",year:"\u8FD11\u5E74",twoyear:"\u8FD12\u5E74",tyear:"\u8FD13\u5E74",fyear:"\u8FD15\u5E74",nowyear:"\u4ECA\u5E74\u6765",now:"\u6210\u7ACB\u6765"};function Bs(n){let t=n?.item?.[0]||{},e={};for(let o of ja){let a=t[`return_${o}`],s=t[`peer_average_${o}`],i=t[`rank_${o}`],r=t[`rank_total_${o}`];a===void 0&&s===void 0&&i===void 0||(e[Ta[o]]={returnPct:_(a??null),peerAveragePct:_(s??null),rank:i??null,rankTotal:r??null})}return{periods:e}}function Us(n){let t=n?.item?.[0]||{},e={};for(let o of ja)t[o]!==void 0&&(e[Ta[o]]=_(t[o]));return{code:t.thscode||"",maxDrawdownPct:e}}function Ys(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.stock_name||e.name||"",assetType:e.asset_type||"",holdRatio:_(e.hold_ratio??e.security_market_value_rate_pct)??null,marketValue:e.position_capital??e.market_value??null,rank:e.investment_rank??e.rank??null,reportDate:S(e.end_date_ms)?.slice(0,10)??null})),summary:{stockRatio:_(n?.total_stock_ratio_pct??n?.stock_ratio_pct)??null,bondRatio:_(n?.total_bond_ratio_pct)??null,fundRatio:_(n?.total_fund_ratio_pct)??null,turnoverRate:_(n?.turnover_rate_pct)??null,concentration:_(n?.concentration_ratio)??null,mainIndustry:n?.main_industry||null},total:t.length}}function Ks(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",assetType:e.asset_type||"",holdRatio:_(e.hold_ratio)??null,marketValue:e.market_value??null,periodChangePct:_(e.period_increase_pct)??null,rank:e.rank??null,reportDate:S(e.end_date_ms)?.slice(0,10)??null})),total:t.length}}function zs(n){let t=n?.item||[];return{items:t.map(e=>({reportType:e.report_type||"",name:e.report_type_name||"",start:S(e.start_date_ms)?.slice(0,10)??null,end:S(e.end_date_ms)?.slice(0,10)??null})),total:t.length}}function Gs(n){let t=n?.item||[];return{items:t.map(e=>({reportDate:S(e.report_date_ms)?.slice(0,10)??e.report_period??null,stock:_(e.stock_ratio_pct)??null,bond:_(e.bond_ratio_pct)??null,deposit:_(e.deposit_ratio_pct)??null,other:_(e.other_ratio_pct)??null})),total:t.length}}function Ws(n){let t=n?.item||[];return{items:t.map(e=>({reportPeriod:e.report_period||"",industry:e.industry_name||"",ratio:_(e.ratio_pct)??null})),total:t.length}}function Xs(n){let t=n?.item||[];return{items:t.map(e=>({scope:e.merge_scope||"",reportDate:S(e.report_date_ms)?.slice(0,10)??null,institutionPct:_(e.ins_position)??null,personalPct:_(e.psnl_rate)??null,holderCount:e.holder_amount??null,avgHolderShare:_(e.avg_holder_share)??null,staffHoldPct:_(e.mgmt_staff_hold_rate)??null})),total:t.length}}function Qs(n){let t=n?.item||[];return{items:t.map(e=>({rank:e.rank??null,name:e.holder_name||"",type:e.holder_type||"",holdShare:e.hold_share??null,holdPct:_(e.hold_rate_pct)??null,reportDate:S(e.report_date_ms)?.slice(0,10)??null})),total:t.length}}function Vs(n,t,e,o){let a=n?.item?.[0]||{},s=t?.item?.[0]||{};return{id:a.manager_id||"",name:a.manager_name||"",sex:a.sex??null,degree:a.degree??null,company:a.company_name??null,companyId:a.company_id??null,resume:a.resume??null,annualReturnPct:_(a.annual_return_pct)??null,maxReturnPct:_(a.maximum_return_pct)??null,radar:a.radar_comparison||[],style:{representativeFund:s.representative_fund_name??null,representativeFundCode:s.representative_fund_thscode??null,idea:s.investment_idea??null,totalScale:s.total_fund_scale??null,industryPreferences:s.industry_preferences??null},experience:e?.item?.[0]??null,performance:o?(o.item||[]).map(i=>({date:S(i.date_ms)?.slice(0,10)??null,managerPct:_(i.manager_return_pct)??null,peerPct:_(i.peer_return_pct)??null,benchmarkPct:_(i.benchmark_return_pct)??null})):null}}function Zs(n){let t=n?.item?.[0]||{};return{id:t.company_id||"",name:t.company_name||"",type:t.company_type||"",established:S(t.established_date_ms),fundCount:t.fund_count??null,scale:t.scale??null}}function ei(n){let t=n?.item||[];return{items:t.map(e=>({period:`${S(e.start_date_ms)?.slice(0,10)??""}~${S(e.end_date_ms)?.slice(0,10)??""}`,published:S(e.publish_date_ms),...Object.fromEntries(Object.entries(e).filter(([o])=>!o.endsWith("_ms")&&o!=="thscode"&&o!=="ticker"))})),total:t.length}}function ti(n){let t=n?.item||[];return{count:n?.dividend_count??t.length,total:n?.dividend_total??null,items:t.map(e=>({perTenCashBeforeTax:e.per_ten_cash_before_tax??null,perTenCashAfterTax:e.per_ten_cash_after_tax??null,progress:e.progress||"",publishDate:S(e.publish_date_ms)?.slice(0,10)??null,exDividendDate:S(e.ex_dividend_date_ms)?.slice(0,10)??null,paymentDate:S(e.payment_date_ms)?.slice(0,10)??null}))}}function ni(n){let t=n?.item?.[0]||{};return{code:t.thscode||"",price:t.last_price??null,change:t.price_change??null,changePercent:_(t.price_change_ratio_pct)??null,open:t.open_price??null,high:t.high_price??null,low:t.low_price??null,prevClose:t.prev_price??null,amplitude:_(t.price_amplitude_ratio_pct)??null,volume:t.volume??null,amount:t.turnover??null,turnoverRate:_(t.turnover_ratio_pct)??null}}function oi(n){let t=n?.item||[];return{code:n?.thscode||"",items:t.map(e=>({date:S(e.date_ms)?.slice(0,10)??null,open:e.open_price??null,high:e.high_price??null,low:e.low_price??null,close:e.close_price??null,volume:e.volume??null,amount:e.turnover??null})),total:t.length}}function ai(n){let t=n?.item||[];return{items:t.map(e=>({title:e.title||"",summary:e.summary||"",source:e.source||"",url:e.url??null,time:S(e.publish_time_ms)})),total:t.length,hasMore:!!n?.has_more,nextOffset:n?.offset??null}}function ri(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",ticker:e.ticker||"",subscriptionStart:S(e.subscription_start_ms)?.slice(0,10)??null,subscriptionEnd:S(e.subscription_end_ms)?.slice(0,10)??null})),total:t.length}}function va(n){return n.command({command:"fund",describe:"\u57FA\u91D1\u6570\u636E\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1A\u6863\u6848/\u51C0\u503C/\u4E1A\u7EE9/\u56DE\u64A4/\u6301\u4ED3/\u6301\u6709\u4EBA/\u7ECF\u7406/\u516C\u53F8/\u5206\u7EA2/ETF\u884C\u60C5",builder:t=>t.strictCommands(!1).command("profile <code>","\u57FA\u91D1\u6863\u6848\uFF08\u540D\u79F0/\u7ECF\u7406/\u89C4\u6A21/\u8D39\u7387\uFF0C\u542B manager_id \u4E0E company_id \u4E0B\u94BB\u5165\u53E3\uFF09",P(e=>e.positional("code",{type:"string",describe:"\u57FA\u91D1\u4EE3\u7801\uFF0C\u573A\u5916\u5982 025480.OF\uFF0CETF \u5982 510300 / 510300.SH"})),async e=>{let o=await jt(e.code,A(e));u({data:o,command:`fund profile ${e.code}`,source:"fuyao",toJSON:Fs})}).command("nav <code>","\u51C0\u503C\u5E8F\u5217\uFF08\u9ED8\u8BA4\u6700\u65B0\u4E00\u6761\uFF1B--range week..fyear \u53D6\u533A\u95F4\uFF09",P(e=>e.positional("code",{type:"string"}).option("range",{type:"string",choices:["week","month","tmonth","hyear","year","twoyear","tyear","fyear"],describe:"\u51C0\u503C\u533A\u95F4"}).option("nav-type",{type:"string",default:"unit,adj",choices:["unit","adj","unit,adj"],describe:"\u5355\u4F4D/\u590D\u6743\u51C0\u503C"})),async e=>{let o=await na(e.code,{range:e.range,navType:e["nav-type"],fundType:A(e)});u({data:o,command:`fund nav ${e.code}${e.range?` --range ${e.range}`:""}`,source:"fuyao",toJSON:Hs})}).command("perf <code>","\u533A\u95F4\u6536\u76CA\uFF08\u8FD11\u5468..\u6210\u7ACB\u6765 + \u540C\u7C7B\u5E73\u5747 + \u540C\u7C7B\u6392\u540D\uFF09",P(e=>e.positional("code",{type:"string"})),async e=>{let o=await oa(e.code,A(e));u({data:o,command:`fund perf ${e.code}`,source:"fuyao",toJSON:Bs})}).command("drawdown <code>","\u6700\u5927\u56DE\u64A4\uFF08\u5404\u5468\u671F\uFF09",P(e=>e.positional("code",{type:"string"})),async e=>{let o=await aa(e.code,A(e));u({data:o,command:`fund drawdown ${e.code}`,source:"fuyao",toJSON:Us})}).command("holdings <code>","\u6700\u65B0\u91CD\u4ED3\u6301\u4ED3\uFF08\u80A1\u7968/\u503A\u5238/\u57FA\u91D1 + \u6C47\u603B\u5360\u6BD4\uFF09",P(e=>e.positional("code",{type:"string"})),async e=>{let o=await ra(e.code,A(e));u({data:o,command:`fund holdings ${e.code}`,source:"fuyao",toJSON:Ys})}).command("holdings-history <code>","\u5386\u53F2\u6301\u4ED3\u660E\u7EC6\uFF08\u9700\u62A5\u544A\u671F\uFF1A\u5148 fund report-dates \u67E5 end \u65E5\u671F\uFF09",P(e=>e.positional("code",{type:"string"}).option("report",{type:"string",default:"quarter",describe:"\u62A5\u544A\u7C7B\u578B\uFF0C\u5982 quarter"}).option("end",{type:"string",required:!0,describe:"\u62A5\u544A\u622A\u6B62\u65E5 YYYY-MM-DD"}).option("bond",{type:"boolean",default:!1,describe:"\u503A\u5238\u6301\u4ED3\uFF08\u9ED8\u8BA4\u80A1\u7968\uFF09"})),async e=>{let o=e.code,{report:a="quarter",end:s,bond:i}=e,r=i?await ia(o,a,s,A(e)):await sa(o,a,s,A(e));u({data:r,command:`fund holdings-history ${o} --end ${s}`,source:"fuyao",toJSON:Ks})}).command("report-dates <code>","\u6301\u4ED3\u53EF\u7528\u62A5\u544A\u671F\uFF08holdings-history \u9700\u8981\u7684 end \u65E5\u671F\uFF09",P(e=>e.positional("code",{type:"string"})),async e=>{let o=await ca(e.code,void 0,A(e));u({data:o,command:`fund report-dates ${e.code}`,source:"fuyao",toJSON:zs})}).command("allocation <code>","\u8D44\u4EA7\u914D\u7F6E\uFF08\u80A1\u7968/\u503A\u5238/\u5B58\u6B3E/\u5176\u4ED6\u5360\u6BD4\uFF0C\u591A\u671F\uFF09",P(e=>e.positional("code",{type:"string"})),async e=>{let o=await ua(e.code,A(e));u({data:o,command:`fund allocation ${e.code}`,source:"fuyao",toJSON:Gs})}).command("industry <code>","\u884C\u4E1A\u914D\u7F6E\uFF08\u591A\u671F\uFF09",P(e=>e.positional("code",{type:"string"})),async e=>{let o=await la(e.code,A(e));u({data:o,command:`fund industry ${e.code}`,source:"fuyao",toJSON:Ws})}).command("holders <code>","\u6301\u6709\u4EBA\u7ED3\u6784\uFF08\u673A\u6784/\u4E2A\u4EBA\u5360\u6BD4\u3001\u6237\u6570\uFF09",P(e=>e.positional("code",{type:"string"}).option("top",{type:"boolean",default:!1,describe:"\u524D\u5341\u5927\u6301\u6709\u4EBA"})),async e=>{let o=e.code,a=e.top?await ma(o,void 0,A(e)):await da(o,void 0,A(e));u({data:a,command:`fund holders ${o}${e.top?" --top":""}`,source:"fuyao",toJSON:e.top?Qs:Xs})}).command("manager <code>","\u57FA\u91D1\u7ECF\u7406\uFF08\u7ECF\u57FA\u91D1\u4EE3\u7801\u89E3\u6790 manager_id\uFF1A\u8BE6\u60C5+\u98CE\u683C+\u7ECF\u5386\uFF09",P(e=>e.positional("code",{type:"string",describe:"\u57FA\u91D1\u4EE3\u7801\uFF08\u81EA\u52A8\u53D6\u5176\u73B0\u4EFB\u7ECF\u7406\uFF09"}).option("range",{type:"string",choices:["month","tmonth","year","nowyear","now"],describe:"\u9644\u52A0\u4E1A\u7EE9\u66F2\u7EBF\u533A\u95F4"})),async e=>{let o=e.code,s=(await jt(o,A(e)))?.item?.[0]?.manager_info?.[0],i=s?.manager_id??s?.id;if(!i)throw new Error(`\u57FA\u91D1 ${o} \u672A\u62AB\u9732\u57FA\u91D1\u7ECF\u7406 ID\uFF0C\u8BF7\u5728 profile \u8F93\u51FA\u7684 managerInfo \u4E2D\u786E\u8BA4`);let[r,c,l]=await Promise.all([pa(i),fa(i),ga(i)]),m=e.range?await ya(i,e.range):null,d=Vs(r,c,l,m);u({data:d,command:`fund manager ${o}`,source:"fuyao",toJSON:p=>p})}).command("company <company_id>","\u57FA\u91D1\u516C\u53F8\u8BE6\u60C5\uFF08company_id \u6765\u81EA fund profile \u8F93\u51FA\uFF09",e=>e.positional("company_id",{type:"string",describe:"\u57FA\u91D1\u516C\u53F8 ID\uFF0C\u5982 80000222"}),async e=>{let o=await ha(e.company_id);u({data:o,command:`fund company ${e.company_id}`,source:"fuyao",toJSON:Zs})}).command("financial <code>","\u57FA\u91D1\u8D22\u52A1\u6570\u636E\uFF08--t indicators(\u9ED8\u8BA4)/income/balance\uFF09",P(e=>e.positional("code",{type:"string"}).option("t",{type:"string",default:"indicators",choices:["indicators","income","balance"]})),async e=>{let o=e.code,a=e.t||"indicators",s=a==="income"?await _a(o,A(e)):a==="balance"?await wa(o,A(e)):await ba(o,A(e));u({data:s,command:`fund financial ${o} -t ${a}`,source:"fuyao",toJSON:ei})}).command("dividend <code>","\u57FA\u91D1\u5206\u7EA2\u8BB0\u5F55",P(e=>e.positional("code",{type:"string"})),async e=>{let o=await Sa(e.code,A(e));u({data:o,command:`fund dividend ${e.code}`,source:"fuyao",toJSON:ti})}).command("diagnose <code>","\u57FA\u91D1\u8BCA\u65AD\uFF08\u7EF4\u5EA6/\u540C\u7C7B\u5BF9\u6BD4/\u97E7\u6027\u6307\u6807\uFF09",P(e=>e.positional("code",{type:"string"})),async e=>{let o=await ka(e.code,A(e));u({data:o,command:`fund diagnose ${e.code}`,source:"fuyao",toJSON:a=>({items:a?.item||[],total:a?.item?.length??0})})}).command("issue [subscribe]","\u65B0\u53D1\u57FA\u91D1\u52DF\u96C6\u5217\u8868\uFF08active \u5F53\u524D\u52DF\u96C6 / upcoming \u5373\u5C06\u52DF\u96C6\uFF09",e=>e.positional("subscribe",{type:"string",default:"active",choices:["active","upcoming"]}),async e=>{let o=e.subscribe||"active",a=await xa(o);u({data:a,command:`fund issue ${o}`,source:"fuyao",toJSON:ri})}).command("news <code>","\u57FA\u91D1\u8D44\u8BAF",P(e=>e.positional("code",{type:"string"})),async e=>{let{n:o}=e,a=await Na(e.code,{limit:o,fundType:A(e)});u({data:a,command:`fund news ${e.code}`,source:"fuyao",toJSON:ai})}).command("etf <code>","ETF \u884C\u60C5\u5FEB\u7167\uFF08\u4EC5 ETF\uFF1BLOF/\u573A\u5916/REITs \u4E0D\u652F\u6301\uFF09",e=>e.positional("code",{type:"string",describe:"ETF \u4EE3\u7801\uFF0C\u5982 510300 / 510300.SH"}),async e=>{let o=await Aa(e.code);u({data:o,command:`fund etf ${e.code}`,source:"fuyao",toJSON:ni})}).command("etf-kline <code>","ETF \u5386\u53F2\u65E5\u7EBF\uFF08\u7A97\u53E3 \u22645 \u5E74\uFF09",e=>e.positional("code",{type:"string"}).option("days",{type:"number",default:120,describe:"\u56DE\u770B\u5929\u6570\uFF08\u22641825\uFF09"}),async e=>{let o=e.code,a=Math.min(Math.max(Number(e.days)||120,1),1825),s=Date.now(),i=await Oa(o,s-a*864e5,s);u({data:i,command:`fund etf-kline ${o}`,source:"fuyao",toJSON:oi})}),handler:async()=>{throw new Error("\u8BF7\u6307\u5B9A\u5B50\u547D\u4EE4\uFF1Afinflow fund --help \u67E5\u770B profile/nav/perf/holdings/etf \u7B49 17 \u4E2A\u5B50\u547D\u4EE4")}})}var M=si(ii(process.argv)).scriptName("finflow").version("1.9.7").demandCommand(1,"\u8BF7\u6307\u5B9A\u547D\u4EE4\uFF0C\u8FD0\u884C finflow --help \u67E5\u770B\u5E2E\u52A9").option("n",{type:"number",default:10,describe:"\u6761\u6570"}).strict().help().alias("h","help");Dn(M);Eo(M);Lo(M);Yo(M);Go(M);Wo(M);Vo(M);ta(M);va(M);M.parse();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openduo/finflow",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.7",
|
|
4
4
|
"description": "Unified financial CLI — jin10, cls, xueqiu, gelonghui",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"scripts": {
|
|
16
16
|
"build": "tsup",
|
|
17
17
|
"test": "vitest run",
|
|
18
|
+
"fuyao:check": "node scripts/fuyao-check.mjs",
|
|
18
19
|
"release": "npm run build && npm version && git push && git push --follow-tags"
|
|
19
20
|
},
|
|
20
21
|
"dependencies": {
|