@openduo/finflow 1.9.6 → 1.9.8
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 +5 -4
- 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(`
|
|
4
|
-
`);console.error(`\u672A\u77E5\u680F\u76EE: ${s}
|
|
2
|
+
import ki from"yargs";import{hideBin as xi}from"yargs/helpers";function M(n){return(n||"").replace(/<[^>]+>/g,"")}function j(){let n=new Date;return`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`}function Uo(n,t=!1){console.log(t?JSON.stringify(n,null,2):JSON.stringify(n))}function Bo(n,t,e){return{data:n,meta:{source:e,timestamp:new Date().toISOString(),command:t}}}function l(n){let{data:t,command:e,source:r,toJSON:o}=n;Uo(Bo(o?o(t):t,e,r))}import Ye from"https";import te from"crypto";var Z=Object.freeze({os:"web",sv:"8.7.9",app:"CailianpressWeb"}),Ko=Object.freeze({os:"web",sv:"8.7.9",app:"CailianpressWeb"});function Yt(n){return Object.keys(n).sort().map(t=>`${t}=${n[t]}`).join("&")}function we(n){let t={...Z,...n},e=Yt(t);return e?te.createHash("md5").update(te.createHash("sha1").update(e).digest("hex")).digest("hex"):te.createHash("md5").update(te.createHash("sha1").update("").digest("hex")).digest("hex")}function Ht(n){return{...Z,...n,sign:we(n)}}var Ft=te.createHash("md5").update(te.createHash("sha1").update(Yt(Ko)).digest("hex")).digest("hex");var L=n=>n.trim().toLowerCase(),Go="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",ie={"User-Agent":Go,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"};function He(n,t,e,r,o,a){return new Promise((s,i)=>{let u=Ye.request({hostname:n,path:t,method:e,timeout:a,headers:o},c=>{let p=[];c.on("data",m=>p.push(m)),c.on("end",()=>{let m=Buffer.concat(p).toString("utf-8");try{let f=JSON.parse(m);c.statusCode>=400&&(f._statusCode=c.statusCode),s(f)}catch{s(m)}})});u.on("error",i),u.on("timeout",()=>{u.destroy(),i(new Error("timeout"))}),u.end(r)})}function $(n,t,e={},r={}){let o=r.timeout??1e4,a=new URLSearchParams(Ht(e)).toString();return He(n,`${t}?${a}`,"GET",void 0,{...ie,host:n,Referer:`https://${n}/`},o)}var zo={...ie,"Content-Type":"application/json",Origin:"https://www.cls.cn",Referer:"https://www.cls.cn/"};async function Wo(){return new Promise(n=>{let t=Ye.request({hostname:"www.cls.cn",path:"/",method:"GET",timeout:8e3,headers:{...ie}},e=>{e.on("end",()=>{let r=(e.headers["set-cookie"]||[]).map(o=>o.split(";")[0]).join("; ");n(r)}),e.on("data",()=>{})});t.on("error",()=>n("")),t.on("timeout",()=>{t.destroy(),n("")}),t.end()})}async function Se(n,t={}){let e=t.type??"all",r=t.rn??20,o=t.page??0,a={type:e,keyword:n,rn:r,page:o,os:"web",sv:"8.7.9",app:"CailianpressWeb"},s=await Wo(),i={...zo};return s&&(i.Cookie=s),He("www.cls.cn",`/api/sw?app=CailianpressWeb&os=web&sv=8.7.9&sign=${Ft}`,"POST",JSON.stringify(a),i,1e4)}function Fe(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),$("www.cls.cn","/v1/roll/get_roll_list",e)}async function Ut(n){let e=(await new Promise((r,o)=>{let a=Ye.request({hostname:"www.cls.cn",path:`/detail/${n}`,method:"GET",timeout:1e4,headers:{...ie,Referer:"https://www.cls.cn/"}},s=>{let i=[];s.on("data",u=>i.push(u)),s.on("end",()=>r(Buffer.concat(i).toString("utf-8")))});a.on("error",o),a.on("timeout",()=>{a.destroy(),o(new Error("timeout"))}),a.end()})).match(/<script id="__NEXT_DATA__" type="application\/json">([\s\S]*?)<\/script>/);if(!e)return{data:{roll_data:[]}};try{let r=JSON.parse(e[1]),o=(s,i=0)=>{if(i>12||!s||typeof s!="object")return null;if(s.content&&s.brief&&String(s.id)===String(n))return s;for(let u of Object.keys(s)){let c=o(s[u],i+1);if(c)return c}return null},a=o(r);return{data:{roll_data:a?[a]:[]}}}catch{return{data:{roll_data:[]}}}}function Ue(n){return $("www.cls.cn",`/v3/depth/home/assembled/${n}`)}function Bt(n,t){return $("www.cls.cn",`/v3/depth/list/${n}`,{id:n,last_time:t.lastTime,rn:t.rn??20})}function Kt(){return $("www.cls.cn","/v2/article/hot/list")}function Gt(){return $("www.cls.cn","/api/subject/hotAndNewestSubject")}function Be(n={}){return $("x-quote.cls.cn","/web_quote/plate/hot_plate",{type:n.type??"industry",way:n.way??"change",rever:1,num:50})}function zt(n){return $("x-quote.cls.cn","/quote/stock/basic",{secu_code:L(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 Ke(n){return $("x-quote.cls.cn","/quote/stock/volume",{secu_code:L(n),field:"five"})}function Ge(n){return $("x-quote.cls.cn","/quote/stock/volume",{secu_code:L(n),field:"vol"})}function ze(n){return $("x-quote.cls.cn","/v2/quote/a/tline",{secu_code:L(n)})}function Wt(n,t={}){let e={code:L(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),$("x-quote.cls.cn","/v2/quote/a/kline",e)}function We(n){return $("x-quote.cls.cn","/web_quote/stock/assoc_plate",{secu_code:L(n)})}function Qe(n,t={}){return $("x-quote.cls.cn","/web_quote/plate/stocks",{secu_code:L(n),way:t.way??"change",rever:t.rever??1})}function Qt(n){return $("x-quote.cls.cn","/quote/stock/fundflow",{secu_code:L(n)})}function Xt(n,t={}){let e=Math.floor(Date.now()/1e3);return $("www.cls.cn","/es/quotes/articles",{keyword:n,lastTime:e,rn:t.rn??10})}function Vt(){return $("x-quote.cls.cn","/v2/quote/a/stock/emotion")}function Zt(n){return $("www.cls.cn","/v3/transaction/anchor",{cdate:n.date})}function en(n,t={}){return $("x-quote.cls.cn","/quote/index/ann",{secu_code:L(n),page:t.page??1})}function tn(n,t={}){let e=t.page??1,r=t.pageSize??15,o=t.keyWord??"",a={page:e,pageSize:r,stocksCode:L(n),keyWord:o},s={...a,...Z,sign:we(a)},i=new URLSearchParams({app:Z.app,os:Z.os,sv:Z.sv,sign:we({})}).toString();return He("x-api.cls.cn",`/tool/interaction/getDataByParam?${i}`,"POST",JSON.stringify(s),{...ie,"Content-Type":"application/json",Origin:"https://www.cls.cn",Referer:"https://www.cls.cn/"},1e4)}var ne=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"}}),Xe=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 nn(n){return Xe[n]?Xe[n]:Object.values(Xe).find(t=>t.name===n||t.category===n)||null}function rn(n){if(ne[n])return ne[n];let t=parseInt(n,10);return isNaN(t)?Object.values(ne).find(e=>e.name===n||e.name.includes(n))||null:Object.values(ne).find(e=>e.id===t)||null}import Qo from"https";import Xo from"http";var Vo="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",Zo={"User-Agent":Vo,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"},ea={"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 v(n,t,e={},r={}){let o=r.timeout??1e4,a=Object.keys(e).length?"?"+new URLSearchParams(e).toString():"",s=`${t}${a}`,i={...Zo,Referer:"https://www.jin10.com/",Origin:"https://www.jin10.com"},u=ea[n];return u&&(i["x-app-id"]=u.id,i["x-version"]=u.version,i.handleerror="true",u.referer&&(i.Referer=u.referer,i.Origin=new URL(u.referer).origin)),r.cookie&&(i.Cookie=r.cookie),r.extraHeaders&&Object.assign(i,r.extraHeaders),new Promise((c,p)=>{let f=(n.startsWith("localhost")?Xo:Qo).request({hostname:n,path:s,method:"GET",timeout:o,headers:i},y=>{if(y.statusCode>=300&&y.statusCode<400&&y.headers.location){let h=new URL(y.headers.location,`https://${n}`);return c(v(h.hostname,h.pathname+h.search,e,r))}let g=[];y.on("data",h=>g.push(h)),y.on("end",()=>{let h=Buffer.concat(g).toString("utf-8");try{let _=JSON.parse(h);y.statusCode>=400&&(_._statusCode=y.statusCode),c(_)}catch{c(h)}})});f.on("error",p),f.on("timeout",()=>{f.destroy(),p(new Error("timeout"))}),f.end()})}function on(n={},t){let e={};return n.max_read_id&&(e.max_read_id=n.max_read_id),n.channel&&(e.channel=n.channel),v("flash-api.jin10.com","/get_flash_list",e,t)}function an(n,t){return v("flash-api.jin10.com","/get_flash_list",{channel:"-8200",vip:"1",max_time:n},t)}function sn(n,t){return v("flash-api.jin10.com","/get_flash_detail",{id:n},t)}function cn(n,t){return v("flash-api.jin10.com","/get_flash_list_by_date",{date:n},t)}function Ve(n,t){return v("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 un(){return v("e0430d16720e4211b5e072c26205c890.z3c.jin10.com","/web/interest_rates",{},{extraHeaders:{"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0"}})}function ln(){return v("cdn.jin10.com","/json/index/slide_204.json")}function mn(){return v("cdn.jin10.com","/json/index/flir.json")}var Ze="e0430d16720e4211b5e072c26205c890.z3c.jin10.com",ta={"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0",handleerror:"true"};function et(n){return{extraHeaders:ta,...n}}function tt(n,t="cj",e){return v(Ze,"/get/data",{date:n,category:t},et(e))}function dn(n,t="cj",e){return v(Ze,"/get/event",{date:n,category:t},et(e))}function pn(n,t="cj",e){return v(Ze,"/page/holiday",{date:n,category:t,page:1,pagesize:50},et(e))}function nt(n=-1,t={},e){let r={channel:n};return t.max_time&&(r.max_time=t.max_time),v("qh-flash-api.jin10.com","/get_flash_list",r,e)}function fn(n){return v("futures-report-api.jin10.com","/api/headline",{},n)}function rt(n){return n.replace(/-/g,"")}function yn(n,t){return v("qhcal-api.jin10.com","/data",{date:rt(n)},t)}function xe(n,t){return v("qhcal-api.jin10.com","/event",{date:rt(n)},t)}function Ne(n,t){return v("qhcal-api.jin10.com","/holiday",{date:rt(n)},t)}function gn(n,t){return v("28e2bd69d5104a428d25ff1df132b716.z3c.jin10.com","/basic_data",{date:n},{...t,extraHeaders:{"x-app-id":"KxBcVoDHStE6CUkQ","x-version":"1.0"}})}function Ae(){return v("cdn.jin10.com","/json/index/all_topics.json")}function hn(n,t={},e){let r={id:n};return t.page&&(r.page=t.page),t.page_size&&(r.page_size=t.page_size),v("reference-api.jin10.com","/topic/getById",r,{...e,extraHeaders:{"x-app-id":"arU9WZF7TC9m7nWn","x-version":"1.0.1",Referer:"https://xnews.jin10.com/"}})}import na from"https";var ot="www.gelonghui.com",ra="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 Oe(n,t=1e4){return new Promise((e,r)=>{let o=new URL(n,`https://${ot}`),a=na.get({hostname:ot,path:o.pathname+o.search,headers:{"User-Agent":ra,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9",Referer:`https://${ot}/live/`,"client-lang":"zh-cn",platform:"web",shortversion:"10.7.0"}},s=>{let i=[];s.on("data",u=>i.push(u)),s.on("end",()=>{let u=Buffer.concat(i).toString();try{e(JSON.parse(u))}catch{e(u)}})});a.setTimeout(t,()=>{a.destroy(),r(new Error("timeout"))}),a.on("error",r)})}function ce(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)),Oe(`/api/live-channels/${n.channel??"all"}/lives/v4?${t}`)}function bn(n={}){return ce({channel:n.channel,category:"important",limit:n.limit,liveId:n.liveId})}function _n(n={}){return ce({channel:n.channel,category:"popular",limit:n.limit,liveId:n.liveId})}function wn(n={}){return Oe(`/hq/hk/boards/v1?sort=${n.sort??"netChange"}&order=${n.order??"desc"}`)}function at(){return Oe("/hq/home-page-data")}function ue(){return Oe("/hq/quote/api/market/flow/entrance/data/v2")}var st=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"}]),it=Object.freeze([{id:"netChange",name:"\u6DA8\u8DCC\u5E45"},{id:"turnoverValue",name:"\u6210\u4EA4\u989D"},{id:"turnVolume",name:"\u6210\u4EA4\u91CF"}]);function Te(n){return n?st.find(t=>t.id.toLowerCase()===n.toLowerCase()||t.name===n)??st[0]:st[0]}function Sn(n){return n?it.find(t=>t.id.toLowerCase()===n.toLowerCase()||t.name===n)??it[0]:it[0]}import ct from"fs";import U from"path";import B from"os";import{execSync as ut}from"child_process";import kn from"crypto";function aa(){return ut('security find-generic-password -w -s "Chrome Safe Storage"',{encoding:"utf-8"}).trim()}function sa(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 r of e){let o=n.match(r);if(o&&o[1])return o[1]}return n}function ia(n,t,e=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 a=kn.pbkdf2Sync(t,"saltysalt",1003,16,"sha1"),s=Buffer.alloc(16,32),i=kn.createDecipheriv("aes-128-cbc",a,s);i.setAutoPadding(!1);let u=Buffer.concat([i.update(o),i.final()]),c=u[u.length-1];return c&&c<=16&&(u=u.slice(0,-c)),e>=24&&u.length>32&&(u=u.slice(32)),sa(u.toString("utf-8"))}var ca=[U.join(B.homedir(),"Library/Application Support/Google/Chrome/Default/Cookies"),U.join(B.homedir(),"Library/Application Support/Google/Chrome/Profile 1/Cookies"),U.join(B.homedir(),"Library/Application Support/Google/Chrome Beta/Default/Cookies"),U.join(B.homedir(),"Library/Application Support/Google/Chrome Beta/Profile 1/Cookies"),U.join(B.homedir(),"Library/Application Support/Google/Chrome Dev/Default/Cookies"),U.join(B.homedir(),"Library/Application Support/Google/Chrome Canary/Default/Cookies"),U.join(B.homedir(),"Library/Application Support/BraveSoftware/Brave-Browser/Default/Cookies"),U.join(B.homedir(),"Library/Application Support/Microsoft Edge/Default/Cookies")];function ua(n){for(let t of ca){if(!ct.existsSync(t))continue;let e=U.join(B.tmpdir(),`finflow_cookies_${Date.now()}.db`);ct.copyFileSync(t,e);try{let r=0;try{let s=ut(`sqlite3 "${e}" "SELECT value FROM meta WHERE key='version';"`,{encoding:"utf-8"}).trim();r=parseInt(s,10)||0}catch{}let o=`SELECT name, hex(encrypted_value), host_key FROM cookies WHERE host_key LIKE '%${n}%'`;return JSON.parse(ut(`sqlite3 -json "${e}" "${o}"`,{encoding:"utf-8"})).map(s=>({name:s.name,value:Buffer.from(s["hex(encrypted_value)"],"hex"),domain:s.host_key,_metaVersion:r}))}finally{try{ct.unlinkSync(e)}catch{}}}return[]}function ve(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=aa()}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=ua(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=t?[t,`.${t}`]:[`.${n}`,n],a=[];for(let s of r)if(o.includes(s.domain))try{let i=ia(s.value,e,s._metaVersion);if(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(i))continue;a.push(`${s.name}=${i}`)}catch{}if(!a.length)throw new Error("Cookie \u89E3\u5BC6\u5168\u90E8\u5931\u8D25");return a.join("; ")}function W(){try{return ve("jin10.com")}catch{return null}}function xn(n){return n?.slice(5,16)||""}function le(n){return n?.length?n.filter(t=>t.type==="quotes").map(t=>t.title).join(" "):""}function qe(n,t){return!n&&t?.data?.vip_title?`[VIP] ${t.data.vip_title}`:n?M(n).replace(/^金十数据\d{4}年\d{1,2}月\d{1,2}日讯[,,]?\s*/,""):""}var Nn=[],la=["content","title","brief","data.content","data.title","indicator_name","name","subject_name"];function ma(n){return la.map(t=>t.split(".").reduce((r,o)=>r?.[o],n)||"").filter(Boolean).join(" ").toLowerCase()}function C(n){if(!Nn.length||!Array.isArray(n))return n;let t=Nn.map(e=>e.toLowerCase());return n.filter(e=>{let r=ma(e);return!t.some(o=>r.includes(o))})}import re from"fs";import An from"path";import da from"os";var Y=[{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 mt(n){return Y.find(t=>t.id===n.toLowerCase())}function lt(){return An.join(da.homedir(),".finflow","keys")}function oe(n){return An.join(lt(),n.toLowerCase())}function On(n,t){let e=oe(n);re.mkdirSync(lt(),{recursive:!0});try{re.chmodSync(lt(),448)}catch{}re.writeFileSync(e,t.trim()+`
|
|
4
|
+
`,"utf-8");try{re.chmodSync(e,384)}catch{}return e}function me(n){let t=mt(n),e=t?(process.env[t.env]||"").trim():"";if(e)return{key:e,origin:"env"};try{let r=re.readFileSync(oe(n),"utf-8").trim();if(r)return{key:r,origin:"file"}}catch{}return null}function Tn(n){try{return re.unlinkSync(oe(n)),!0}catch{return!1}}function dt(n){let t=n.trim();return t.length<=16?t.slice(0,4)+"\u2026":`${t.slice(0,12)}\u2026${t.slice(-4)}`}var pa="https://fuyao.aicubes.cn";function de(){return me("fuyao")}var Pe=class extends Error{constructor(e,r,o){super(r);this.code=e;this.requestId=o;this.name="FuyaoApiError"}code;requestId};async function b(n,t={}){let e=de();if(!e)throw new Pe(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 r=new URLSearchParams;for(let[u,c]of Object.entries(t))c!=null&&c!==""&&r.set(u,String(c));let o=r.toString(),a=`${pa}${n}${o?`?${o}`:""}`,s;try{s=await fetch(a,{headers:{"X-api-key":e.key,Accept:"application/json"}})}catch(u){throw new Error(`\u6276\u6447\u63A5\u53E3\u7F51\u7EDC\u9519\u8BEF\uFF1A${u.message}`)}let i;try{i=await s.json()}catch{i=null}if(!i||typeof i.code!="number")throw new Error(`\u6276\u6447\u63A5\u53E3\u54CD\u5E94\u5F02\u5E38\uFF08HTTP ${s.status}\uFF0C\u975E JSON \u4FE1\u5C01\uFF09`);if(i.code!==0)throw new Pe(i.code,`\u6276\u6447 API ${i.code}\uFF1A${i.message||"\u672A\u77E5\u9519\u8BEF"}`,i.request_id);return i.data}function fa(n){return/^88/.test(n)?"TI":/^92/.test(n)||/^[48]/.test(n)?"BJ":/^[0123]/.test(n)?"SZ":/^[569]/.test(n)?"SH":"SZ"}function S(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}.${fa(t)}`),t}function vn(n){return/\.TI$/i.test(n.trim())}function pe(n,t={}){return b("/api/a-share/prices/snapshot",{thscodes:n.length?n.map(S).join(","):void 0,limit:t.limit,offset:t.offset})}function qn(n,t){return b("/api/a-share/prices/historical",{thscode:S(n),interval:t.interval||"1d",start:t.start,end:t.end,adjust:t.adjust&&t.adjust!=="none"?t.adjust:void 0})}function Pn(n){return b("/api/a-share-index/prices/snapshot",{thscodes:n.map(S).join(",")})}function jn(n,t){return b("/api/a-share-index/prices/historical",{thscode:S(n),interval:t.interval||"1d",start:t.start,end:t.end})}function $n(n="cn_concept"){return b("/api/a-share-index/catalog/ths-index-list",{tag:n})}function pt(n){return b("/api/a-share-index/constituents/ths-stock-list",{thscode:S(n)})}function Cn(n,t={}){return b("/api/meta/tickers/search",{q:n,exchange:t.exchange,asset_type:t.assetType,limit:t.limit})}function Dn(n={}){return b("/api/meta/tickers/list",{asset_type:n.assetType,limit:n.limit,offset:n.offset})}function En(){return b("/api/a-share/calendar/trading-days")}function Rn(n,t={}){return b("/api/a-share/corporate-actions/adjustment-factors",{thscode:S(n),from:t.from,to:t.to})}function ft(n,t){return{thscode:S(n),period:t.period||"annual",...t.start!==void 0&&t.end!==void 0?{start:t.start,end:t.end}:{limit:t.limit}}}function Jn(n,t={}){return b("/api/a-share/financials/income-statements",ft(n,t))}function Mn(n,t={}){return b("/api/a-share/financials/balance-sheets",ft(n,t))}function In(n,t={}){return b("/api/a-share/financials/cash-flow-statements",ft(n,t))}function Ln(n,t){return b("/api/a-share/financials/indicators",{thscode:S(n),report:t})}function Yn(n){return b("/api/a-share/valuations/snapshot",{thscodes:n.map(S).join(",")})}function fe(n){return n=C(n),{items:n.map(t=>({time:t.time,content:qe(t.data?.content||t.data?.title||"",t),title:t.data?.title||"",importance:t.important??0,source:t.data?.source||"",tags:le(t.remark)?le(t.remark).split(" "):[]})),total:n.length}}function ya(n){return n=C(n),{items:n.map(t=>({time:new Date(t.ctime*1e3).toISOString(),content:M(t.content||t.brief||""),title:t.title||"",importance:0,source:"cls",tags:(t.subjects||[]).map(e=>`#${e.subject_name}`)})),total:n.length}}function gt(n){return n=C(n),{items:n.map(t=>({time:new Date(t.createTimestamp*1e3).toISOString(),content:M(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 ga(n){let t=n?.list||(Array.isArray(n)?n:[]),e=[];if(Array.isArray(t)&&Array.isArray(t[0]))for(let r of t)for(let o of r)e.push(o);else Array.isArray(t)&&(e=t);return e=C(e),{items:e.map(r=>({title:r.title||"",badge:r.ndata?.badge||"",redirectUrl:r.web_redirect_url||""})),total:e.length}}function ha(n){let t=[],e=n?.list||(Array.isArray(n)?n:[]);if(Array.isArray(e)&&e.length&&Array.isArray(e[0]))for(let r of e)t.push(...r);else Array.isArray(e)&&(t=e);return t=C(t),{items:t.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:t.length}}function Hn(n){let t=n?.data?.top_article||[],e=n?.data?.depth_list||[],r=C([...t,...e]);return{items:r.map(o=>({time:o.ctime?new Date(o.ctime*1e3).toISOString():"",title:o.title||"",brief:M(o.brief||""),source:o.source||"",subjects:(o.subjects||[]).map(a=>a.subject_name||a.name||""),readingNum:o.reading_num||0})),total:r.length}}function ba(n){let t=C(n?.data||[]);return{items:t.map(e=>({title:e.title||"",readingNum:e.readNum||0})),total:t.length}}function _a(n){let t=C(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 Fn(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 wa(n){let t=n?.data?.hot_subjects||[],e=n?.data?.newest_subjects||[];return{hotSubjects:t.map(r=>({name:r.name||"",attentionNum:r.attention_num||0,newestArticleTitle:M(r.newest_article_title||"")})),newestSubjects:e.map(r=>({name:r.name||""}))}}function Sa(n){let t=Array.isArray(n)?n:n?.data||[],e=new Map;for(let o of t){let a=o.category_name||"\u672A\u5206\u7C7B";e.set(a,(e.get(a)||0)+1)}let r=Array.from(e,([o,a])=>({name:o,count:a}));return{items:r,total:r.length}}var ka=new Set(["stock","telegram","featured","depth","eoe_article"]),xa={stock:"\u80A1\u7968",telegram:"\u7535\u62A5",featured:"\u8981\u95FB",depth:"\u6DF1\u5EA6",eoe_article:"\u6587\u7AE0"};function Un(n){let t=n?.data||{},e=[],r=0;for(let[o,a]of Object.entries(t))if(ka.has(o)&&!(!a||typeof a!="object"||!Array.isArray(a.data))){r+=a.total_num||a.data.length;for(let s of a.data){let i=s.stock_category==="stock"||/^s[hz]\d+$/i.test(s.descr||""),u=s.descr?M(s.descr):"",c=M(s.title||s.featuredTitle||""),p=u;if(!c&&u){let m=u.search(/[。!?\n]/);c=m>0?u.slice(0,m):u.slice(0,60),p=u}p&&p.length>200&&(p=p.slice(0,200)),!(!c&&!p&&!i)&&e.push({kind:xa[o]||o,type:i||s.type===1?"stock":"article",title:c,brief:p,code:i&&(s.stock_id||s.descr)||"",name:i?M(s.title||""):"",price:s.last||null,percent:s.raise||null,time:s.time?new Date(s.time*1e3).toISOString():"",author:s.author||"",id:s.id,url:s.external_link||""})}}return{items:e,total:r}}function Na(n){let t=n?.data?.roll_data?.[0];return t?{item:{id:t.id,time:t.ctime?new Date(t.ctime*1e3).toISOString():"",title:M(t.title||""),content:M(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 Bn(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?M(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 ht(n){let t=W(),e=t?{cookie:t}:void 0,r=new Set,o=[],a=await on({},e);for(let u of a?.data||[])r.has(u.id)||(r.add(u.id),o.push(u));let s=0,i=50;for(;o.length<n&&s++<i;){let u=o[o.length-1];if(!u)break;let p=(await an(u.time,e))?.data||[];if(!p.length)break;let m=0;for(let f of p)r.has(f.id)||(r.add(f.id),o.push(f),m++);if(m===0)break;o.length<n&&await new Promise(f=>setTimeout(f,200))}return o}function Kn(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:r=30}=e,o=e.asset_type||"a-share",a=await Dn({assetType:o,limit:Math.min(r,1e4)});l({data:a,command:`info codes ${o}`,source:"fuyao",toJSON:s=>({items:(s?.item||[]).map(i=>({code:i.thscode||"",name:i.name||"",type:i.asset_type||"",exchange:i.exchange??null})),total:s?.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",r=>r.option("channel",{alias:"c",type:"string",describe:"\u9891\u9053"}),async r=>{let{n:o=10,channel:a}=r,s=a?Te(a):Te("popular"),i=await bn({channel:s.id,limit:o}),u=C(i.result||[]);l({data:u,command:"info flash important",source:"glh",toJSON:()=>gt(u)})}).command("popular","\u70ED\u95E8\u5FEB\u8BAF\uFF08glh\uFF09",r=>r,async r=>{let{n:o=10}=r,a=await _n({limit:o}),s=C(a.result||[]);l({data:s,command:"info flash popular",source:"glh",toJSON:()=>gt(s)})}).command("detail <id>","\u5FEB\u8BAF\u8BE6\u60C5\uFF08jin10\uFF09",r=>r,async r=>{let o=r.id,a=await sn(o);l({data:a,command:"info flash detail",source:"jin10",toJSON:s=>fe(s?.data?[s]:[])})}).command("date <date>","\u5386\u53F2\u5FEB\u8BAF\uFF08jin10\uFF0C\u9700\u767B\u5F55\uFF09",r=>r,async r=>{let o=r.date,a;try{a=ve("jin10.com")}catch(i){console.error(i.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 s=await cn(o,{cookie:a});s?._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:s,command:"info flash date",source:"jin10",toJSON:i=>fe(i?.data||[])})}),async e=>{let{n:r=10,src:o="cls",category:a}=e,s=a||"all",i=[];o==="jin10"?i.push({name:"jin10",fn:m=>ht(r).then(f=>l({data:f,command:"info flash",source:m,toJSON:fe}))},{name:"cls",fn:m=>c(m,s,r)},{name:"glh",fn:m=>p(m,s,r)}):o==="glh"?i.push({name:"glh",fn:m=>p(m,s,r)},{name:"cls",fn:m=>c(m,s,r)},{name:"jin10",fn:m=>ht(r).then(f=>l({data:f,command:"info flash",source:m,toJSON:fe}))}):s==="all"?i.push({name:"cls",fn:m=>c(m,s,r)},{name:"jin10",fn:m=>ht(r).then(f=>l({data:C(f),command:"info flash",source:m,toJSON:fe}))},{name:"glh",fn:m=>p(m,s,r)}):i.push({name:"cls",fn:m=>c(m,s,r)});let u;for(let m=0;m<i.length;m++){let{name:f,fn:y}=i[m],g=m===0?f:`${f} fallback`;try{await y(g);return}catch(h){u=h,m<i.length-1&&console.error(`Source ${f} failed: ${h?.message||h}, trying next...`)}}throw u;async function c(m,f,y){let g=nn(f);if(!g)return l({data:{error:`\u672A\u77E5\u680F\u76EE: ${f}\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,_=[],A=20,q=50,I=0,O=g.category,se=(await Fe({rn:A,category:O}))?.data?.roll_data||[];for(let J of se)h.has(J.id)||(h.add(J.id),_.push(J));for(;_.length<y&&I++<q;){let J=_.reduce((z,Lt)=>(Lt.ctime||0)<(z.ctime||0)?Lt:z,_[0]);if(!J?.ctime)break;let Fo=(await Fe({lastTime:J.ctime,rn:A,category:O}))?.data?.roll_data||[],It=0;for(let z of Fo)h.has(z.id)||(h.add(z.id),_.push(z),It++);if(!It)break;_.length<y&&await new Promise(z=>setTimeout(z,200))}let V=_.slice(0,y);l({data:V,command:"info flash",source:m,toJSON:ya})}async function p(m,f,y){let g=f&&f!=="all"?Te(f):{id:"all"},h=new Set,_=[],A=15,q=50,I=0,O=await ce({channel:g.id,limit:A});for(let x of O?.result||[])h.has(x.id)||(h.add(x.id),_.push(x));for(;_.length<y&&I++<q;){let x=_[_.length-1];if(!x?.id)break;let se=await ce({channel:g.id,limit:A,liveId:x.id}),V=0;for(let J of se?.result||[])h.has(J.id)||(h.add(J.id),_.push(J),V++);if(!V)break;_.length<y&&await new Promise(J=>setTimeout(J,200))}l({data:_,command:"info flash",source:m,toJSON:gt})}}).command("news","\u6DF1\u5EA6\u6587\u7AE0",e=>e.strictCommands(!1).command("slide","\u5E7B\u706F\u7247/\u91CD\u8981\u4E8B\u4EF6\uFF08jin10\uFF09",r=>r,async()=>{let r=await ln();l({data:r,command:"info news slide",source:"jin10",toJSON:ga})}).command("feature","\u7CBE\u9009\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async()=>{let r=await mn();l({data:r,command:"info news feature",source:"jin10",toJSON:ha})}).command("depth [channel]","\u6DF1\u5EA6\u680F\u76EE\uFF08cls\uFF09",r=>r,async r=>{let{n:o=10}=r,a=r.channel||"headline",s=rn(a);if(!s){let c=Object.entries(ne).map(([p,m])=>` ${p.padEnd(12)} ${m.name} (${m.id})`).join(`
|
|
5
|
+
`);console.error(`\u672A\u77E5\u680F\u76EE: ${a}
|
|
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
|
+
${c}`),process.exit(1)}let i=await Ue(s.id),u=C(i?.data?.depth_list||[]);if(u.length<o){let c=u[u.length-1]?.ctime;if(c){let p=await Bt(s.id,{lastTime:c,rn:o-u.length}),m=C(p?.data?.depth_list||p?.data||[]);u=[...u,...m]}}l({data:i,command:"info news depth",source:"cls",toJSON:Hn})}).command("hot","\u70ED\u95E8\u6587\u7AE0\u6392\u884C\uFF08cls\uFF09",r=>r,async()=>{let r=await Kt();l({data:r,command:"info news hot",source:"cls",toJSON:ba})}).command("stock <code>","\u4E2A\u80A1\u65B0\u95FB\uFF08cls\uFF0Ccode \u6216\u540D\u79F0\uFF09",r=>r,async r=>{let{n:o=10}=r,a=r.code.trim(),s=a;if(!/^(s[hz]\d+|\d{6})$/i.test(a)){let c=(await Se(a,{type:"stock",rn:1}))?.data?.stock?.data?.[0];s=c?.stock_id||c?.descr||a}let i=await Xt(s,{rn:o});l({data:i,command:"info news stock",source:"cls",toJSON:_a})}),async()=>{let e=await Ue(1e3);l({data:e,command:"info news",source:"cls",toJSON:Hn})}).command("topic","\u4E13\u9898",e=>e.strictCommands(!1).command("search <keyword>","\u641C\u7D22\u8BDD\u9898",r=>r,async r=>{let{n:o=10}=r,a=r.keyword,s=await Ae(),i=Array.isArray(s)?s:s?.data||[],u=a.toLowerCase(),c=i.filter(m=>(m.title||"").toLowerCase().includes(u)||(m.short_name||"").toLowerCase().includes(u)||(m.introduction||"").toLowerCase().includes(u));if(!c.length)return l({data:{items:[],total:0,message:`\u672A\u627E\u5230\u5339\u914D "${a}" \u7684\u4E13\u9898`},command:"info topic search",source:"jin10"});let p=C(c.slice(0,o));l({data:p,command:"info topic search",source:"jin10",toJSON:Fn})}).command("groups","\u8BDD\u9898\u5206\u7EC4",r=>r,async()=>{let r=await Ae();l({data:r,command:"info topic groups",source:"jin10",toJSON:Sa})}).command("hot","\u8D22\u8054\u793E\u9898\u6750",r=>r,async()=>{let r=await Gt();l({data:r,command:"info topic hot",source:"cls",toJSON:o=>wa(C(o))})}).command("show <id>","\u4E13\u9898\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async r=>{let{n:o=10}=r,a=r.id,s=W(),i=s?{cookie:s}:void 0,u=new Set,c=[],p=1,m=50;for(;c.length<o&&p<=m;){let g=(await hn(a,{page:p},i))?.data?.list||[];if(!g.length)break;let h=0;for(let _ of g)u.has(_.id)||(u.add(_.id),c.push(_),h++);if(h===0)break;p++,c.length<o&&await new Promise(_=>setTimeout(_,200))}let f=C(c);l({data:f,command:"info topic show",source:"jin10",toJSON:y=>({items:y.map(g=>({time:g.display_datetime,title:g.title,author:g.author?.nick,vip:g.vip})),total:y.length})})}),async e=>{let{n:r=10}=e,o=await Ae(),a=C(Array.isArray(o)?o:o?.data||[]);if(a=a.slice(0,r),!a.length)return l({data:{items:[],total:0},command:"info topic",source:"jin10"});l({data:a,command:"info topic",source:"jin10",toJSON:Fn})}).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",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:a="cls",type:s}=r,i=r.keyword;if(a==="jin10"){let c=await Ve({keyword:i,type:s&&s!=="all"?s:"all",offset:0});l({data:c,command:"info search",source:"jin10",toJSON:Bn})}else{let c=await Se(i,{type:s||"all",rn:Math.max(o,20)});l({data:c,command:"info search",source:"cls",toJSON:Un})}}).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,a=await Ut(o);l({data:a,command:"info search detail",source:"cls",toJSON:Na})}),async e=>{let{n:r=20,src:o="cls",type:a}=e,s=e.keyword||e._?.[2];if(!s)return l({data:{error:"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD"},command:"info search",source:"cls"});if(o==="jin10"){let u=await Ve({keyword:s,type:a&&a!=="all"?a:"all",offset:0});l({data:u,command:"info search",source:"jin10",toJSON:Bn})}else{let u=await Se(s,{type:a||"all",rn:Math.max(r,20)});l({data:u,command:"info search",source:"cls",toJSON:Un})}}),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 zn from"fs";import Aa from"path";import Oa from"os";var Wn=Aa.join(Oa.homedir(),".xueqiu-anon-cookie"),Qn="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",T="stock.xueqiu.com",Ta="xueqiu.com";function D(n){return n.trim().toUpperCase()}var va="https://xueqiu.com/hq";function qa(){try{let n=zn.readFileSync(Wn,"utf-8").trim();return n&&/acw_tc=/.test(n)?n:null}catch{return null}}function Pa(n){let t=n.headers;return typeof t.getSetCookie=="function"?t.getSetCookie():(t.get("set-cookie")||"").split(/,(?=\s*[A-Za-z_-]+=)/)}function ja(n){let t=n.map(e=>{let r=e.indexOf("=");if(r<0)return"";let o=e.slice(0,r).trim();if(!o)return"";let a=e.slice(r+1).split(";")[0];return`${o}=${a}`}).filter(Boolean);return t.length?t.join("; "):null}async function Gn(){let n=await fetch(va,{headers:{"User-Agent":Qn,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=ja(Pa(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{zn.writeFileSync(Wn,t,"utf-8")}catch{}return t}function $a(n){return String(n?.error_code??n?.code)==="400016"}async function Ca(n,t,e,r,{token:o=!0,ua:a}={}){let s=o?qa()??await Gn():null,i=0,u=async p=>{let m={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":a||Qn,Origin:"https://xueqiu.com",Referer:"https://xueqiu.com/"};p&&(m.Cookie=p);let f={method:n,headers:m,redirect:"follow"};r&&(f.body=new URLSearchParams(r).toString(),m["Content-Type"]="application/x-www-form-urlencoded");let y=await fetch(`https://${t}${e}`,f);i=y.status;try{return await y.json()}catch{return null}},c=await u(s);if(o&&($a(c)||c===null||i===401)&&(c=await u(await Gn())),c===null)throw new Error(`\u96EA\u7403\u63A5\u53E3\u8FD4\u56DE\u975E JSON \u54CD\u5E94\uFF08HTTP ${i}\uFF09\uFF0C\u53EF\u80FD\u88AB WAF \u62E6\u622A\u6216\u533F\u540D\u4EE4\u724C\u5931\u6548`);return c}function N(n,t,e={}){return Ca("GET",n,t,null,e)}function Xn(n){return N(T,`/v5/stock/realtime/quotec.json?symbol=${n.map(D).join(",")}`,{token:!1})}function bt(n){return N(T,`/v5/stock/realtime/pankou.json?symbol=${D(n)}`)}var Da={d:"day",w:"week",m:"month",y:"year",q:"quarter"};function Vn(n,{period:t="day",count:e=284}={}){let r=Da[t]||t,o=Date.now();return N(T,`/v5/stock/chart/kline.json?symbol=${D(n)}&begin=${o}&period=${r}&type=before&count=-${e}&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance`)}function _t(n,{period:t="1d"}={}){return N(T,`/v5/stock/chart/minute.json?symbol=${D(n)}&period=${t}`)}function wt(n,{count:t=50}={}){return N(T,`/v5/stock/history/trade.json?symbol=${D(n)}&count=${t}`)}function Zn(n){return N(T,`/v5/stock/quote/relevant.json?symbol=${D(n)}`)}function er(n){return N(Ta,`/query/v1/suggest_stock.json?q=${encodeURIComponent(n)}`)}function tr({category:n="cn"}={}){return N(T,`/v5/stock/screener/industries.json?category=${n}`)}function nr(n={}){let{page:t=1,size:e=30,order:r="desc",order_by:o="percent",market:a="CN"}=n,s=new URLSearchParams({page:String(t),size:String(e),order:r,order_by:o,market:a});return n.ind_code&&s.set("ind_code",n.ind_code),n.type&&s.set("type",n.type),N(T,`/v5/stock/screener/quote/list.json?${s.toString()}`)}function rr(n){return N(T,`/v5/stock/hq/longhu.json?date=${n}`)}function or(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return N(T,`/v5/stock/finance/${a}/indicator.json?symbol=${D(n)}&type=${r}&is_detail=${o}&count=${e}`)}function ar(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return N(T,`/v5/stock/finance/${a}/cash_flow.json?symbol=${D(n)}&type=${r}&is_detail=${o}&count=${e}`)}function sr(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return N(T,`/v5/stock/finance/${a}/income.json?symbol=${D(n)}&type=${r}&is_detail=${o}&count=${e}`)}function ir(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return N(T,`/v5/stock/finance/${a}/balance.json?symbol=${D(n)}&type=${r}&is_detail=${o}&count=${e}`)}function St(n,{circula:t=1}={}){return N(T,`/v5/stock/f10/cn/top_holders.json?symbol=${D(n)}&circula=${t}`)}function ye(n){return N(T,`/v5/stock/f10/cn/indicator.json?symbol=${D(n)}`)}function cr(n){return N(T,`/v5/stock/f10/cn/industry.json?symbol=${D(n)}`)}function kt(n,{page:t=1,size:e=10}={}){return N(T,`/v5/stock/f10/cn/bonus.json?symbol=${D(n)}&page=${t}&size=${e}`)}function xt(n){return N(T,`/v5/stock/capital/flow.json?symbol=${D(n)}`)}function ur(n,{count:t=20}={}){return N(T,`/v5/stock/capital/history.json?symbol=${D(n)}&count=${t}`)}function lr(n,{page:t=1,size:e=180}={}){return N(T,`/v5/stock/capital/margin.json?symbol=${D(n)}&page=${t}&size=${e}`)}function mr(n){return N(T,`/v5/stock/batch/quote.json?symbol=${n.map(D).join(",")}&extend=detail&is_delay_hk=true`)}function ge(n){let t=n.result||{},e=(r,o)=>({label:r,netBuy:o?.netBuyTurnover??null,netBuyText:o?.netBuyTurnoverText||null,turnover:o?.tradValSum??null,status:o?.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 pr="https://query1.finance.yahoo.com/v8/finance/chart",Ea="https://query1.finance.yahoo.com/v1/finance/search",Ra="https://finance.yahoo.com/quote",Ja={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9"},Nt={"User-Agent":"Mozilla/5.0"};function ee(n){let t=n.trim().toUpperCase();return t?/^(SH|SZ)\d{6}$/.test(t)?t.startsWith("SH")?`${t.slice(2)}.SS`:`${t.slice(2)}.SZ`:/^\d{6}\.(SS|SH)$/.test(t)?`${t.slice(0,6)}.SS`:/^\d{6}\.SZ$/.test(t)?t:/^\d{6}$/.test(t)?t.startsWith("6")?`${t}.SS`:`${t}.SZ`:/^\d{4,5}\.HK$/.test(t)?t:/^\d{1,5}$/.test(t)?`${t.padStart(4,"0")}.HK`:(/^\d{4}\.T$/.test(t)||/^\d{6}\.(KS|KQ)$/.test(t),t):""}function d(n){return n==null?null:typeof n=="object"?"raw"in n?n.raw??null:null:n}function Ma(n){return n==null?null:typeof n=="object"?"fmt"in n?n.fmt??null:null:String(n)}function je(n){let t=d(n);if(!t||typeof t!="number")return Ma(n)||null;let e=t>1e11?t:t*1e3;try{return new Date(e).toISOString().slice(0,10)}catch{return null}}async function fr(n){let t=ee(n),e=`${Ra}/${encodeURIComponent(t)}/`;try{let r=await fetch(e,{headers:Ja});if(r.status!==200)return null;let a=[...(await r.text()).matchAll(/<script[^>]*>(.*?)<\/script>/gs)],s=null,i=null;for(let u of a){let c=u[1].trim();if(c.startsWith('{"status":200'))try{let p=JSON.parse(c);if(p.body){let m=JSON.parse(p.body);if(m.quoteSummary?.result?.[0]&&(s=m.quoteSummary.result[0]),Array.isArray(m.quoteResponse?.result)){let f=m.quoteResponse.result.find(y=>y.symbol?.toUpperCase()===t.toUpperCase());f&&(i=f)}}}catch{}}return{quoteSummary:s,quoteResponse:i}}catch{return null}}function yr(n,t){let e=n.quoteSummary?.price||{},r=n.quoteSummary?.summaryDetail||{},o=n.quoteResponse||{},a=d(e.regularMarketPrice)??d(o.regularMarketPrice)??0,s=d(e.regularMarketPreviousClose)??d(r.regularMarketPreviousClose)??d(o.regularMarketPreviousClose)??0,i=d(e.regularMarketChange)??a-s,u=d(e.regularMarketChangePercent)!=null?d(e.regularMarketChangePercent)*100:s===0?0:i/s*100;if(!a&&!s)return null;let c=d(e.preMarketPrice)??d(o.preMarketPrice),p=d(e.preMarketChange)??d(o.preMarketChange),m=d(e.preMarketChangePercent)??d(o.preMarketChangePercent),f=d(e.preMarketTime)??d(o.preMarketTime),y=d(e.postMarketPrice)??d(o.postMarketPrice),g=d(e.postMarketChange)??d(o.postMarketChange),h=d(e.postMarketChangePercent)??d(o.postMarketChangePercent),_=d(e.postMarketTime)??d(o.postMarketTime),A=c!=null?{price:c,change:p!=null?Math.round(p*100)/100:s?Math.round((c-s)*100)/100:null,changePercent:m!=null?Math.round(m*(Math.abs(m)<1?1e4:100))/100:0,time:f?new Date(f*1e3).toISOString():null}:null,q=y!=null?{price:y,change:g!=null?Math.round(g*100)/100:a?Math.round((y-a)*100)/100:null,changePercent:h!=null?Math.round(h*(Math.abs(h)<1?1e4:100))/100:0,time:_?new Date(_*1e3).toISOString():null}:null;return{symbol:e.symbol||o.symbol||t,name:e.shortName||e.longName||o.shortName||o.longName||"",price:a,prevClose:s,change:i,changePercent:u,open:d(e.regularMarketOpen)??d(r.open),high:d(e.regularMarketDayHigh)??d(r.dayHigh),low:d(e.regularMarketDayLow)??d(r.dayLow),volume:d(e.regularMarketVolume)??d(r.volume),avgVolume:d(r.averageVolume),marketCap:d(e.marketCap)??d(r.marketCap),pe:d(r.trailingPE),forwardPE:d(r.forwardPE),beta:d(r.beta),fiftyTwoWeekHigh:d(r.fiftyTwoWeekHigh),fiftyTwoWeekLow:d(r.fiftyTwoWeekLow),dividendYield:d(r.dividendYield)!=null?d(r.dividendYield)*100:null,preMarket:A,postMarket:q,currency:e.currency||r.currency||o.currency||"",exchange:e.exchangeName||o.fullExchangeName||"",marketState:e.marketState||o.marketState||"",quoteType:e.quoteType||o.quoteType||""}}function Ia(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary.summaryProfile||{},r=n.quoteSummary.price||{},o=Array.isArray(e.companyOfficers)?e.companyOfficers.map(a=>({name:a.name||"",title:a.title||"",age:d(a.age),totalPay:d(a.totalPay)})):[];return{symbol:r.symbol||t,name:r.shortName||r.longName||"",sector:e.sector||e.sectorDisp||null,industry:e.industry||e.industryDisp||null,website:e.website||null,phone:e.phone||null,address:e.address1||null,city:e.city||null,state:e.state||null,country:e.country||null,zip:e.zip||null,employees:d(e.fullTimeEmployees),description:e.longBusinessSummary||null,officers:o}}function La(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary,r=e.defaultKeyStatistics||{},o=e.summaryDetail||{},a=e.financialData||{},s=e.price||{};return{symbol:s.symbol||t,name:s.shortName||s.longName||"",marketCap:d(s.marketCap)??d(o.marketCap),enterpriseValue:d(r.enterpriseValue),trailingPE:d(o.trailingPE),forwardPE:d(r.forwardPE)??d(o.forwardPE),pegRatio:d(r.pegRatio),priceToBook:d(r.priceToBook),priceToSales:d(r.priceToSalesTrailing12Months)??d(o.priceToSalesTrailing12Months),enterpriseToRevenue:d(r.enterpriseToRevenue),enterpriseToEbitda:d(r.enterpriseToEbitda),profitMargins:d(r.profitMargins)!=null?d(r.profitMargins)*100:d(a.profitMargins)!=null?d(a.profitMargins)*100:null,operatingMargins:d(a.operatingMargins)!=null?d(a.operatingMargins)*100:null,grossMargins:d(a.grossMargins)!=null?d(a.grossMargins)*100:null,ebitdaMargins:d(a.ebitdaMargins)!=null?d(a.ebitdaMargins)*100:null,returnOnAssets:d(a.returnOnAssets)!=null?d(a.returnOnAssets)*100:null,returnOnEquity:d(a.returnOnEquity)!=null?d(a.returnOnEquity)*100:null,totalRevenue:d(a.totalRevenue),revenuePerShare:d(a.revenuePerShare),quarterlyRevenueGrowth:d(a.revenueGrowth)!=null?d(a.revenueGrowth)*100:null,grossProfits:d(a.grossProfits),ebitda:d(a.ebitda),netIncome:d(r.netIncomeToCommon),dilutedEps:d(r.trailingEps),quarterlyEarningsGrowth:d(a.earningsGrowth)!=null?d(a.earningsGrowth)*100:null,totalCash:d(a.totalCash),totalCashPerShare:d(a.totalCashPerShare),totalDebt:d(a.totalDebt),debtToEquity:d(a.debtToEquity),currentRatio:d(a.currentRatio),quickRatio:d(a.quickRatio),bookValuePerShare:d(r.bookValue),operatingCashflow:d(a.operatingCashflow),freeCashflow:d(a.freeCashflow),sharesOutstanding:d(r.sharesOutstanding),floatShares:d(r.floatShares),sharesShort:d(r.sharesShort),shortRatio:d(r.shortRatio),shortPercentOfFloat:d(r.shortPercentOfFloat)!=null?d(r.shortPercentOfFloat)*100:null,heldPercentInsiders:d(r.heldPercentInsiders)!=null?d(r.heldPercentInsiders)*100:null,heldPercentInstitutions:d(r.heldPercentInstitutions)!=null?d(r.heldPercentInstitutions)*100:null,beta:d(r.beta)??d(o.beta),dividendRate:d(o.dividendRate),dividendYield:d(o.dividendYield)!=null?d(o.dividendYield)*100:null,exDividendDate:je(o.exDividendDate),payoutRatio:d(o.payoutRatio)!=null?d(o.payoutRatio)*100:null,fiveYearAvgDividendYield:d(o.fiveYearAvgDividendYield),currency:a.financialCurrency||s.currency||"USD"}}function Ya(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary,r=e.financialData||{},o=e.recommendationTrend||{},a=e.upgradeDowngradeHistory||{},s=e.price||{},i=(Array.isArray(o.trend)?o.trend:[]).map(p=>({period:p.period||"",strongBuy:Number(p.strongBuy??0),buy:Number(p.buy??0),hold:Number(p.hold??0),sell:Number(p.sell??0),strongSell:Number(p.strongSell??0)})),c=(Array.isArray(a.history)?a.history:[]).slice(0,30).map(p=>({date:je(p.epochGradeDate)||"",firm:p.firm||"",action:p.action||"",toGrade:p.toGrade||"",fromGrade:p.fromGrade||"",priceTargetAction:p.priceTargetAction||null,currentPriceTarget:d(p.currentPriceTarget),priorPriceTarget:d(p.priorPriceTarget)}));return{symbol:s.symbol||t,name:s.shortName||s.longName||"",targetPrice:{current:d(r.currentPrice)??d(s.regularMarketPrice),high:d(r.targetHighPrice),low:d(r.targetLowPrice),mean:d(r.targetMeanPrice),median:d(r.targetMedianPrice),analystsCount:d(r.numberOfAnalystOpinions)},recommendation:{key:r.recommendationKey||null,mean:d(r.recommendationMean)},trend:i,upgradesDowngrades:c}}function Ha(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary,r=e.calendarEvents||{},o=e.earnings||{},a=e.price||{},s=[],i=r.earnings?.earningsDate||o.earningsChart?.earningsDate||[];Array.isArray(i)&&(s=i.map(g=>je(g)).filter(Boolean));let u=o.earningsChart?.quarterly||[],c=(Array.isArray(u)?u:[]).map(g=>({quarter:g.date||"",calendarQuarter:g.calendarQuarter||void 0,reportedDate:je(g.reportedDate)||void 0,actual:d(g.actual),estimate:d(g.estimate),difference:typeof g.difference=="string"?Number(g.difference):d(g.difference),surprisePct:typeof g.surprisePct=="string"?Number(g.surprisePct):d(g.surprisePct)})),p=o.financialsChart?.yearly||[],m=(Array.isArray(p)?p:[]).map(g=>({year:Number(g.date||0),revenue:d(g.revenue),earnings:d(g.earnings),profitMargin:d(g.profitMargin)!=null?d(g.profitMargin)*100:null})),f=o.financialsChart?.quarterly||[],y=(Array.isArray(f)?f:[]).map(g=>({quarter:g.date||"",revenue:d(g.revenue),earnings:d(g.earnings),profitMargin:d(g.profitMargin)!=null?d(g.profitMargin)*100:null}));return{symbol:a.symbol||t,name:a.shortName||a.longName||"",currency:o.financialCurrency||a.currency||"USD",earningsDates:s,isEarningsDateEstimate:r.earnings?.isEarningsDateEstimate??o.earningsChart?.isEarningsDateEstimate,quarterlyHistory:c,financialsYearly:m,financialsQuarterly:y}}async function he(n){let t=ee(n);if(!t)return null;try{let r=await fr(t);if(r?.quoteSummary||r?.quoteResponse){let o=yr(r,t);if(o)return o}}catch{}let e=`${pr}/${encodeURIComponent(t)}?interval=1d&range=1d&includePrePost=true`;try{let r=await fetch(e,{headers:Nt});if(r.ok||r.status===200||!r.status){let s=(await r.json())?.chart?.result?.[0]?.meta;if(s?.symbol){let i=Number(s.regularMarketPrice??0),u=Number(s.chartPreviousClose??0),c=i-u,p=u===0?0:c/u*100,m={symbol:s.symbol,name:s.shortName||s.longName||"",price:i,prevClose:u,change:c,changePercent:p,currency:s.currency||"",exchange:s.exchangeName||"",marketState:s.marketState||""};if(s.regularMarketOpen!=null&&(m.open=Number(s.regularMarketOpen)),s.regularMarketDayHigh!=null&&(m.high=Number(s.regularMarketDayHigh)),s.regularMarketDayLow!=null&&(m.low=Number(s.regularMarketDayLow)),s.regularMarketVolume!=null&&(m.volume=Number(s.regularMarketVolume)),s.fiftyTwoWeekHigh!=null&&(m.fiftyTwoWeekHigh=Number(s.fiftyTwoWeekHigh)),s.fiftyTwoWeekLow!=null&&(m.fiftyTwoWeekLow=Number(s.fiftyTwoWeekLow)),s.instrumentType&&(m.quoteType=s.instrumentType),s.preMarketPrice!=null){let f=Number(s.preMarketPrice);m.preMarket={price:f,change:u?f-u:null,changePercent:u?(f-u)/u*100:0,time:s.preMarketTime?new Date(Number(s.preMarketTime)*1e3).toISOString():null}}if(s.postMarketPrice!=null){let f=Number(s.postMarketPrice);m.postMarket={price:f,change:i?f-i:null,changePercent:i?(f-i)/i*100:0,time:s.postMarketTime?new Date(Number(s.postMarketTime)*1e3).toISOString():null}}return m}}}catch{return null}return null}async function At(n){let t=ee(n);if(!t)return null;let e=await fr(t),r=e?yr(e,t):null;if(r||(r=await he(t)),!r)return null;let o=e?Ia(e,t):null,a=e?La(e,t):null,s=e?Ya(e,t):null,i=e?Ha(e,t):null;return{symbol:r.symbol,name:r.name,quote:r,profile:o,stats:a,analysis:s,earnings:i}}async function $e(n,t="1d",e=120){let r=ee(n);if(!r)return null;let o="1d",a="1y";switch(t.toLowerCase()){case"1m":o="1m",a="5d";break;case"5m":o="5m",a="1mo";break;case"15m":o="15m",a="1mo";break;case"30m":o="30m",a="1mo";break;case"60m":case"1h":o="60m",a="3mo";break;case"d":case"1d":o="1d",a=e>250?"5y":e>60?"1y":"6mo";break;case"w":case"1w":o="1wk",a="5y";break;case"m":case"1m_month":case"1mo":o="1mo",a="10y";break;default:o="1d",a="1y"}let s=`${pr}/${encodeURIComponent(r)}?interval=${o}&range=${a}&includePrePost=false`;try{let i=await fetch(s,{headers:Nt});if(i.status!==200)return null;let c=(await i.json())?.chart?.result?.[0];if(!c?.timestamp||!c?.indicators?.quote?.[0])return null;let p=c.timestamp,m=c.indicators.quote[0],f=m.open||[],y=m.high||[],g=m.low||[],h=m.close||[],_=m.volume||[],A=[],q=["1m","5m","15m","30m","60m"].includes(o);for(let O=0;O<p.length;O++){let x=h[O];if(x==null||!Number.isFinite(x))continue;let se=p[O]*1e3,V=new Date(se),J=q?V.toISOString():V.toISOString().slice(0,10);A.push({date:J,open:f[O]??x,high:y[O]??x,low:g[O]??x,close:x,volume:_[O]??0,change:O>0&&h[O-1]!=null?x-h[O-1]:0})}let I=A.slice(-e);return{symbol:c.meta?.symbol||r,period:t,items:I,total:I.length}}catch{return null}}async function Ot(n,t=10){let e=`${Ea}?q=${encodeURIComponent(n)}"esCount=${t}&newsCount=5&enableFuzzyQuery=true`;try{let r=await fetch(e,{headers:Nt});if(r.status!==200)return null;let o=await r.json(),a=(o.quotes||[]).map(i=>({symbol:i.symbol||"",name:i.shortname||i.longname||"",exchange:i.exchange||i.exchDisp||"",quoteType:i.quoteType||"",industry:i.industry||null,sector:i.sector||null,score:i.score??null})).filter(i=>i.symbol),s=(o.news||[]).map(i=>({uuid:i.uuid||"",title:i.title||"",publisher:i.publisher||"",link:i.link||"",publishTime:i.providerPublishTime?new Date(i.providerPublishTime*1e3).toISOString():"",thumbnail:i.thumbnail?.resolutions?.[0]?.url||null}));return{quotes:a,news:s,total:a.length}}catch{return null}}var gr={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"},hr=new Set(["d","w","m","y","5d","1m","5m","10m","15m","30m","60m","120m"]);function Ce(n){let t=String(n??"").trim().toLowerCase();if(gr[t])return gr[t];if(hr.has(t))return t;let e=t.match(/^(\d+)\s*(?:min|minute|minutes)$/);if(e){let r=`${e[1]}m`;if(hr.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 br="Asia/Shanghai";function K(n){return new Date(n).toLocaleDateString("en-CA",{timeZone:br})}function be(n){return new Date(n).toLocaleString("sv-SE",{timeZone:br,hour12:!1}).replace(" ","T")+"+08:00"}function _r(n={}){return b("/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 wr(n={}){return b("/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 Sr(n={}){return b("/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 kr(){return b("/api/a-share/special-data/limit-up-ladder")}function xr(n="day"){return b("/api/a-share/special-data/skyrocket-list",{period:n})}function Nr(n="day"){return b("/api/a-share/special-data/hot-stock-list",{period:n})}function Ar(n){return b("/api/a-share/special-data/hot-stock-list-history",{date:n})}function Or(n,t,e){return b("/api/a-share/special-data/hot-stock-rank-trend",{thscode:S(n),start_date:t,end_date:e})}function Tr(n){return b("/api/a-share/special-data/anomaly-analysis-list",{tag_codes:n?.join(",")})}function vr(n){return b("/api/a-share/special-data/anomaly-analysis-stock",{thscodes:n.map(S).join(",")})}function qr(n={}){return b("/api/a-share/special-data/dragon-tiger-list",{board_type:n.boardType,date:n.date})}function Pr(n,t="final"){return b("/api/a-share/auction/snapshot",{thscodes:n.map(S).join(","),stage:t})}function jr(n){return b("/api/a-share/auction/short-term-benchmark",{date:n})}function Ua(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 Ba(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 Ka(n){let t=n?.data||{},e=Number(t.last_px??0);return!!(t.secu_name||t.secu_code)&&Number.isFinite(e)&&e!==0}function Ga(n){if(!n)return!1;let t=Number(n.current??n.price??0);return!!(n.symbol||n.name)&&Number.isFinite(t)&&t!==0}function za(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 Kr(n){let t=n.map(za),e,r;try{e=await mr(t),r=e?.data?.items||[],r.length&&r[0]?.quote&&(r=r.map(o=>({...o.quote,market:o.market})))}catch{e=await Xn(t),r=e?.data||e?.items||[]}return r}async function Wa(n){let t=await Kr([n]);return t[0]?.quote||t[0]||null}function qt(n){return{code:n.symbol,name:n.name,price:n.price,change:n.change,changePercent:n.changePercent!=null?Math.round(n.changePercent*100)/100:0,open:n.open??null,high:n.high??null,low:n.low??null,preclose:n.prevClose,volume:n.volume??null,avgVolume:n.avgVolume??null,marketCap:n.marketCap??null,pe:n.pe??null,forwardPE:n.forwardPE??null,eps:n.eps??null,beta:n.beta??null,fiftyTwoWeekHigh:n.fiftyTwoWeekHigh??null,fiftyTwoWeekLow:n.fiftyTwoWeekLow??null,dividendYield:n.dividendYield??null,preMarket:n.preMarket?{price:n.preMarket.price,change:n.preMarket.change??null,changePercent:n.preMarket.changePercent!=null?Math.round(n.preMarket.changePercent*100)/100:0,time:n.preMarket.time??null,volume:n.preMarket.volume??null}:null,postMarket:n.postMarket?{price:n.postMarket.price,change:n.postMarket.change??null,changePercent:n.postMarket.changePercent!=null?Math.round(n.postMarket.changePercent*100)/100:0,time:n.postMarket.time??null,volume:n.postMarket.volume??null}:null,currency:n.currency,exchange:n.exchange,marketState:n.marketState,status:n.marketState==="REGULAR"?"trading":"closed",source:"yahoo"}}function Qa(n){return{code:n.symbol,name:n.name,quote:qt(n.quote),profile:n.profile?{sector:n.profile.sector,industry:n.profile.industry,website:n.profile.website,phone:n.profile.phone,address:[n.profile.address,n.profile.city,n.profile.state,n.profile.country].filter(Boolean).join(", "),employees:n.profile.employees,description:n.profile.description,officers:n.profile.officers}:null,stats:n.stats,analysis:n.analysis,earnings:n.earnings,source:"yahoo"}}function Q(){return!!de()}function Pt(n){return vn(n)||/^88\d{4}$/.test(n.trim())}function Tt(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 vt(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 $r(n,t,e){return{code:S(n),period:"d",adjust:e||"none",items:t.map(r=>({date:K(r.date_ms),open:r.open_price??null,high:r.high_price??null,low:r.low_price??null,close:r.close_price??null,volume:r.volume??0,amount:r.turnover??0})),total:t.length}}async function Cr(n,t,e){let r=Date.now(),o=r-t*1.6*864e5;return((Pt(n)?await jn(n,{start:o,end:r}):await qn(n,{start:o,end:r,adjust:e}))?.item||[]).slice(-t)}var Gr=new Set(["1m","5m","15m","30m","60m","120m"]);function Xa(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 Va(n,t,e){return{code:n,period:t,items:e.map(r=>({date:Xa(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:e.length}}function Za(n,t,e){let r=Gr.has(t);return{code:n,period:t,items:e.map(o=>({date:r?be(o[0]):K(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:e.length}}function Dr(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 Er(n,t){let e=t.current??0,r=t.percent??0,o=r!==0?e/(1+r/100):0;return{code:n,current:e,preclose:o,asks:[1,2,3,4,5].map(a=>({price:Number(t[`sp${a}`]||0),volume:Number(t[`sc${a}`]||0)})),bids:[5,4,3,2,1].map(a=>({price:Number(t[`bp${a}`]||0),volume:Number(t[`bc${a}`]||0)})),buyPercent:t.buypct??null,sellPercent:t.sellpct??null,buySellRatio:t.ratio??null,source:"xq"}}function Rr(n,t){let e=t?.data?.volume||[],r=t?.data?.end||e.length;return{code:n,items:e.map(o=>{let a=String(o.minute),s=a.length<=3?"0"+a[0]:a.slice(0,2),i=a.length<=3?a.slice(1):a.slice(2),u=a.slice(-2);return{time:`${s}:${i}:${u}`,price:Number(o.last_px||0),volume:Number(o.change_vol||0),side:o.change_vol_color===1?"buy":"sell"}}),total:r}}function Jr(n,t){let e=t?.data?.items||[];return{code:n,items:e.slice(0,50).map(r=>({time:be(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:e.length}}function Mr(n,t){let e=t?.data||{},r=e.line||[],o=Number(e.preclose_px||0);return{code:n,preclose:o,items:r.map(a=>{let s=String(a.minute),i=s.length<=3?"0"+s[0]:s.slice(0,2),u=s.length<=3?s.slice(1):s.slice(2),c=Number(a.last_px||0);return{time:`${i}:${u}`,price:c,avgPrice:Number(a.av_px||0),changePercent:o>0?(c-o)/o*100:0,amount:Number(a.business_balance||0)}}),total:r.length}}function Ir(n,t){let e=t?.data?.items||[];return{code:n,items:e.slice(0,240).map(r=>({time:be(r.timestamp),price:Number(r.current||0),volume:Number(r.volume||0),avgPrice:Number(r.avg_price||0)})),total:e.length}}function es(n){let t=n?.data||{},e=t.company||{};return{name:e.org_name_cn||"",industry:(t.industry||[]).map(r=>r.ind_name),concept:(t.concept||[]).map(r=>r.ind_name),companyType:e.classi_name||"",region:e.provincial_name||"",listedDate:e.listed_date||"",controller:e.actual_controller||"",mainBusiness:e.main_operation_business||""}}function ts(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 Lr(n){let t=n?.data||{},e=t.items||[];return{items:e.map(r=>({time:r.timestamp?K(r.timestamp):"",amount:Number(r.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 ns(n){let t=n?.data?.items||[];return{items:t.map(e=>({date:e.td_date?K(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 rs(n){let t=Array.isArray(n?.data)?n.data:[];return{items:t.map(e=>({title:e.title||"",date:e.time||(e.timestamp?K(e.timestamp):""),url:e.url||"",source:"cls"})),total:t.length}}function os(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?K(e.anncDate1):e.anncDate2||"",source:e.source||"\u6295\u8D44\u8005\u4E92\u52A8"})),total:n?.total??t.length}}function Yr(n){let t=n?.data?.items||n?.data||[];return{items:t.map((e,r)=>({rank:r+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?K(e.ashare_ex_dividend_date):"",equityDate:e.equity_date?K(e.equity_date):"",plan:e.plan_explain||""})),total:t.length}:{items:[],total:0}}function _e(n){return Array.isArray(n)?n[0]:n}function as(n){let t=n?.data||{},e=t.list||[];return{name:t.quote_name||"",items:e.map(r=>({report:r.report_name||"",roe:_e(r.avg_roe),eps:_e(r.basic_eps),grossMargin:_e(r.gross_selling_rate),revenueYoy:_e(r.operating_income_yoy)})),total:e.length}}function De(n){let t=n?.data?.items?.[0];if(!t)return{items:[],total:0};let e=r=>r==null||r===""?null:Number(r);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 ss(n,t){let e=n?.data||{},r=e.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"]},a={cashflow:["report","operating","investing","financing","netIncrease"],income:["report","revenue","netProfit","netProfitAttrib","netProfitDeducted"],balance:["report","totalAssets","totalLiab","debtRatio","equity"]},s=o[t]||o.cashflow,i=a[t]||a.cashflow;return{name:e.quote_name||"",type:t,items:r.map(u=>{let c={report:u.report_name||""};for(let p=1;p<s.length;p++)c[i[p]]=_e(u[s[p]]);return c}),total:r.length}}function Fr(n){let t=n?.data||n?.list||[],e={1:"stock",2:"fund",3:"index"};return{items:t.map(r=>({code:r.code||r.symbol||"",name:r.query||r.name||r.cn_name||"",type:r.type?e[r.type]||String(r.type):""})),total:t.length}}function is(n){let e=(n?.data||{}).items||[];return{items:e.map(r=>({time:r.timestamp?be(r.timestamp):"",amount:Number(r.amount||0)})),total:e.length}}function cs(n){let t=(n?.data?.industries||[]).map(e=>({code:e.encode||"",name:e.name||"",pinyin:e.pinyin||""}));return{items:t,total:t.length}}function Ur(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 Br(n){let t=[],e,r=1,o=12;for(;t.length<n.n&&r<=o;){let a=await nr({page:r,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(a?.error_code)throw new Error(`\u96EA\u7403\u7B5B\u9009\u63A5\u53E3\u9519\u8BEF: ${a.error_description||a.error_code}`);let s=a?.data?.list||[];if(e=a?.data?.count??e,!s.length)break;t.push(...s),r++}return{list:t,count:e}}function zr(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("detail <code>","\u6DF1\u5EA6\u7EFC\u5408\u8BE6\u60C5\uFF08\u516C\u53F8\u6982\u51B5/\u6838\u5FC3\u4F30\u503C/\u5206\u6790\u5E08\u8BC4\u7EA7/\u4E1A\u7EE9\u5386\u53F2\uFF0CYahoo\uFF09",e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 AAPL / NVDA / TSLA / 0700.HK"}),async e=>{let r=e.code,o=await At(r);if(!o)throw new Error(`Yahoo \u65E0\u6CD5\u83B7\u53D6 ${r} \u7684\u6DF1\u5EA6\u8BE6\u60C5`);l({data:o,command:`quote detail ${r}`,source:"yahoo",toJSON:()=>Qa(o)})}).command("related <code>","\u5173\u8054\u80A1\u7968\uFF08xueqiu\uFF09",e=>e,async e=>{let r=e.code,a=await Zn(r),s=a?.data?.items||a?.data||[];l({data:a,command:`quote related ${r}`,source:"xq",toJSON:()=>({items:s.map(i=>({code:i.symbol||"",name:i.name||"",price:i.current??0,changePercent:Math.round((i.percent??0)*100)/100,relation:i.relation||""}))})})}).command("search <keyword>","\u641C\u7D22\u80A1\u7968\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1/\u5168\u7403\u8BC1\u5238\uFF1Bxq / fuyao / yahoo \u591A\u6E90\u515C\u5E95\uFF09",e=>e,async e=>{let r=e.keyword,o;try{o=await er(r)}catch(i){if(!Q())throw i;o=null}if((o?.data?.stocks||o?.data||[]).length){l({data:o,command:`quote search ${r}`,source:"xq",toJSON:Fr});return}if(Q())try{let i=await Cn(r,{limit:20});if(i?.item?.length){l({data:i,command:`quote search ${r}`,source:"fuyao fallback",toJSON:u=>({items:(u?.item||[]).map(c=>({code:c.thscode||"",name:c.name||"",type:c.asset_type||"",exchange:c.exchange??null})),total:u?.item?.length??0})});return}}catch{}let s=await Ot(r,20);if(s&&s.quotes.length){l({data:s,command:`quote search ${r}`,source:"yahoo fallback",toJSON:i=>({items:i.quotes.map(u=>({code:u.symbol,name:u.name,type:u.quoteType,exchange:u.exchange})),total:i.quotes.length})});return}l({data:o,command:`quote search ${r}`,source:"xq",toJSON:Fr})}).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:r=30}=e,o=e.ind_code,a=String(e.market??"cn").toLowerCase(),s=e["order-by"]??"percent",i=e.order??"desc";if(!o){let p=await tr({category:a});if(p?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${p.error_description||p.error_code}`);return l({data:p,command:`quote industry --market ${a}`,source:"xq",toJSON:cs})}let{list:u,count:c}=await Br({n:r,order:i,order_by:s,market:a.toUpperCase(),ind_code:o});l({data:{list:u},command:`quote industry ${o} --market ${a}`,source:"xq",toJSON:()=>Ur(u,c)})}).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 r=e.code,o=r.length<=6?r.toUpperCase().startsWith("SH")||r.toUpperCase().startsWith("SZ")?r:r.toUpperCase():r,a=await cr(o);l({data:a,command:`quote industry-profile ${r}`,source:"xq",toJSON:es})}).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:r=30}=e,o=e.type,a=e["order-by"]??"percent",s=e.order??"desc",i=o==="hk"?"HK":o==="us"||o==="us_china"?"US":"CN",{list:u,count:c}=await Br({n:r,order:s,order_by:a,market:i,type:o});l({data:{list:u},command:`quote board ${o}`,source:"xq",toJSON:()=>Ur(u,c)})}).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","yahoo"],describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u53EF\u7528 xq \u6216 yahoo\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:r="d",n:o=120,src:a}=e,s=e.adjust||e.a||"none",i=e.code,u;try{u=Ce(r)}catch(y){return l({data:{error:y.message},command:`quote kline ${i} -p ${r}`,source:"finflow"})}let c=Gr.has(u);if(a==="yahoo"){let y=await $e(i,u,o);if(y&&y.items.length)return l({data:y.items,command:`quote kline ${i} -p ${u} --src yahoo`,source:"yahoo",toJSON:()=>({code:y.symbol,period:u,items:y.items,total:y.total})});throw new Error(`Yahoo \u65E0\u6CD5\u83B7\u53D6 ${i} \u7684 K \u7EBF\u6570\u636E`)}if(a==="fuyao"||s!=="none"||Pt(i)){if(!Q())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(c)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 y=await Cr(i,o,s!=="none"?s:void 0);l({data:y,command:`quote kline ${i} -p d${s!=="none"?` --adjust ${s}`:""}`,source:"fuyao",toJSON:()=>$r(i,y,s)});return}let m=a==="xq"||!a&&c,f=async y=>{if(y){let O=await Vn(i,{period:u,count:o}),x=O?.data?.item||O?.data||[];return{items:x,toJSON:()=>Za(i,u,x),source:"xq"}}let g=u==="w"?"w":u==="m"?"m":u==="y"?"y":"d",h=[],_,A=0,q=50;for(;h.length<o&&A++<q;){let x=(await Wt(i,{period:g,limit:Math.min(o-h.length,200),start_date:_}))?.data||[];if(!x.length)break;h=[...x,...h],_=String(x[0].trade_date)}let I=h.slice(-o);return{items:I,toJSON:()=>Va(i,g,I),source:"cls"}};try{let y=await f(m);l({data:y.items,command:`quote kline ${i} -p ${u}`,source:y.source,toJSON:y.toJSON})}catch(y){if(c&&!a)throw y;try{let g=await f(!m);l({data:g.items,command:`quote kline ${i} -p ${u}`,source:`${g.source} fallback`,toJSON:g.toJSON})}catch{if(Q()&&Tt(i)&&!c){let h=await Cr(i,o);l({data:h,command:`quote kline ${i} -p d`,source:"fuyao fallback",toJSON:()=>$r(i,h)});return}let g=await $e(i,u,o);if(g&&g.items.length){l({data:g.items,command:`quote kline ${i} -p ${u}`,source:"yahoo fallback",toJSON:()=>({code:g.symbol,period:u,items:g.items,total:g.total})});return}throw y}}}).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:r="cls"}=e,o=e.code,a=r;try{if(a==="xq"){let s=await bt(o);return l({data:s,command:`quote depth ${o} --src xq`,source:"xq",toJSON:i=>Er(o,i?.data||{})})}else{let s=await Ke(o);return l({data:s,command:`quote depth ${o}`,source:"cls",toJSON:i=>Dr(o,i?.data||{})})}}catch{if((a==="xq"?"cls":"xq")==="xq"){let i=await bt(o);l({data:i,command:`quote depth ${o} --src xq`,source:"xq fallback",toJSON:u=>Er(o,u?.data||{})})}else{let i=await Ke(o);l({data:i,command:`quote depth ${o}`,source:"cls fallback",toJSON:u=>Dr(o,u?.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:r="cls"}=e,o=e.code,a=r;try{if(a==="xq"){let s=await wt(o);return l({data:s,command:`quote ticks ${o} --src xq`,source:"xq",toJSON:i=>Jr(o,i)})}else{let s=await Ge(o);return l({data:s,command:`quote ticks ${o}`,source:"cls",toJSON:i=>Rr(o,i)})}}catch{if((a==="xq"?"cls":"xq")==="xq"){let i=await wt(o);l({data:i,command:`quote ticks ${o} --src xq`,source:"xq fallback",toJSON:u=>Jr(o,u)})}else{let i=await Ge(o);l({data:i,command:`quote ticks ${o}`,source:"cls fallback",toJSON:u=>Rr(o,u)})}}}).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:r="cls"}=e,o=e.code,a=r;try{if(a==="xq"){let s=await _t(o,{period:"1d"});return l({data:s,command:`quote timeline ${o} --src xq`,source:"xq",toJSON:i=>Ir(o,i)})}else{let s=await ze(o);return l({data:s,command:`quote timeline ${o}`,source:"cls",toJSON:i=>Mr(o,i)})}}catch{if((a==="xq"?"cls":"xq")==="xq"){let i=await _t(o,{period:"1d"});l({data:i,command:`quote timeline ${o} --src xq`,source:"xq fallback",toJSON:u=>Ir(o,u)})}else{let i=await ze(o);l({data:i,command:`quote timeline ${o}`,source:"cls fallback",toJSON:u=>Mr(o,u)})}}}).command("flow [code]","\u8D44\u91D1\u6D41\u5411",e=>e.positional("code",{type:"string"}).strictCommands(!1).command("market","\u5317\u5411/\u5357\u5411\u8D44\u91D1",r=>r,async()=>{let r=await ue();l({data:r,command:"quote flow market",source:"glh",toJSON:ge})}).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,a=r.code,s=await ur(a,{count:o});l({data:s,command:`quote flow history ${a}`,source:"xq",toJSON:Lr})}).command("margin <code>","\u878D\u8D44\u878D\u5238",r=>r,async r=>{let o=r.code,a=await lr(o);l({data:a,command:`quote flow margin ${o}`,source:"xq",toJSON:ns})}).command("intraday <code>","\u5F53\u65E5\u8D44\u91D1\u6D41\u5411\uFF08xueqiu\uFF09",r=>r,async r=>{let o=r.code,s=await xt(o);l({data:s,command:`quote flow intraday ${o}`,source:"xq",toJSON:Lr})}).command("xq <code>","\u96EA\u7403\u8D44\u91D1\u6D41",r=>r,async r=>{let o=r.code,s=await xt(o);l({data:s,command:`quote flow xq ${o}`,source:"xq",toJSON:is})}),async e=>{let{code:r}=e;if(r){let o=await Qt(r);l({data:o,command:`quote flow ${r}`,source:"cls",toJSON:ts})}else{let o=await ue();l({data:o,command:"quote flow market",source:"glh",toJSON:ge})}}).command("f10 [code]","\u57FA\u672C\u9762\uFF08\u9ED8\u8BA4\u4E3B\u8981\u6307\u6807\uFF0C\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF09",e=>e.positional("code",{type:"string"}).strictCommands(!1).command("holders <code>","\u5341\u5927\u80A1\u4E1C",r=>r,async r=>{let o=r.code;try{let s=await St(o);if(s?.data?.items?.length)return l({data:s,command:`quote f10 holders ${o}`,source:"xq",toJSON:Yr})}catch{}let a=await St(o);l({data:a,command:`quote f10 holders ${o}`,source:"xq",toJSON:Yr})}).command("bonus <code>","\u5206\u7EA2\u9001\u80A1",r=>r,async r=>{let o=r.code;try{let i=await kt(o);if(i?.data?.items?.length)return l({data:i,command:`quote f10 bonus ${o}`,source:"xq",toJSON:Hr})}catch{}let a=await fetchYahooStats(o);if(a)return l({data:a,command:`quote f10 bonus ${o}`,source:"yahoo fallback",toJSON:()=>({items:[{dividendRate:a.dividendRate,dividendYield:a.dividendYield,exDividendDate:a.exDividendDate,payoutRatio:a.payoutRatio}],total:1})});let s=await kt(o);l({data:s,command:`quote f10 bonus ${o}`,source:"xq",toJSON:Hr})}).command("indicator <code>","\u4E3B\u8981\u6307\u6807",r=>r,async r=>{let o=r.code;try{let i=await ye(o);if(i?.data?.indicator)return l({data:i,command:`quote f10 indicator ${o}`,source:"xq",toJSON:De})}catch{}let a=await fetchYahooStats(o);if(a)return l({data:a,command:`quote f10 indicator ${o}`,source:"yahoo fallback",toJSON:()=>yahooStatsToJSON(a)});let s=await ye(o);l({data:s,command:`quote f10 indicator ${o}`,source:"xq",toJSON:De})}).command("profile <code>","\u516C\u53F8\u8D44\u6599\u4E0E\u9AD8\u7BA1",r=>r,async r=>{let o=r.code,a=await fetchYahooProfile(o);if(!a)throw new Error(`\u65E0\u6CD5\u83B7\u53D6 ${o} \u7684\u516C\u53F8\u8D44\u6599`);l({data:a,command:`quote f10 profile ${o}`,source:"yahoo",toJSON:()=>yahooProfileToJSON(a)})}),async e=>{let r=e.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"});try{let s=await ye(r);if(s?.data?.indicator)return l({data:s,command:`quote f10 indicator ${r}`,source:"xq",toJSON:De})}catch{}let o=await fetchYahooStats(r);if(o)return l({data:o,command:`quote f10 indicator ${r}`,source:"yahoo fallback",toJSON:()=>yahooStatsToJSON(o)});let a=await ye(r);l({data:a,command:`quote f10 indicator ${r}`,source:"xq",toJSON:De})}).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 r=e.codes,o=e.live?"live":"final",a=await Pr(r,o),s=a?.item||[];l({data:a,command:`quote auction ${r.join(" ")}`,source:"fuyao",toJSON:()=>({phase:a?.auction_phase||"",dataStatus:a?.data_status||"",items:s.map(i=>({code:i.thscode||"",name:i.name||"",price:i.auction_price??null,changePercent:X(i.auction_pct),volume:i.auction_volume??null,amount:i.auction_amount??null,unmatched:i.auction_unmatched??null,turnoverRate:X(i.auction_turnover_pct),volumeRatio:i.auction_volume_ratio??null,preClose:i.pre_close_price??null,floatMarketCap:i.float_market_cap??null})),total:a?.total??s.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 r=e.code,o=e.p??1,a=await en(r,{page:o});l({data:a,command:`quote announcement ${r}`,source:"cls",toJSON:rs})}).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 r=e.code,o=e.p??1,a=e.s??15,s=e.k??"",i=await tn(r,{page:o,pageSize:a,keyWord:s});l({data:i,command:`quote interaction ${r}`,source:"cls",toJSON:os})}).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:r="indicator",src:o="xq"}=e,a=e.code;if(o==="fuyao"){let{period:s="annual",limit:i=4}=e,{start:u,end:c}=e,p=u&&c?{period:s,start:Date.parse(`${u}T00:00:00+08:00`),end:Date.parse(`${c}T00:00:00+08:00`)}:{period:s,limit:i},m=r==="income"?Jn:r==="balance"?Mn:r==="cashflow"?In:null;if(!m)return l({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 ${r} ${a} --src fuyao`,source:"fuyao"});let f=await m(a,p);l({data:f,command:`quote finance ${r} ${a} --src fuyao --period ${s}`,source:"fuyao",toJSON:y=>({code:S(a),type:r,period:s,items:(y?.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:y?.item?.length??0})});return}if(r==="indicator"){let s=await or(a);l({data:s,command:`quote finance indicator ${a}`,source:"xq",toJSON:as})}else{let i={cashflow:ar,income:sr,balance:ir}[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 u=await i(a);l({data:u,command:`quote finance ${r} ${a}`,source:"xq",toJSON:c=>ss(c,r)})}}).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 r=e.codes;if(r.length>100)throw new Error("\u4F30\u503C\u5FEB\u7167\u5355\u6B21\u6700\u591A 100 \u53EA");let o=await Yn(r);l({data:o,command:`quote valuation ${r.join(" ")}`,source:"fuyao",toJSON:a=>({items:(a?.item||[]).map(s=>({code:s.thscode||"",name:s.name??null,peTtm:X(s.pe_ttm),peMrq:X(s.pe_mrq),pb:X(s.pb_mrq),ps:X(s.ps_ttm),pcf:X(s.pcf_ttm)})),total:a?.total??a?.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 r=e.code,o=`${new Date().getFullYear()-1}-4`,a=e.report||o,s=await Ln(r,a),i={growth:"\u6210\u957F",profitability:"\u76C8\u5229",solvency:"\u507F\u503A",operation:"\u8425\u8FD0","cash-flow":"\u73B0\u91D1\u6D41"};l({data:s,command:`quote indicators ${r} ${a}`,source:"fuyao",toJSON:u=>({code:u?.thscode||S(r),report:a,abilities:(u?.abilities||[]).map(c=>({ability:i[c.ability]||c.ability,indicators:(c.indicators||[]).map(p=>({id:p.index_id,value:p.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 r=e.code,{from:o,to:a}=e,s=await Rn(r,{from:o,to:a});l({data:s,command:`quote adjust ${r}`,source:"fuyao",toJSON:i=>({code:i?.thscode||S(r),items:(i?.item||[]).map(u=>({exDate:u.ex_date_ms?new Date(u.ex_date_ms).toISOString().slice(0,10):null,dividendPerShare:u.dividend_per_share??null,perShareBonus:u.per_share_bonus??null})),total:i?.item?.length??0})})}),handler:async t=>{let e=t.codes||[];if(!e.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","valuation","indicators","adjust","detail"];if(e.length===1&&r.includes(e[0]))return l({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(c=>Pt(c))){if(!Q())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 c=await Pn(e),p=c?.item||[];l({data:c,command:`quote ${e.join(" ")}`,source:"fuyao",toJSON:()=>({items:p.map(m=>vt(m,"fuyao")),total:p.length})});return}if(e.length>1){let c=[];try{c=await Kr(e)}catch{c=[]}if(c.length){l({data:c,command:`quote ${e.join(" ")}`,source:"xq",toJSON:()=>Ba(c)});return}if(Q()&&e.every(Tt)){let p=await pe(e),m=p?.item||[];l({data:p,command:`quote ${e.join(" ")}`,source:"fuyao fallback",toJSON:()=>({items:m.map(vt),total:m.length})});return}throw new Error(`\u96EA\u7403\u65E0\u6CD5\u83B7\u53D6 ${e.join(" ")} \u7684\u6279\u91CF\u884C\u60C5${Q()?"":"\uFF08\u914D\u7F6E\u6276\u6447 key \u53EF\u542F\u7528 A \u80A1\u515C\u5E95\uFF1Afinflow key set fuyao\uFF09"}`)}let o=e[0],a=o.trim().toUpperCase();if(/^[A-Z]{1,5}$/.test(a)&&!a.startsWith("SH")&&!a.startsWith("SZ"))try{let c=await he(a);if(c){l({data:c,command:`quote ${o}`,source:"yahoo",toJSON:()=>qt(c)});return}}catch{}try{let c=await zt(o);if(Ka(c)){l({data:c,command:`quote ${o}`,source:"cls",toJSON:Ua});return}}catch{}let i=null;try{i=await Wa(o)}catch{}if(Ga(i)){l({data:i,command:`quote ${o}`,source:"xq fallback",toJSON:c=>({code:c.symbol||"",name:c.name||"",price:c.current??0,change:c.chg??0,changePercent:Math.round((c.percent??0)*100)/100,open:c.open??0,high:c.high??0,low:c.low??0,preclose:c.last_close??0,volume:c.volume??0,amount:c.amount??0,turnoverRate:c.turnover_rate??0,amplitude:c.amplitude??0,avgPrice:c.avg_price??0,volumeRatio:c.volume_ratio??0,pe:c.pe_ttm??null,pb:c.pb??null,marketCap:c.market_capital??0,change3d:null,change5d:null,status:c.status===1?"trading":"closed",source:"xq fallback"})});return}if(Q()&&Tt(o))try{let p=(await pe([o]))?.item?.[0];if(p&&p.last_price!=null){l({data:p,command:`quote ${o}`,source:"fuyao fallback",toJSON:vt});return}}catch{}let u=ee(o);if(u){let c=await he(u);if(c){l({data:c,command:`quote ${o}`,source:"yahoo fallback",toJSON:()=>qt(c)});return}}if(i){l({data:i,command:`quote ${o}`,source:"xq fallback",toJSON:c=>({code:c.symbol||"",name:c.name||"",price:c.current??0,change:c.chg??0,changePercent:Math.round((c.percent??0)*100)/100,open:c.open??0,high:c.high??0,low:c.low??0,preclose:c.last_close??0,volume:c.volume??0,amount:c.amount??0,turnoverRate:c.turnover_rate??0,amplitude:c.amplitude??0,avgPrice:c.avg_price??0,volumeRatio:c.volume_ratio??0,pe:c.pe_ttm??null,pb:c.pb??null,marketCap:c.market_capital??0,change3d:null,change5d:null,status:c.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 us(n){let t=n?.data||{},e=t.limit_up_board||{},r=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: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 Wr(n){let t=n.result||[],e=t.filter(o=>o.category==="\u6307\u6570"),r=t.filter(o=>o.category==="\u6CAA\u6E2F\u6DF1\u901A");return{indices:e.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 ls(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 ms(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 jt(n){return Date.parse(`${n}T00:00:00+08:00`)}var G=n=>n==null?null:Math.round(n*100)/100;function ds(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:G(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 ps(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:G(e.price_change_ratio_pct),firstLimitTime:e.first_limit_time||"",lastLimitTime:e.last_limit_time||"",turnoverRate:G(e.turnover_ratio_pct)})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}function fs(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:G(e.price_change_ratio_pct),openTimes:e.open_times??null,turnoverRate:G(e.turnover_ratio_pct),amount:e.turnover??null})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}var ys=[["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 gs(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(ys.map(([r,o])=>[o,(e.boards?.[r]||[]).map(a=>({code:a.thscode||"",name:a.name||"",boardNum:a.board_num??null,sealNextday:a.seal_nextday??null}))]))})),total:t.length}}function Qr(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 hs(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 bs(n){let t=n?.item||[];return{items:t.map(e=>({date:e.date||"",rank:e.rank??null})),total:t.length}}function _s(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 ws(n){let t=n?.stock_items||[],e=n?.hot_money_items||[];return{tradeDate:n?.trade_date||"",boardType:n?.board_type||"all",items:t.map(r=>({code:r.thscode||"",name:r.name||"",changePercent:G((r.change??0)*100),netBuy:r.net_value??null,netRate:G((r.net_rate??0)*100),buy:r.buy_value??null,sell:r.sell_value??null,orgNetBuy:r.org_net_value??null,orgBuyNum:r.org_buy_num??null,orgSellNum:r.org_sell_num??null,hotRank:r.hot_rank??null,reason:r.limit_reason??null,rangeDays:r.range_days??null,concepts:(r.concept_list||[]).map(o=>o.name||"")})),hotMoneyItems:e.map(r=>({name:r.name||"",netBuy:r.buying??null,stocks:(r.rows||[]).map(o=>({code:o.thscode||"",name:o.name||"",changePercent:G((o.change??0)*100)}))})),total:n?.stock_count??t.length}}function Ss(n){let t=n?.item||[];return{date:n?.date||"",items:t.map(e=>({code:e.thscode||"",name:e.name||"",changePercent:G(e.auction_pct),tags:e.tags||[]})),total:t.length}}function Xr(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 Vt();l({data:e,command:"market emotion",source:"cls",toJSON:us})}).command("index","\u5927\u76D8\u6307\u6570\uFF08glh\uFF09",e=>e,async()=>{let e=await at();l({data:e,command:"market index",source:"glh",toJSON:Wr})}).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 r=e.sort,o=e.order||"desc",a=Sn(r),s=await wn({sort:a.id,order:o});l({data:s,command:"market hk",source:"glh",toJSON:ls})}).command("flow","\u6CAA\u6DF1\u6E2F\u901A\u8D44\u91D1\u6D41\u5411",e=>e,async()=>{let e=await ue();l({data:e,command:"market flow",source:"glh",toJSON:ge})}).command("rates","\u5168\u7403\u592E\u884C\u5229\u7387\uFF08jin10\uFF09",e=>e,async()=>{let e=await un(),r=e?.data?.list||[];l({data:e,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\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 r=e.date||void 0,o=e.board||"all";if(de()){let c=await qr({boardType:o,date:r});l({data:c,command:`market longhu${r?` ${r}`:""}`,source:"fuyao",toJSON:ws});return}let a=r||j(),s=a.split("-").map(Number),i=Date.UTC(s[0],(s[1]||1)-1,s[2]||1)-480*60*1e3;if(!Number.isFinite(i))throw new Error(`\u65E0\u6548\u65E5\u671F: ${a}\uFF08\u683C\u5F0F YYYY-MM-DD\uFF09`);let u=await rr(i);if(u?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${u.error_description||u.error_code}`);l({data:u,command:`market longhu ${a}`,source:"xq",toJSON:ms})}).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 r=Math.min(Number(e.n)||50,200),o=e.date||void 0,a=await _r({dateMs:o?jt(o):void 0,size:r,sortField:e.sort||"continue_day_cnt",sortDir:e.dir||"desc"});l({data:a,command:`market limitup${o?` ${o}`:""}`,source:"fuyao",toJSON:ds})}).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 r=Math.min(Number(e.n)||50,200),o=e.date||void 0,a=await wr({dateMs:o?jt(o):void 0,size:r,sortField:e.sort||void 0,sortDir:e.dir||void 0});l({data:a,command:`market limitdown${o?` ${o}`:""}`,source:"fuyao",toJSON:ps})}).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 r=Math.min(Number(e.n)||50,200),o=e.date||void 0,a=await Sr({dateMs:o?jt(o):void 0,size:r,sortField:e.sort||void 0,sortDir:e.dir||void 0});l({data:a,command:`market limitbreak${o?` ${o}`:""}`,source:"fuyao",toJSON:fs})}).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 kr();l({data:e,command:"market ladder",source:"fuyao",toJSON:gs})}).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 r=e.date,o=r?await Ar(r):await Nr(e.hour?"hour":"day");l({data:o,command:`market hot${r?` ${r}`:""}`,source:"fuyao",toJSON:r?hs:Qr})}).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 r=await xr(e.hour?"hour":"day");l({data:r,command:"market skyrocket",source:"fuyao",toJSON:Qr})}).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 r=e.code,o=Math.min(Math.max(Number(e.days)||30,1),365),a=new Date,s=new Date(a.getTime()-o*864e5),i=c=>c.toISOString().slice(0,10),u=await Or(r,i(s),i(a));l({data:u,command:`market hot-trend ${r}`,source:"fuyao",toJSON:bs})}).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 r=(e.targets||[]).filter(Boolean),a=r.length>0&&r.every(s=>/^((sh|sz|bj)?\d{6}|\d{6}\.(sh|sz|bj))$/i.test(s.trim()))?await vr(r):await Tr(r);l({data:a,command:`market anomaly${r.length?` ${r.join(" ")}`:""}`,source:"fuyao",toJSON:_s})}).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 r=e.date||void 0,o=await jr(r);l({data:o,command:`market benchmark${r?` ${r}`:""}`,source:"fuyao",toJSON:Ss})}),handler:async()=>{let t=await at();l({data:t,command:"market",source:"glh",toJSON:Wr})}})}function ks(n){let t=n?.data||[];return{items:t.map(e=>{let r=e.symbol_code||"",o=/^cls/i.test(r)?"plate":"stock";return{time:e.c_time?e.c_time.slice(11,16):"",code:r,name:e.symbol_name||"",kind:o,direction:e.float==="up"?"up":e.float==="down"?"down":"",articleId:e.article_id??null}}),total:t.length}}function Vr(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 Zr(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 eo(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 to={concept:"cn_concept",industry:"industry",region:"region",tszs:"tszs"},xs={cn_concept:"\u6982\u5FF5",industry:"\u884C\u4E1A",region:"\u533A\u57DF",tszs:"\u7279\u8272"};function Ns(n){return{items:n.map(t=>({code:t.code||"",name:t.name||"",type:t.type||""})),total:n.length}}function no(n){return{items:n.map(t=>({code:t.thscode||"",name:t.name||""})),total:n.length}}function ro(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 r=e.date||j(),o=await Zt({date:r});l({data:o,command:`sector anchor ${r}`,source:"cls",toJSON:ks})}).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:r="industry"}=e,o=await Be({type:r}),a=Array.isArray(o?.data)?o.data:[];l({data:o,command:`sector rank -t ${r}`,source:"cls",toJSON:()=>Vr(a,r)})}).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 r=e.code,o=await We(r),a=Array.isArray(o?.data)?o.data:[];l({data:o,command:`sector plate ${r}`,source:"cls",toJSON:()=>Zr(a)})}).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:r="change"}=e,o=e.plate_code;if(/^88\d{4}(\.TI)?$/i.test(o.trim())||/\.TI$/i.test(o.trim())){let s=await pt(o),i=s?.item||[];l({data:s,command:`sector stocks ${o}`,source:"fuyao",toJSON:()=>no(i)});return}let a=await Qe(o,{way:r});l({data:a,command:`sector stocks ${o}`,source:"cls",toJSON:eo})}).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:r=30}=e,o=String(e.name||"").trim(),a=e.type||e.t,s=a?[a]:o?["concept","industry"]:["concept"],i=await Promise.all(s.map(p=>$n(to[p]))),u=new Set,c=[];i.forEach((p,m)=>{for(let f of p?.item||[]){let y=f.thscode||"";u.has(y)||(u.add(y),(!o||String(f.name||"").includes(o))&&c.push({code:y,name:f.name||"",type:xs[to[s[m]]]||s[m]}))}}),l({data:{hits:c},command:`sector search${o?` ${o}`:""}`,source:"fuyao",toJSON:()=>Ns(c.slice(0,r))})}),handler:async t=>{let{code:e}=t;if(e)if(/^88\d{4}(\.TI)?$/i.test(e.trim())){let r=await pt(e),o=r?.item||[];l({data:r,command:`sector ${e}`,source:"fuyao",toJSON:()=>no(o)})}else if(/^cls/i.test(e)){let r=await Qe(e,{way:"change"});l({data:r,command:`sector ${e}`,source:"cls",toJSON:eo})}else{let r=await We(e),o=Array.isArray(r?.data)?r.data:[];l({data:r,command:`sector ${e}`,source:"cls",toJSON:()=>Zr(o)})}else{let r=await Be({type:"industry"}),o=Array.isArray(r?.data)?r.data:[];l({data:r,command:"sector",source:"cls",toJSON:()=>Vr(o,"industry")})}}})}import{inflateSync as As}from"zlib";var Os="wss://wss-flash-2.jin10.com/",Ee={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},Re={LOGIN:4002,CACHE_DATA:2006,CALENDAR_DATA:2001,CALENDAR_EVENT:2003,CALENDAR_HOLIDAY:2004,CALENDAR_HOLIDAY_PAGE:2005},ae=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 r=0;r<e.length;r++)this.dv.setUint8(this.pos++,e[r])}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 oo(n,t){let e;n instanceof Uint8Array?e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength):e=new Uint8Array(n);let r=new Uint8Array(e.length),o=t.charCodeAt(0);for(let a=0;a<e.length;a++)r[a]=e[a]^t.charCodeAt((a+o)%t.length);return r.buffer}function Ts(n,t){return oo(n,t)}function vs(n){try{return As(Buffer.from(n,"base64")).toString("utf-8")}catch{return null}}var $t=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 r=setTimeout(()=>{this.ws?.close(),e(new Error("WebSocket \u8FDE\u63A5\u8D85\u65F6"))},this.timeout);this.ws=new WebSocket(Os),this.ws.binaryType="arraybuffer",this.ws.onmessage=o=>{let a=o.data;if(!this.encryptKey){let c=new ae(a);c.rU32L();let p=c.rU32L(),m=c.rU32L();this.encryptKey=`${m}.${p}`,this._sendLogin();return}let s=oo(a,this.encryptKey),i=new ae(s),u=i.r16L();if(u===Re.LOGIN){clearTimeout(r),t();return}if(u===Re.CACHE_DATA){i.rU32L(),i.rStrL();let c=i.rU32L(),p=i.rStrL(),m=this._pending.get(c);if(m){this._pending.delete(c),clearTimeout(m.timer);try{let f=JSON.parse(p);if(f.data){let y=vs(f.data);m.resolve(y?JSON.parse(y):null)}else m.resolve(null)}catch(f){m.reject(f)}}}},this.ws.onerror=()=>{clearTimeout(r),e(new Error("WebSocket \u8FDE\u63A5\u5931\u8D25"))}})}_sendLogin(){let t=new ae;t.w16L(Re.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(),r=this.encryptKey?Ts(e,this.encryptKey):e;this.ws.send(r)}_request(t,e){return new Promise((r,o)=>{let a=this.requestId++,s=setTimeout(()=>{this._pending.delete(a),o(new Error("\u8BF7\u6C42\u8D85\u65F6"))},this.timeout);this._pending.set(a,{resolve:r,reject:o,timer:s});let i=new ae;i.w16L(Re.CACHE_DATA),i.wU32L(t),i.wStrL(e),i.wU32L(a),this._send(i)})}close(){this.ws?.close(),this.ws=null,this.encryptKey="",this._pending.clear()}getFuturesData(t){return this._request(Ee.QH_DATA,t)}getHKStockData(t){return this._request(Ee.HK_DATA,t)}getUSStockData(t){return this._request(Ee.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(Ee.A_SHARE,e.join("&"))}};async function ao(n){let t=new $t(n);return await t.connect(),t}async function Ct(n,...t){let e=await ao();try{return await e[n](...t)}finally{e.close()}}function Je(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 qs(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 Ps(n){let t=n?.data?.data||n?.data,e=Array.isArray(t)?t:t?Object.values(t):[];return{items:e.map(r=>({date:(r.date||"").slice(5,16),market:r.exchange_name||"",name:r.name||"",note:r.rest_note||""})),total:e.length}}function js(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(r=>({name:r.name,code:r.code})),regions:(e.region||[]).map(r=>({name:r.name}))})),total:t.length}}function $s(n){let t=n?.data||[];return{items:t.map(e=>({time:e.public_time||"",country:e.country||"",event:e.eventcontent||""})),total:t.length}}function Cs(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 so(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 En(),r=e?.item||[];l({data:e,command:"calendar trading",source:"fuyao",toJSON:()=>({items:r.map(o=>({date:/^\d{8}$/.test(o.date||"")?`${o.date.slice(0,4)}-${o.date.slice(4,6)}-${o.date.slice(6,8)}`:o.date})),total:r.length})})}).command("macro [date]","\u5168\u7403\u5B8F\u89C2\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||j(),o=W(),a=await tt(r,"cj",o?{cookie:o}:void 0);l({data:a,command:`calendar macro ${r}`,source:"jin10",toJSON:s=>Je(s?.data||[])})}).command("event [date]","\u5B8F\u89C2\u5927\u4E8B\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||j(),o=W(),a=await dn(r,"cj",o?{cookie:o}:void 0);l({data:a,command:"calendar event",source:"jin10",toJSON:qs})}).command("holiday [date]","\u5168\u7403\u5047\u671F\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||j(),o=W(),a=await pn(r,"cj",o?{cookie:o}:void 0);l({data:a,command:"calendar holiday",source:"jin10",toJSON:Ps})}).command("ashare","A\u80A1\u5927\u4E8B\uFF08jin10\uFF09",e=>e,async()=>{let e=await Ct("getAShareData",{page:1});l({data:e,command:"calendar ashare",source:"jin10",toJSON:js})}).command("hk [date]","\u6E2F\u80A1\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||j(),o=await Ct("getHKStockData",r);l({data:o,command:"calendar hk",source:"jin10",toJSON:a=>Je(Array.isArray(a)?a:[])})}).command("us [date]","\u7F8E\u80A1\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||j(),o=await Ct("getUSStockData",r);l({data:o,command:"calendar us",source:"jin10",toJSON:a=>Je(Array.isArray(a)?a:[])})}).command("future-event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||j(),o=await xe(r);l({data:o,command:"calendar future-event",source:"jin10",toJSON:$s})}).command("future-holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||j(),o=await Ne(r);l({data:o,command:"calendar future-holiday",source:"jin10",toJSON:Cs})}),handler:async()=>{let t=j(),e=W(),r=await tt(t,"cj",e?{cookie:e}:void 0);l({data:r,command:`calendar macro ${t}`,source:"jin10",toJSON:o=>Je(o?.data||[])})}})}var Me={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 Ds(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 Es(n){return{groups:(n?.data?.list||[]).map(e=>({name:e.name||"",items:(e.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 Rs(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 Js(n){let t=n?.data||[];return{items:t.map(e=>({time:xn(e.time),content:qe(e.data?.content||e.data?.title||"",e),importance:e.important??0,source:e.data?.source||"",remark:le(e.remark)||""})),total:t.length}}function io(n){return n.command("future","\u671F\u8D27",t=>t.option("channel",{alias:"c",type:"string",default:"all",describe:`\u9891\u9053: ${Object.keys(Me).join("/")}`}).command("headline","\u671F\u8D27\u5934\u6761",{},async()=>{let e=await fn();l({data:e,command:"future headline",source:"jin10",toJSON:Ds})}).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 r=e.date||j(),o=await gn(r);l({data:o,command:"future basis",source:"jin10",toJSON:Es})}).command("calendar [date]","\u671F\u8D27\u65E5\u5386",e=>e.positional("date",{type:"string"}),async e=>{let r=e.date||j(),o=await yn(r);l({data:o,command:"future calendar",source:"jin10",toJSON:Rs})}).command("event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",e=>e.positional("date",{type:"string"}),async e=>{let r=e.date||j(),o=await xe(r);l({data:o,command:`future event ${r}`,source:"jin10",toJSON:a=>({items:(a?.data||[]).map(i=>({time:i.public_time,country:i.country,event:i.eventcontent}))})})}).command("holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",e=>e.positional("date",{type:"string"}),async e=>{let r=e.date||j(),o=await Ne(r);l({data:o,command:`future holiday ${r}`,source:"jin10",toJSON:a=>({items:(a?.data||[]).map(i=>({time:i.holiday_time,country:i.country,market:i.market,name:i.holiday_name,description:i.description}))})})}),async t=>{let{channel:e="all",n:r=10}=t,o=Me[e];o===void 0&&(console.error(`\u9519\u8BEF: \u4E0D\u652F\u6301\u7684\u9891\u9053 "${e}"\uFF0C\u53EF\u9009: ${Object.keys(Me).join(", ")}`),process.exit(1));let a=new Set,s=[],i=await nt(o);for(let m of i?.data||[])a.has(m.id)||(a.add(m.id),s.push(m));let u=0,c=50;for(;s.length<r&&u++<c;){let m=s[s.length-1];if(!m)break;let y=(await nt(o,{max_time:m.time}))?.data||[];if(!y.length)break;let g=0;for(let h of y)a.has(h.id)||(a.add(h.id),s.push(h),g++);if(g===0)break;s.length<r&&await new Promise(h=>setTimeout(h,200))}let p={...i,data:s};l({data:p,command:"future",source:"jin10",toJSON:Js})})}var Ms="wss://market-ws.jin10.com/",Is=["DCE","CZC","SHF","INE","CF","GFEX"];function Ls(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 H(n,t){return Number(n.readBigInt64LE(t))}function Ys(n){if(n.length<2)return null;let t=2,e=Ls(n,t);if(!e)return null;let r=e.str;if(t=e.end,t+76>n.length)return null;let o=H(n,t)/1e6,a=H(n,t+8)/1e6;H(n,t+16);let s=H(n,t+24),i=H(n,t+32)/1e6,u=H(n,t+40)/1e6,c=H(n,t+48)/1e6,p=H(n,t+56)/1e6,m=H(n,t+64),f=n.readUInt32LE(t+72),y=r.split(".")[1],g=Is.includes(y),h=null,_=t+76;g&&_<n.length&&n[_]===1&&(h=H(n,_+1)/1e6);let A=h??p,q=o-A,I=A?q/A*100:0;return{code:r,snap:{code:r,close:o,prevClose:a,high:i,low:c,open:u,preclose:A,base:A,change:q,changePercent:I,openInterest:s,turnover:m,timestamp:f}}}function co(n,t={}){let e=t.freq??2e3,r=t.timeout??8e3;return new Promise((o,a)=>{if(!n.length)return o(new Map);let s=new Set(n),i=new Map,u=new WebSocket(Ms);u.binaryType="arraybuffer";let c=setTimeout(()=>{try{u.close()}catch{}o(i)},r);u.onopen=()=>{let p=[],m=Buffer.alloc(8);m.writeUInt16LE(10003,0),m.writeUInt32LE(e,2),m.writeUInt16LE(Math.min(n.length,40),6),p.push(m);for(let f of n.slice(0,40)){let y=Buffer.from(f,"utf8"),g=Buffer.alloc(2);g.writeUInt16LE(y.length),p.push(g,y)}u.send(Buffer.concat(p))},u.onmessage=p=>{try{let m=Buffer.from(p.data);if(m.length<2)return;let f=m.readUInt16LE(0);if(f===1100)return;if(f===1200){u.send(Buffer.alloc(0));return}if(f!==10005)return;let y=Ys(m);if(!y)return;if(s.has(y.code)&&i.set(y.code,y.snap),i.size>=s.size){clearTimeout(c);try{u.close()}catch{}o(i)}}catch{}},u.onerror=()=>{clearTimeout(c),o(i)}})}import Hs from"https";import{gunzipSync as Fs}from"zlib";var Us="wss://tm-qtg.jiaoyixia.com",Bs="https://jiaoyixia-market.jin10.com",Rt={"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}},au=Object.fromEntries(Object.entries(Rt).flatMap(([n,t])=>t.kind==="oss"?[[n,t.code]]:[])),Ks=Object.keys(Rt).join("/");function Gs(n,t){let e=[];for(let r of n){let o=Math.floor(Date.parse(r.date)/1e3);if(!Number.isFinite(o))continue;let a=Math.floor(o/t)*t,s=new Date(a*1e3).toISOString(),i=e[e.length-1];!i||i.date!==s?e.push({date:s,open:r.open,high:r.high,low:r.low,close:r.close,volume:r.volume}):(i.high=Math.max(i.high,r.high),i.low=Math.min(i.low,r.low),i.close=r.close,i.volume+=r.volume)}return e}function Dt(n,t){let e=Buffer.alloc(n.length);for(let r=0;r<n.length;r++)e[r]=n[r]^t.charCodeAt(r%t.length);return e}var Ie=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 zs(){return new Ie().wU16(21100).wStr("").wI8(7).wU16(0).wU16(0).wU16(0).wU16(46860).wU32(0).wI8(122).wU32(0).wU32(0).toBuffer()}function Ws(n,t,e,r=8e3){return new Promise((o,a)=>{let s=new WebSocket(Us);s.binaryType="arraybuffer";let i="",u=!1,c=(m,f)=>{if(!u){u=!0,clearTimeout(p);try{s.close()}catch{}m?a(m):o(f)}},p=setTimeout(()=>c(new Error("tm-qtg 10006 \u8D85\u65F6"),[]),r);s.onopen=()=>{let m=Buffer.alloc(6);m.writeInt16LE(912,0),m.writeInt32LE(3063,2),s.send(m)},s.onmessage=m=>{try{let f=Buffer.from(m.data);if(!i){if(f.length<4)return;i=f.readUInt32LE(0).toString(),s.send(Dt(zs(),i));return}if(f.length<2)return;let y=Dt(f,i),g=y.readUInt16LE(0);if(g===21100){setTimeout(()=>{let h=new Ie().wU16(10006).wStr(n).wU8(t).wI64(e).wU16(0).wU8(0);s.send(Dt(h.toBuffer(),i))},400);return}if(g===10006){let h=y.toString("utf8"),_=/([0-9a-f]{32})\.(\d+)\.(\d+)\.(\d+)\.(\d+)/g,A=[],q;for(;q=_.exec(h);)A.push({hash:q[1],count:+q[2],start:+q[3],end:+q[4],idx:+q[5]});c(null,A)}}catch{}},s.onerror=()=>c(new Error("tm-qtg \u8FDE\u63A5\u5931\u8D25"),[])})}async function Et(n,t,e){for(let r=0;r<3;r++)try{return await Ws(n,t,e)}catch{if(r===2)return[];await new Promise(a=>setTimeout(a,300))}return[]}function uo(n,t,e){let r=`${Bs}/${n}/${t}/${e}`;return new Promise(o=>{let a=()=>o([]);Hs.get(r,i=>{if(i.statusCode&&i.statusCode>=300&&i.statusCode<400&&i.headers.location&&i.headers.location!==r)return i.resume(),o(uo(n,t,e));if(!i.statusCode||i.statusCode>=400)return i.resume(),a();let u=[];i.on("data",c=>u.push(c)),i.on("end",()=>{try{let c=Fs(Buffer.concat(u)),p=Math.floor(c.length/48),m=[];for(let f=0;f<p;f++){let y=f*48;m.push({date:new Date(Number(c.readBigUInt64LE(y))*1e3).toISOString(),open:Number(c.readBigInt64LE(y+8))/1e6,high:Number(c.readBigInt64LE(y+16))/1e6,low:Number(c.readBigInt64LE(y+24))/1e6,close:Number(c.readBigInt64LE(y+32))/1e6,volume:Number(c.readBigInt64LE(y+40))})}o(m)}catch{a()}}),i.on("error",a)}).on("error",a)})}var Qs=86400;async function Jt(n,t,e){let r=Rt[n];if(!r)throw new Error(`\u4E0D\u652F\u6301\u7684\u5468\u671F: ${n}\uFF08\u652F\u6301 ${Ks}\uFF09`);let o=t;if(r.kind==="agg"){let a=await Jt(r.from,o,e*r.factor);return{candles:Gs(a.candles,r.sec).slice(-e),source:a.source}}try{let s=[...r.intraday?await Xs(o,r.code):await Vs(o,r.code)].sort((c,p)=>p.start-c.start),i=[],u=new Set;for(let c of s){if(i.length>=e)break;if(u.has(c.hash))continue;u.add(c.hash);let p=await uo(o,r.code,c.hash);for(let m of p)i.some(f=>f.date===m.date)||i.push(m)}return i.sort((c,p)=>c.date<p.date?-1:1),{candles:i.slice(-e),source:"jin10 tm-qtg"}}catch{return{candles:[],source:"jin10 tm-qtg"}}}async function Xs(n,t){let e=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 a=e-o*Qs,s=await Et(n,t,a);if(s.length)return s}return await Et(n,t,0)}async function Vs(n,t,e=12){let r=[],o=new Set,a=0;for(let s=0;s<e;s++){let i=await Et(n,t,a);if(!i.length)break;let u=0;for(let p of i)o.has(p.hash)||(o.add(p.hash),r.push(p),u++);if(u===0)break;a=Math.max(...i.map(p=>p.end))}return r}var Zs=["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 ei(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 lo(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 r=e.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:a=120}=e,s;try{s=Ce(o)}catch(c){return l({data:{error:c.message},command:`price kline ${r} -p ${o}`,source:"finflow"})}let{candles:i,source:u}=await Jt(s,r,a);l({data:{code:r,period:s,items:i,total:i.length},command:`price kline ${r} -p ${s}`,source:u})}),async t=>{let e=t.codes||[],r=e.length?e.map(i=>i.trim()).filter(Boolean):Zs,o=await co(r),a=r.map(i=>o.get(i)).filter(i=>!!i).map(ei),s=r.filter(i=>!o.has(i));l({data:a,command:`price ${e.length?e.join(" "):"(\u9ED8\u8BA4\u770B\u76D8\u5217\u8868)"}`,source:"jin10 market-ws",toJSON:i=>({items:i,total:i.length,...s.length?{missing:s}:{}})})})}var mo={fuyao:async()=>{let t=(await pe(["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 po(n){let t=me(n.id);return{source:n.id,name:n.name,describe:n.describe,envVar:n.env,configured:!!t,origin:t?.origin??null,key:t?dt(t.key):null,path:oe(n.id)}}function Le(n){let t=String(n.source||"").trim().toLowerCase(),e=mt(t);if(!e)throw new Error(`\u672A\u77E5\u6570\u636E\u6E90 "${t}"\u3002\u5F53\u524D\u652F\u6301:${Y.map(r=>r.id).join(", ")}`);return e.id}function fo(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${Y.map(r=>r.id).join(" / ")}`}).positional("key",{type:"string",describe:"API key"}),async e=>{let r=Le(e),o=String(e.key||"").trim();if(!o)throw new Error("\u7F3A\u5C11 key \u53C2\u6570\uFF1Afinflow key set <source> <key>");let a=On(r,o);l({data:{saved:!0,source:r,path:a,key:dt(o)},command:`key set ${r}`,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 r=e.source?Le(e):null,o=r?Y.filter(a=>a.id===r):Y;l({data:{items:o.map(po),total:o.length},command:`key show${r?` ${r}`:""}`,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 r=Le(e),o=Tn(r);l({data:{cleared:o,source:r,path:oe(r)},command:`key clear ${r}`,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 r=e.source?Le(e):null,o=(r?Y.filter(s=>s.id===r):Y).filter(s=>mo[s.id]),a=await Promise.all(o.map(async s=>{let i=me(s.id);if(!i)return{source:s.id,ok:!1,configured:!1,error:`\u672A\u914D\u7F6E key\uFF1A\u8FD0\u884C finflow key set ${s.id} <key> \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF ${s.env}`};try{let u=await mo[s.id]();return{source:s.id,ok:!0,configured:!0,origin:i.origin,...u}}catch(u){return{source:s.id,ok:!1,configured:!0,origin:i.origin,error:u.message}}}));l({data:{items:a,total:a.length,allOk:a.every(s=>s.ok)},command:`key test${r?` ${r}`:""}`,source:"finflow"})}),handler:async()=>{l({data:{items:Y.map(po),total:Y.length},command:"key",source:"finflow"})}})}function ti(n){return/\.OF$/i.test(n.trim())?"otc":"exchange"}function E(n,t){return{fund_type:n||ti(t),thscode:S(t)}}function Mt(n,t){return b("/api/fund/profile/detail",E(t,n))}function yo(n,t={}){return b("/api/fund/performance/nav",{...E(t.fundType,n),range:t.range,nav_type:t.navType})}function go(n,t){return b("/api/fund/performance/returns",E(t,n))}function ho(n,t){return b("/api/fund/performance/drawdowns",E(t,n))}function bo(n,t){return b("/api/fund/portfolio/holdings",E(t,n))}function _o(n,t,e,r){return b("/api/fund/portfolio/stock-history",{...E(r,n),report_type:t,end_date:e})}function wo(n,t,e,r){return b("/api/fund/portfolio/bond-history",{...E(r,n),report_type:t,end_date:e})}function So(n,t,e){return b("/api/fund/portfolio/stock-report-dates",{...E(e,n),report_type:t})}function ko(n,t){return b("/api/fund/portfolio/asset-allocation",E(t,n))}function xo(n,t){return b("/api/fund/portfolio/industry-allocation",E(t,n))}function No(n,t,e){return b("/api/fund/holders/detail",{...E(e,n),merge_scope:t})}function Ao(n,t,e){return b("/api/fund/holders/top",{...E(e,n),limit:t})}function Oo(n){return b("/api/fund/managers/detail",{manager_id:n})}function To(n){return b("/api/fund/managers/investment-style",{manager_id:n})}function vo(n,t){return b("/api/fund/managers/performance",{manager_id:n,range:t})}function qo(n){return b("/api/fund/managers/experience",{manager_id:n})}function Po(n){return b("/api/fund/companies/detail",{company_id:n})}function jo(n,t){return b("/api/fund/financials/indicators",E(t,n))}function $o(n,t){return b("/api/fund/financials/income-statements",E(t,n))}function Co(n,t){return b("/api/fund/financials/balance-sheets",E(t,n))}function Do(n,t){return b("/api/fund/corporate-actions/dividends",E(t,n))}function Eo(n,t){return b("/api/fund/diagnostics/detail",E(t,n))}function Ro(n){return b("/api/fund/offerings/list",{subscribe:n})}function Jo(n,t={}){return b("/api/fund/news/article-list",{...E(t.fundType,n),limit:t.limit,offset:t.offset})}function Mo(n){return b("/api/fund/market/snapshot",{thscode:S(n)})}function Io(n,t,e){return b("/api/fund/market/historical",{thscode:S(n),interval:"1d",start:t,end:e})}function k(n){return typeof n=="number"?new Date(n).toISOString():null}var w=n=>n==null?null:Math.round(n*100)/100;function R(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 P(n){return n.type||void 0}function ri(n){let t=n?.item?.[0]||{};return{code:t.thscode||"",name:t.fund_name||"",established:k(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:w(e.return_pct??e.profit??null),start:k(e.start_date_ms??e.start_ms)??e.start_date??null,end:k(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 oi(n){let t=n?.item||[];return{items:t.map(e=>({date:k(e.nav_date)?.slice(0,10)??null,unitNav:e.unit_nav??null,adjNav:e.adj_nav??null})),total:t.length}}var Lo=["week","month","tmonth","hyear","year","twoyear","tyear","fyear","nowyear","now"],Yo={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 ai(n){let t=n?.item?.[0]||{},e={};for(let r of Lo){let o=t[`return_${r}`],a=t[`peer_average_${r}`],s=t[`rank_${r}`],i=t[`rank_total_${r}`];o===void 0&&a===void 0&&s===void 0||(e[Yo[r]]={returnPct:w(o??null),peerAveragePct:w(a??null),rank:s??null,rankTotal:i??null})}return{periods:e}}function si(n){let t=n?.item?.[0]||{},e={};for(let r of Lo)t[r]!==void 0&&(e[Yo[r]]=w(t[r]));return{code:t.thscode||"",maxDrawdownPct:e}}function ii(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.stock_name||e.name||"",assetType:e.asset_type||"",holdRatio:w(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:k(e.end_date_ms)?.slice(0,10)??null})),summary:{stockRatio:w(n?.total_stock_ratio_pct??n?.stock_ratio_pct)??null,bondRatio:w(n?.total_bond_ratio_pct)??null,fundRatio:w(n?.total_fund_ratio_pct)??null,turnoverRate:w(n?.turnover_rate_pct)??null,concentration:w(n?.concentration_ratio)??null,mainIndustry:n?.main_industry||null},total:t.length}}function ci(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",assetType:e.asset_type||"",holdRatio:w(e.hold_ratio)??null,marketValue:e.market_value??null,periodChangePct:w(e.period_increase_pct)??null,rank:e.rank??null,reportDate:k(e.end_date_ms)?.slice(0,10)??null})),total:t.length}}function ui(n){let t=n?.item||[];return{items:t.map(e=>({reportType:e.report_type||"",name:e.report_type_name||"",start:k(e.start_date_ms)?.slice(0,10)??null,end:k(e.end_date_ms)?.slice(0,10)??null})),total:t.length}}function li(n){let t=n?.item||[];return{items:t.map(e=>({reportDate:k(e.report_date_ms)?.slice(0,10)??e.report_period??null,stock:w(e.stock_ratio_pct)??null,bond:w(e.bond_ratio_pct)??null,deposit:w(e.deposit_ratio_pct)??null,other:w(e.other_ratio_pct)??null})),total:t.length}}function mi(n){let t=n?.item||[];return{items:t.map(e=>({reportPeriod:e.report_period||"",industry:e.industry_name||"",ratio:w(e.ratio_pct)??null})),total:t.length}}function di(n){let t=n?.item||[];return{items:t.map(e=>({scope:e.merge_scope||"",reportDate:k(e.report_date_ms)?.slice(0,10)??null,institutionPct:w(e.ins_position)??null,personalPct:w(e.psnl_rate)??null,holderCount:e.holder_amount??null,avgHolderShare:w(e.avg_holder_share)??null,staffHoldPct:w(e.mgmt_staff_hold_rate)??null})),total:t.length}}function pi(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:w(e.hold_rate_pct)??null,reportDate:k(e.report_date_ms)?.slice(0,10)??null})),total:t.length}}function fi(n,t,e,r){let o=n?.item?.[0]||{},a=t?.item?.[0]||{};return{id:o.manager_id||"",name:o.manager_name||"",sex:o.sex??null,degree:o.degree??null,company:o.company_name??null,companyId:o.company_id??null,resume:o.resume??null,annualReturnPct:w(o.annual_return_pct)??null,maxReturnPct:w(o.maximum_return_pct)??null,radar:o.radar_comparison||[],style:{representativeFund:a.representative_fund_name??null,representativeFundCode:a.representative_fund_thscode??null,idea:a.investment_idea??null,totalScale:a.total_fund_scale??null,industryPreferences:a.industry_preferences??null},experience:e?.item?.[0]??null,performance:r?(r.item||[]).map(s=>({date:k(s.date_ms)?.slice(0,10)??null,managerPct:w(s.manager_return_pct)??null,peerPct:w(s.peer_return_pct)??null,benchmarkPct:w(s.benchmark_return_pct)??null})):null}}function yi(n){let t=n?.item?.[0]||{};return{id:t.company_id||"",name:t.company_name||"",type:t.company_type||"",established:k(t.established_date_ms),fundCount:t.fund_count??null,scale:t.scale??null}}function gi(n){let t=n?.item||[];return{items:t.map(e=>({period:`${k(e.start_date_ms)?.slice(0,10)??""}~${k(e.end_date_ms)?.slice(0,10)??""}`,published:k(e.publish_date_ms),...Object.fromEntries(Object.entries(e).filter(([r])=>!r.endsWith("_ms")&&r!=="thscode"&&r!=="ticker"))})),total:t.length}}function hi(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:k(e.publish_date_ms)?.slice(0,10)??null,exDividendDate:k(e.ex_dividend_date_ms)?.slice(0,10)??null,paymentDate:k(e.payment_date_ms)?.slice(0,10)??null}))}}function bi(n){let t=n?.item?.[0]||{};return{code:t.thscode||"",price:t.last_price??null,change:t.price_change??null,changePercent:w(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:w(t.price_amplitude_ratio_pct)??null,volume:t.volume??null,amount:t.turnover??null,turnoverRate:w(t.turnover_ratio_pct)??null}}function _i(n){let t=n?.item||[];return{code:n?.thscode||"",items:t.map(e=>({date:k(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 wi(n){let t=n?.item||[];return{items:t.map(e=>({title:e.title||"",summary:e.summary||"",source:e.source||"",url:e.url??null,time:k(e.publish_time_ms)})),total:t.length,hasMore:!!n?.has_more,nextOffset:n?.offset??null}}function Si(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",ticker:e.ticker||"",subscriptionStart:k(e.subscription_start_ms)?.slice(0,10)??null,subscriptionEnd:k(e.subscription_end_ms)?.slice(0,10)??null})),total:t.length}}function Ho(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",R(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 r=await Mt(e.code,P(e));l({data:r,command:`fund profile ${e.code}`,source:"fuyao",toJSON:ri})}).command("nav <code>","\u51C0\u503C\u5E8F\u5217\uFF08\u9ED8\u8BA4\u6700\u65B0\u4E00\u6761\uFF1B--range week..fyear \u53D6\u533A\u95F4\uFF09",R(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 r=await yo(e.code,{range:e.range,navType:e["nav-type"],fundType:P(e)});l({data:r,command:`fund nav ${e.code}${e.range?` --range ${e.range}`:""}`,source:"fuyao",toJSON:oi})}).command("perf <code>","\u533A\u95F4\u6536\u76CA\uFF08\u8FD11\u5468..\u6210\u7ACB\u6765 + \u540C\u7C7B\u5E73\u5747 + \u540C\u7C7B\u6392\u540D\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await go(e.code,P(e));l({data:r,command:`fund perf ${e.code}`,source:"fuyao",toJSON:ai})}).command("drawdown <code>","\u6700\u5927\u56DE\u64A4\uFF08\u5404\u5468\u671F\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await ho(e.code,P(e));l({data:r,command:`fund drawdown ${e.code}`,source:"fuyao",toJSON:si})}).command("holdings <code>","\u6700\u65B0\u91CD\u4ED3\u6301\u4ED3\uFF08\u80A1\u7968/\u503A\u5238/\u57FA\u91D1 + \u6C47\u603B\u5360\u6BD4\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await bo(e.code,P(e));l({data:r,command:`fund holdings ${e.code}`,source:"fuyao",toJSON:ii})}).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",R(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 r=e.code,{report:o="quarter",end:a,bond:s}=e,i=s?await wo(r,o,a,P(e)):await _o(r,o,a,P(e));l({data:i,command:`fund holdings-history ${r} --end ${a}`,source:"fuyao",toJSON:ci})}).command("report-dates <code>","\u6301\u4ED3\u53EF\u7528\u62A5\u544A\u671F\uFF08holdings-history \u9700\u8981\u7684 end \u65E5\u671F\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await So(e.code,void 0,P(e));l({data:r,command:`fund report-dates ${e.code}`,source:"fuyao",toJSON:ui})}).command("allocation <code>","\u8D44\u4EA7\u914D\u7F6E\uFF08\u80A1\u7968/\u503A\u5238/\u5B58\u6B3E/\u5176\u4ED6\u5360\u6BD4\uFF0C\u591A\u671F\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await ko(e.code,P(e));l({data:r,command:`fund allocation ${e.code}`,source:"fuyao",toJSON:li})}).command("industry <code>","\u884C\u4E1A\u914D\u7F6E\uFF08\u591A\u671F\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await xo(e.code,P(e));l({data:r,command:`fund industry ${e.code}`,source:"fuyao",toJSON:mi})}).command("holders <code>","\u6301\u6709\u4EBA\u7ED3\u6784\uFF08\u673A\u6784/\u4E2A\u4EBA\u5360\u6BD4\u3001\u6237\u6570\uFF09",R(e=>e.positional("code",{type:"string"}).option("top",{type:"boolean",default:!1,describe:"\u524D\u5341\u5927\u6301\u6709\u4EBA"})),async e=>{let r=e.code,o=e.top?await Ao(r,void 0,P(e)):await No(r,void 0,P(e));l({data:o,command:`fund holders ${r}${e.top?" --top":""}`,source:"fuyao",toJSON:e.top?pi:di})}).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",R(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 r=e.code,a=(await Mt(r,P(e)))?.item?.[0]?.manager_info?.[0],s=a?.manager_id??a?.id;if(!s)throw new Error(`\u57FA\u91D1 ${r} \u672A\u62AB\u9732\u57FA\u91D1\u7ECF\u7406 ID\uFF0C\u8BF7\u5728 profile \u8F93\u51FA\u7684 managerInfo \u4E2D\u786E\u8BA4`);let[i,u,c]=await Promise.all([Oo(s),To(s),qo(s)]),p=e.range?await vo(s,e.range):null,m=fi(i,u,c,p);l({data:m,command:`fund manager ${r}`,source:"fuyao",toJSON:f=>f})}).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 r=await Po(e.company_id);l({data:r,command:`fund company ${e.company_id}`,source:"fuyao",toJSON:yi})}).command("financial <code>","\u57FA\u91D1\u8D22\u52A1\u6570\u636E\uFF08--t indicators(\u9ED8\u8BA4)/income/balance\uFF09",R(e=>e.positional("code",{type:"string"}).option("t",{type:"string",default:"indicators",choices:["indicators","income","balance"]})),async e=>{let r=e.code,o=e.t||"indicators",a=o==="income"?await $o(r,P(e)):o==="balance"?await Co(r,P(e)):await jo(r,P(e));l({data:a,command:`fund financial ${r} -t ${o}`,source:"fuyao",toJSON:gi})}).command("dividend <code>","\u57FA\u91D1\u5206\u7EA2\u8BB0\u5F55",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await Do(e.code,P(e));l({data:r,command:`fund dividend ${e.code}`,source:"fuyao",toJSON:hi})}).command("diagnose <code>","\u57FA\u91D1\u8BCA\u65AD\uFF08\u7EF4\u5EA6/\u540C\u7C7B\u5BF9\u6BD4/\u97E7\u6027\u6307\u6807\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await Eo(e.code,P(e));l({data:r,command:`fund diagnose ${e.code}`,source:"fuyao",toJSON:o=>({items:o?.item||[],total:o?.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 r=e.subscribe||"active",o=await Ro(r);l({data:o,command:`fund issue ${r}`,source:"fuyao",toJSON:Si})}).command("news <code>","\u57FA\u91D1\u8D44\u8BAF",R(e=>e.positional("code",{type:"string"})),async e=>{let{n:r}=e,o=await Jo(e.code,{limit:r,fundType:P(e)});l({data:o,command:`fund news ${e.code}`,source:"fuyao",toJSON:wi})}).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 r=await Mo(e.code);l({data:r,command:`fund etf ${e.code}`,source:"fuyao",toJSON:bi})}).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 r=e.code,o=Math.min(Math.max(Number(e.days)||120,1),1825),a=Date.now(),s=await Io(r,a-o*864e5,a);l({data:s,command:`fund etf-kline ${r}`,source:"fuyao",toJSON:_i})}),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 F=ki(xi(process.argv)).scriptName("finflow").version("1.9.8").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");Kn(F);zr(F);Xr(F);ro(F);so(F);io(F);lo(F);fo(F);Ho(F);F.parse();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openduo/finflow",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.8",
|
|
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": {
|