@openduo/finflow 1.9.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/finflow.js +1 -1
- package/package.json +1 -1
package/dist/bin/finflow.js
CHANGED
|
@@ -3,4 +3,4 @@ import No from"yargs";import{hideBin as qo}from"yargs/helpers";function O(n){ret
|
|
|
3
3
|
\u8BF7\u786E\u4FDD\u5DF2\u5B89\u88C5 Google Chrome\u3002`)}let r=tr(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 a of r)if(o.includes(a.domain))try{let i=Vn(a.value,t,a._metaVersion);if(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(i))continue;s.push(`${a.name}=${i}`)}catch{}if(!s.length)throw new Error("Cookie \u89E3\u5BC6\u5168\u90E8\u5931\u8D25");return s.join("; ")}function R(){try{return rt("jin10.com")}catch{return null}}function Ee(n){return n?.slice(5,16)||""}function F(n){return n?.length?n.filter(e=>e.type==="quotes").map(e=>e.title).join(" "):""}function ot(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 Je=[],er=["content","title","brief","data.content","data.title","indicator_name","name","subject_name"];function nr(n){return er.map(e=>e.split(".").reduce((r,o)=>r?.[o],n)||"").filter(Boolean).join(" ").toLowerCase()}function k(n){if(!Je.length||!Array.isArray(n))return n;let e=Je.map(t=>t.toLowerCase());return n.filter(t=>{let r=nr(t);return!e.some(o=>r.includes(o))})}function G(n){return n=k(n),{items:n.map(e=>({time:e.time,content:ot(e.data?.content||e.data?.title||"",e),title:e.data?.title||"",importance:e.important??0,source:e.data?.source||"",tags:F(e.remark)?F(e.remark).split(" "):[]})),total:n.length}}function rr(n){return n=k(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 Et(n){return n=k(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 or(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=k(t),{items:t.map(r=>({title:r.title||"",badge:r.ndata?.badge||"",redirectUrl:r.web_redirect_url||""})),total:t.length}}function ar(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=k(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 Re(n){let e=n?.data?.top_article||[],t=n?.data?.depth_list||[],r=k([...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 sr(n){let e=k(n?.data||[]);return{items:e.map(t=>({title:t.title||"",readingNum:t.readNum||0})),total:e.length}}function ir(n){let e=k(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 Le(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 cr(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 lr(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 ur=new Set(["stock","telegram","featured","depth","eoe_article"]),mr={stock:"\u80A1\u7968",telegram:"\u7535\u62A5",featured:"\u8981\u95FB",depth:"\u6DF1\u5EA6",eoe_article:"\u6587\u7AE0"};function Pe(n){let e=n?.data||{},t=[],r=0;for(let[o,s]of Object.entries(e))if(ur.has(o)&&!(!s||typeof s!="object"||!Array.isArray(s.data))){r+=s.total_num||s.data.length;for(let a of s.data){let i=a.stock_category==="stock"||/^s[hz]\d+$/i.test(a.descr||""),c=a.descr?O(a.descr):"",m=O(a.title||a.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&&!i)&&t.push({kind:mr[o]||o,type:i||a.type===1?"stock":"article",title:m,brief:d,code:i&&(a.stock_id||a.descr)||"",name:i?O(a.title||""):"",price:a.last||null,percent:a.raise||null,time:a.time?new Date(a.time*1e3).toISOString():"",author:a.author||"",id:a.id,url:a.external_link||""})}}return{items:t,total:r}}function dr(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 De(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 Jt(n){let e=R(),t=e?{cookie:e}:void 0,r=new Set,o=[],s=await fe({},t);for(let c of s?.data||[])r.has(c.id)||(r.add(c.id),o.push(c));let a=0,i=50;for(;o.length<n&&a++<i;){let c=o[o.length-1];if(!c)break;let d=(await he(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 Ie(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,a=s?nt(s):nt("popular"),i=await ve({channel:a.id,limit:o}),c=k(i.result||[]);l({data:c,command:"info flash important",source:"glh",toJSON:()=>Et(c)})}).command("popular","\u70ED\u95E8\u5FEB\u8BAF\uFF08glh\uFF09",r=>r,async r=>{let{n:o=10}=r,s=await je({limit:o}),a=k(s.result||[]);l({data:a,command:"info flash popular",source:"glh",toJSON:()=>Et(a)})}).command("detail <id>","\u5FEB\u8BAF\u8BE6\u60C5\uFF08jin10\uFF09",r=>r,async r=>{let o=r.id,s=await ge(o);l({data:s,command:"info flash detail",source:"jin10",toJSON:a=>G(a?.data?[a]:[])})}).command("date <date>","\u5386\u53F2\u5FEB\u8BAF\uFF08jin10\uFF0C\u9700\u767B\u5F55\uFF09",r=>r,async r=>{let o=r.date,s;try{s=rt("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 a=await ye(o,{cookie:s});a?._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:a,command:"info flash date",source:"jin10",toJSON:i=>G(i?.data||[])})}),async t=>{let{n:r=10,src:o="cls",category:s}=t,a=s||"all",i=[];o==="jin10"?i.push({name:"jin10",fn:u=>Jt(r).then(p=>l({data:p,command:"info flash",source:u,toJSON:G}))},{name:"cls",fn:u=>m(u,a,r)},{name:"glh",fn:u=>d(u,a,r)}):o==="glh"?i.push({name:"glh",fn:u=>d(u,a,r)},{name:"cls",fn:u=>m(u,a,r)},{name:"jin10",fn:u=>Jt(r).then(p=>l({data:p,command:"info flash",source:u,toJSON:G}))}):a==="all"?i.push({name:"cls",fn:u=>m(u,a,r)},{name:"jin10",fn:u=>Jt(r).then(p=>l({data:k(p),command:"info flash",source:u,toJSON:G}))},{name:"glh",fn:u=>d(u,a,r)}):i.push({name:"cls",fn:u=>m(u,a,r)});let c;for(let u=0;u<i.length;u++){let{name:p,fn:f}=i[u],y=u===0?p:`${p} fallback`;try{await f(y);return}catch(h){c=h,u<i.length-1&&console.error(`Source ${p} failed: ${h?.message||h}, trying next...`)}}throw c;async function m(u,p,f){let y=de(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 h=new Set,g=[],S=20,q=50,U=0,H=y.category,lt=(await mt({rn:S,category:H}))?.data?.roll_data||[];for(let v of lt)h.has(v.id)||(h.add(v.id),g.push(v));for(;g.length<f&&U++<q;){let v=g.reduce((T,Xt)=>(Xt.ctime||0)<(T.ctime||0)?Xt:T,g[0]);if(!v?.ctime)break;let En=(await mt({lastTime:v.ctime,rn:S,category:H}))?.data?.roll_data||[],Wt=0;for(let T of En)h.has(T.id)||(h.add(T.id),g.push(T),Wt++);if(!Wt)break;g.length<f&&await new Promise(T=>setTimeout(T,200))}let Y=g.slice(0,f);l({data:Y,command:"info flash",source:u,toJSON:rr})}async function d(u,p,f){let y=p&&p!=="all"?nt(p):{id:"all"},h=new Set,g=[],S=15,q=50,U=0,H=await B({channel:y.id,limit:S});for(let J of H?.result||[])h.has(J.id)||(h.add(J.id),g.push(J));for(;g.length<f&&U++<q;){let J=g[g.length-1];if(!J?.id)break;let lt=await B({channel:y.id,limit:S,liveId:J.id}),Y=0;for(let v of lt?.result||[])h.has(v.id)||(h.add(v.id),g.push(v),Y++);if(!Y)break;g.length<f&&await new Promise(v=>setTimeout(v,200))}l({data:g,command:"info flash",source:u,toJSON:Et})}}).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 we();l({data:r,command:"info news slide",source:"jin10",toJSON:or})}).command("feature","\u7CBE\u9009\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async()=>{let r=await _e();l({data:r,command:"info news feature",source:"jin10",toJSON:ar})}).command("depth [channel]","\u6DF1\u5EA6\u680F\u76EE\uFF08cls\uFF09",r=>r,async r=>{let{n:o=10}=r,s=r.channel||"headline",a=pe(s);if(!a){let m=Object.entries(D).map(([d,u])=>` ${d.padEnd(12)} ${u.name} (${u.id})`).join(`
|
|
4
4
|
`);console.error(`\u672A\u77E5\u680F\u76EE: ${s}
|
|
5
5
|
\u53EF\u7528\u680F\u76EE:
|
|
6
|
-
${m}`),process.exit(1)}let i=await dt(a.id),c=k(i?.data?.depth_list||[]);if(c.length<o){let m=c[c.length-1]?.ctime;if(m){let d=await re(a.id,{lastTime:m,rn:o-c.length}),u=k(d?.data?.depth_list||d?.data||[]);c=[...c,...u]}}l({data:i,command:"info news depth",source:"cls",toJSON:Re})}).command("hot","\u70ED\u95E8\u6587\u7AE0\u6392\u884C\uFF08cls\uFF09",r=>r,async()=>{let r=await oe();l({data:r,command:"info news hot",source:"cls",toJSON:sr})}).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(),a=s;if(!/^(s[hz]\d+|\d{6})$/i.test(s)){let m=(await X(s,{type:"stock",rn:1}))?.data?.stock?.data?.[0];a=m?.stock_id||m?.descr||s}let i=await ue(a,{rn:o});l({data:i,command:"info news stock",source:"cls",toJSON:ir})}),async()=>{let t=await dt(1e3);l({data:t,command:"info news",source:"cls",toJSON:Re})}).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,a=await tt(),i=Array.isArray(a)?a:a?.data||[],c=s.toLowerCase(),m=i.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=k(m.slice(0,o));l({data:d,command:"info topic search",source:"jin10",toJSON:Le})}).command("groups","\u8BDD\u9898\u5206\u7EC4",r=>r,async()=>{let r=await tt();l({data:r,command:"info topic groups",source:"jin10",toJSON:lr})}).command("hot","\u8D22\u8054\u793E\u9898\u6750",r=>r,async()=>{let r=await ae();l({data:r,command:"info topic hot",source:"cls",toJSON:o=>cr(k(o))})}).command("show <id>","\u4E13\u9898\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async r=>{let{n:o=10}=r,s=r.id,a=R(),i=a?{cookie:a}:void 0,c=new Set,m=[],d=1,u=50;for(;m.length<o&&d<=u;){let y=(await Oe(s,{page:d},i))?.data?.list||[];if(!y.length)break;let h=0;for(let g of y)c.has(g.id)||(c.add(g.id),m.push(g),h++);if(h===0)break;d++,m.length<o&&await new Promise(g=>setTimeout(g,200))}let p=k(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 tt(),s=k(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:Le})}).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:a}=r,i=r.keyword;if(s==="jin10"){let m=await xt({keyword:i,type:a&&a!=="all"?a:"all",offset:0});l({data:m,command:"info search",source:"jin10",toJSON:De})}else{let m=await X(i,{type:a||"all",rn:Math.max(o,20)});l({data:m,command:"info search",source:"cls",toJSON:Pe})}}).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 ne(o);l({data:s,command:"info search detail",source:"cls",toJSON:dr})}),async t=>{let{n:r=20,src:o="cls",type:s}=t,a=t.keyword||t._?.[2];if(!a)return l({data:{error:"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD"},command:"info search",source:"cls"});if(o==="jin10"){let c=await xt({keyword:a,type:s&&s!=="all"?s:"all",offset:0});l({data:c,command:"info search",source:"jin10",toJSON:De})}else{let c=await X(a,{type:s||"all",rn:Math.max(r,20)});l({data:c,command:"info search",source:"cls",toJSON:Pe})}}),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 He from"fs";import pr from"path";import fr from"os";var Be=pr.join(fr.homedir(),".xueqiu-anon-cookie"),Me="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",w="stock.xueqiu.com",hr="xueqiu.com";function A(n){return n.trim().toUpperCase()}var gr="https://xueqiu.com/hq";function yr(){try{let n=He.readFileSync(Be,"utf-8").trim();return n&&/acw_tc=/.test(n)?n:null}catch{return null}}function br(n){let e=n.headers;return typeof e.getSetCookie=="function"?e.getSetCookie():(e.get("set-cookie")||"").split(/,(?=\s*[A-Za-z_-]+=)/)}function wr(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 Ue(){let n=await fetch(gr,{headers:{"User-Agent":Me,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=wr(br(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{He.writeFileSync(Be,e,"utf-8")}catch{}return e}function _r(n){return String(n?.error_code??n?.code)==="400016"}async function Sr(n,e,t,r,{token:o=!0,ua:s}={}){let a=o?yr()??await Ue():null,i=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||Me,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);i=f.status;try{return await f.json()}catch{return null}},m=await c(a);if(o&&(_r(m)||m===null||i===401)&&(m=await c(await Ue())),m===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 m}function b(n,e,t={}){return Sr("GET",n,e,null,t)}function Rt(n){return b(w,`/v5/stock/realtime/quotec.json?symbol=${n.map(A).join(",")}`,{token:!1})}function Lt(n){return b(w,`/v5/stock/realtime/pankou.json?symbol=${A(n)}`)}var xr={d:"day",w:"week",m:"month",y:"year",q:"quarter"};function Pt(n,{period:e="day",count:t=284}={}){let r=xr[e]||e,o=Date.now();return b(w,`/v5/stock/chart/kline.json?symbol=${A(n)}&begin=${o}&period=${r}&type=before&count=-${t}&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance`)}function Dt(n,{period:e="1d"}={}){return b(w,`/v5/stock/chart/minute.json?symbol=${A(n)}&period=${e}`)}function It(n,{count:e=50}={}){return b(w,`/v5/stock/history/trade.json?symbol=${A(n)}&count=${e}`)}function Fe(n){return b(w,`/v5/stock/quote/relevant.json?symbol=${A(n)}`)}function Ge(n){return b(hr,`/query/v1/suggest_stock.json?q=${encodeURIComponent(n)}`)}function Ke({category:n="cn"}={}){return b(w,`/v5/stock/screener/industries.json?category=${n}`)}function ze(n={}){let{page:e=1,size:t=30,order:r="desc",order_by:o="percent",market:s="CN"}=n,a=new URLSearchParams({page:String(e),size:String(t),order:r,order_by:o,market:s});return n.ind_code&&a.set("ind_code",n.ind_code),n.type&&a.set("type",n.type),b(w,`/v5/stock/screener/quote/list.json?${a.toString()}`)}function Ye(n){return b(w,`/v5/stock/hq/longhu.json?date=${n}`)}function We(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(w,`/v5/stock/finance/${s}/indicator.json?symbol=${A(n)}&type=${r}&is_detail=${o}&count=${t}`)}function Xe(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(w,`/v5/stock/finance/${s}/cash_flow.json?symbol=${A(n)}&type=${r}&is_detail=${o}&count=${t}`)}function Qe(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(w,`/v5/stock/finance/${s}/income.json?symbol=${A(n)}&type=${r}&is_detail=${o}&count=${t}`)}function Ve(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(w,`/v5/stock/finance/${s}/balance.json?symbol=${A(n)}&type=${r}&is_detail=${o}&count=${t}`)}function Ze(n,{circula:e=1}={}){return b(w,`/v5/stock/f10/cn/top_holders.json?symbol=${A(n)}&circula=${e}`)}function Ut(n){return b(w,`/v5/stock/f10/cn/indicator.json?symbol=${A(n)}`)}function tn(n){return b(w,`/v5/stock/f10/cn/industry.json?symbol=${A(n)}`)}function en(n,{page:e=1,size:t=10}={}){return b(w,`/v5/stock/f10/cn/bonus.json?symbol=${A(n)}&page=${e}&size=${t}`)}function Ht(n){return b(w,`/v5/stock/capital/flow.json?symbol=${A(n)}`)}function nn(n,{count:e=20}={}){return b(w,`/v5/stock/capital/history.json?symbol=${A(n)}&count=${e}`)}function rn(n,{page:e=1,size:t=180}={}){return b(w,`/v5/stock/capital/margin.json?symbol=${A(n)}&page=${e}&size=${t}`)}function Bt(n){return b(w,`/v5/stock/batch/quote.json?symbol=${n.map(A).join(",")}&extend=detail&is_delay_hk=true`)}function K(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 kr="https://query1.finance.yahoo.com/v8/finance/chart",Ar={"User-Agent":"Mozilla/5.0"};async function Mt(n){let e=n.trim().toUpperCase(),t=`${kr}/${encodeURIComponent(e)}?interval=1d&range=1d`;try{let s=(await(await fetch(t,{headers:Ar})).json())?.chart?.result;if(!Array.isArray(s)||s.length===0)return null;let a=s[0]?.meta;if(!a?.symbol)return null;let i=Number(a.regularMarketPrice??0),c=Number(a.chartPreviousClose??0),m=i-c,d=c===0?0:m/c*100;return{symbol:a.symbol,name:a.shortName??"",price:i,prevClose:c,change:m,changePercent:d,currency:a.currency??"",exchange:a.exchangeName??"",marketState:a.marketState??""}}catch{return null}}function Nr(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 qr(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 Or(n){let e=n?.data||{},t=Number(e.last_px??0);return!!(e.secu_name||e.secu_code)&&Number.isFinite(t)&&t!==0}function vr(n){if(!n)return!1;let e=Number(n.current??n.price??0);return!!(n.symbol||n.name)&&Number.isFinite(e)&&e!==0}function jr(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}async function Cr(n){let e=n.toUpperCase().startsWith("SH")||n.toUpperCase().startsWith("SZ")?[n.toUpperCase()]:/^\d{6}$/.test(n)?[n.startsWith("6")?"SH"+n:"SZ"+n]:[n.toUpperCase()];try{let r=(await Bt(e))?.data?.items||[];return r[0]?.quote||r[0]||null}catch{let t=await Rt(e);return(t?.data||t?.items||[])[0]||null}}function $r(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 _n=new Set(["1m","5m","15m","30m","60m","120m"]);function Tr(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 an(n,e,t){return{code:n,period:e,items:t.map(r=>({date:Tr(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 sn(n,e,t){let r=_n.has(e);return{code:n,period:e,items:t.map(o=>({date:r?new Date(o[0]).toISOString():new Date(o[0]).toISOString().slice(0,10),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 cn(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 ln(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 un(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),a=s.length<=3?"0"+s[0]:s.slice(0,2),i=s.length<=3?s.slice(1):s.slice(2),c=s.slice(-2);return{time:`${a}:${i}:${c}`,price:Number(o.last_px||0),volume:Number(o.change_vol||0),side:o.change_vol_color===1?"buy":"sell"}}),total:r}}function mn(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,50).map(r=>({time:new Date(r.timestamp).toISOString(),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 dn(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 a=String(s.minute),i=a.length<=3?"0"+a[0]:a.slice(0,2),c=a.length<=3?a.slice(1):a.slice(2),m=Number(s.last_px||0);return{time:`${i}:${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 pn(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,240).map(r=>({time:new Date(r.timestamp).toISOString(),price:Number(r.current||0),volume:Number(r.volume||0),avgPrice:Number(r.avg_price||0)})),total:t.length}}function fn(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 hn(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 Er(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 Jr(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 Rr(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 gn(n){let e=n?.data||{},t=e.items||[];return{items:t.map(r=>({time:r.timestamp?new Date(r.timestamp).toISOString():"",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 Lr(n){let e=n?.data?.items||[];return{items:e.map(t=>({date:t.td_date?new Date(t.td_date).toISOString().slice(0,10):"",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 Pr(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 Dr(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?new Date(t.ashare_ex_dividend_date).toISOString().slice(0,10):"",equityDate:t.equity_date?new Date(t.equity_date).toISOString().slice(0,10):"",plan:t.plan_explain||""})),total:e.length}:{items:[],total:0}}function z(n){return Array.isArray(n)?n[0]:n}function Ir(n){let e=n?.data||{},t=e.list||[];return{name:e.quote_name||"",items:t.map(r=>({report:r.report_name||"",roe:z(r.avg_roe),eps:z(r.basic_eps),grossMargin:z(r.gross_selling_rate),revenueYoy:z(r.operating_income_yoy)})),total:t.length}}function yn(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 Ur(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"]},a=o[e]||o.cashflow,i=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<a.length;d++)m[i[d]]=z(c[a[d]]);return m}),total:r.length}}function Hr(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 Br(n){let t=(n?.data||{}).items||[];return{items:t.map(r=>({time:r.timestamp?new Date(r.timestamp).toISOString():"",amount:Number(r.amount||0)})),total:t.length}}function Mr(n){let e=(n?.data?.industries||[]).map(t=>({code:t.encode||"",name:t.name||"",pinyin:t.pinyin||""}));return{items:e,total:e.length}}function bn(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 wn(n){let e=[],t,r=1,o=12;for(;e.length<n.n&&r<=o;){let s=await ze({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 a=s?.data?.list||[];if(t=s?.data?.count??t,!a.length)break;e.push(...a),r++}return{list:e,count:t}}function Sn(n){return n.command({command:"quote [code]",describe:"\u8BC1\u5238\u884C\u60C5\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF0C\u81EA\u52A8\u8BC6\u522B\u6570\u636E\u6E90\uFF09",builder:e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF08A\u80A1: sh600519 / 600519\uFF0C\u6E2F\u80A1: 00700\uFF0C\u7F8E\u80A1: AAPL\uFF09"}).strictCommands(!1).command("batch <codes...>","\u6279\u91CF\u884C\u60C5\uFF08\u96EA\u7403\uFF0C\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF09",t=>t,async t=>{let r=t.codes,o=r.map(i=>{let c=i.toUpperCase();return c.startsWith("SH")||c.startsWith("SZ")?c:/^\d{6}$/.test(i)?i.startsWith("6")?"SH"+i:"SZ"+i:c}),s,a;try{s=await Bt(o),a=s?.data?.items||[],a.length&&a[0]?.quote&&(a=a.map(i=>({...i.quote,market:i.market})))}catch{s=await Rt(o),a=s?.data||s?.items||[]}l({data:a,command:`quote batch ${r.join(" ")}`,source:"xq",toJSON:()=>qr(a)})}).command("related <code>","\u5173\u8054\u80A1\u7968\uFF08xueqiu\uFF09",t=>t,async t=>{let r=t.code,s=await Fe(r),a=s?.data?.items||s?.data||[];l({data:s,command:`quote related ${r}`,source:"xq",toJSON:()=>({items:a.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\uFF09",t=>t,async t=>{let r=t.keyword,o=await Ge(r);l({data:o,command:`quote search ${r}`,source:"xq",toJSON:Hr})}).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(),a=t["order-by"]??"percent",i=t.order??"desc";if(!o){let d=await Ke({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:Mr})}let{list:c,count:m}=await wn({n:r,order:i,order_by:a,market:s.toUpperCase(),ind_code:o});l({data:{list:c},command:`quote industry ${o} --market ${s}`,source:"xq",toJSON:()=>bn(c,m)})}).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",a=t.order??"desc",i=o==="hk"?"HK":o==="us"||o==="us_china"?"US":"CN",{list:c,count:m}=await wn({n:r,order:a,order_by:s,market:i,type:o});l({data:{list:c},command:`quote board ${o}`,source:"xq",toJSON:()=>bn(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,a=t.code,i=_n.has(r),c=s==="xq"||!s&&i;try{if(c){let m=await Pt(a,{period:r,count:o}),d=m?.data?.item||m?.data||[];return l({data:m,command:`quote kline ${a} -p ${r}`,source:"xq",toJSON:()=>sn(a,r,d)})}else{let m=r==="w"?"w":r==="m"?"m":r==="y"?"y":"d",d=[],u,p=0,f=50;for(;d.length<o&&p++<f;){let g=(await yt(a,{period:m,limit:Math.min(o-d.length,200),start_date:u}))?.data||[];if(!g.length)break;d=[...g,...d],u=String(g[0].trade_date)}let y=d.slice(-o);return l({data:y,command:`quote kline ${a} -p ${r}`,source:"cls",toJSON:h=>an(a,m,h)})}}catch{if(i&&!s)throw new Error("xq K\u7EBF\u8BF7\u6C42\u5931\u8D25\uFF0C\u5206\u949F\u7EBF\u65E0\u5907\u9009\u6570\u636E\u6E90");if((c?"cls":"xq")==="xq"){let d=await Pt(a,{period:r,count:o}),u=d?.data?.item||d?.data||[];l({data:d,command:`quote kline ${a} -p ${r}`,source:"xq fallback",toJSON:()=>sn(a,r,u)})}else{let d=r==="w"?"w":r==="m"?"m":r==="y"?"y":"d",u=[],p,f=0,y=50;for(;u.length<o&&f++<y;){let S=(await yt(a,{period:d,limit:Math.min(o-u.length,200),start_date:p}))?.data||[];if(!S.length)break;u=[...S,...u],p=String(S[0].trade_date)}let h=u.slice(-o);l({data:h,command:`quote kline ${a} -p ${r}`,source:"cls fallback",toJSON:g=>an(a,d,g)})}}}).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 a=await Lt(o);return l({data:a,command:`quote depth ${o} --src xq`,source:"xq",toJSON:i=>ln(o,i?.data||{})})}else{let a=await ft(o);return l({data:a,command:`quote depth ${o}`,source:"cls",toJSON:i=>cn(o,i?.data||{})})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Lt(o);l({data:i,command:`quote depth ${o} --src xq`,source:"xq fallback",toJSON:c=>ln(o,c?.data||{})})}else{let i=await ft(o);l({data:i,command:`quote depth ${o}`,source:"cls fallback",toJSON:c=>cn(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 a=await It(o);return l({data:a,command:`quote ticks ${o} --src xq`,source:"xq",toJSON:i=>mn(o,i)})}else{let a=await ht(o);return l({data:a,command:`quote ticks ${o}`,source:"cls",toJSON:i=>un(o,i)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await It(o);l({data:i,command:`quote ticks ${o} --src xq`,source:"xq fallback",toJSON:c=>mn(o,c)})}else{let i=await ht(o);l({data:i,command:`quote ticks ${o}`,source:"cls fallback",toJSON:c=>un(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 a=await Dt(o,{period:"1d"});return l({data:a,command:`quote timeline ${o} --src xq`,source:"xq",toJSON:i=>pn(o,i)})}else{let a=await gt(o);return l({data:a,command:`quote timeline ${o}`,source:"cls",toJSON:i=>dn(o,i)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Dt(o,{period:"1d"});l({data:i,command:`quote timeline ${o} --src xq`,source:"xq fallback",toJSON:c=>pn(o,c)})}else{let i=await gt(o);l({data:i,command:`quote timeline ${o}`,source:"cls fallback",toJSON:c=>dn(o,c)})}}}).command("sector [code]","\u677F\u5757",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("rank","\u677F\u5757\u6392\u884C",r=>r.option("type",{alias:"t",type:"string",default:"industry"}),async r=>{let{t:o="industry"}=r,s=await pt({type:o}),a=Array.isArray(s?.data)?s.data:[];l({data:s,command:`quote sector rank -t ${o}`,source:"cls",toJSON:()=>fn(a,o)})}).command("plate <code>","\u4E2A\u80A1\u677F\u5757",r=>r,async r=>{let o=r.code,s=await bt(o),a=Array.isArray(s?.data)?s.data:[];l({data:s,command:`quote sector plate ${o}`,source:"cls",toJSON:()=>hn(a)})}).command("industry <code>","\u884C\u4E1A\u4FE1\u606F",r=>r,async r=>{let o=r.code,s=o.length<=6?o.toUpperCase().startsWith("SH")||o.toUpperCase().startsWith("SZ")?o:o.toUpperCase():o,a=await tn(s);l({data:a,command:`quote sector industry ${o}`,source:"xq",toJSON:Jr})}).command("stocks <plate_code>","\u677F\u5757/\u6982\u5FF5\u6210\u5206\u80A1\uFF08plate_code \u6765\u81EA sector rank / sector plate\uFF09",r=>r.positional("plate_code",{type:"string"}).option("way",{type:"string",default:"change",describe:"\u6392\u5E8F\uFF1Achange(\u6DA8\u8DCC\u5E45)/last_px(\u4EF7)/amount"}),async r=>{let{way:o="change"}=r,s=r.plate_code,a=await ce(s,{way:o});l({data:a,command:`quote sector stocks ${s}`,source:"cls",toJSON:Er})}),async t=>{let{code:r}=t;if(r){let o=await bt(r),s=Array.isArray(o?.data)?o.data:[];l({data:o,command:`quote sector ${r}`,source:"cls",toJSON:()=>hn(s)})}else{let o=await pt({type:"industry"}),s=Array.isArray(o?.data)?o.data:[];l({data:o,command:"quote sector",source:"cls",toJSON:()=>fn(s,"industry")})}}).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 M();l({data:r,command:"quote flow market",source:"glh",toJSON:K})}).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,a=await nn(s,{count:o});l({data:a,command:`quote flow history ${s}`,source:"xq",toJSON:gn})}).command("margin <code>","\u878D\u8D44\u878D\u5238",r=>r,async r=>{let o=r.code,s=await rn(o);l({data:s,command:`quote flow margin ${o}`,source:"xq",toJSON:Lr})}).command("intraday <code>","\u5F53\u65E5\u8D44\u91D1\u6D41\u5411\uFF08xueqiu\uFF09",r=>r,async r=>{let o=r.code,a=await Ht(o);l({data:a,command:`quote flow intraday ${o}`,source:"xq",toJSON:gn})}).command("xq <code>","\u96EA\u7403\u8D44\u91D1\u6D41",r=>r,async r=>{let o=r.code,a=await Ht(o);l({data:a,command:`quote flow xq ${o}`,source:"xq",toJSON:Br})}),async t=>{let{code:r}=t;if(r){let o=await le(r);l({data:o,command:`quote flow ${r}`,source:"cls",toJSON:Rr})}else{let o=await M();l({data:o,command:"quote flow market",source:"glh",toJSON:K})}}).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 Ze(o);l({data:s,command:`quote f10 holders ${o}`,source:"xq",toJSON:Pr})}).command("bonus <code>","\u5206\u7EA2\u9001\u80A1",r=>r,async r=>{let o=r.code,s=await en(o);l({data:s,command:`quote f10 bonus ${o}`,source:"xq",toJSON:Dr})}).command("indicator <code>","\u4E3B\u8981\u6307\u6807",r=>r,async r=>{let o=r.code,s=await Ut(o);l({data:s,command:`quote f10 indicator ${o}`,source:"xq",toJSON:yn})}),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 Ut(r);l({data:o,command:`quote f10 indicator ${r}`,source:"xq",toJSON:yn})}).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 We(o);l({data:s,command:`quote finance indicator ${o}`,source:"xq",toJSON:Ir})}else{let a={cashflow:Xe,income:Qe,balance:Ve}[r];if(!a)return l({data:{error:`\u672A\u77E5\u7C7B\u578B: ${r}\uFF0C\u53EF\u9009 indicator/cashflow/income/balance`},command:`quote finance ${r}`,source:"xq"});let i=await a(o);l({data:i,command:`quote finance ${r} ${o}`,source:"xq",toJSON:c=>Ur(c,r)})}}),handler:async e=>{let t=e.code;if(!t)return l({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote sh600519 / finflow quote AAPL"},command:"quote",source:"cls"});if(["search","batch","related","industry","board","kline","depth","ticks","timeline","sector","flow","f10","finance"].includes(t))return l({data:{error:`\u8BF7\u63D0\u4F9B\u5B50\u547D\u4EE4\u53C2\u6570\uFF0C\u4F8B\u5982: finflow quote ${t} <code>`},command:`quote ${t}`,source:"cls"});try{let a=await ie(t);if(Or(a)){l({data:a,command:`quote ${t}`,source:"cls",toJSON:Nr});return}}catch{}let o=null;try{o=await Cr(t)}catch{}if(vr(o)){l({data:o,command:`quote ${t}`,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 s=jr(t);if(s){let a=await Mt(s);if(a){l({data:a,command:`quote ${t}`,source:"yahoo fallback",toJSON:$r});return}}if(o){l({data:o,command:`quote ${t}`,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 ${t} \u7684\u884C\u60C5\u6570\u636E`)}})}function Fr(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 xn(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 Gr(n){let e=n?.data,t=Array.isArray(e)?e:e?.data||[];return{items:t.map(r=>({code:r.secu_code||"",name:r.secu_name||"",change:r.change_px??null,changePercent:r.change!=null?Math.round(Number(r.change)*1e4)/100:null})),total:t.length}}function Kr(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 zr(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 kn(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:Fr})}).command("rank [type]","\u6DA8\u8DCC\u6392\u884C\uFF08cls\uFF09",t=>t,async t=>{let r=t.type||"change",o=St[r]||St.change,s=await se({way:o.way});l({data:s,command:"market rank",source:"cls",toJSON:Gr})}).command("index","\u5927\u76D8\u6307\u6570\uFF08glh\uFF09",t=>t,async()=>{let t=await vt();l({data:t,command:"market index",source:"glh",toJSON:xn})}).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=$e(r),a=await Ce({sort:s.id,order:o});l({data:a,command:"market hk",source:"glh",toJSON:Kr})}).command("flow","\u6CAA\u6DF1\u6E2F\u901A\u8D44\u91D1\u6D41\u5411",t=>t,async()=>{let t=await M();l({data:t,command:"market flow",source:"glh",toJSON:K})}).command("rates","\u5168\u7403\u592E\u884C\u5229\u7387\uFF08jin10\uFF09",t=>t,async()=>{let t=await be(),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||N(),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 a=await Ye(s);if(a?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${a.error_description||a.error_code}`);l({data:a,command:`market longhu ${r}`,source:"xq",toJSON:zr})}),handler:async()=>{let e=await vt();l({data:e,command:"market",source:"glh",toJSON:xn})}})}import{inflateSync as Yr}from"zlib";var Wr="wss://wss-flash-2.jin10.com/",at={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},st={LOGIN:4002,CACHE_DATA:2006,CALENDAR_DATA:2001,CALENDAR_EVENT:2003,CALENDAR_HOLIDAY:2004,CALENDAR_HOLIDAY_PAGE:2005},I=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 An(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 Xr(n,e){return An(n,e)}function Qr(n){try{return Yr(Buffer.from(n,"base64")).toString("utf-8")}catch{return null}}var Ft=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(Wr),this.ws.binaryType="arraybuffer",this.ws.onmessage=o=>{let s=o.data;if(!this.encryptKey){let m=new I(s);m.rU32L();let d=m.rU32L(),u=m.rU32L();this.encryptKey=`${u}.${d}`,this._sendLogin();return}let a=An(s,this.encryptKey),i=new I(a),c=i.r16L();if(c===st.LOGIN){clearTimeout(r),e();return}if(c===st.CACHE_DATA){i.rU32L(),i.rStrL();let m=i.rU32L(),d=i.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=Qr(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 I;e.w16L(st.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?Xr(t,this.encryptKey):t;this.ws.send(r)}_request(e,t){return new Promise((r,o)=>{let s=this.requestId++,a=setTimeout(()=>{this._pending.delete(s),o(new Error("\u8BF7\u6C42\u8D85\u65F6"))},this.timeout);this._pending.set(s,{resolve:r,reject:o,timer:a});let i=new I;i.w16L(st.CACHE_DATA),i.wU32L(e),i.wStrL(t),i.wU32L(s),this._send(i)})}close(){this.ws?.close(),this.ws=null,this.encryptKey="",this._pending.clear()}getFuturesData(e){return this._request(at.QH_DATA,e)}getHKStockData(e){return this._request(at.HK_DATA,e)}getUSStockData(e){return this._request(at.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(at.A_SHARE,t.join("&"))}};async function Nn(n){let e=new Ft(n);return await e.connect(),e}async function Gt(n,...e){let t=await Nn();try{return await t[n](...e)}finally{t.close()}}function Kt(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 qn(n){let e=n?.data||[];return{items:e.map(t=>({time:t.c_time?t.c_time.slice(5,16):"",name:t.symbol_name||t.event||"",direction:t.float==="up"?"up":t.float==="down"?"down":""})),total:e.length}}function Vr(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 Zr(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 to(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 eo(n){let e=n?.data||[];return{items:e.map(t=>({time:t.public_time||"",country:t.country||"",event:t.eventcontent||""})),total:e.length}}function no(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 On(n){return n.command({command:"calendar",describe:"\u5B8F\u89C2\u65E5\u5386",builder:e=>e.strictCommands(!1).command("invest [date]","A\u80A1\u6295\u8D44\u65E5\u5386\uFF08cls\uFF0C\u9ED8\u8BA4\u4ECA\u5929\uFF09",t=>t,async t=>{let r=t.date||N(),o=await wt({date:r});l({data:o,command:"calendar invest",source:"cls",toJSON:qn})}).command("macro [date]","\u5168\u7403\u5B8F\u89C2\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=R(),s=await Se(r,"cj",o?{cookie:o}:void 0);l({data:s,command:"calendar macro",source:"jin10",toJSON:a=>Kt(a?.data||[])})}).command("event [date]","\u5B8F\u89C2\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=R(),s=await xe(r,"cj",o?{cookie:o}:void 0);l({data:s,command:"calendar event",source:"jin10",toJSON:Vr})}).command("holiday [date]","\u5168\u7403\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=R(),s=await ke(r,"cj",o?{cookie:o}:void 0);l({data:s,command:"calendar holiday",source:"jin10",toJSON:Zr})}).command("ashare","A\u80A1\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async()=>{let t=await Gt("getAShareData",{page:1});l({data:t,command:"calendar ashare",source:"jin10",toJSON:to})}).command("hk [date]","\u6E2F\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=await Gt("getHKStockData",r);l({data:o,command:"calendar hk",source:"jin10",toJSON:s=>Kt(Array.isArray(s)?s:[])})}).command("us [date]","\u7F8E\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=await Gt("getUSStockData",r);l({data:o,command:"calendar us",source:"jin10",toJSON:s=>Kt(Array.isArray(s)?s:[])})}).command("future-event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=await V(r);l({data:o,command:"calendar future-event",source:"jin10",toJSON:eo})}).command("future-holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=await Z(r);l({data:o,command:"calendar future-holiday",source:"jin10",toJSON:no})}),handler:async()=>{let e=await wt({date:N()});l({data:e,command:"calendar",source:"cls",toJSON:qn})}})}var it={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 ro(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 oo(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 ao(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 so(n){let e=n?.data||[];return{items:e.map(t=>({time:Ee(t.time),content:ot(t.data?.content||t.data?.title||"",t),importance:t.important??0,source:t.data?.source||"",remark:F(t.remark)||""})),total:e.length}}function vn(n){return n.command("future","\u671F\u8D27",e=>e.option("channel",{alias:"c",type:"string",default:"all",describe:`\u9891\u9053: ${Object.keys(it).join("/")}`}).command("headline","\u671F\u8D27\u5934\u6761",{},async()=>{let t=await Ae();l({data:t,command:"future headline",source:"jin10",toJSON:ro})}).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||N(),o=await qe(r);l({data:o,command:"future basis",source:"jin10",toJSON:oo})}).command("calendar [date]","\u671F\u8D27\u65E5\u5386",t=>t.positional("date",{type:"string"}),async t=>{let r=t.date||N(),o=await Ne(r);l({data:o,command:"future calendar",source:"jin10",toJSON:ao})}).command("event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let r=t.date||N(),o=await V(r);l({data:o,command:`future event ${r}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(i=>({time:i.public_time,country:i.country,event:i.eventcontent}))})})}).command("holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let r=t.date||N(),o=await Z(r);l({data:o,command:`future holiday ${r}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(i=>({time:i.holiday_time,country:i.country,market:i.market,name:i.holiday_name,description:i.description}))})})}),async e=>{let{channel:t="all",n:r=10}=e,o=it[t];o===void 0&&(console.error(`\u9519\u8BEF: \u4E0D\u652F\u6301\u7684\u9891\u9053 "${t}"\uFF0C\u53EF\u9009: ${Object.keys(it).join(", ")}`),process.exit(1));let s=new Set,a=[],i=await Nt(o);for(let u of i?.data||[])s.has(u.id)||(s.add(u.id),a.push(u));let c=0,m=50;for(;a.length<r&&c++<m;){let u=a[a.length-1];if(!u)break;let f=(await Nt(o,{max_time:u.time}))?.data||[];if(!f.length)break;let y=0;for(let h of f)s.has(h.id)||(s.add(h.id),a.push(h),y++);if(y===0)break;a.length<r&&await new Promise(h=>setTimeout(h,200))}let d={...i,data:a};l({data:d,command:"future",source:"jin10",toJSON:so})})}var io="wss://market-ws.jin10.com/",co=["DCE","CZC","SHF","INE","CF","GFEX"];function lo(n,e){let t=n.readUInt16LE(e);return e+=2,{str:n.subarray(e,e+t).toString("utf8"),end:e+t}}function j(n,e){return Number(n.readBigInt64LE(e))}function uo(n){let e=2,{str:t,end:r}=lo(n,e);e=r;let o=j(n,e)/1e6,s=j(n,e+8)/1e6;j(n,e+16);let a=j(n,e+24),i=j(n,e+32)/1e6,c=j(n,e+40)/1e6,m=j(n,e+48)/1e6,d=j(n,e+56)/1e6,u=j(n,e+64),p=n.readUInt32LE(e+72),f=t.split(".")[1],y=co.includes(f),h=null,g=e+76;y&&g<n.length&&n[g]===1&&(h=j(n,g+1)/1e6);let S=h??d,q=o-S,U=S?q/S*100:0;return{code:t,snap:{code:t,close:o,prevClose:s,high:i,low:m,open:c,preclose:S,base:S,change:q,changePercent:U,openInterest:a,turnover:u,timestamp:p}}}function jn(n,e={}){let t=e.freq??2e3,r=e.timeout??8e3;return new Promise((o,s)=>{if(!n.length)return o(new Map);let a=new Set(n),i=new Map,c=new WebSocket(io);c.binaryType="arraybuffer";let m=setTimeout(()=>{try{c.close()}catch{}o(i)},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=>{let u=Buffer.from(d.data),p=u.readUInt16LE(0);if(p===1100)return;if(p===1200){c.send(Buffer.alloc(0));return}if(p!==10005)return;let f=uo(u);if(f&&(a.has(f.code)&&i.set(f.code,f.snap),i.size>=a.size)){clearTimeout(m);try{c.close()}catch{}o(i)}},c.onerror=()=>{clearTimeout(m),o(i)}})}import mo from"https";import{gunzipSync as po}from"zlib";var fo="wss://tm-qtg.jiaoyixia.com",ho="https://jiaoyixia-market.jin10.com",go={"1m":1,"5m":2,"30m":3,"60m":4,"120m":16,d:5,w:6,m:7,y:23,"15m":14,"10m":13};function zt(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 ct=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 yo(){return new ct().wU16(21100).wStr("").wI8(7).wU16(0).wU16(0).wU16(0).wU16(46860).wU32(0).wI8(122).wU32(0).wU32(0).toBuffer()}function bo(n,e,t,r=8e3){return new Promise((o,s)=>{let a=new WebSocket(fo);a.binaryType="arraybuffer";let i="",c=!1,m=(u,p)=>{if(!c){c=!0,clearTimeout(d);try{a.close()}catch{}u?s(u):o(p)}},d=setTimeout(()=>m(new Error("tm-qtg 10006 \u8D85\u65F6"),[]),r);a.onopen=()=>{let u=Buffer.alloc(6);u.writeInt16LE(912,0),u.writeInt32LE(3063,2),a.send(u)},a.onmessage=u=>{let p=Buffer.from(u.data);if(!i){i=p.readUInt32LE(0).toString(),a.send(zt(yo(),i));return}let f=zt(p,i),y=f.readUInt16LE(0);if(y===21100){setTimeout(()=>{let h=new ct().wU16(10006).wStr(n).wU8(e).wI64(t).wU16(0).wU8(0);a.send(zt(h.toBuffer(),i))},400);return}if(y===10006){let h=f.toString("utf8"),g=/([0-9a-f]{32})\.(\d+)\.(\d+)\.(\d+)\.(\d+)/g,S=[],q;for(;q=g.exec(h);)S.push({hash:q[1],count:+q[2],start:+q[3],end:+q[4],idx:+q[5]});m(null,S)}},a.onerror=()=>m(new Error("tm-qtg \u8FDE\u63A5\u5931\u8D25"),[])})}async function Yt(n,e,t){for(let r=0;r<3;r++)try{return await bo(n,e,t)}catch{if(r===2)return[];await new Promise(s=>setTimeout(s,300))}return[]}function Cn(n,e,t){let r=`${ho}/${n}/${e}/${t}`;return new Promise((o,s)=>{mo.get(r,a=>{if(a.statusCode&&a.statusCode>=300&&a.statusCode<400&&a.headers.location)return o(Cn(n,e,t));let i=[];a.on("data",c=>i.push(c)),a.on("end",()=>{try{let c=po(Buffer.concat(i)),m=Math.floor(c.length/48),d=[];for(let u=0;u<m;u++){let p=u*48;d.push({date:new Date(Number(c.readBigUInt64LE(p))*1e3).toISOString(),open:Number(c.readBigInt64LE(p+8))/1e6,high:Number(c.readBigInt64LE(p+16))/1e6,low:Number(c.readBigInt64LE(p+24))/1e6,close:Number(c.readBigInt64LE(p+32))/1e6,volume:Number(c.readBigInt64LE(p+40))})}o(d)}catch(c){s(c)}}),a.on("error",s)}).on("error",s)})}var wo=86400,_o=new Set(["1m","5m","10m","15m","30m","60m","120m"]);async function $n(n,e,t){let r=go[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,s;_o.has(n)?s=await So(o,r):s=await xo(o,r);let a=[...s].sort((m,d)=>d.start-m.start),i=[],c=new Set;for(let m of a){if(i.length>=t)break;if(!c.has(m.hash)){c.add(m.hash);try{let d=await Cn(o,r,m.hash);for(let u of d)i.some(p=>p.date===u.date)||i.push(u)}catch{}}}return i.sort((m,d)=>m.date<d.date?-1:1),{candles:i.slice(-t),source:"jin10 tm-qtg"}}async function So(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*wo,a=await Yt(n,e,s);if(a.length)return a}return await Yt(n,e,0)}async function xo(n,e,t=12){let r=[],o=new Set,s=0;for(let a=0;a<t;a++){let i=await Yt(n,e,s);if(!i.length)break;let c=0;for(let d of i)o.has(d.hash)||(o.add(d.hash),r.push(d),c++);if(c===0)break;s=Math.max(...i.map(d=>d.end))}return r}var ko=["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 Ao(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 Tn(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/1m/5m/10m/15m/30m/60m/120m"}).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,{candles:a,source:i}=await $n(o,r,s);l({data:{code:r,period:o,items:a,total:a.length},command:`price kline ${r} -p ${o}`,source:i})}),async e=>{let t=e.codes||[],r=t.length?t.map(a=>a.trim()).filter(Boolean):ko,o=await jn(r),s=r.map(a=>o.get(a)).filter(a=>!!a).map(Ao);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})})})}var L=No(qo(process.argv)).scriptName("finflow").version("1.9.0").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");Ie(L);Sn(L);kn(L);On(L);vn(L);Tn(L);L.parse();
|
|
6
|
+
${m}`),process.exit(1)}let i=await dt(a.id),c=k(i?.data?.depth_list||[]);if(c.length<o){let m=c[c.length-1]?.ctime;if(m){let d=await re(a.id,{lastTime:m,rn:o-c.length}),u=k(d?.data?.depth_list||d?.data||[]);c=[...c,...u]}}l({data:i,command:"info news depth",source:"cls",toJSON:Re})}).command("hot","\u70ED\u95E8\u6587\u7AE0\u6392\u884C\uFF08cls\uFF09",r=>r,async()=>{let r=await oe();l({data:r,command:"info news hot",source:"cls",toJSON:sr})}).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(),a=s;if(!/^(s[hz]\d+|\d{6})$/i.test(s)){let m=(await X(s,{type:"stock",rn:1}))?.data?.stock?.data?.[0];a=m?.stock_id||m?.descr||s}let i=await ue(a,{rn:o});l({data:i,command:"info news stock",source:"cls",toJSON:ir})}),async()=>{let t=await dt(1e3);l({data:t,command:"info news",source:"cls",toJSON:Re})}).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,a=await tt(),i=Array.isArray(a)?a:a?.data||[],c=s.toLowerCase(),m=i.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=k(m.slice(0,o));l({data:d,command:"info topic search",source:"jin10",toJSON:Le})}).command("groups","\u8BDD\u9898\u5206\u7EC4",r=>r,async()=>{let r=await tt();l({data:r,command:"info topic groups",source:"jin10",toJSON:lr})}).command("hot","\u8D22\u8054\u793E\u9898\u6750",r=>r,async()=>{let r=await ae();l({data:r,command:"info topic hot",source:"cls",toJSON:o=>cr(k(o))})}).command("show <id>","\u4E13\u9898\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async r=>{let{n:o=10}=r,s=r.id,a=R(),i=a?{cookie:a}:void 0,c=new Set,m=[],d=1,u=50;for(;m.length<o&&d<=u;){let y=(await Oe(s,{page:d},i))?.data?.list||[];if(!y.length)break;let h=0;for(let g of y)c.has(g.id)||(c.add(g.id),m.push(g),h++);if(h===0)break;d++,m.length<o&&await new Promise(g=>setTimeout(g,200))}let p=k(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 tt(),s=k(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:Le})}).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:a}=r,i=r.keyword;if(s==="jin10"){let m=await xt({keyword:i,type:a&&a!=="all"?a:"all",offset:0});l({data:m,command:"info search",source:"jin10",toJSON:De})}else{let m=await X(i,{type:a||"all",rn:Math.max(o,20)});l({data:m,command:"info search",source:"cls",toJSON:Pe})}}).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 ne(o);l({data:s,command:"info search detail",source:"cls",toJSON:dr})}),async t=>{let{n:r=20,src:o="cls",type:s}=t,a=t.keyword||t._?.[2];if(!a)return l({data:{error:"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD"},command:"info search",source:"cls"});if(o==="jin10"){let c=await xt({keyword:a,type:s&&s!=="all"?s:"all",offset:0});l({data:c,command:"info search",source:"jin10",toJSON:De})}else{let c=await X(a,{type:s||"all",rn:Math.max(r,20)});l({data:c,command:"info search",source:"cls",toJSON:Pe})}}),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 He from"fs";import pr from"path";import fr from"os";var Be=pr.join(fr.homedir(),".xueqiu-anon-cookie"),Me="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",w="stock.xueqiu.com",hr="xueqiu.com";function A(n){return n.trim().toUpperCase()}var gr="https://xueqiu.com/hq";function yr(){try{let n=He.readFileSync(Be,"utf-8").trim();return n&&/acw_tc=/.test(n)?n:null}catch{return null}}function br(n){let e=n.headers;return typeof e.getSetCookie=="function"?e.getSetCookie():(e.get("set-cookie")||"").split(/,(?=\s*[A-Za-z_-]+=)/)}function wr(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 Ue(){let n=await fetch(gr,{headers:{"User-Agent":Me,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=wr(br(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{He.writeFileSync(Be,e,"utf-8")}catch{}return e}function _r(n){return String(n?.error_code??n?.code)==="400016"}async function Sr(n,e,t,r,{token:o=!0,ua:s}={}){let a=o?yr()??await Ue():null,i=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||Me,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);i=f.status;try{return await f.json()}catch{return null}},m=await c(a);if(o&&(_r(m)||m===null||i===401)&&(m=await c(await Ue())),m===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 m}function b(n,e,t={}){return Sr("GET",n,e,null,t)}function Rt(n){return b(w,`/v5/stock/realtime/quotec.json?symbol=${n.map(A).join(",")}`,{token:!1})}function Lt(n){return b(w,`/v5/stock/realtime/pankou.json?symbol=${A(n)}`)}var xr={d:"day",w:"week",m:"month",y:"year",q:"quarter"};function Pt(n,{period:e="day",count:t=284}={}){let r=xr[e]||e,o=Date.now();return b(w,`/v5/stock/chart/kline.json?symbol=${A(n)}&begin=${o}&period=${r}&type=before&count=-${t}&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance`)}function Dt(n,{period:e="1d"}={}){return b(w,`/v5/stock/chart/minute.json?symbol=${A(n)}&period=${e}`)}function It(n,{count:e=50}={}){return b(w,`/v5/stock/history/trade.json?symbol=${A(n)}&count=${e}`)}function Fe(n){return b(w,`/v5/stock/quote/relevant.json?symbol=${A(n)}`)}function Ge(n){return b(hr,`/query/v1/suggest_stock.json?q=${encodeURIComponent(n)}`)}function Ke({category:n="cn"}={}){return b(w,`/v5/stock/screener/industries.json?category=${n}`)}function ze(n={}){let{page:e=1,size:t=30,order:r="desc",order_by:o="percent",market:s="CN"}=n,a=new URLSearchParams({page:String(e),size:String(t),order:r,order_by:o,market:s});return n.ind_code&&a.set("ind_code",n.ind_code),n.type&&a.set("type",n.type),b(w,`/v5/stock/screener/quote/list.json?${a.toString()}`)}function Ye(n){return b(w,`/v5/stock/hq/longhu.json?date=${n}`)}function We(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(w,`/v5/stock/finance/${s}/indicator.json?symbol=${A(n)}&type=${r}&is_detail=${o}&count=${t}`)}function Xe(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(w,`/v5/stock/finance/${s}/cash_flow.json?symbol=${A(n)}&type=${r}&is_detail=${o}&count=${t}`)}function Qe(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(w,`/v5/stock/finance/${s}/income.json?symbol=${A(n)}&type=${r}&is_detail=${o}&count=${t}`)}function Ve(n,e={}){let{count:t=10,type:r="Q4",is_detail:o=!0,region:s="cn"}=e;return b(w,`/v5/stock/finance/${s}/balance.json?symbol=${A(n)}&type=${r}&is_detail=${o}&count=${t}`)}function Ze(n,{circula:e=1}={}){return b(w,`/v5/stock/f10/cn/top_holders.json?symbol=${A(n)}&circula=${e}`)}function Ut(n){return b(w,`/v5/stock/f10/cn/indicator.json?symbol=${A(n)}`)}function tn(n){return b(w,`/v5/stock/f10/cn/industry.json?symbol=${A(n)}`)}function en(n,{page:e=1,size:t=10}={}){return b(w,`/v5/stock/f10/cn/bonus.json?symbol=${A(n)}&page=${e}&size=${t}`)}function Ht(n){return b(w,`/v5/stock/capital/flow.json?symbol=${A(n)}`)}function nn(n,{count:e=20}={}){return b(w,`/v5/stock/capital/history.json?symbol=${A(n)}&count=${e}`)}function rn(n,{page:e=1,size:t=180}={}){return b(w,`/v5/stock/capital/margin.json?symbol=${A(n)}&page=${e}&size=${t}`)}function Bt(n){return b(w,`/v5/stock/batch/quote.json?symbol=${n.map(A).join(",")}&extend=detail&is_delay_hk=true`)}function K(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 kr="https://query1.finance.yahoo.com/v8/finance/chart",Ar={"User-Agent":"Mozilla/5.0"};async function Mt(n){let e=n.trim().toUpperCase(),t=`${kr}/${encodeURIComponent(e)}?interval=1d&range=1d`;try{let s=(await(await fetch(t,{headers:Ar})).json())?.chart?.result;if(!Array.isArray(s)||s.length===0)return null;let a=s[0]?.meta;if(!a?.symbol)return null;let i=Number(a.regularMarketPrice??0),c=Number(a.chartPreviousClose??0),m=i-c,d=c===0?0:m/c*100;return{symbol:a.symbol,name:a.shortName??"",price:i,prevClose:c,change:m,changePercent:d,currency:a.currency??"",exchange:a.exchangeName??"",marketState:a.marketState??""}}catch{return null}}function Nr(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 qr(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 Or(n){let e=n?.data||{},t=Number(e.last_px??0);return!!(e.secu_name||e.secu_code)&&Number.isFinite(t)&&t!==0}function vr(n){if(!n)return!1;let e=Number(n.current??n.price??0);return!!(n.symbol||n.name)&&Number.isFinite(e)&&e!==0}function jr(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}async function Cr(n){let e=n.toUpperCase().startsWith("SH")||n.toUpperCase().startsWith("SZ")?[n.toUpperCase()]:/^\d{6}$/.test(n)?[n.startsWith("6")?"SH"+n:"SZ"+n]:[n.toUpperCase()];try{let r=(await Bt(e))?.data?.items||[];return r[0]?.quote||r[0]||null}catch{let t=await Rt(e);return(t?.data||t?.items||[])[0]||null}}function $r(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 _n=new Set(["1m","5m","15m","30m","60m","120m"]);function Tr(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 an(n,e,t){return{code:n,period:e,items:t.map(r=>({date:Tr(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 sn(n,e,t){let r=_n.has(e);return{code:n,period:e,items:t.map(o=>({date:r?new Date(o[0]).toISOString():new Date(o[0]).toISOString().slice(0,10),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 cn(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 ln(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 un(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),a=s.length<=3?"0"+s[0]:s.slice(0,2),i=s.length<=3?s.slice(1):s.slice(2),c=s.slice(-2);return{time:`${a}:${i}:${c}`,price:Number(o.last_px||0),volume:Number(o.change_vol||0),side:o.change_vol_color===1?"buy":"sell"}}),total:r}}function mn(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,50).map(r=>({time:new Date(r.timestamp).toISOString(),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 dn(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 a=String(s.minute),i=a.length<=3?"0"+a[0]:a.slice(0,2),c=a.length<=3?a.slice(1):a.slice(2),m=Number(s.last_px||0);return{time:`${i}:${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 pn(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,240).map(r=>({time:new Date(r.timestamp).toISOString(),price:Number(r.current||0),volume:Number(r.volume||0),avgPrice:Number(r.avg_price||0)})),total:t.length}}function fn(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 hn(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 Er(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 Jr(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 Rr(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 gn(n){let e=n?.data||{},t=e.items||[];return{items:t.map(r=>({time:r.timestamp?new Date(r.timestamp).toISOString():"",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 Lr(n){let e=n?.data?.items||[];return{items:e.map(t=>({date:t.td_date?new Date(t.td_date).toISOString().slice(0,10):"",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 Pr(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 Dr(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?new Date(t.ashare_ex_dividend_date).toISOString().slice(0,10):"",equityDate:t.equity_date?new Date(t.equity_date).toISOString().slice(0,10):"",plan:t.plan_explain||""})),total:e.length}:{items:[],total:0}}function z(n){return Array.isArray(n)?n[0]:n}function Ir(n){let e=n?.data||{},t=e.list||[];return{name:e.quote_name||"",items:t.map(r=>({report:r.report_name||"",roe:z(r.avg_roe),eps:z(r.basic_eps),grossMargin:z(r.gross_selling_rate),revenueYoy:z(r.operating_income_yoy)})),total:t.length}}function yn(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 Ur(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"]},a=o[e]||o.cashflow,i=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<a.length;d++)m[i[d]]=z(c[a[d]]);return m}),total:r.length}}function Hr(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 Br(n){let t=(n?.data||{}).items||[];return{items:t.map(r=>({time:r.timestamp?new Date(r.timestamp).toISOString():"",amount:Number(r.amount||0)})),total:t.length}}function Mr(n){let e=(n?.data?.industries||[]).map(t=>({code:t.encode||"",name:t.name||"",pinyin:t.pinyin||""}));return{items:e,total:e.length}}function bn(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 wn(n){let e=[],t,r=1,o=12;for(;e.length<n.n&&r<=o;){let s=await ze({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 a=s?.data?.list||[];if(t=s?.data?.count??t,!a.length)break;e.push(...a),r++}return{list:e,count:t}}function Sn(n){return n.command({command:"quote [code]",describe:"\u8BC1\u5238\u884C\u60C5\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF0C\u81EA\u52A8\u8BC6\u522B\u6570\u636E\u6E90\uFF09",builder:e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF08A\u80A1: sh600519 / 600519\uFF0C\u6E2F\u80A1: 00700\uFF0C\u7F8E\u80A1: AAPL\uFF09"}).strictCommands(!1).command("batch <codes...>","\u6279\u91CF\u884C\u60C5\uFF08\u96EA\u7403\uFF0C\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF09",t=>t,async t=>{let r=t.codes,o=r.map(i=>{let c=i.toUpperCase();return c.startsWith("SH")||c.startsWith("SZ")?c:/^\d{6}$/.test(i)?i.startsWith("6")?"SH"+i:"SZ"+i:c}),s,a;try{s=await Bt(o),a=s?.data?.items||[],a.length&&a[0]?.quote&&(a=a.map(i=>({...i.quote,market:i.market})))}catch{s=await Rt(o),a=s?.data||s?.items||[]}l({data:a,command:`quote batch ${r.join(" ")}`,source:"xq",toJSON:()=>qr(a)})}).command("related <code>","\u5173\u8054\u80A1\u7968\uFF08xueqiu\uFF09",t=>t,async t=>{let r=t.code,s=await Fe(r),a=s?.data?.items||s?.data||[];l({data:s,command:`quote related ${r}`,source:"xq",toJSON:()=>({items:a.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\uFF09",t=>t,async t=>{let r=t.keyword,o=await Ge(r);l({data:o,command:`quote search ${r}`,source:"xq",toJSON:Hr})}).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(),a=t["order-by"]??"percent",i=t.order??"desc";if(!o){let d=await Ke({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:Mr})}let{list:c,count:m}=await wn({n:r,order:i,order_by:a,market:s.toUpperCase(),ind_code:o});l({data:{list:c},command:`quote industry ${o} --market ${s}`,source:"xq",toJSON:()=>bn(c,m)})}).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",a=t.order??"desc",i=o==="hk"?"HK":o==="us"||o==="us_china"?"US":"CN",{list:c,count:m}=await wn({n:r,order:a,order_by:s,market:i,type:o});l({data:{list:c},command:`quote board ${o}`,source:"xq",toJSON:()=>bn(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,a=t.code,i=_n.has(r),c=s==="xq"||!s&&i;try{if(c){let m=await Pt(a,{period:r,count:o}),d=m?.data?.item||m?.data||[];return l({data:m,command:`quote kline ${a} -p ${r}`,source:"xq",toJSON:()=>sn(a,r,d)})}else{let m=r==="w"?"w":r==="m"?"m":r==="y"?"y":"d",d=[],u,p=0,f=50;for(;d.length<o&&p++<f;){let g=(await yt(a,{period:m,limit:Math.min(o-d.length,200),start_date:u}))?.data||[];if(!g.length)break;d=[...g,...d],u=String(g[0].trade_date)}let y=d.slice(-o);return l({data:y,command:`quote kline ${a} -p ${r}`,source:"cls",toJSON:h=>an(a,m,h)})}}catch{if(i&&!s)throw new Error("xq K\u7EBF\u8BF7\u6C42\u5931\u8D25\uFF0C\u5206\u949F\u7EBF\u65E0\u5907\u9009\u6570\u636E\u6E90");if((c?"cls":"xq")==="xq"){let d=await Pt(a,{period:r,count:o}),u=d?.data?.item||d?.data||[];l({data:d,command:`quote kline ${a} -p ${r}`,source:"xq fallback",toJSON:()=>sn(a,r,u)})}else{let d=r==="w"?"w":r==="m"?"m":r==="y"?"y":"d",u=[],p,f=0,y=50;for(;u.length<o&&f++<y;){let S=(await yt(a,{period:d,limit:Math.min(o-u.length,200),start_date:p}))?.data||[];if(!S.length)break;u=[...S,...u],p=String(S[0].trade_date)}let h=u.slice(-o);l({data:h,command:`quote kline ${a} -p ${r}`,source:"cls fallback",toJSON:g=>an(a,d,g)})}}}).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 a=await Lt(o);return l({data:a,command:`quote depth ${o} --src xq`,source:"xq",toJSON:i=>ln(o,i?.data||{})})}else{let a=await ft(o);return l({data:a,command:`quote depth ${o}`,source:"cls",toJSON:i=>cn(o,i?.data||{})})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Lt(o);l({data:i,command:`quote depth ${o} --src xq`,source:"xq fallback",toJSON:c=>ln(o,c?.data||{})})}else{let i=await ft(o);l({data:i,command:`quote depth ${o}`,source:"cls fallback",toJSON:c=>cn(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 a=await It(o);return l({data:a,command:`quote ticks ${o} --src xq`,source:"xq",toJSON:i=>mn(o,i)})}else{let a=await ht(o);return l({data:a,command:`quote ticks ${o}`,source:"cls",toJSON:i=>un(o,i)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await It(o);l({data:i,command:`quote ticks ${o} --src xq`,source:"xq fallback",toJSON:c=>mn(o,c)})}else{let i=await ht(o);l({data:i,command:`quote ticks ${o}`,source:"cls fallback",toJSON:c=>un(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 a=await Dt(o,{period:"1d"});return l({data:a,command:`quote timeline ${o} --src xq`,source:"xq",toJSON:i=>pn(o,i)})}else{let a=await gt(o);return l({data:a,command:`quote timeline ${o}`,source:"cls",toJSON:i=>dn(o,i)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Dt(o,{period:"1d"});l({data:i,command:`quote timeline ${o} --src xq`,source:"xq fallback",toJSON:c=>pn(o,c)})}else{let i=await gt(o);l({data:i,command:`quote timeline ${o}`,source:"cls fallback",toJSON:c=>dn(o,c)})}}}).command("sector [code]","\u677F\u5757",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("rank","\u677F\u5757\u6392\u884C",r=>r.option("type",{alias:"t",type:"string",default:"industry"}),async r=>{let{t:o="industry"}=r,s=await pt({type:o}),a=Array.isArray(s?.data)?s.data:[];l({data:s,command:`quote sector rank -t ${o}`,source:"cls",toJSON:()=>fn(a,o)})}).command("plate <code>","\u4E2A\u80A1\u677F\u5757",r=>r,async r=>{let o=r.code,s=await bt(o),a=Array.isArray(s?.data)?s.data:[];l({data:s,command:`quote sector plate ${o}`,source:"cls",toJSON:()=>hn(a)})}).command("industry <code>","\u884C\u4E1A\u4FE1\u606F",r=>r,async r=>{let o=r.code,s=o.length<=6?o.toUpperCase().startsWith("SH")||o.toUpperCase().startsWith("SZ")?o:o.toUpperCase():o,a=await tn(s);l({data:a,command:`quote sector industry ${o}`,source:"xq",toJSON:Jr})}).command("stocks <plate_code>","\u677F\u5757/\u6982\u5FF5\u6210\u5206\u80A1\uFF08plate_code \u6765\u81EA sector rank / sector plate\uFF09",r=>r.positional("plate_code",{type:"string"}).option("way",{type:"string",default:"change",describe:"\u6392\u5E8F\uFF1Achange(\u6DA8\u8DCC\u5E45)/last_px(\u4EF7)/amount"}),async r=>{let{way:o="change"}=r,s=r.plate_code,a=await ce(s,{way:o});l({data:a,command:`quote sector stocks ${s}`,source:"cls",toJSON:Er})}),async t=>{let{code:r}=t;if(r){let o=await bt(r),s=Array.isArray(o?.data)?o.data:[];l({data:o,command:`quote sector ${r}`,source:"cls",toJSON:()=>hn(s)})}else{let o=await pt({type:"industry"}),s=Array.isArray(o?.data)?o.data:[];l({data:o,command:"quote sector",source:"cls",toJSON:()=>fn(s,"industry")})}}).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 M();l({data:r,command:"quote flow market",source:"glh",toJSON:K})}).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,a=await nn(s,{count:o});l({data:a,command:`quote flow history ${s}`,source:"xq",toJSON:gn})}).command("margin <code>","\u878D\u8D44\u878D\u5238",r=>r,async r=>{let o=r.code,s=await rn(o);l({data:s,command:`quote flow margin ${o}`,source:"xq",toJSON:Lr})}).command("intraday <code>","\u5F53\u65E5\u8D44\u91D1\u6D41\u5411\uFF08xueqiu\uFF09",r=>r,async r=>{let o=r.code,a=await Ht(o);l({data:a,command:`quote flow intraday ${o}`,source:"xq",toJSON:gn})}).command("xq <code>","\u96EA\u7403\u8D44\u91D1\u6D41",r=>r,async r=>{let o=r.code,a=await Ht(o);l({data:a,command:`quote flow xq ${o}`,source:"xq",toJSON:Br})}),async t=>{let{code:r}=t;if(r){let o=await le(r);l({data:o,command:`quote flow ${r}`,source:"cls",toJSON:Rr})}else{let o=await M();l({data:o,command:"quote flow market",source:"glh",toJSON:K})}}).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 Ze(o);l({data:s,command:`quote f10 holders ${o}`,source:"xq",toJSON:Pr})}).command("bonus <code>","\u5206\u7EA2\u9001\u80A1",r=>r,async r=>{let o=r.code,s=await en(o);l({data:s,command:`quote f10 bonus ${o}`,source:"xq",toJSON:Dr})}).command("indicator <code>","\u4E3B\u8981\u6307\u6807",r=>r,async r=>{let o=r.code,s=await Ut(o);l({data:s,command:`quote f10 indicator ${o}`,source:"xq",toJSON:yn})}),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 Ut(r);l({data:o,command:`quote f10 indicator ${r}`,source:"xq",toJSON:yn})}).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 We(o);l({data:s,command:`quote finance indicator ${o}`,source:"xq",toJSON:Ir})}else{let a={cashflow:Xe,income:Qe,balance:Ve}[r];if(!a)return l({data:{error:`\u672A\u77E5\u7C7B\u578B: ${r}\uFF0C\u53EF\u9009 indicator/cashflow/income/balance`},command:`quote finance ${r}`,source:"xq"});let i=await a(o);l({data:i,command:`quote finance ${r} ${o}`,source:"xq",toJSON:c=>Ur(c,r)})}}),handler:async e=>{let t=e.code;if(!t)return l({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote sh600519 / finflow quote AAPL"},command:"quote",source:"cls"});if(["search","batch","related","industry","board","kline","depth","ticks","timeline","sector","flow","f10","finance"].includes(t))return l({data:{error:`\u8BF7\u63D0\u4F9B\u5B50\u547D\u4EE4\u53C2\u6570\uFF0C\u4F8B\u5982: finflow quote ${t} <code>`},command:`quote ${t}`,source:"cls"});try{let a=await ie(t);if(Or(a)){l({data:a,command:`quote ${t}`,source:"cls",toJSON:Nr});return}}catch{}let o=null;try{o=await Cr(t)}catch{}if(vr(o)){l({data:o,command:`quote ${t}`,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 s=jr(t);if(s){let a=await Mt(s);if(a){l({data:a,command:`quote ${t}`,source:"yahoo fallback",toJSON:$r});return}}if(o){l({data:o,command:`quote ${t}`,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 ${t} \u7684\u884C\u60C5\u6570\u636E`)}})}function Fr(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 xn(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 Gr(n){let e=n?.data,t=Array.isArray(e)?e:e?.data||[];return{items:t.map(r=>({code:r.secu_code||"",name:r.secu_name||"",change:r.change_px??null,changePercent:r.change!=null?Math.round(Number(r.change)*1e4)/100:null})),total:t.length}}function Kr(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 zr(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 kn(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:Fr})}).command("rank [type]","\u6DA8\u8DCC\u6392\u884C\uFF08cls\uFF09",t=>t,async t=>{let r=t.type||"change",o=St[r]||St.change,s=await se({way:o.way});l({data:s,command:"market rank",source:"cls",toJSON:Gr})}).command("index","\u5927\u76D8\u6307\u6570\uFF08glh\uFF09",t=>t,async()=>{let t=await vt();l({data:t,command:"market index",source:"glh",toJSON:xn})}).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=$e(r),a=await Ce({sort:s.id,order:o});l({data:a,command:"market hk",source:"glh",toJSON:Kr})}).command("flow","\u6CAA\u6DF1\u6E2F\u901A\u8D44\u91D1\u6D41\u5411",t=>t,async()=>{let t=await M();l({data:t,command:"market flow",source:"glh",toJSON:K})}).command("rates","\u5168\u7403\u592E\u884C\u5229\u7387\uFF08jin10\uFF09",t=>t,async()=>{let t=await be(),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||N(),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 a=await Ye(s);if(a?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${a.error_description||a.error_code}`);l({data:a,command:`market longhu ${r}`,source:"xq",toJSON:zr})}),handler:async()=>{let e=await vt();l({data:e,command:"market",source:"glh",toJSON:xn})}})}import{inflateSync as Yr}from"zlib";var Wr="wss://wss-flash-2.jin10.com/",at={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},st={LOGIN:4002,CACHE_DATA:2006,CALENDAR_DATA:2001,CALENDAR_EVENT:2003,CALENDAR_HOLIDAY:2004,CALENDAR_HOLIDAY_PAGE:2005},I=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 An(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 Xr(n,e){return An(n,e)}function Qr(n){try{return Yr(Buffer.from(n,"base64")).toString("utf-8")}catch{return null}}var Ft=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(Wr),this.ws.binaryType="arraybuffer",this.ws.onmessage=o=>{let s=o.data;if(!this.encryptKey){let m=new I(s);m.rU32L();let d=m.rU32L(),u=m.rU32L();this.encryptKey=`${u}.${d}`,this._sendLogin();return}let a=An(s,this.encryptKey),i=new I(a),c=i.r16L();if(c===st.LOGIN){clearTimeout(r),e();return}if(c===st.CACHE_DATA){i.rU32L(),i.rStrL();let m=i.rU32L(),d=i.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=Qr(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 I;e.w16L(st.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?Xr(t,this.encryptKey):t;this.ws.send(r)}_request(e,t){return new Promise((r,o)=>{let s=this.requestId++,a=setTimeout(()=>{this._pending.delete(s),o(new Error("\u8BF7\u6C42\u8D85\u65F6"))},this.timeout);this._pending.set(s,{resolve:r,reject:o,timer:a});let i=new I;i.w16L(st.CACHE_DATA),i.wU32L(e),i.wStrL(t),i.wU32L(s),this._send(i)})}close(){this.ws?.close(),this.ws=null,this.encryptKey="",this._pending.clear()}getFuturesData(e){return this._request(at.QH_DATA,e)}getHKStockData(e){return this._request(at.HK_DATA,e)}getUSStockData(e){return this._request(at.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(at.A_SHARE,t.join("&"))}};async function Nn(n){let e=new Ft(n);return await e.connect(),e}async function Gt(n,...e){let t=await Nn();try{return await t[n](...e)}finally{t.close()}}function Kt(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 qn(n){let e=n?.data||[];return{items:e.map(t=>({time:t.c_time?t.c_time.slice(5,16):"",name:t.symbol_name||t.event||"",direction:t.float==="up"?"up":t.float==="down"?"down":""})),total:e.length}}function Vr(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 Zr(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 to(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 eo(n){let e=n?.data||[];return{items:e.map(t=>({time:t.public_time||"",country:t.country||"",event:t.eventcontent||""})),total:e.length}}function no(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 On(n){return n.command({command:"calendar",describe:"\u5B8F\u89C2\u65E5\u5386",builder:e=>e.strictCommands(!1).command("invest [date]","A\u80A1\u6295\u8D44\u65E5\u5386\uFF08cls\uFF0C\u9ED8\u8BA4\u4ECA\u5929\uFF09",t=>t,async t=>{let r=t.date||N(),o=await wt({date:r});l({data:o,command:"calendar invest",source:"cls",toJSON:qn})}).command("macro [date]","\u5168\u7403\u5B8F\u89C2\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=R(),s=await Se(r,"cj",o?{cookie:o}:void 0);l({data:s,command:"calendar macro",source:"jin10",toJSON:a=>Kt(a?.data||[])})}).command("event [date]","\u5B8F\u89C2\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=R(),s=await xe(r,"cj",o?{cookie:o}:void 0);l({data:s,command:"calendar event",source:"jin10",toJSON:Vr})}).command("holiday [date]","\u5168\u7403\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=R(),s=await ke(r,"cj",o?{cookie:o}:void 0);l({data:s,command:"calendar holiday",source:"jin10",toJSON:Zr})}).command("ashare","A\u80A1\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async()=>{let t=await Gt("getAShareData",{page:1});l({data:t,command:"calendar ashare",source:"jin10",toJSON:to})}).command("hk [date]","\u6E2F\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=await Gt("getHKStockData",r);l({data:o,command:"calendar hk",source:"jin10",toJSON:s=>Kt(Array.isArray(s)?s:[])})}).command("us [date]","\u7F8E\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=await Gt("getUSStockData",r);l({data:o,command:"calendar us",source:"jin10",toJSON:s=>Kt(Array.isArray(s)?s:[])})}).command("future-event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=await V(r);l({data:o,command:"calendar future-event",source:"jin10",toJSON:eo})}).command("future-holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let r=t.date||N(),o=await Z(r);l({data:o,command:"calendar future-holiday",source:"jin10",toJSON:no})}),handler:async()=>{let e=await wt({date:N()});l({data:e,command:"calendar",source:"cls",toJSON:qn})}})}var it={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 ro(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 oo(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 ao(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 so(n){let e=n?.data||[];return{items:e.map(t=>({time:Ee(t.time),content:ot(t.data?.content||t.data?.title||"",t),importance:t.important??0,source:t.data?.source||"",remark:F(t.remark)||""})),total:e.length}}function vn(n){return n.command("future","\u671F\u8D27",e=>e.option("channel",{alias:"c",type:"string",default:"all",describe:`\u9891\u9053: ${Object.keys(it).join("/")}`}).command("headline","\u671F\u8D27\u5934\u6761",{},async()=>{let t=await Ae();l({data:t,command:"future headline",source:"jin10",toJSON:ro})}).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||N(),o=await qe(r);l({data:o,command:"future basis",source:"jin10",toJSON:oo})}).command("calendar [date]","\u671F\u8D27\u65E5\u5386",t=>t.positional("date",{type:"string"}),async t=>{let r=t.date||N(),o=await Ne(r);l({data:o,command:"future calendar",source:"jin10",toJSON:ao})}).command("event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let r=t.date||N(),o=await V(r);l({data:o,command:`future event ${r}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(i=>({time:i.public_time,country:i.country,event:i.eventcontent}))})})}).command("holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let r=t.date||N(),o=await Z(r);l({data:o,command:`future holiday ${r}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(i=>({time:i.holiday_time,country:i.country,market:i.market,name:i.holiday_name,description:i.description}))})})}),async e=>{let{channel:t="all",n:r=10}=e,o=it[t];o===void 0&&(console.error(`\u9519\u8BEF: \u4E0D\u652F\u6301\u7684\u9891\u9053 "${t}"\uFF0C\u53EF\u9009: ${Object.keys(it).join(", ")}`),process.exit(1));let s=new Set,a=[],i=await Nt(o);for(let u of i?.data||[])s.has(u.id)||(s.add(u.id),a.push(u));let c=0,m=50;for(;a.length<r&&c++<m;){let u=a[a.length-1];if(!u)break;let f=(await Nt(o,{max_time:u.time}))?.data||[];if(!f.length)break;let y=0;for(let h of f)s.has(h.id)||(s.add(h.id),a.push(h),y++);if(y===0)break;a.length<r&&await new Promise(h=>setTimeout(h,200))}let d={...i,data:a};l({data:d,command:"future",source:"jin10",toJSON:so})})}var io="wss://market-ws.jin10.com/",co=["DCE","CZC","SHF","INE","CF","GFEX"];function lo(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 j(n,e){return Number(n.readBigInt64LE(e))}function uo(n){if(n.length<2)return null;let e=2,t=lo(n,e);if(!t)return null;let r=t.str;if(e=t.end,e+76>n.length)return null;let o=j(n,e)/1e6,s=j(n,e+8)/1e6;j(n,e+16);let a=j(n,e+24),i=j(n,e+32)/1e6,c=j(n,e+40)/1e6,m=j(n,e+48)/1e6,d=j(n,e+56)/1e6,u=j(n,e+64),p=n.readUInt32LE(e+72),f=r.split(".")[1],y=co.includes(f),h=null,g=e+76;y&&g<n.length&&n[g]===1&&(h=j(n,g+1)/1e6);let S=h??d,q=o-S,U=S?q/S*100:0;return{code:r,snap:{code:r,close:o,prevClose:s,high:i,low:m,open:c,preclose:S,base:S,change:q,changePercent:U,openInterest:a,turnover:u,timestamp:p}}}function jn(n,e={}){let t=e.freq??2e3,r=e.timeout??8e3;return new Promise((o,s)=>{if(!n.length)return o(new Map);let a=new Set(n),i=new Map,c=new WebSocket(io);c.binaryType="arraybuffer";let m=setTimeout(()=>{try{c.close()}catch{}o(i)},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=uo(u);if(!f)return;if(a.has(f.code)&&i.set(f.code,f.snap),i.size>=a.size){clearTimeout(m);try{c.close()}catch{}o(i)}}catch{}},c.onerror=()=>{clearTimeout(m),o(i)}})}import mo from"https";import{gunzipSync as po}from"zlib";var fo="wss://tm-qtg.jiaoyixia.com",ho="https://jiaoyixia-market.jin10.com",go={"1m":1,"5m":2,"30m":3,"60m":4,"120m":16,d:5,w:6,m:7,y:23,"15m":14,"10m":13};function zt(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 ct=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 yo(){return new ct().wU16(21100).wStr("").wI8(7).wU16(0).wU16(0).wU16(0).wU16(46860).wU32(0).wI8(122).wU32(0).wU32(0).toBuffer()}function bo(n,e,t,r=8e3){return new Promise((o,s)=>{let a=new WebSocket(fo);a.binaryType="arraybuffer";let i="",c=!1,m=(u,p)=>{if(!c){c=!0,clearTimeout(d);try{a.close()}catch{}u?s(u):o(p)}},d=setTimeout(()=>m(new Error("tm-qtg 10006 \u8D85\u65F6"),[]),r);a.onopen=()=>{let u=Buffer.alloc(6);u.writeInt16LE(912,0),u.writeInt32LE(3063,2),a.send(u)},a.onmessage=u=>{let p=Buffer.from(u.data);if(!i){i=p.readUInt32LE(0).toString(),a.send(zt(yo(),i));return}let f=zt(p,i),y=f.readUInt16LE(0);if(y===21100){setTimeout(()=>{let h=new ct().wU16(10006).wStr(n).wU8(e).wI64(t).wU16(0).wU8(0);a.send(zt(h.toBuffer(),i))},400);return}if(y===10006){let h=f.toString("utf8"),g=/([0-9a-f]{32})\.(\d+)\.(\d+)\.(\d+)\.(\d+)/g,S=[],q;for(;q=g.exec(h);)S.push({hash:q[1],count:+q[2],start:+q[3],end:+q[4],idx:+q[5]});m(null,S)}},a.onerror=()=>m(new Error("tm-qtg \u8FDE\u63A5\u5931\u8D25"),[])})}async function Yt(n,e,t){for(let r=0;r<3;r++)try{return await bo(n,e,t)}catch{if(r===2)return[];await new Promise(s=>setTimeout(s,300))}return[]}function Cn(n,e,t){let r=`${ho}/${n}/${e}/${t}`;return new Promise((o,s)=>{mo.get(r,a=>{if(a.statusCode&&a.statusCode>=300&&a.statusCode<400&&a.headers.location)return o(Cn(n,e,t));let i=[];a.on("data",c=>i.push(c)),a.on("end",()=>{try{let c=po(Buffer.concat(i)),m=Math.floor(c.length/48),d=[];for(let u=0;u<m;u++){let p=u*48;d.push({date:new Date(Number(c.readBigUInt64LE(p))*1e3).toISOString(),open:Number(c.readBigInt64LE(p+8))/1e6,high:Number(c.readBigInt64LE(p+16))/1e6,low:Number(c.readBigInt64LE(p+24))/1e6,close:Number(c.readBigInt64LE(p+32))/1e6,volume:Number(c.readBigInt64LE(p+40))})}o(d)}catch(c){s(c)}}),a.on("error",s)}).on("error",s)})}var wo=86400,_o=new Set(["1m","5m","10m","15m","30m","60m","120m"]);async function $n(n,e,t){let r=go[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,s;_o.has(n)?s=await So(o,r):s=await xo(o,r);let a=[...s].sort((m,d)=>d.start-m.start),i=[],c=new Set;for(let m of a){if(i.length>=t)break;if(!c.has(m.hash)){c.add(m.hash);try{let d=await Cn(o,r,m.hash);for(let u of d)i.some(p=>p.date===u.date)||i.push(u)}catch{}}}return i.sort((m,d)=>m.date<d.date?-1:1),{candles:i.slice(-t),source:"jin10 tm-qtg"}}async function So(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*wo,a=await Yt(n,e,s);if(a.length)return a}return await Yt(n,e,0)}async function xo(n,e,t=12){let r=[],o=new Set,s=0;for(let a=0;a<t;a++){let i=await Yt(n,e,s);if(!i.length)break;let c=0;for(let d of i)o.has(d.hash)||(o.add(d.hash),r.push(d),c++);if(c===0)break;s=Math.max(...i.map(d=>d.end))}return r}var ko=["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 Ao(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 Tn(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/1m/5m/10m/15m/30m/60m/120m"}).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,{candles:a,source:i}=await $n(o,r,s);l({data:{code:r,period:o,items:a,total:a.length},command:`price kline ${r} -p ${o}`,source:i})}),async e=>{let t=e.codes||[],r=t.length?t.map(i=>i.trim()).filter(Boolean):ko,o=await jn(r),s=r.map(i=>o.get(i)).filter(i=>!!i).map(Ao),a=r.filter(i=>!o.has(i));l({data:s,command:`price ${t.length?t.join(" "):"(\u9ED8\u8BA4\u770B\u76D8\u5217\u8868)"}`,source:"jin10 market-ws",toJSON:i=>({items:i,total:i.length,...a.length?{missing:a}:{}})})})}var L=No(qo(process.argv)).scriptName("finflow").version("1.9.1").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");Ie(L);Sn(L);kn(L);On(L);vn(L);Tn(L);L.parse();
|