best-geo-test 0.3.0 → 0.3.2

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/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var kt=Object.defineProperty;var At=(e,t,n)=>t in e?kt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Z=(e,t,n)=>At(e,typeof t!="symbol"?t+"":t,n);var ee="https://nbgeo.aimusiclj.com",Ie="best-geo-test",he="best-geo-test",ke="bg-test-cli-",Ae="0.3.0";var P=1,E=Ae,R=he,d=Ie,be="dev",B=St(bt());function bt(){var e;return(e=process.env.BEST_GEO_API_BASE)!=null?e:ee}var j=ke,Se=300*1e3,xe=30*1e3;function St(e){return e.replace(/\/+$/,"")}var Me=require("node:child_process");var Re=require("node:crypto"),q=require("node:os");var p=require("node:fs"),_e=require("node:os"),L=require("node:path");var ve=require("node:crypto");var A=class extends Error{constructor(n,r,o){super(o);Z(this,"reason",n);Z(this,"path",r);this.name="LocalConfigError"}},xt={schemaVersion:1,device:null,activeCredential:null,pendingCredential:null};function T(){var e;return(e=process.env.BEST_GEO_CONFIG_DIR)!=null?e:(0,L.join)((0,_e.homedir)(),`.${d}`)}function v(){return(0,L.join)(T(),"config.json")}function S(){var n,r,o;let e=v(),t;try{if(!(0,p.existsSync)(e))return null;vt(e),t=(0,p.readFileSync)(e,"utf8")}catch(s){throw s instanceof A?s:Ce(s,e)}try{let s=JSON.parse(t);if(typeof s!="object"||s==null||s.schemaVersion!==1)throw new Error("unexpected shape");return{schemaVersion:1,device:(n=s.device)!=null?n:null,activeCredential:(r=s.activeCredential)!=null?r:null,pendingCredential:(o=s.pendingCredential)!=null?o:null}}catch{throw new A("corrupted",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5185\u5BB9\u4E0D\u5B8C\u6574\u6216\u683C\u5F0F\u4E0D\u5BF9\uFF1A${e}`)}}function _t(e){let t=T(),n=v(),r=(0,L.join)(t,`.config.json.${(0,ve.randomBytes)(6).toString("hex")}.tmp`);try{(0,p.existsSync)(t)||(0,p.mkdirSync)(t,{recursive:!0,mode:448});let o=(0,p.openSync)(r,"wx",384);try{(0,p.writeSync)(o,`${JSON.stringify(e,null,2)}
3
- `),(0,p.fsyncSync)(o)}finally{(0,p.closeSync)(o)}(0,p.renameSync)(r,n)}catch(o){if((0,p.existsSync)(r))try{(0,p.unlinkSync)(r)}catch{}throw Ce(o,n)}}function x(e){var n;let t=e((n=S())!=null?n:{...xt});return _t(t),t}function vt(e){var r;if(process.platform==="win32")return;let t=(0,p.statSync)(e),n=(r=process.getuid)==null?void 0:r.call(process);if(n!=null&&t.uid!==n)throw new A("not_owner",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u4E0D\u5C5E\u4E8E\u5F53\u524D\u7528\u6237\uFF1A${e}`);if((t.mode&63)!==0)throw new A("permissions_too_open",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u8FC7\u5BBD\uFF08\u540C\u673A\u5176\u4ED6\u7528\u6237\u53EF\u8BFB\uFF09\uFF1A${e}`)}function Ce(e,t){let n=e==null?void 0:e.code;return n==="EACCES"||n==="EPERM"||n==="EROFS"?new A("denied",t,`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\uFF1A${t}`):e instanceof Error?e:new Error(String(e))}var Ct=3600*1e3;function we(){return(0,L.join)(T(),"pending-uploads.json")}function U(){let e=we();if(!(0,p.existsSync)(e))return{};try{let t=JSON.parse((0,p.readFileSync)(e,"utf8")),n=Date.now();return Object.fromEntries(Object.entries(t).filter(([,r])=>{var o;return n-((o=r==null?void 0:r.createdAt)!=null?o:0)<Ct}))}catch{return{}}}function te(e){(0,p.mkdirSync)(T(),{recursive:!0,mode:448}),(0,p.writeFileSync)(we(),JSON.stringify(e),{mode:384})}function Oe(){var t,n;let e=(t=S())==null?void 0:t.device;return(n=e==null?void 0:e.deviceId)!=null&&n.startsWith(j)?e.deviceId:null}function G(){var r,o;let e={deviceName:(0,q.hostname)().slice(0,50),platform:`${(0,q.platform)()}-${process.arch}`},t=(r=S())==null?void 0:r.device;if((o=t==null?void 0:t.deviceId)!=null&&o.startsWith(j))return t.deviceName===e.deviceName&&t.platform===e.platform?t:x(s=>({...s,device:{...t,...e}})).device;let n={deviceId:`${j}${(0,Re.randomUUID)()}`,...e};return x(s=>({...s,device:n})).device}function $e(){return`cli_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function I(e,t=$e()){return{ok:!0,code:"OK",requestId:t,data:e}}function c(e,t,n={}){var r;return{ok:!1,code:e,message:t,requestId:(r=n.requestId)!=null?r:$e(),...n.data==null?{}:{data:n.data},...n.nextAction==null?{}:{nextAction:n.nextAction}}}function a(e){process.stdout.write(`${JSON.stringify(e)}
4
- `),e.ok||(process.exitCode=1)}async function y(e,t={}){var s,i;let n=new URL(`${B}/v1/agent-cli${e}`);for(let[l,m]of Object.entries((s=t.query)!=null?s:{}))if(m!=null)for(let u of Array.isArray(m)?m:[m])n.searchParams.append(l,String(u));let r={"X-GEO-CLI-Version":E,"X-GEO-Protocol-Version":String(P),"X-GEO-CLI-Package":R},o=null;try{o=Oe()}catch{}o&&(r["X-Device-ID"]=o),t.apiKey&&(r.Authorization=`Bearer ${t.apiKey}`),t.body!=null&&(r["Content-Type"]="application/json");try{let l=await fetch(n,{method:(i=t.method)!=null?i:"GET",headers:r,body:t.body==null?void 0:JSON.stringify(t.body),signal:AbortSignal.timeout(xe)}),m=await l.text();try{let u=JSON.parse(m);return wt(u)?u:c("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${l.status}\uFF09`,{data:{transportFailure:!0}})}catch{return c("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${l.status}\uFF09`,{data:{transportFailure:!0}})}}catch(l){return c("SERVER_ERROR",`\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF1A${l instanceof Error?l.message:String(l)}`,{data:{transportFailure:!0},nextAction:{type:"ask_user",message:"\u8BF7\u786E\u8BA4\u7F51\u7EDC\u53EF\u7528\uFF0C\u4EE5\u53CA\u670D\u52A1\u7AEF\u5730\u5740\u914D\u7F6E\u6B63\u786E"}})}}function wt(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.ok=="boolean"&&typeof t.code=="string"}function Rt(e){var t;return!e.ok&&((t=e.data)==null?void 0:t.transportFailure)===!0}function ne(e){return e.ok||Rt(e)?!1:["AUTH_EXPIRED","DEVICE_MISMATCH","ACCESS_DENIED","AUTH_REQUIRED","VALIDATION_FAILED"].includes(e.code)}function O(){var e,t,n;return(n=(t=(e=S())==null?void 0:e.activeCredential)==null?void 0:t.apiKey)!=null?n:null}function H(){var e,t;return(t=(e=S())==null?void 0:e.activeCredential)!=null?t:null}function Ne(){var e,t;return(t=(e=S())==null?void 0:e.pendingCredential)!=null?t:null}function De(e){x(t=>({...t,pendingCredential:{apiKey:e,startedAt:new Date().toISOString()}}))}function re(){x(e=>({...e,pendingCredential:null}))}function oe(e){return x(t=>{let n=t.pendingCredential;return n?{...t,activeCredential:{apiKey:n.apiKey,...e},pendingCredential:null}:t}).activeCredential}function Pe(){x(e=>({...e,activeCredential:null,pendingCredential:null}))}var _=require("node:crypto"),Te=require("node:http");function Le(e){let t=`
2
+ "use strict";var bt=Object.defineProperty;var At=(e,t,n)=>t in e?bt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Z=(e,t,n)=>At(e,typeof t!="symbol"?t+"":t,n);var ee="https://nbgeo.aimusiclj.com",he="best-geo-test",Ie="best-geo-test",ke="bg-test-cli-",be="0.3.2";var D=1,E=be,O=Ie,l=he,Ae="dev",B=xt(St());function St(){var e;return(e=process.env.BEST_GEO_API_BASE)!=null?e:ee}var j=ke,Se=300*1e3,xe=30*1e3,_e=300*1e3;function xt(e){return e.replace(/\/+$/,"")}var Ve=require("node:child_process");var Oe=require("node:crypto"),G=require("node:os");var p=require("node:fs"),ve=require("node:os"),L=require("node:path");var we=require("node:crypto");var A=class extends Error{constructor(n,r,i){super(i);Z(this,"reason",n);Z(this,"path",r);this.name="LocalConfigError"}},_t={schemaVersion:1,device:null,activeCredential:null,pendingCredential:null};function U(){var e;return(e=process.env.BEST_GEO_CONFIG_DIR)!=null?e:(0,L.join)((0,ve.homedir)(),`.${l}`)}function w(){return(0,L.join)(U(),"config.json")}function x(){var n,r,i;let e=w(),t;try{if(!(0,p.existsSync)(e))return null;wt(e),t=(0,p.readFileSync)(e,"utf8")}catch(s){throw s instanceof A?s:Ce(s,e)}try{let s=JSON.parse(t);if(typeof s!="object"||s==null||s.schemaVersion!==1)throw new Error("unexpected shape");return{schemaVersion:1,device:(n=s.device)!=null?n:null,activeCredential:(r=s.activeCredential)!=null?r:null,pendingCredential:(i=s.pendingCredential)!=null?i:null}}catch{throw new A("corrupted",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5185\u5BB9\u4E0D\u5B8C\u6574\u6216\u683C\u5F0F\u4E0D\u5BF9\uFF1A${e}`)}}function vt(e){let t=U(),n=w(),r=(0,L.join)(t,`.config.json.${(0,we.randomBytes)(6).toString("hex")}.tmp`);try{(0,p.existsSync)(t)||(0,p.mkdirSync)(t,{recursive:!0,mode:448});let i=(0,p.openSync)(r,"wx",384);try{(0,p.writeSync)(i,`${JSON.stringify(e,null,2)}
3
+ `),(0,p.fsyncSync)(i)}finally{(0,p.closeSync)(i)}(0,p.renameSync)(r,n)}catch(i){if((0,p.existsSync)(r))try{(0,p.unlinkSync)(r)}catch{}throw Ce(i,n)}}function _(e){var n;let t=e((n=x())!=null?n:{..._t});return vt(t),t}function wt(e){var r;if(process.platform==="win32")return;let t=(0,p.statSync)(e),n=(r=process.getuid)==null?void 0:r.call(process);if(n!=null&&t.uid!==n)throw new A("not_owner",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u4E0D\u5C5E\u4E8E\u5F53\u524D\u7528\u6237\uFF1A${e}`);if((t.mode&63)!==0)throw new A("permissions_too_open",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u8FC7\u5BBD\uFF08\u540C\u673A\u5176\u4ED6\u7528\u6237\u53EF\u8BFB\uFF09\uFF1A${e}`)}function Ce(e,t){let n=e==null?void 0:e.code;return n==="EACCES"||n==="EPERM"||n==="EROFS"?new A("denied",t,`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\uFF1A${t}`):e instanceof Error?e:new Error(String(e))}var Ct=3600*1e3;function Re(){return(0,L.join)(U(),"pending-uploads.json")}function M(){let e=Re();if(!(0,p.existsSync)(e))return{};try{let t=JSON.parse((0,p.readFileSync)(e,"utf8")),n=Date.now();return Object.fromEntries(Object.entries(t).filter(([,r])=>{var i;return n-((i=r==null?void 0:r.createdAt)!=null?i:0)<Ct}))}catch{return{}}}function te(e){(0,p.mkdirSync)(U(),{recursive:!0,mode:448}),(0,p.writeFileSync)(Re(),JSON.stringify(e),{mode:384})}function $e(){var t,n;let e=(t=x())==null?void 0:t.device;return(n=e==null?void 0:e.deviceId)!=null&&n.startsWith(j)?e.deviceId:null}function H(){var r,i;let e={deviceName:(0,G.hostname)().slice(0,50),platform:`${(0,G.platform)()}-${process.arch}`},t=(r=x())==null?void 0:r.device;if((i=t==null?void 0:t.deviceId)!=null&&i.startsWith(j))return t.deviceName===e.deviceName&&t.platform===e.platform?t:_(s=>({...s,device:{...t,...e}})).device;let n={deviceId:`${j}${(0,Oe.randomUUID)()}`,...e};return _(s=>({...s,device:n})).device}function Ne(){return`cli_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function h(e,t=Ne()){return{ok:!0,code:"OK",requestId:t,data:e}}function c(e,t,n={}){var r;return{ok:!1,code:e,message:t,requestId:(r=n.requestId)!=null?r:Ne(),...n.data==null?{}:{data:n.data},...n.nextAction==null?{}:{nextAction:n.nextAction}}}function a(e){process.stdout.write(`${JSON.stringify(e)}
4
+ `),e.ok||(process.exitCode=1)}async function y(e,t={}){var s,o;let n=new URL(`${B}/v1/agent-cli${e}`);for(let[d,m]of Object.entries((s=t.query)!=null?s:{}))if(m!=null)for(let u of Array.isArray(m)?m:[m])n.searchParams.append(d,String(u));let r={"X-GEO-CLI-Version":E,"X-GEO-Protocol-Version":String(D),"X-GEO-CLI-Package":O},i=null;try{i=$e()}catch{}i&&(r["X-Device-ID"]=i),t.apiKey&&(r.Authorization=`Bearer ${t.apiKey}`),t.body!=null&&(r["Content-Type"]="application/json");try{let d=await fetch(n,{method:(o=t.method)!=null?o:"GET",headers:r,body:t.body==null?void 0:JSON.stringify(t.body),signal:AbortSignal.timeout(t.isWrite?_e:xe)}),m=await d.text();try{let u=JSON.parse(m);return Rt(u)?u:c("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}catch{return c("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}}catch(d){return d instanceof Error&&(d.name==="TimeoutError"||d.name==="AbortError")?c("SERVER_ERROR",t.isWrite?"\u670D\u52A1\u7AEF\u5904\u7406\u8D85\u65F6,\u8FD9\u6B21\u5199\u5165\u7ED3\u679C\u672A\u77E5":"\u670D\u52A1\u7AEF\u54CD\u5E94\u8D85\u65F6",{data:{transportFailure:!0},nextAction:t.isWrite?{type:"ask_user",message:"\u8D85\u65F6\u4E0D\u4EE3\u8868\u6CA1\u5199\u8FDB\u53BB \u2014\u2014 \u670D\u52A1\u7AEF\u53EF\u80FD\u8FD8\u5728\u5904\u7406\u3002**\u5148\u7528\u5BF9\u5E94\u7684\u67E5\u8BE2\u80FD\u529B\u786E\u8BA4\u4E00\u904D**,\u786E\u5B9E\u6CA1\u6709\u518D\u91CD\u65B0 plan;\u76F4\u63A5\u91CD\u8BD5\u4F1A\u5EFA\u51FA\u91CD\u590D\u7684\u4E00\u4EFD,\u800C\u4E14\u4F1A\u518D\u6263\u4E00\u6B21\u8D39\u3002"}:{type:"ask_user",message:"\u670D\u52A1\u7AEF\u54CD\u5E94\u592A\u6162\u3002\u7A0D\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u5373\u53EF,\u67E5\u8BE2\u4E0D\u4F1A\u4EA7\u751F\u4EFB\u4F55\u5199\u5165"}}):c("SERVER_ERROR",`\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF1A${d instanceof Error?d.message:String(d)}`,{data:{transportFailure:!0},nextAction:{type:"ask_user",message:"\u8BF7\u786E\u8BA4\u7F51\u7EDC\u53EF\u7528\uFF0C\u4EE5\u53CA\u670D\u52A1\u7AEF\u5730\u5740\u914D\u7F6E\u6B63\u786E"}})}}function Rt(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.ok=="boolean"&&typeof t.code=="string"}function Ot(e){var t;return!e.ok&&((t=e.data)==null?void 0:t.transportFailure)===!0}function ne(e){return e.ok||Ot(e)?!1:["AUTH_EXPIRED","DEVICE_MISMATCH","ACCESS_DENIED","AUTH_REQUIRED","VALIDATION_FAILED"].includes(e.code)}function $(){var e,t,n;return(n=(t=(e=x())==null?void 0:e.activeCredential)==null?void 0:t.apiKey)!=null?n:null}function J(){var e,t;return(t=(e=x())==null?void 0:e.activeCredential)!=null?t:null}function Te(){var e,t;return(t=(e=x())==null?void 0:e.pendingCredential)!=null?t:null}function Pe(e){_(t=>({...t,pendingCredential:{apiKey:e,startedAt:new Date().toISOString()}}))}function re(){_(e=>({...e,pendingCredential:null}))}function ie(e){return _(t=>{let n=t.pendingCredential;return n?{...t,activeCredential:{apiKey:n.apiKey,...e},pendingCredential:null}:t}).activeCredential}function De(){_(e=>({...e,activeCredential:null,pendingCredential:null}))}var v=require("node:crypto"),Ue=require("node:http");function Le(e){let t=`
5
5
  (function () {
6
6
  var form = document.getElementById('f');
7
7
  var input = document.getElementById('k');
@@ -84,12 +84,12 @@ button:disabled { opacity: .6; cursor: default; }
84
84
  </div>
85
85
  <script>${t}</script>
86
86
  </body>
87
- </html>`,scriptHash:t}}var Ot=256,$t=4*1024;async function Ue(){let e=(0,_.randomBytes)(16).toString("hex"),t=(0,_.randomBytes)(16).toString("hex"),n=(0,_.randomBytes)(16).toString("hex"),{html:r,scriptHash:o}=Le(t),s=(0,_.createHash)("sha256").update(o).digest("base64"),i=null,l=new Promise((g,f)=>{i={resolve:g,reject:f}});l.catch(()=>{});let m=!1,u=(0,Te.createServer)((g,f)=>{k(g,f).catch(()=>{f.writeHead(500,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!1,message:"internal error"}))})});async function k(g,f){var pe,me,fe,ge,ye;let Y=new URL((pe=g.url)!=null?pe:"/","http://127.0.0.1");if(g.method==="GET"&&Y.pathname==="/"){if(Y.searchParams.get("state")!==e){f.writeHead(404).end();return}f.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":["default-src 'none'",`script-src 'sha256-${s}'`,"style-src 'unsafe-inline'","connect-src 'self'","form-action 'none'","base-uri 'none'","frame-ancestors 'none'"].join("; "),"Set-Cookie":`bg_session=${n}; HttpOnly; SameSite=Strict; Path=/`,"Cache-Control":"no-store","Referrer-Policy":"no-referrer"}),f.end(r);return}if(g.method==="POST"&&Y.pathname==="/submit"){let It=g.headers.origin,ht=`http://127.0.0.1:${u.address().port}`;if(It!==ht){b(f,403,{ok:!1,message:"origin rejected"});return}if(!Dt(String((me=g.headers["x-csrf-token"])!=null?me:""),t)){b(f,403,{ok:!1,message:"csrf rejected"});return}if(!String((fe=g.headers.cookie)!=null?fe:"").includes(`bg_session=${n}`)){b(f,403,{ok:!1,message:"session rejected"});return}if(!String((ge=g.headers["content-type"])!=null?ge:"").includes("application/json")){b(f,415,{ok:!1,message:"content-type rejected"});return}if(m){b(f,409,{ok:!1,message:"already submitted"});return}let Ee=await Nt(g);if(Ee==null){b(f,413,{ok:!1,message:"body too large"});return}let V="";try{V=String((ye=JSON.parse(Ee).key)!=null?ye:"").trim()}catch{b(f,400,{ok:!1,message:"invalid json"});return}if(!V||V.length>Ot){b(f,400,{ok:!1,message:"invalid key"});return}m=!0,b(f,200,{ok:!0}),i==null||i.resolve(V),setTimeout(()=>W(),200).unref();return}f.writeHead(404).end()}if(process.env.BEST_GEO_TEST_FORCE_LISTEN_ERROR==="1")throw Object.assign(new Error("listen EACCES: permission denied 127.0.0.1"),{code:"EACCES"});u.on("error",g=>{i==null||i.reject(g)}),await new Promise((g,f)=>{u.once("error",f),u.listen(0,"127.0.0.1",()=>{u.removeListener("error",f),g()})});let h=u.address().port,le=setTimeout(()=>{i==null||i.reject(new Error("LOCAL_INTAKE_TIMEOUT")),W()},Se);le.unref();let de=!1;function W(){var g;de||(de=!0,clearTimeout(le),(g=u.closeAllConnections)==null||g.call(u),u.close())}return{url:`http://127.0.0.1:${h}/?state=${e}`,waitForKey:l,close:W}}function b(e,t,n){e.writeHead(t,{"Content-Type":"application/json","Cache-Control":"no-store"}),e.end(JSON.stringify(n))}async function Nt(e){let t=[],n=0;for await(let r of e){if(n+=r.length,n>$t)return null;t.push(r)}return Buffer.concat(t).toString("utf8")}function Dt(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&(0,_.timingSafeEqual)(n,r)}async function M(){let e=Ne();if(!e)return null;let t=await je(e.apiKey);return t.ok?(oe({userId:t.data.user.id,agentId:t.data.agentId,companyIds:t.data.companyIds}),null):ne(t)?(re(),null):c("SERVER_ERROR",`\u672C\u673A\u6709\u4E00\u4EFD\u5F85\u786E\u8BA4\u7684\u6388\u6743\uFF0C\u6682\u65F6\u65E0\u6CD5\u4E0E\u670D\u52A1\u7AEF\u786E\u8BA4\uFF1A${t.message}`,{requestId:t.requestId,nextAction:{type:"ask_user",message:"\u7F51\u7EDC\u6062\u590D\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\uFF1B\u5728\u6B64\u4E4B\u524D\u4E0D\u8981\u91CD\u65B0\u767B\u5F55\uFF0C\u4E5F\u4E0D\u8981\u5220\u9664\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u3002"}})}async function Ke(){var m;let e=G(),t=await M();if(t){a(t);return}let n=O(),r;try{r=await Ue()}catch(u){a(c("HOST_PERMISSION_REQUIRED",`\u65E0\u6CD5\u5728\u672C\u673A\u542F\u52A8\u5F55\u5165\u670D\u52A1\uFF1A${Lt(u)}`,{nextAction:{type:"request_host_approval",message:"Best GEO \u9700\u8981\u5728 127.0.0.1 \u4E0A\u76D1\u542C\u4E00\u4E2A\u968F\u673A\u7AEF\u53E3\u6765\u63A5\u6536\u7528\u6237\u7C98\u8D34\u7684\u5BC6\u94A5\uFF08\u4E0D\u5BF9\u5916\u66B4\u9732\uFF09\u3002\u8BF7\u7528\u5F53\u524D\u5DE5\u5177\u7684\u6743\u9650\u786E\u8BA4\u673A\u5236\u6388\u6743\u672C\u673A\u56DE\u73AF\u7AEF\u53E3\u76D1\u542C\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u3002",capability:"loopback_port",command:`${d} auth login`}}));return}Pt(r.url);let o=`[${d}]`;process.stderr.write(`${o} auth login \u5DF2\u542F\u52A8\u672C\u673A\u5F55\u5165\u670D\u52A1\uFF0C\u4F1A\u963B\u585E\u7B49\u5F85\u7528\u6237\u7C98\u8D34\u5BC6\u94A5\uFF0C\u6700\u957F 5 \u5206\u949F\u3002
88
- ${o} \u8C03\u7528\u65B9\u8BF7\u4FDD\u6301\u672C\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\u3001\u4E0D\u8981\u8F6C\u4EA4\u7ED9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\uFF1B
89
- ${o} \u8FDB\u7A0B\u9000\u51FA\u65F6 stdout \u4F1A\u7ED9\u51FA\u552F\u4E00\u4E00\u4E2A JSON \u7ED3\u679C\uFF0C\u90A3\u65F6\u518D\u5411\u7528\u6237\u6C47\u62A5\u6210\u8D25\u3002
90
- ${o} \u73B0\u5728\u8BF7\u628A\u4E0B\u9762\u8FD9\u4E2A\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u8BA9\u4ED6\u5728\u6D4F\u89C8\u5668\u91CC\u6253\u5F00\u5E76\u7C98\u8D34\u5BC6\u94A5\uFF08\u5BC6\u94A5\u4E0D\u8981\u7ECF\u8FC7\u4F60\uFF09\uFF1A
91
- `),process.stderr.write(`${o} \u672C\u5730\u9875\u9762\uFF1A${r.url}
92
- `),n&&process.stderr.write(`${o} \u672C\u673A\u5DF2\u6709\u4E00\u4EFD\u6388\u6743\uFF0C\u5F55\u5165\u65B0\u5BC6\u94A5\u4F1A\u66FF\u6362\u5B83\u3002
93
- `);let s;try{s=await r.waitForKey}catch{r.close(),a(c("AUTH_REQUIRED","\u672C\u5730\u5F55\u5165\u8D85\u65F6\u6216\u88AB\u53D6\u6D88",{nextAction:{type:"auth_login",message:"\u7528\u6237\u5728 5 \u5206\u949F\u5185\u6CA1\u6709\u5B8C\u6210\u7C98\u8D34\u3002\u5148\u95EE\u6E05\u4ED6\u662F\u5426\u5DF2\u7ECF\u62FF\u5230\u5BC6\u94A5\uFF0C\u518D\u7531\u4F60\u91CD\u65B0\u6267\u884C command\uFF0C\u5E76\u628A\u65B0\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u4ED6\u3002",command:`${d} auth login`}}));return}process.stderr.write(`${o} \u5DF2\u6536\u5230\u5BC6\u94A5\uFF0C\u672C\u673A\u5F55\u5165\u670D\u52A1\u5DF2\u5173\u95ED\uFF0C\u6B63\u5728\u5411\u670D\u52A1\u7AEF\u6821\u9A8C\u5E76\u7ED1\u5B9A\u672C\u673A\uFF0C\u8BF7\u7EE7\u7EED\u7B49\u5F85\u672C\u8FDB\u7A0B\u9000\u51FA\u3002
94
- `),De(s);let i=await je(s);if(!i.ok){ne(i)?re():process.stderr.write(`${o} \u672A\u80FD\u786E\u8BA4\u7ED1\u5B9A\u7ED3\u679C\uFF0C\u5DF2\u4FDD\u7559\u8FD9\u628A\u5F85\u786E\u8BA4\u7684\u5BC6\u94A5\u3002\u7F51\u7EDC\u6062\u590D\u540E\u6267\u884C\u4EFB\u610F ${d} \u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\u3002
95
- `),a(i);return}let l=oe({userId:i.data.user.id,agentId:i.data.agentId,companyIds:i.data.companyIds});a(I({user:i.data.user,device:i.data.device,companyIds:(m=l==null?void 0:l.companyIds)!=null?m:i.data.companyIds,replacedPreviousAuthorization:i.data.replacedPreviousAuthorization,configPath:v()},i.requestId))}async function Ve(){let e=await M();if(e){a(e);return}let t=O();if(!t){a(Be());return}let n=await y("/companies",{apiKey:t,query:{page:1,limit:100}});if(!n.ok){a(n);return}let r=G();a(I({loggedIn:!0,device:{deviceId:r.deviceId,deviceName:r.deviceName,platform:r.platform},user:H()?{id:H().userId,agentId:H().agentId}:null,companies:n.data.data.map(o=>({id:o.id,name:o.name})),configPath:v()},n.requestId))}async function Fe(){let e=await M();if(e){a(e);return}let t=O();if(!t){a(Be());return}let n=await y("/auth/logout",{method:"POST",apiKey:t});if(!n.ok){a(n);return}Pe(),a(I({loggedOut:!0,revoked:n.data,note:"\u670D\u52A1\u7AEF\u5BC6\u94A5\u5DF2\u64A4\u9500\uFF0C\u672C\u673A\u51ED\u636E\u5DF2\u6E05\u9664\u3002\u8BBE\u5907\u8EAB\u4EFD\u4FDD\u7559\uFF0C\u91CD\u65B0\u767B\u5F55\u4F1A\u590D\u7528\u540C\u4E00\u53F0\u8BBE\u5907\u3002"},n.requestId))}function Be(){return c("AUTH_REQUIRED","\u672C\u673A\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u6388\u6743",{nextAction:{type:"auth_login",message:"\u5148\u8BA9\u7528\u6237\u5230\u6240\u5C5E SaaS \u7F51\u9875\u7684\u5BC6\u94A5\u7BA1\u7406\u91CC\u521B\u5EFA\u300CAI \u52A9\u624B\u5BC6\u94A5\u300D\u5E76\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002\u6267\u884C\u671F\u95F4\u628A stderr \u91CC\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u4FDD\u6301\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\u3002",command:`${d} auth login`}})}function je(e){let t=G();return y("/auth/claim",{method:"POST",apiKey:e,body:{...t,cliVersion:E}})}function Pt(e){if(process.env.BEST_GEO_NO_BROWSER==="1")return;let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",n=process.platform==="win32"?["/c","start","",e]:[e];(0,Me.execFile)(t,n,()=>{})}function Lt(e){return e instanceof Error?e.message:String(e)}async function K(){let e=await M();if(e)return{ok:!1,envelope:e};let t=O();return t?{ok:!0,apiKey:t}:{ok:!1,envelope:c("AUTH_REQUIRED","\u672C\u673A\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u6388\u6743",{nextAction:{type:"auth_login",message:"\u5148\u8BA9\u7528\u6237\u5230\u6240\u5C5E SaaS \u7F51\u9875\u7684\u5BC6\u94A5\u7BA1\u7406\u91CC\u521B\u5EFA\u300CAI \u52A9\u624B\u5BC6\u94A5\u300D\u5E76\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002",command:`${d} auth login`}})}}var Ge=require("node:fs"),$=require("node:path"),He=require("node:url");function Tt(e){if(e.cjsDir)return(0,$.join)(e.cjsDir,"..");if(!e.moduleUrl)throw new Error("\u7F3A\u5C11 CLI \u8FD0\u884C\u4F4D\u7F6E");return(0,$.join)((0,$.dirname)((0,He.fileURLToPath)(e.moduleUrl)),"..","..","..")}function Ut(){return Tt({cjsDir:typeof __dirname=="string"?__dirname:void 0,moduleUrl:void 0})}function N(...e){return(0,Ge.readFileSync)((0,$.join)(Ut(),...e),"utf8")}function Je(){a(I({package:R,version:E,protocolVersion:P,commands:[{command:`${d} version --check`,description:"\u68C0\u67E5\u7248\u672C\u662F\u5426\u9700\u8981\u5347\u7EA7"},{command:`${d} capabilities`,description:"\u5217\u51FA\u53EF\u7528\u80FD\u529B\u53CA\u5176\u8F93\u5165 schema"},{command:`${d} skill get --raw > <\u4F60\u7684 skill \u76EE\u5F55>/best-geo/SKILL.md`,description:"\u76F4\u63A5\u628A Skill \u5199\u6210\u6587\u4EF6\uFF08\u63A8\u8350\uFF1B--raw \u8F93\u51FA markdown \u539F\u6587\uFF0C\u4E0D\u662F JSON\uFF09"},{command:`${d} skill get`,description:"\u4EE5 JSON \u4FE1\u5C01\u8FD4\u56DE Skill \u5185\u5BB9\u548C revision"},{command:`${d} guide list`,description:"\u5217\u51FA\u4E1A\u52A1\u6307\u5357"},{command:`${d} guide get <name>`,description:"\u8BFB\u53D6\u4E00\u4EFD\u4E1A\u52A1\u6307\u5357"},{command:`${d} auth login`,description:"\u6253\u5F00\u672C\u5730\u9875\u9762\u5F55\u5165\u5BC6\u94A5\u5E76\u7ED1\u5B9A\u672C\u673A"},{command:`${d} auth status`,description:"\u67E5\u770B\u5F53\u524D\u6388\u6743\u72B6\u6001"},{command:`${d} auth logout`,description:"\u64A4\u9500\u670D\u52A1\u7AEF\u5BC6\u94A5\u5E76\u6E05\u9664\u672C\u673A\u51ED\u636E"},{command:`${d} call <capability> --input '<JSON>'`,description:"\u8C03\u7528\u4E00\u4E2A\u67E5\u8BE2\u80FD\u529B"},{command:`${d} plan <operation> --input '<JSON>'`,description:"\u751F\u6210\u5199\u64CD\u4F5C\u8BA1\u5212\uFF0C\u8FD4\u56DE\u7ED9\u7528\u6237\u770B\u7684\u53D8\u66F4\u6458\u8981\uFF08\u4E0D\u5199\u6570\u636E\uFF09"},{command:`${d} apply <planId>`,description:"\u6267\u884C\u8BA1\u5212\u3002\u5FC5\u987B\u5148\u628A plan \u7684\u6458\u8981\u7ED9\u7528\u6237\u770B\u8FC7\u5E76\u5F97\u5230\u540C\u610F"}],nextAction:{type:"install_skill",command:`${d} skill get --raw`,message:"\u6309\u5F53\u524D AI \u5DE5\u5177\u7684 Skill \u673A\u5236\u9009\u4E00\u4E2A\u5B89\u88C5\u76EE\u5F55\uFF0C\u7528 best-geo skill get --raw \u628A\u5185\u5BB9\u76F4\u63A5\u91CD\u5B9A\u5411\u6210 SKILL.md\uFF0C\u7136\u540E\u52A0\u8F7D\u5B83"}}))}async function ze(e){if(!e){a(I({package:R,version:E,protocolVersion:P,env:be,apiBase:B}));return}let t=await y("/meta");if(!t.ok){a(t);return}if(qe(E,t.data.minimumCliVersion)<0){a(c("CLI_UPDATE_REQUIRED",`\u5F53\u524D\u7248\u672C ${E} \u4F4E\u4E8E\u6700\u4F4E\u8981\u6C42 ${t.data.minimumCliVersion}`,{requestId:t.requestId,data:{current:E,...t.data},nextAction:{type:"upgrade",message:"\u5347\u7EA7\u540E\u91CD\u8BD5",command:`npm install -g ${R}@latest`}}));return}a(I({current:E,...t.data,updateAvailable:qe(E,t.data.latestCliVersion)<0},t.requestId))}function Xe(){a(I(JSON.parse(N("capabilities","capabilities.json"))))}function Qe(e){let t=Ze(N("skills","best-geo","SKILL.md"));if(e){process.stdout.write(t);return}a(I({name:d,revision:1,content:t}))}var ie=["company","product","question","article","knowledge","material","question-task","article-task","scheduled-monitor"];function We(){a(I({guides:ie.map(e=>{let t=JSON.parse(N("guides",`${e}.json`));return{name:t.name,title:t.title,whenToUse:t.whenToUse}})}))}function Ye(e){if(!ie.includes(e)){a(c("GUIDE_NOT_FOUND",`\u6CA1\u6709\u540D\u4E3A ${e} \u7684\u6307\u5357`,{data:{available:ie}}));return}a(I(JSON.parse(Ze(N("guides",`${e}.json`)))))}function qe(e,t){var o,s;let n=e.split(".").map(i=>Number.parseInt(i,10)||0),r=t.split(".").map(i=>Number.parseInt(i,10)||0);for(let i=0;i<Math.max(n.length,r.length);i+=1){let l=((o=n[i])!=null?o:0)-((s=r[i])!=null?s:0);if(l!==0)return l<0?-1:1}return 0}function Ze(e){return d==="best-geo"?e:e.replace(/\bbest-geo\b(?!-)/g,d)}var se=null,ae=null;function et(){return se===null&&(se=JSON.parse(N("capabilities","capabilities.json")).capabilities),se}function Mt(){return ae===null&&(ae=new Map(et().filter(e=>e.inputSchema!==void 0).map(e=>[e.name,e.inputSchema]))),ae}function tt(){return et().filter(e=>e.mode==="write").map(e=>e.name)}function J(e,t){let n=Mt().get(e);return n===void 0?[]:ue(t,n,"")}function ue(e,t,n){if(t.type==="object"||t.properties!==void 0)return Kt(e,t,n);let r=nt(e,t,n);if(r!==null)return[r];let o=[];return typeof e=="string"&&t.maxLength!==void 0&&e.length>t.maxLength&&o.push(`${n} \u6700\u591A ${t.maxLength} \u4E2A\u5B57\u7B26\uFF0C\u5F53\u524D ${e.length} \u4E2A`),typeof e=="number"&&(t.maximum!==void 0&&e>t.maximum&&o.push(`${n} \u4E0D\u80FD\u5927\u4E8E ${t.maximum}`),t.minimum!==void 0&&e<t.minimum&&o.push(`${n} \u4E0D\u80FD\u5C0F\u4E8E ${t.minimum}`)),t.enum!==void 0&&!t.enum.includes(e)&&o.push(`${n} \u53EA\u80FD\u662F ${t.enum.join(" / ")} \u4E4B\u4E00\uFF0C\u6536\u5230 ${C(e)}`),Array.isArray(e)&&(t.minItems!==void 0&&e.length<t.minItems&&o.push(`${n} \u81F3\u5C11\u8981 ${t.minItems} \u9879\uFF0C\u5F53\u524D ${e.length} \u9879`),t.maxItems!==void 0&&e.length>t.maxItems&&o.push(`${n} \u6700\u591A ${t.maxItems} \u9879\uFF0C\u5F53\u524D ${e.length} \u9879`),t.items!==void 0&&e.forEach((s,i)=>{o.push(...ue(s,t.items,`${n}[${i}]`))})),o}function Kt(e,t,n){var l,m;if(typeof e!="object"||e===null||Array.isArray(e))return[`${n||"\u5165\u53C2"} \u5FC5\u987B\u662F\u5BF9\u8C61`];let r=e,o=(l=t.properties)!=null?l:{},s=(m=t.required)!=null?m:[],i=[];for(let u of s)(r[u]===void 0||r[u]===null)&&i.push(`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 ${ce(n,u)}`);if(t.additionalProperties===!1){let u=Object.keys(o);for(let k of Object.keys(r))u.includes(k)||i.push(`\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5 ${ce(n,k)}\uFF0C\u53EF\u7528\u5B57\u6BB5\uFF1A${u.join("\u3001")}`)}for(let[u,k]of Object.entries(o)){let h=r[u];h===void 0||h===null&&s.includes(u)||i.push(...ue(h,k,ce(n,u)))}return i}function nt(e,t,n){if(Array.isArray(t.type)){let r=t.type.map(o=>nt(e,{...t,type:o},n));return r.some(o=>o===null)?null:r[0]}switch(t.type){case"null":return e===null?null:`${n} \u5FC5\u987B\u662F null\uFF0C\u6536\u5230 ${C(e)}`;case"string":return typeof e=="string"?null:`${n} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF0C\u6536\u5230 ${C(e)}`;case"number":return typeof e=="number"&&Number.isFinite(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u5B57\uFF0C\u6536\u5230 ${C(e)}`;case"integer":return typeof e=="number"&&Number.isInteger(e)?null:`${n} \u5FC5\u987B\u662F\u6574\u6570\uFF0C\u6536\u5230 ${C(e)}`;case"boolean":return typeof e=="boolean"?null:`${n} \u5FC5\u987B\u662F true \u6216 false\uFF0C\u6536\u5230 ${C(e)}`;case"array":return Array.isArray(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u7EC4\uFF0C\u6536\u5230 ${C(e)}`;default:return null}}function ce(e,t){return e===""?t:`${e}.${t}`}function C(e){if(e===null)return"null";if(Array.isArray(e))return"\u6570\u7EC4";if(typeof e=="object")return"\u5BF9\u8C61";let t=String(e);return typeof e=="string"?`\u5B57\u7B26\u4E32 "${Vt(t)}"`:t}function Vt(e){return e.length>20?`${e.slice(0,20)}\u2026`:e}function z(e,t){return c("VALIDATION_FAILED",`\u5165\u53C2\u4E0D\u5408\u6CD5\uFF1A${t.join("\uFF1B")}`,{data:{name:e,errors:t},nextAction:{type:"ask_user",message:"\u6309 capabilities \u91CC\u7684 inputSchema \u4FEE\u6B63\u53C2\u6570\u540E\u91CD\u8BD5\uFF1B\u7F3A\u7684\u4FE1\u606F\u95EE\u7528\u6237"}})}var rt={"companies.list":e=>({path:"/companies",query:e}),"companies.get":e=>({path:`/companies/${Number(e.id)}`}),"products.list":e=>({path:"/products",query:e}),"products.get":e=>({path:`/products/${Number(e.id)}`}),"questions.list":e=>({path:"/questions",query:e}),"questions.get":e=>({path:`/questions/${Number(e.id)}`}),"articles.list":e=>({path:"/articles",query:e}),"articles.get":e=>({path:`/articles/${Number(e.id)}`,query:e.withContent===!0?{withContent:"true"}:void 0}),"knowledge.list":e=>({path:"/knowledge",query:e}),"knowledge.get":e=>({path:`/knowledge/${Number(e.id)}`}),"images.list":e=>({path:"/images",query:e}),"images.get":e=>({path:`/images/${Number(e.id)}`}),"videos.list":e=>({path:"/videos",query:e}),"videos.get":e=>({path:`/videos/${Number(e.id)}`}),"prompts.list":e=>({path:"/prompts",query:e}),"models.list":e=>({path:"/models",query:e}),"questionTasks.list":e=>({path:"/question-tasks",query:e}),"questionTasks.get":e=>({path:`/question-tasks/${Number(e.taskId)}`}),"articleTasks.list":e=>({path:"/article-tasks",query:e}),"articleTasks.get":e=>({path:`/article-tasks/${Number(e.taskId)}`}),"indexingPlatforms.list":()=>({path:"/indexing-platforms"}),"scheduledIndexing.list":e=>({path:"/scheduled-indexing",query:e}),"scheduledIndexing.get":e=>({path:`/scheduled-indexing/${Number(e.planId)}`}),"scheduledIndexing.runs":e=>({path:`/scheduled-indexing/${Number(e.planId)}/runs`,query:X(e)}),"scheduledIndexing.metrics":e=>({path:`/scheduled-indexing/${Number(e.planId)}/metrics`,query:X(e)}),"scheduledSentiment.list":e=>({path:"/scheduled-sentiment",query:e}),"scheduledSentiment.get":e=>({path:`/scheduled-sentiment/${Number(e.planId)}`}),"scheduledSentiment.runs":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/runs`,query:X(e)}),"scheduledSentiment.metrics":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/metrics`,query:X(e)})};function X(e){let{planId:t,...n}=e;return n}function Ft(){return Object.keys(rt)}async function ot(e,t){let n=rt[e];if(!n){a(c("VALIDATION_FAILED",`\u672A\u77E5\u80FD\u529B\uFF1A${e}`,{data:{available:Ft()},nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo capabilities \u67E5\u770B\u53EF\u7528\u80FD\u529B"}}));return}let r={};if(t)try{r=JSON.parse(t)}catch{a(c("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let o=J(e,r);if(o.length>0){a(z(e,o));return}let s=await K();if(!s.ok){a(s.envelope);return}let{path:i,query:l}=n(r);a(await y(i,{apiKey:s.apiKey,query:l}))}var w=require("node:fs"),D=require("node:path");var Bt={image:{maxBytes:2*1024*1024,extensions:[".png",".jpg",".jpeg"],label:"\u56FE\u7247"},video:{maxBytes:200*1024*1024,extensions:[".mp4"],label:"\u89C6\u9891"},thumbnail:{maxBytes:5*1024*1024,extensions:[".png",".jpg",".jpeg"],label:"\u5C01\u9762\u56FE"}},jt={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".mp4":"video/mp4"},it={"images.create":[{pathKey:"filePath",metaKey:"file",uploadField:"fileUrl",kind:"image"}],"videos.create":[{pathKey:"videoPath",metaKey:"video",uploadField:"videoUrl",kind:"video"},{pathKey:"thumbnailPath",metaKey:"thumbnail",uploadField:"thumbnail",kind:"thumbnail"}]},qt=900*1e3;function st(e){return it[e]!==void 0}function at(e){return U()[e]!==void 0}function ct(e,t){var s;let n=(s=it[e])!=null?s:[],r={...t},o={};for(let i of n){let l=t[i.pathKey];if(typeof l!="string"||!l.trim())return{ok:!1,envelope:Jt(i)};let m=(0,D.resolve)(l.trim()),u=Ht(m,i);if(!u.ok)return{ok:!1,envelope:u.envelope};delete r[i.pathKey],r[i.metaKey]={name:(0,D.basename)(m),size:u.size},o[i.uploadField]=m}return{ok:!0,input:r,paths:o}}function ut(e,t){te({...U(),[e]:{paths:t,createdAt:Date.now()}})}async function lt(e,t){let n=U()[e];if(!n)return{ok:!1,envelope:c("VALIDATION_FAILED","\u672C\u673A\u6CA1\u6709\u8FD9\u4E2A\u8BA1\u5212\u7684\u5F85\u4F20\u6587\u4EF6\u8BB0\u5F55",{nextAction:{type:"ask_user",message:"\u91CD\u65B0\u6267\u884C best-geo plan \u751F\u6210\u8BA1\u5212\uFF0C\u628A\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D apply\u2014\u2014\u8BA1\u5212\u548C\u5F85\u4F20\u6587\u4EF6\u662F\u4E00\u8D77\u751F\u6210\u7684"}})};let r={};for(let[o,s]of Object.entries(n.paths)){if(!(0,w.existsSync)(s))return{ok:!1,envelope:c("VALIDATION_FAILED",`\u6587\u4EF6\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF1A${s}`)};let i=await y(`/plans/${encodeURIComponent(e)}/uploads/presign`,{method:"POST",apiKey:t,body:{field:o,fileName:(0,D.basename)(s)}});if(!i.ok)return{ok:!1,envelope:i};let l=await Gt(i.data,s);if(!l.ok)return{ok:!1,envelope:l.envelope};r[o]=i.data.uploadUrl}return{ok:!0,uploads:r}}function dt(e){let t=U();delete t[e],te(t)}async function Gt(e,t){let n=jt[pt(t)];if(!n)return{ok:!1,envelope:c("UPLOAD_FAILED",`${t} \u7684\u6587\u4EF6\u7C7B\u578B\u6CA1\u6709\u767B\u8BB0 MIME\uFF0C\u4F20\u4E0D\u4E86`)};let r=new FormData;r.append("key",e.key),r.append("policy",e.policy),r.append("OSSAccessKeyId",e.OSSAccessKeyId),r.append("signature",e.signature),r.append("callback",e.callback),r.append("Content-Disposition",e["Content-Disposition"]),r.append("success_action_status","200"),r.append("file",await(0,w.openAsBlob)(t,{type:n}),(0,D.basename)(t));try{let o=await fetch(e.host,{method:"POST",body:r,signal:AbortSignal.timeout(qt)}),s=(await o.text().catch(()=>"")).slice(0,300);if(!o.ok)return{ok:!1,envelope:c("UPLOAD_FAILED",`\u4E0A\u4F20\u5931\u8D25\uFF08HTTP ${o.status}\uFF09\uFF1A${s}`,{nextAction:{type:"ask_user",message:"\u628A\u8FD9\u4E2A\u60C5\u51B5\u544A\u8BC9\u7528\u6237\uFF0C\u7A0D\u540E\u91CD\u65B0\u6267\u884C\u4E00\u6B21 plan \u518D\u8BD5"}})};let i=zt(s);return i?{ok:!1,envelope:c("UPLOAD_FAILED",`\u6587\u4EF6\u5DF2\u4E0A\u4F20\uFF0C\u4F46\u767B\u8BB0\u5931\u8D25\uFF1A${i}`,{nextAction:{type:"ask_user",message:"\u628A\u8FD9\u53E5\u62A5\u9519\u539F\u6837\u544A\u8BC9\u7528\u6237\uFF0C\u8BA9\u4ED6\u8054\u7CFB\u670D\u52A1\u5546\u3002\u91CD\u8BD5\u591A\u534A\u4E0D\u4F1A\u597D\u3002"}})}:{ok:!0}}catch(o){return{ok:!1,envelope:c("UPLOAD_FAILED",`\u4E0A\u4F20\u4E2D\u65AD\uFF1A${o instanceof Error?o.message:String(o)}`,{nextAction:{type:"ask_user",message:"\u4E0A\u4F20\u6CA1\u80FD\u5B8C\u6210\uFF0C\u539F\u56E0\u89C1\u4E0A\u9762\u7684\u62A5\u9519\u539F\u6587\u3002\u544A\u8BC9\u7528\u6237\uFF0C\u7A0D\u540E\u91CD\u65B0\u8D70\u4E00\u904D"}})}}}function Ht(e,t){let n=Bt[t.kind];if(!(0,w.existsSync)(e))return{ok:!1,envelope:c("VALIDATION_FAILED",`\u627E\u4E0D\u5230\u6587\u4EF6\uFF1A${e}`,{nextAction:{type:"ask_user",message:"\u8BA9\u7528\u6237\u786E\u8BA4\u6587\u4EF6\u8DEF\u5F84\u3002\u76F8\u5BF9\u8DEF\u5F84\u662F\u76F8\u5BF9\u4F60\u5F53\u524D\u7684\u5DE5\u4F5C\u76EE\u5F55\u7B97\u7684"}})};let r=(0,w.statSync)(e);if(!r.isFile())return{ok:!1,envelope:c("VALIDATION_FAILED",`${e} \u4E0D\u662F\u4E00\u4E2A\u6587\u4EF6`)};let o=pt(e);return n.extensions.includes(o)?r.size>n.maxBytes?{ok:!1,envelope:c("VALIDATION_FAILED",`${n.label}\u6700\u5927 ${Q(n.maxBytes)}\uFF0C\u5F53\u524D ${Q(r.size)}\uFF0C\u8D85\u51FA ${Q(r.size-n.maxBytes)}`,{nextAction:{type:"ask_user",message:`\u544A\u8BC9\u7528\u6237\u8FD9\u4E2A\u6587\u4EF6\u8D85\u4E86\u591A\u5C11\uFF0C\u5E76\u95EE\u4ED6\u8981\u4E0D\u8981\u4F60\u5148\u628A\u5B83\u538B\u5230 ${Q(n.maxBytes)} \u4EE5\u5185\u518D\u4F20\u3002\u4F60\u53EF\u4EE5\u7528\u7528\u6237\u673A\u5668\u4E0A\u73B0\u6210\u7684\u5DE5\u5177\u5904\u7406\uFF08macOS \u81EA\u5E26 sips\uFF0C\u591A\u6570\u673A\u5668\u6709 ffmpeg\uFF09\uFF0C\u5904\u7406\u5B8C\u7528\u65B0\u6587\u4EF6\u91CD\u65B0 plan\u3002`}})}:{ok:!0,size:r.size}:{ok:!1,envelope:c("VALIDATION_FAILED",`${n.label}\u53EA\u652F\u6301 ${n.extensions.join(" / ")}\uFF0C\u5F53\u524D\u662F ${o||"(\u6CA1\u6709\u6269\u5C55\u540D)"}`,{nextAction:{type:"ask_user",message:`\u628A\u8FD9\u4E2A\u9650\u5236\u544A\u8BC9\u7528\u6237\uFF0C\u95EE\u4ED6\u8981\u4E0D\u8981\u4F60\u5148\u628A\u6587\u4EF6\u8F6C\u6210 ${n.extensions[0]} \u518D\u4F20`}})}}function Jt(e){return c("VALIDATION_FAILED",`\u7F3A\u5C11 ${e.pathKey}`,{nextAction:{type:"ask_user",message:`${e.pathKey} \u8981\u7ED9\u4E00\u4E2A\u672C\u673A\u6587\u4EF6\u8DEF\u5F84\u3002\u95EE\u7528\u6237\u6587\u4EF6\u653E\u5728\u54EA\uFF0C\u4E0D\u8981\u81EA\u5DF1\u7F16\u4E00\u4E2A\u8DEF\u5F84\u3002`}})}function Q(e){return e>=1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${Math.max(1,Math.round(e/1024))}KB`}function zt(e){try{let t=JSON.parse(e),n=Number(t.statusCode);if(Number.isFinite(n)&&n!==0&&n!==200)return typeof t.message=="string"?t.message:`statusCode ${n}`}catch{}return null}function pt(e){let t=e.lastIndexOf(".");return t===-1?"":e.toLowerCase().slice(t)}async function mt(e,t,n){var k;let r=tt();if(!e||!r.includes(e)){a(c("VALIDATION_FAILED",`\u672A\u77E5\u7684\u5199\u64CD\u4F5C\uFF1A${e!=null?e:"(\u7A7A)"}`,{data:{available:r},nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo capabilities \u67E5\u770B\u53EF\u7528\u80FD\u529B\u548C\u5B83\u4EEC\u7684\u5165\u53C2"}}));return}if(!t&&(n!=null&&n.trim().startsWith("{"))){a(c("VALIDATION_FAILED","\u5165\u53C2\u8981\u653E\u5728 --input \u540E\u9762",{nextAction:{type:"ask_user",message:`\u6B63\u786E\u5199\u6CD5\uFF1Abest-geo plan ${e} --input '<JSON>'`}}));return}let o;try{o=t?JSON.parse(t):{}}catch{a(c("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let s=J(e,o);if(s.length>0){a(z(e,s));return}let i=o,l=null;if(st(e)){let h=ct(e,o);if(!h.ok){a(h.envelope);return}i=h.input,l=h.paths}let m=await K();if(!m.ok){a(m.envelope);return}let u=await y("/plans",{method:"POST",apiKey:m.apiKey,body:{operation:e,input:i}});u.ok&&l&&((k=u.data)!=null&&k.planId)&&ut(u.data.planId,l),a(u)}async function ft(e){if(!e){a(c("VALIDATION_FAILED","\u7F3A\u5C11 planId",{nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo plan <operation> \u751F\u6210\u8BA1\u5212\uFF0C\u628A\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D\u6267\u884C"}}));return}let t=await K();if(!t.ok){a(t.envelope);return}let n;if(at(e)){let o=await lt(e,t.apiKey);if(!o.ok){a(o.envelope);return}n=o.uploads}let r=await y(`/plans/${encodeURIComponent(e)}/apply`,{method:"POST",apiKey:t.apiKey,body:n?{uploads:n}:{}});r.ok&&dt(e),a(r)}function gt(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];if(!r.startsWith("--"))continue;let o=r.slice(2),s=e[n+1];s&&!s.startsWith("--")?(t[o]=s,n+=1):t[o]=!0}return t}function yt(e,t){let n=v();if(e.reason==="denied")return c("HOST_PERMISSION_REQUIRED",`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\u6587\u4EF6\uFF1A${n}`,{nextAction:{type:"request_host_approval",message:`Best GEO \u9700\u8981\u8BFB\u5199 ${n} \u6765\u4FDD\u5B58\u672C\u673A\u7684\u8BBE\u5907\u8EAB\u4EFD\u548C\u6388\u6743\u3002\u8BF7\u7528\u5F53\u524D\u5DE5\u5177\u81EA\u5E26\u7684\u6743\u9650\u786E\u8BA4\u673A\u5236\u7533\u8BF7\u5BF9\u8BE5\u6587\u4EF6\u7684\u8BFB\u5199\u6743\u9650\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\uFF0C\u4E0D\u8981\u5173\u95ED\u6574\u4E2A\u6C99\u7BB1\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u628A\u5BC6\u94A5\u8D34\u8FDB\u5BF9\u8BDD\u3002`,capability:t.capability,...t.retryCommand?{command:t.retryCommand}:{}}});if(e.reason==="permissions_too_open"||e.reason==="not_owner"){let r=e.reason==="not_owner"?"\u8BE5\u6587\u4EF6\u4E0D\u5C5E\u4E8E\u5F53\u524D\u7CFB\u7EDF\u7528\u6237\uFF0C\u8BF7\u8BA9\u7528\u6237\u786E\u8BA4\u540E\u5220\u9664\u6216\u4FEE\u6B63\u5C5E\u4E3B":`\u8BF7\u8BA9\u7528\u6237\u6267\u884C\uFF1Achmod 600 ${n}`;return c("HOST_PERMISSION_REQUIRED",`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u4E0D\u5B89\u5168\uFF1A${n}`,{nextAction:{type:"ask_user",message:`${e.message}\u3002${r}\uFF0C\u7136\u540E\u91CD\u8BD5\u3002`}})}return c("HOST_PERMISSION_REQUIRED",`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5DF2\u635F\u574F\uFF1A${n}`,{nextAction:{type:"ask_user",message:`\u8BF7\u8BA9\u7528\u6237\u5220\u9664 ${n} \u540E\u91CD\u65B0\u6267\u884C\u767B\u5F55\u3002\u8BE5\u6587\u4EF6\u91CC\u53EA\u6709\u672C\u673A\u8BBE\u5907\u8EAB\u4EFD\u548C\u6388\u6743\uFF0C\u5220\u9664\u4E0D\u4F1A\u5F71\u54CD\u670D\u52A1\u7AEF\u6570\u636E\u3002`,command:`${d} auth login`}})}function Et(e){return e instanceof A}async function Xt(){let[e,...t]=process.argv.slice(2),n=gt(t);switch(e){case void 0:case"help":Je();return;case"version":await ze(n.check===!0);return;case"capabilities":Xe();return;case"skill":if(t[0]==="get"){Qe(n.raw===!0);return}break;case"guide":if(t[0]==="list"){We();return}if(t[0]==="get"&&t[1]){Ye(t[1]);return}break;case"auth":if(t[0]==="login")return Ke();if(t[0]==="status")return Ve();if(t[0]==="logout")return Fe();break;case"plan":await mt(t[0],typeof n.input=="string"?n.input:void 0,t[1]);return;case"apply":await ft(t[0]);return;case"call":if(t[0]){await ot(t[0],typeof n.input=="string"?n.input:void 0);return}break;default:break}a(c("VALIDATION_FAILED",`\u65E0\u6CD5\u8BC6\u522B\u7684\u547D\u4EE4\uFF1A${[e,...t].filter(Boolean).join(" ")}`,{nextAction:{type:"ask_user",message:"\u6267\u884C best-geo help \u67E5\u770B\u53EF\u7528\u547D\u4EE4"}})),process.exitCode=1}Xt().catch(e=>{if(Et(e)){a(yt(e,{capability:e.reason==="denied"?"config_write":"config_read",retryCommand:Qt()})),process.exitCode=1;return}a(c("SERVER_ERROR",e instanceof Error?e.message:String(e))),process.exitCode=1});function Qt(){let[e,t]=process.argv.slice(2);if(e==="auth"&&(t==="login"||t==="status"||t==="logout"))return`${d} auth ${t}`}
87
+ </html>`,scriptHash:t}}var $t=256,Nt=4*1024;async function Me(){let e=(0,v.randomBytes)(16).toString("hex"),t=(0,v.randomBytes)(16).toString("hex"),n=(0,v.randomBytes)(16).toString("hex"),{html:r,scriptHash:i}=Le(t),s=(0,v.createHash)("sha256").update(i).digest("base64"),o=null,d=new Promise((g,f)=>{o={resolve:g,reject:f}});d.catch(()=>{});let m=!1,u=(0,Ue.createServer)((g,f)=>{b(g,f).catch(()=>{f.writeHead(500,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!1,message:"internal error"}))})});async function b(g,f){var pe,me,fe,ge,ye;let Y=new URL((pe=g.url)!=null?pe:"/","http://127.0.0.1");if(g.method==="GET"&&Y.pathname==="/"){if(Y.searchParams.get("state")!==e){f.writeHead(404).end();return}f.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":["default-src 'none'",`script-src 'sha256-${s}'`,"style-src 'unsafe-inline'","connect-src 'self'","form-action 'none'","base-uri 'none'","frame-ancestors 'none'"].join("; "),"Set-Cookie":`bg_session=${n}; HttpOnly; SameSite=Strict; Path=/`,"Cache-Control":"no-store","Referrer-Policy":"no-referrer"}),f.end(r);return}if(g.method==="POST"&&Y.pathname==="/submit"){let It=g.headers.origin,kt=`http://127.0.0.1:${u.address().port}`;if(It!==kt){S(f,403,{ok:!1,message:"origin rejected"});return}if(!Pt(String((me=g.headers["x-csrf-token"])!=null?me:""),t)){S(f,403,{ok:!1,message:"csrf rejected"});return}if(!String((fe=g.headers.cookie)!=null?fe:"").includes(`bg_session=${n}`)){S(f,403,{ok:!1,message:"session rejected"});return}if(!String((ge=g.headers["content-type"])!=null?ge:"").includes("application/json")){S(f,415,{ok:!1,message:"content-type rejected"});return}if(m){S(f,409,{ok:!1,message:"already submitted"});return}let Ee=await Tt(g);if(Ee==null){S(f,413,{ok:!1,message:"body too large"});return}let K="";try{K=String((ye=JSON.parse(Ee).key)!=null?ye:"").trim()}catch{S(f,400,{ok:!1,message:"invalid json"});return}if(!K||K.length>$t){S(f,400,{ok:!1,message:"invalid key"});return}m=!0,S(f,200,{ok:!0}),o==null||o.resolve(K),setTimeout(()=>W(),200).unref();return}f.writeHead(404).end()}if(process.env.BEST_GEO_TEST_FORCE_LISTEN_ERROR==="1")throw Object.assign(new Error("listen EACCES: permission denied 127.0.0.1"),{code:"EACCES"});u.on("error",g=>{o==null||o.reject(g)}),await new Promise((g,f)=>{u.once("error",f),u.listen(0,"127.0.0.1",()=>{u.removeListener("error",f),g()})});let k=u.address().port,de=setTimeout(()=>{o==null||o.reject(new Error("LOCAL_INTAKE_TIMEOUT")),W()},Se);de.unref();let le=!1;function W(){var g;le||(le=!0,clearTimeout(de),(g=u.closeAllConnections)==null||g.call(u),u.close())}return{url:`http://127.0.0.1:${k}/?state=${e}`,waitForKey:d,close:W}}function S(e,t,n){e.writeHead(t,{"Content-Type":"application/json","Cache-Control":"no-store"}),e.end(JSON.stringify(n))}async function Tt(e){let t=[],n=0;for await(let r of e){if(n+=r.length,n>Nt)return null;t.push(r)}return Buffer.concat(t).toString("utf8")}function Pt(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&(0,v.timingSafeEqual)(n,r)}async function V(){let e=Te();if(!e)return null;let t=await je(e.apiKey);return t.ok?(ie({userId:t.data.user.id,agentId:t.data.agentId,companyIds:t.data.companyIds}),null):ne(t)?(re(),null):c("SERVER_ERROR",`\u672C\u673A\u6709\u4E00\u4EFD\u5F85\u786E\u8BA4\u7684\u6388\u6743\uFF0C\u6682\u65F6\u65E0\u6CD5\u4E0E\u670D\u52A1\u7AEF\u786E\u8BA4\uFF1A${t.message}`,{requestId:t.requestId,nextAction:{type:"ask_user",message:"\u7F51\u7EDC\u6062\u590D\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\uFF1B\u5728\u6B64\u4E4B\u524D\u4E0D\u8981\u91CD\u65B0\u767B\u5F55\uFF0C\u4E5F\u4E0D\u8981\u5220\u9664\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u3002"}})}async function qe(){var m;let e=H(),t=await V();if(t){a(t);return}let n=$(),r;try{r=await Me()}catch(u){a(c("HOST_PERMISSION_REQUIRED",`\u65E0\u6CD5\u5728\u672C\u673A\u542F\u52A8\u5F55\u5165\u670D\u52A1\uFF1A${Lt(u)}`,{nextAction:{type:"request_host_approval",message:"Best GEO \u9700\u8981\u5728 127.0.0.1 \u4E0A\u76D1\u542C\u4E00\u4E2A\u968F\u673A\u7AEF\u53E3\u6765\u63A5\u6536\u7528\u6237\u7C98\u8D34\u7684\u5BC6\u94A5\uFF08\u4E0D\u5BF9\u5916\u66B4\u9732\uFF09\u3002\u8BF7\u7528\u5F53\u524D\u5DE5\u5177\u7684\u6743\u9650\u786E\u8BA4\u673A\u5236\u6388\u6743\u672C\u673A\u56DE\u73AF\u7AEF\u53E3\u76D1\u542C\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u3002",capability:"loopback_port",command:`${l} auth login`}}));return}Dt(r.url);let i=`[${l}]`;process.stderr.write(`${i} auth login \u5DF2\u542F\u52A8\u672C\u673A\u5F55\u5165\u670D\u52A1\uFF0C\u4F1A\u963B\u585E\u7B49\u5F85\u7528\u6237\u7C98\u8D34\u5BC6\u94A5\uFF0C\u6700\u957F 5 \u5206\u949F\u3002
88
+ ${i} \u8C03\u7528\u65B9\u8BF7\u4FDD\u6301\u672C\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\u3001\u4E0D\u8981\u8F6C\u4EA4\u7ED9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\uFF1B
89
+ ${i} \u8FDB\u7A0B\u9000\u51FA\u65F6 stdout \u4F1A\u7ED9\u51FA\u552F\u4E00\u4E00\u4E2A JSON \u7ED3\u679C\uFF0C\u90A3\u65F6\u518D\u5411\u7528\u6237\u6C47\u62A5\u6210\u8D25\u3002
90
+ ${i} \u73B0\u5728\u8BF7\u628A\u4E0B\u9762\u8FD9\u4E2A\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u8BA9\u4ED6\u5728\u6D4F\u89C8\u5668\u91CC\u6253\u5F00\u5E76\u7C98\u8D34\u5BC6\u94A5\uFF08\u5BC6\u94A5\u4E0D\u8981\u7ECF\u8FC7\u4F60\uFF09\uFF1A
91
+ `),process.stderr.write(`${i} \u672C\u5730\u9875\u9762\uFF1A${r.url}
92
+ `),n&&process.stderr.write(`${i} \u672C\u673A\u5DF2\u6709\u4E00\u4EFD\u6388\u6743\uFF0C\u5F55\u5165\u65B0\u5BC6\u94A5\u4F1A\u66FF\u6362\u5B83\u3002
93
+ `);let s;try{s=await r.waitForKey}catch{r.close(),a(c("AUTH_REQUIRED","\u672C\u5730\u5F55\u5165\u8D85\u65F6\u6216\u88AB\u53D6\u6D88",{nextAction:{type:"auth_login",message:"\u7528\u6237\u5728 5 \u5206\u949F\u5185\u6CA1\u6709\u5B8C\u6210\u7C98\u8D34\u3002\u5148\u95EE\u6E05\u4ED6\u662F\u5426\u5DF2\u7ECF\u62FF\u5230\u5BC6\u94A5\uFF0C\u518D\u7531\u4F60\u91CD\u65B0\u6267\u884C command\uFF0C\u5E76\u628A\u65B0\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u4ED6\u3002",command:`${l} auth login`}}));return}process.stderr.write(`${i} \u5DF2\u6536\u5230\u5BC6\u94A5\uFF0C\u672C\u673A\u5F55\u5165\u670D\u52A1\u5DF2\u5173\u95ED\uFF0C\u6B63\u5728\u5411\u670D\u52A1\u7AEF\u6821\u9A8C\u5E76\u7ED1\u5B9A\u672C\u673A\uFF0C\u8BF7\u7EE7\u7EED\u7B49\u5F85\u672C\u8FDB\u7A0B\u9000\u51FA\u3002
94
+ `),Pe(s);let o=await je(s);if(!o.ok){ne(o)?re():process.stderr.write(`${i} \u672A\u80FD\u786E\u8BA4\u7ED1\u5B9A\u7ED3\u679C\uFF0C\u5DF2\u4FDD\u7559\u8FD9\u628A\u5F85\u786E\u8BA4\u7684\u5BC6\u94A5\u3002\u7F51\u7EDC\u6062\u590D\u540E\u6267\u884C\u4EFB\u610F ${l} \u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\u3002
95
+ `),a(o);return}let d=ie({userId:o.data.user.id,agentId:o.data.agentId,companyIds:o.data.companyIds});a(h({user:o.data.user,device:o.data.device,companyIds:(m=d==null?void 0:d.companyIds)!=null?m:o.data.companyIds,replacedPreviousAuthorization:o.data.replacedPreviousAuthorization,configPath:w()},o.requestId))}async function Ke(){let e=await V();if(e){a(e);return}let t=$();if(!t){a(Be());return}let n=await y("/companies",{apiKey:t,query:{page:1,limit:100}});if(!n.ok){a(n);return}let r=H();a(h({loggedIn:!0,device:{deviceId:r.deviceId,deviceName:r.deviceName,platform:r.platform},user:J()?{id:J().userId,agentId:J().agentId}:null,companies:n.data.data.map(i=>({id:i.id,name:i.name})),configPath:w()},n.requestId))}async function Fe(){let e=await V();if(e){a(e);return}let t=$();if(!t){a(Be());return}let n=await y("/auth/logout",{method:"POST",apiKey:t});if(!n.ok){a(n);return}De(),a(h({loggedOut:!0,revoked:n.data,note:"\u670D\u52A1\u7AEF\u5BC6\u94A5\u5DF2\u64A4\u9500\uFF0C\u672C\u673A\u51ED\u636E\u5DF2\u6E05\u9664\u3002\u8BBE\u5907\u8EAB\u4EFD\u4FDD\u7559\uFF0C\u91CD\u65B0\u767B\u5F55\u4F1A\u590D\u7528\u540C\u4E00\u53F0\u8BBE\u5907\u3002"},n.requestId))}function Be(){return c("AUTH_REQUIRED","\u672C\u673A\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u6388\u6743",{nextAction:{type:"auth_login",message:"\u5148\u8BA9\u7528\u6237\u5230\u6240\u5C5E SaaS \u7F51\u9875\u7684\u5BC6\u94A5\u7BA1\u7406\u91CC\u521B\u5EFA\u300CAI \u52A9\u624B\u5BC6\u94A5\u300D\u5E76\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002\u6267\u884C\u671F\u95F4\u628A stderr \u91CC\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u4FDD\u6301\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\u3002",command:`${l} auth login`}})}function je(e){let t=H();return y("/auth/claim",{method:"POST",apiKey:e,body:{...t,cliVersion:E}})}function Dt(e){if(process.env.BEST_GEO_NO_BROWSER==="1")return;let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",n=process.platform==="win32"?["/c","start","",e]:[e];(0,Ve.execFile)(t,n,()=>{})}function Lt(e){return e instanceof Error?e.message:String(e)}async function q(){let e=await V();if(e)return{ok:!1,envelope:e};let t=$();return t?{ok:!0,apiKey:t}:{ok:!1,envelope:c("AUTH_REQUIRED","\u672C\u673A\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u6388\u6743",{nextAction:{type:"auth_login",message:"\u5148\u8BA9\u7528\u6237\u5230\u6240\u5C5E SaaS \u7F51\u9875\u7684\u5BC6\u94A5\u7BA1\u7406\u91CC\u521B\u5EFA\u300CAI \u52A9\u624B\u5BC6\u94A5\u300D\u5E76\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002",command:`${l} auth login`}})}}var He=require("node:fs"),N=require("node:path"),Je=require("node:url");function Ut(e){if(e.cjsDir)return(0,N.join)(e.cjsDir,"..");if(!e.moduleUrl)throw new Error("\u7F3A\u5C11 CLI \u8FD0\u884C\u4F4D\u7F6E");return(0,N.join)((0,N.dirname)((0,Je.fileURLToPath)(e.moduleUrl)),"..","..","..")}function Mt(){return Ut({cjsDir:typeof __dirname=="string"?__dirname:void 0,moduleUrl:void 0})}function T(...e){return(0,He.readFileSync)((0,N.join)(Mt(),...e),"utf8")}function ze(){a(h({package:O,version:E,protocolVersion:D,commands:[{command:`${l} version --check`,description:"\u68C0\u67E5\u7248\u672C\u662F\u5426\u9700\u8981\u5347\u7EA7"},{command:`${l} capabilities`,description:"\u5217\u51FA\u53EF\u7528\u80FD\u529B\u53CA\u5176\u8F93\u5165 schema"},{command:`${l} skill get --raw > <\u4F60\u7684 skill \u76EE\u5F55>/best-geo/SKILL.md`,description:"\u76F4\u63A5\u628A Skill \u5199\u6210\u6587\u4EF6\uFF08\u63A8\u8350\uFF1B--raw \u8F93\u51FA markdown \u539F\u6587\uFF0C\u4E0D\u662F JSON\uFF09"},{command:`${l} skill get`,description:"\u4EE5 JSON \u4FE1\u5C01\u8FD4\u56DE Skill \u5185\u5BB9\u548C revision"},{command:`${l} guide list`,description:"\u5217\u51FA\u4E1A\u52A1\u6307\u5357"},{command:`${l} guide get <name>`,description:"\u8BFB\u53D6\u4E00\u4EFD\u4E1A\u52A1\u6307\u5357"},{command:`${l} auth login`,description:"\u6253\u5F00\u672C\u5730\u9875\u9762\u5F55\u5165\u5BC6\u94A5\u5E76\u7ED1\u5B9A\u672C\u673A"},{command:`${l} auth status`,description:"\u67E5\u770B\u5F53\u524D\u6388\u6743\u72B6\u6001"},{command:`${l} auth logout`,description:"\u64A4\u9500\u670D\u52A1\u7AEF\u5BC6\u94A5\u5E76\u6E05\u9664\u672C\u673A\u51ED\u636E"},{command:`${l} call <capability> --input '<JSON>'`,description:"\u8C03\u7528\u4E00\u4E2A\u67E5\u8BE2\u80FD\u529B"},{command:`${l} plan <operation> --input '<JSON>'`,description:"\u751F\u6210\u5199\u64CD\u4F5C\u8BA1\u5212\uFF0C\u8FD4\u56DE\u7ED9\u7528\u6237\u770B\u7684\u53D8\u66F4\u6458\u8981\uFF08\u4E0D\u5199\u6570\u636E\uFF09"},{command:`${l} apply <planId>`,description:"\u6267\u884C\u8BA1\u5212\u3002\u5FC5\u987B\u5148\u628A plan \u7684\u6458\u8981\u7ED9\u7528\u6237\u770B\u8FC7\u5E76\u5F97\u5230\u540C\u610F"}],nextAction:{type:"install_skill",command:`${l} skill get --raw`,message:"\u6309\u5F53\u524D AI \u5DE5\u5177\u7684 Skill \u673A\u5236\u9009\u4E00\u4E2A\u5B89\u88C5\u76EE\u5F55\uFF0C\u7528 best-geo skill get --raw \u628A\u5185\u5BB9\u76F4\u63A5\u91CD\u5B9A\u5411\u6210 SKILL.md\uFF0C\u7136\u540E\u52A0\u8F7D\u5B83"}}))}async function Qe(e){if(!e){a(h({package:O,version:E,protocolVersion:D,env:Ae,apiBase:B}));return}let t=await y("/meta");if(!t.ok){a(t);return}if(Ge(E,t.data.minimumCliVersion)<0){a(c("CLI_UPDATE_REQUIRED",`\u5F53\u524D\u7248\u672C ${E} \u4F4E\u4E8E\u6700\u4F4E\u8981\u6C42 ${t.data.minimumCliVersion}`,{requestId:t.requestId,data:{current:E,...t.data},nextAction:{type:"upgrade",message:"\u5347\u7EA7\u540E\u91CD\u8BD5",command:`npm install -g ${O}@latest`}}));return}a(h({current:E,...t.data,updateAvailable:Ge(E,t.data.latestCliVersion)<0},t.requestId))}function Xe(){a(h(JSON.parse(T("capabilities","capabilities.json"))))}function We(e){let t=et(T("skills","best-geo","SKILL.md"));if(e){process.stdout.write(t);return}a(h({name:l,revision:1,content:t}))}var oe=["company","product","question","article","knowledge","material","question-task","article-task","scheduled-monitor","publication"];function Ye(){a(h({guides:oe.map(e=>{let t=JSON.parse(T("guides",`${e}.json`));return{name:t.name,title:t.title,whenToUse:t.whenToUse}})}))}function Ze(e){if(!oe.includes(e)){a(c("GUIDE_NOT_FOUND",`\u6CA1\u6709\u540D\u4E3A ${e} \u7684\u6307\u5357`,{data:{available:oe}}));return}a(h(JSON.parse(et(T("guides",`${e}.json`)))))}function Ge(e,t){var i,s;let n=e.split(".").map(o=>Number.parseInt(o,10)||0),r=t.split(".").map(o=>Number.parseInt(o,10)||0);for(let o=0;o<Math.max(n.length,r.length);o+=1){let d=((i=n[o])!=null?i:0)-((s=r[o])!=null?s:0);if(d!==0)return d<0?-1:1}return 0}function et(e){return l==="best-geo"?e:e.replace(/\bbest-geo\b(?!-)/g,l)}var se=null,ae=null;function tt(){return se===null&&(se=JSON.parse(T("capabilities","capabilities.json")).capabilities),se}function Vt(){return ae===null&&(ae=new Map(tt().filter(e=>e.inputSchema!==void 0).map(e=>[e.name,e.inputSchema]))),ae}function nt(){return tt().filter(e=>e.mode==="write").map(e=>e.name)}function z(e,t){let n=Vt().get(e);return n===void 0?[]:ue(t,n,"")}function ue(e,t,n){if(t.type==="object"||t.properties!==void 0)return qt(e,t,n);let r=rt(e,t,n);if(r!==null)return[r];let i=[];return typeof e=="string"&&t.maxLength!==void 0&&e.length>t.maxLength&&i.push(`${n} \u6700\u591A ${t.maxLength} \u4E2A\u5B57\u7B26\uFF0C\u5F53\u524D ${e.length} \u4E2A`),typeof e=="number"&&(t.maximum!==void 0&&e>t.maximum&&i.push(`${n} \u4E0D\u80FD\u5927\u4E8E ${t.maximum}`),t.minimum!==void 0&&e<t.minimum&&i.push(`${n} \u4E0D\u80FD\u5C0F\u4E8E ${t.minimum}`)),t.enum!==void 0&&!t.enum.includes(e)&&i.push(`${n} \u53EA\u80FD\u662F ${t.enum.join(" / ")} \u4E4B\u4E00\uFF0C\u6536\u5230 ${C(e)}`),Array.isArray(e)&&(t.minItems!==void 0&&e.length<t.minItems&&i.push(`${n} \u81F3\u5C11\u8981 ${t.minItems} \u9879\uFF0C\u5F53\u524D ${e.length} \u9879`),t.maxItems!==void 0&&e.length>t.maxItems&&i.push(`${n} \u6700\u591A ${t.maxItems} \u9879\uFF0C\u5F53\u524D ${e.length} \u9879`),t.items!==void 0&&e.forEach((s,o)=>{i.push(...ue(s,t.items,`${n}[${o}]`))})),i}function qt(e,t,n){var d,m;if(typeof e!="object"||e===null||Array.isArray(e))return[`${n||"\u5165\u53C2"} \u5FC5\u987B\u662F\u5BF9\u8C61`];let r=e,i=(d=t.properties)!=null?d:{},s=(m=t.required)!=null?m:[],o=[];for(let u of s)(r[u]===void 0||r[u]===null)&&o.push(`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 ${ce(n,u)}`);if(t.additionalProperties===!1){let u=Object.keys(i);for(let b of Object.keys(r))u.includes(b)||o.push(`\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5 ${ce(n,b)}\uFF0C\u53EF\u7528\u5B57\u6BB5\uFF1A${u.join("\u3001")}`)}for(let[u,b]of Object.entries(i)){let k=r[u];k===void 0||k===null&&s.includes(u)||o.push(...ue(k,b,ce(n,u)))}return o}function rt(e,t,n){if(Array.isArray(t.type)){let r=t.type.map(i=>rt(e,{...t,type:i},n));return r.some(i=>i===null)?null:r[0]}switch(t.type){case"null":return e===null?null:`${n} \u5FC5\u987B\u662F null\uFF0C\u6536\u5230 ${C(e)}`;case"string":return typeof e=="string"?null:`${n} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF0C\u6536\u5230 ${C(e)}`;case"number":return typeof e=="number"&&Number.isFinite(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u5B57\uFF0C\u6536\u5230 ${C(e)}`;case"integer":return typeof e=="number"&&Number.isInteger(e)?null:`${n} \u5FC5\u987B\u662F\u6574\u6570\uFF0C\u6536\u5230 ${C(e)}`;case"boolean":return typeof e=="boolean"?null:`${n} \u5FC5\u987B\u662F true \u6216 false\uFF0C\u6536\u5230 ${C(e)}`;case"array":return Array.isArray(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u7EC4\uFF0C\u6536\u5230 ${C(e)}`;default:return null}}function ce(e,t){return e===""?t:`${e}.${t}`}function C(e){if(e===null)return"null";if(Array.isArray(e))return"\u6570\u7EC4";if(typeof e=="object")return"\u5BF9\u8C61";let t=String(e);return typeof e=="string"?`\u5B57\u7B26\u4E32 "${Kt(t)}"`:t}function Kt(e){return e.length>20?`${e.slice(0,20)}\u2026`:e}function Q(e,t){return c("VALIDATION_FAILED",`\u5165\u53C2\u4E0D\u5408\u6CD5\uFF1A${t.join("\uFF1B")}`,{data:{name:e,errors:t},nextAction:{type:"ask_user",message:"\u6309 capabilities \u91CC\u7684 inputSchema \u4FEE\u6B63\u53C2\u6570\u540E\u91CD\u8BD5\uFF1B\u7F3A\u7684\u4FE1\u606F\u95EE\u7528\u6237"}})}var it={"companies.list":e=>({path:"/companies",query:e}),"companies.get":e=>({path:`/companies/${Number(e.id)}`}),"products.list":e=>({path:"/products",query:e}),"products.get":e=>({path:`/products/${Number(e.id)}`}),"questions.list":e=>({path:"/questions",query:e}),"questions.get":e=>({path:`/questions/${Number(e.id)}`}),"articles.list":e=>({path:"/articles",query:e}),"articles.get":e=>({path:`/articles/${Number(e.id)}`,query:e.withContent===!0?{withContent:"true"}:void 0}),"knowledge.list":e=>({path:"/knowledge",query:e}),"knowledge.get":e=>({path:`/knowledge/${Number(e.id)}`}),"images.list":e=>({path:"/images",query:e}),"images.get":e=>({path:`/images/${Number(e.id)}`}),"videos.list":e=>({path:"/videos",query:e}),"videos.get":e=>({path:`/videos/${Number(e.id)}`}),"prompts.list":e=>({path:"/prompts",query:e}),"models.list":e=>({path:"/models",query:e}),"questionTasks.list":e=>({path:"/question-tasks",query:e}),"questionTasks.get":e=>({path:`/question-tasks/${Number(e.taskId)}`}),"articleTasks.list":e=>({path:"/article-tasks",query:e}),"articleTasks.get":e=>({path:`/article-tasks/${Number(e.taskId)}`}),"keywordTasks.list":e=>({path:"/keyword-tasks",query:e}),"keywordTasks.get":e=>({path:`/keyword-tasks/${Number(e.taskId)}`}),"tags.list":e=>({path:"/tags",query:e}),"folders.list":e=>({path:"/article-folders",query:e}),"publicationPlatforms.list":e=>({path:"/publication-platforms",query:e}),"publicationAccounts.list":e=>({path:"/publication-accounts",query:e}),"publicationTasks.list":e=>({path:"/publication-tasks",query:e}),"publicationRecords.list":e=>({path:"/publication-records",query:e}),"mediaPlatforms.list":e=>({path:"/media-platforms",query:e}),"mediaPlatforms.get":e=>({path:`/media-platforms/${Number(e.mediaId)}`}),"mediaPublications.list":e=>({path:"/media-publications",query:e}),"mediaPublications.summary":e=>({path:"/media-publications/summary",query:e}),"articleTasks.reuseConfig":e=>({path:`/article-tasks/${Number(e.taskId)}/reuse-config`}),"scheduledSentiment.generateQuestions":e=>({path:"/scheduled-sentiment/generate-questions",method:"POST",body:e}),"indexing.suggestCompetitors":e=>({path:"/suggest-competitors",method:"POST",body:e}),"indexingPlatforms.list":()=>({path:"/indexing-platforms"}),"scheduledIndexing.list":e=>({path:"/scheduled-indexing",query:e}),"scheduledIndexing.get":e=>({path:`/scheduled-indexing/${Number(e.planId)}`}),"scheduledIndexing.runs":e=>({path:`/scheduled-indexing/${Number(e.planId)}/runs`,query:I(e)}),"scheduledIndexing.metrics":e=>({path:`/scheduled-indexing/${Number(e.planId)}/metrics`,query:I(e)}),"scheduledSentiment.list":e=>({path:"/scheduled-sentiment",query:e}),"scheduledSentiment.get":e=>({path:`/scheduled-sentiment/${Number(e.planId)}`}),"scheduledSentiment.runs":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/runs`,query:I(e)}),"scheduledSentiment.metrics":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/metrics`,query:I(e)}),"scheduledIndexing.answers":e=>({path:`/scheduled-indexing/${Number(e.planId)}/answers`,query:I(e)}),"scheduledIndexing.citations":e=>({path:`/scheduled-indexing/${Number(e.planId)}/citations`,query:I(e)}),"scheduledIndexing.topicStats":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-stats`,query:I(e)}),"scheduledIndexing.topicPlatformMatrix":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-platform-matrix`,query:I(e)}),"scheduledSentiment.answers":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/answers`,query:I(e)}),"scheduledSentiment.citations":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/citations`,query:I(e)}),"scheduledSentiment.topicStats":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/topic-stats`,query:I(e)})};function I(e){let{planId:t,...n}=e;return n}function Ft(){return Object.keys(it)}async function ot(e,t){let n=it[e];if(!n){a(c("VALIDATION_FAILED",`\u672A\u77E5\u80FD\u529B\uFF1A${e}`,{data:{available:Ft()},nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo capabilities \u67E5\u770B\u53EF\u7528\u80FD\u529B"}}));return}let r={};if(t)try{r=JSON.parse(t)}catch{a(c("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let i=z(e,r);if(i.length>0){a(Q(e,i));return}let s=await q();if(!s.ok){a(s.envelope);return}let{path:o,query:d,method:m,body:u}=n(r);a(await y(o,{apiKey:s.apiKey,query:d,method:m,body:u}))}var R=require("node:fs"),P=require("node:path");var Bt={image:{maxBytes:2*1024*1024,extensions:[".png",".jpg",".jpeg"],label:"\u56FE\u7247"},video:{maxBytes:200*1024*1024,extensions:[".mp4"],label:"\u89C6\u9891"},thumbnail:{maxBytes:5*1024*1024,extensions:[".png",".jpg",".jpeg"],label:"\u5C01\u9762\u56FE"}},jt={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".mp4":"video/mp4"},st={"images.create":[{pathKey:"filePath",metaKey:"file",uploadField:"fileUrl",kind:"image"}],"videos.create":[{pathKey:"videoPath",metaKey:"video",uploadField:"videoUrl",kind:"video"},{pathKey:"thumbnailPath",metaKey:"thumbnail",uploadField:"thumbnail",kind:"thumbnail"}]},Gt=900*1e3;function at(e){return st[e]!==void 0}function ct(e){return M()[e]!==void 0}function ut(e,t){var s;let n=(s=st[e])!=null?s:[],r={...t},i={};for(let o of n){let d=t[o.pathKey];if(typeof d!="string"||!d.trim())return{ok:!1,envelope:zt(o)};let m=(0,P.resolve)(d.trim()),u=Jt(m,o);if(!u.ok)return{ok:!1,envelope:u.envelope};delete r[o.pathKey],r[o.metaKey]={name:(0,P.basename)(m),size:u.size},i[o.uploadField]=m}return{ok:!0,input:r,paths:i}}function dt(e,t){te({...M(),[e]:{paths:t,createdAt:Date.now()}})}async function lt(e,t){let n=M()[e];if(!n)return{ok:!1,envelope:c("VALIDATION_FAILED","\u672C\u673A\u6CA1\u6709\u8FD9\u4E2A\u8BA1\u5212\u7684\u5F85\u4F20\u6587\u4EF6\u8BB0\u5F55",{nextAction:{type:"ask_user",message:"\u91CD\u65B0\u6267\u884C best-geo plan \u751F\u6210\u8BA1\u5212\uFF0C\u628A\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D apply\u2014\u2014\u8BA1\u5212\u548C\u5F85\u4F20\u6587\u4EF6\u662F\u4E00\u8D77\u751F\u6210\u7684"}})};let r={};for(let[i,s]of Object.entries(n.paths)){if(!(0,R.existsSync)(s))return{ok:!1,envelope:c("VALIDATION_FAILED",`\u6587\u4EF6\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF1A${s}`)};let o=await y(`/plans/${encodeURIComponent(e)}/uploads/presign`,{method:"POST",apiKey:t,body:{field:i,fileName:(0,P.basename)(s)}});if(!o.ok)return{ok:!1,envelope:o};let d=await Ht(o.data,s);if(!d.ok)return{ok:!1,envelope:d.envelope};r[i]=o.data.uploadUrl}return{ok:!0,uploads:r}}function pt(e){let t=M();delete t[e],te(t)}async function Ht(e,t){let n=jt[mt(t)];if(!n)return{ok:!1,envelope:c("UPLOAD_FAILED",`${t} \u7684\u6587\u4EF6\u7C7B\u578B\u6CA1\u6709\u767B\u8BB0 MIME\uFF0C\u4F20\u4E0D\u4E86`)};let r=new FormData;r.append("key",e.key),r.append("policy",e.policy),r.append("OSSAccessKeyId",e.OSSAccessKeyId),r.append("signature",e.signature),r.append("callback",e.callback),r.append("Content-Disposition",e["Content-Disposition"]),r.append("success_action_status","200"),r.append("file",await(0,R.openAsBlob)(t,{type:n}),(0,P.basename)(t));try{let i=await fetch(e.host,{method:"POST",body:r,signal:AbortSignal.timeout(Gt)}),s=(await i.text().catch(()=>"")).slice(0,300);if(!i.ok)return{ok:!1,envelope:c("UPLOAD_FAILED",`\u4E0A\u4F20\u5931\u8D25\uFF08HTTP ${i.status}\uFF09\uFF1A${s}`,{nextAction:{type:"ask_user",message:"\u628A\u8FD9\u4E2A\u60C5\u51B5\u544A\u8BC9\u7528\u6237\uFF0C\u7A0D\u540E\u91CD\u65B0\u6267\u884C\u4E00\u6B21 plan \u518D\u8BD5"}})};let o=Qt(s);return o?{ok:!1,envelope:c("UPLOAD_FAILED",`\u6587\u4EF6\u5DF2\u4E0A\u4F20\uFF0C\u4F46\u767B\u8BB0\u5931\u8D25\uFF1A${o}`,{nextAction:{type:"ask_user",message:"\u628A\u8FD9\u53E5\u62A5\u9519\u539F\u6837\u544A\u8BC9\u7528\u6237\uFF0C\u8BA9\u4ED6\u8054\u7CFB\u670D\u52A1\u5546\u3002\u91CD\u8BD5\u591A\u534A\u4E0D\u4F1A\u597D\u3002"}})}:{ok:!0}}catch(i){return{ok:!1,envelope:c("UPLOAD_FAILED",`\u4E0A\u4F20\u4E2D\u65AD\uFF1A${i instanceof Error?i.message:String(i)}`,{nextAction:{type:"ask_user",message:"\u4E0A\u4F20\u6CA1\u80FD\u5B8C\u6210\uFF0C\u539F\u56E0\u89C1\u4E0A\u9762\u7684\u62A5\u9519\u539F\u6587\u3002\u544A\u8BC9\u7528\u6237\uFF0C\u7A0D\u540E\u91CD\u65B0\u8D70\u4E00\u904D"}})}}}function Jt(e,t){let n=Bt[t.kind];if(!(0,R.existsSync)(e))return{ok:!1,envelope:c("VALIDATION_FAILED",`\u627E\u4E0D\u5230\u6587\u4EF6\uFF1A${e}`,{nextAction:{type:"ask_user",message:"\u8BA9\u7528\u6237\u786E\u8BA4\u6587\u4EF6\u8DEF\u5F84\u3002\u76F8\u5BF9\u8DEF\u5F84\u662F\u76F8\u5BF9\u4F60\u5F53\u524D\u7684\u5DE5\u4F5C\u76EE\u5F55\u7B97\u7684"}})};let r=(0,R.statSync)(e);if(!r.isFile())return{ok:!1,envelope:c("VALIDATION_FAILED",`${e} \u4E0D\u662F\u4E00\u4E2A\u6587\u4EF6`)};let i=mt(e);return n.extensions.includes(i)?r.size>n.maxBytes?{ok:!1,envelope:c("VALIDATION_FAILED",`${n.label}\u6700\u5927 ${X(n.maxBytes)}\uFF0C\u5F53\u524D ${X(r.size)}\uFF0C\u8D85\u51FA ${X(r.size-n.maxBytes)}`,{nextAction:{type:"ask_user",message:`\u544A\u8BC9\u7528\u6237\u8FD9\u4E2A\u6587\u4EF6\u8D85\u4E86\u591A\u5C11\uFF0C\u5E76\u95EE\u4ED6\u8981\u4E0D\u8981\u4F60\u5148\u628A\u5B83\u538B\u5230 ${X(n.maxBytes)} \u4EE5\u5185\u518D\u4F20\u3002\u4F60\u53EF\u4EE5\u7528\u7528\u6237\u673A\u5668\u4E0A\u73B0\u6210\u7684\u5DE5\u5177\u5904\u7406\uFF08macOS \u81EA\u5E26 sips\uFF0C\u591A\u6570\u673A\u5668\u6709 ffmpeg\uFF09\uFF0C\u5904\u7406\u5B8C\u7528\u65B0\u6587\u4EF6\u91CD\u65B0 plan\u3002`}})}:{ok:!0,size:r.size}:{ok:!1,envelope:c("VALIDATION_FAILED",`${n.label}\u53EA\u652F\u6301 ${n.extensions.join(" / ")}\uFF0C\u5F53\u524D\u662F ${i||"(\u6CA1\u6709\u6269\u5C55\u540D)"}`,{nextAction:{type:"ask_user",message:`\u628A\u8FD9\u4E2A\u9650\u5236\u544A\u8BC9\u7528\u6237\uFF0C\u95EE\u4ED6\u8981\u4E0D\u8981\u4F60\u5148\u628A\u6587\u4EF6\u8F6C\u6210 ${n.extensions[0]} \u518D\u4F20`}})}}function zt(e){return c("VALIDATION_FAILED",`\u7F3A\u5C11 ${e.pathKey}`,{nextAction:{type:"ask_user",message:`${e.pathKey} \u8981\u7ED9\u4E00\u4E2A\u672C\u673A\u6587\u4EF6\u8DEF\u5F84\u3002\u95EE\u7528\u6237\u6587\u4EF6\u653E\u5728\u54EA\uFF0C\u4E0D\u8981\u81EA\u5DF1\u7F16\u4E00\u4E2A\u8DEF\u5F84\u3002`}})}function X(e){return e>=1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${Math.max(1,Math.round(e/1024))}KB`}function Qt(e){try{let t=JSON.parse(e),n=Number(t.statusCode);if(Number.isFinite(n)&&n!==0&&n!==200)return typeof t.message=="string"?t.message:`statusCode ${n}`}catch{}return null}function mt(e){let t=e.lastIndexOf(".");return t===-1?"":e.toLowerCase().slice(t)}async function ft(e,t,n){var b;let r=nt();if(!e||!r.includes(e)){a(c("VALIDATION_FAILED",`\u672A\u77E5\u7684\u5199\u64CD\u4F5C\uFF1A${e!=null?e:"(\u7A7A)"}`,{data:{available:r},nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo capabilities \u67E5\u770B\u53EF\u7528\u80FD\u529B\u548C\u5B83\u4EEC\u7684\u5165\u53C2"}}));return}if(!t&&(n!=null&&n.trim().startsWith("{"))){a(c("VALIDATION_FAILED","\u5165\u53C2\u8981\u653E\u5728 --input \u540E\u9762",{nextAction:{type:"ask_user",message:`\u6B63\u786E\u5199\u6CD5\uFF1Abest-geo plan ${e} --input '<JSON>'`}}));return}let i;try{i=t?JSON.parse(t):{}}catch{a(c("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let s=z(e,i);if(s.length>0){a(Q(e,s));return}let o=i,d=null;if(at(e)){let k=ut(e,i);if(!k.ok){a(k.envelope);return}o=k.input,d=k.paths}let m=await q();if(!m.ok){a(m.envelope);return}let u=await y("/plans",{method:"POST",apiKey:m.apiKey,body:{operation:e,input:o}});u.ok&&d&&((b=u.data)!=null&&b.planId)&&dt(u.data.planId,d),a(u)}async function gt(e){if(!e){a(c("VALIDATION_FAILED","\u7F3A\u5C11 planId",{nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo plan <operation> \u751F\u6210\u8BA1\u5212\uFF0C\u628A\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D\u6267\u884C"}}));return}let t=await q();if(!t.ok){a(t.envelope);return}let n;if(ct(e)){let i=await lt(e,t.apiKey);if(!i.ok){a(i.envelope);return}n=i.uploads}let r=await y(`/plans/${encodeURIComponent(e)}/apply`,{method:"POST",apiKey:t.apiKey,body:n?{uploads:n}:{},isWrite:!0});r.ok&&pt(e),a(r)}function yt(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];if(!r.startsWith("--"))continue;let i=r.slice(2),s=e[n+1];s&&!s.startsWith("--")?(t[i]=s,n+=1):t[i]=!0}return t}function Et(e,t){let n=w();if(e.reason==="denied")return c("HOST_PERMISSION_REQUIRED",`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\u6587\u4EF6\uFF1A${n}`,{nextAction:{type:"request_host_approval",message:`Best GEO \u9700\u8981\u8BFB\u5199 ${n} \u6765\u4FDD\u5B58\u672C\u673A\u7684\u8BBE\u5907\u8EAB\u4EFD\u548C\u6388\u6743\u3002\u8BF7\u7528\u5F53\u524D\u5DE5\u5177\u81EA\u5E26\u7684\u6743\u9650\u786E\u8BA4\u673A\u5236\u7533\u8BF7\u5BF9\u8BE5\u6587\u4EF6\u7684\u8BFB\u5199\u6743\u9650\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\uFF0C\u4E0D\u8981\u5173\u95ED\u6574\u4E2A\u6C99\u7BB1\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u628A\u5BC6\u94A5\u8D34\u8FDB\u5BF9\u8BDD\u3002`,capability:t.capability,...t.retryCommand?{command:t.retryCommand}:{}}});if(e.reason==="permissions_too_open"||e.reason==="not_owner"){let r=e.reason==="not_owner"?"\u8BE5\u6587\u4EF6\u4E0D\u5C5E\u4E8E\u5F53\u524D\u7CFB\u7EDF\u7528\u6237\uFF0C\u8BF7\u8BA9\u7528\u6237\u786E\u8BA4\u540E\u5220\u9664\u6216\u4FEE\u6B63\u5C5E\u4E3B":`\u8BF7\u8BA9\u7528\u6237\u6267\u884C\uFF1Achmod 600 ${n}`;return c("HOST_PERMISSION_REQUIRED",`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u4E0D\u5B89\u5168\uFF1A${n}`,{nextAction:{type:"ask_user",message:`${e.message}\u3002${r}\uFF0C\u7136\u540E\u91CD\u8BD5\u3002`}})}return c("HOST_PERMISSION_REQUIRED",`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5DF2\u635F\u574F\uFF1A${n}`,{nextAction:{type:"ask_user",message:`\u8BF7\u8BA9\u7528\u6237\u5220\u9664 ${n} \u540E\u91CD\u65B0\u6267\u884C\u767B\u5F55\u3002\u8BE5\u6587\u4EF6\u91CC\u53EA\u6709\u672C\u673A\u8BBE\u5907\u8EAB\u4EFD\u548C\u6388\u6743\uFF0C\u5220\u9664\u4E0D\u4F1A\u5F71\u54CD\u670D\u52A1\u7AEF\u6570\u636E\u3002`,command:`${l} auth login`}})}function ht(e){return e instanceof A}async function Xt(){let[e,...t]=process.argv.slice(2),n=yt(t);switch(e){case void 0:case"help":ze();return;case"version":await Qe(n.check===!0);return;case"capabilities":Xe();return;case"skill":if(t[0]==="get"){We(n.raw===!0);return}break;case"guide":if(t[0]==="list"){Ye();return}if(t[0]==="get"&&t[1]){Ze(t[1]);return}break;case"auth":if(t[0]==="login")return qe();if(t[0]==="status")return Ke();if(t[0]==="logout")return Fe();break;case"plan":await ft(t[0],typeof n.input=="string"?n.input:void 0,t[1]);return;case"apply":await gt(t[0]);return;case"call":if(t[0]){await ot(t[0],typeof n.input=="string"?n.input:void 0);return}break;default:break}a(c("VALIDATION_FAILED",`\u65E0\u6CD5\u8BC6\u522B\u7684\u547D\u4EE4\uFF1A${[e,...t].filter(Boolean).join(" ")}`,{nextAction:{type:"ask_user",message:"\u6267\u884C best-geo help \u67E5\u770B\u53EF\u7528\u547D\u4EE4"}})),process.exitCode=1}Xt().catch(e=>{if(ht(e)){a(Et(e,{capability:e.reason==="denied"?"config_write":"config_read",retryCommand:Wt()})),process.exitCode=1;return}a(c("SERVER_ERROR",e instanceof Error?e.message:String(e))),process.exitCode=1});function Wt(){let[e,t]=process.argv.slice(2);if(e==="auth"&&(t==="login"||t==="status"||t==="logout"))return`${l} auth ${t}`}
@@ -31,20 +31,32 @@
31
31
  },
32
32
  {
33
33
  "step": 5,
34
+ "action": "要指定文件夹时,先用 folders.list 拿 id",
35
+ "capability": "folders.list",
36
+ "note": "articles.create 的 folderId 不给就进该项目的默认文件夹。用户点名了文件夹才需要查这里 —— **不要猜 id**,猜错服务端会拒,白跑一次 plan。返回是扁平的,按 parentId 自己拼树;isDefault 那个就是不传 folderId 时会进的。"
37
+ },
38
+ {
39
+ "step": 6,
34
40
  "action": "要新建文章:先确定 GEO 项目,再 plan articles.create",
35
41
  "capability": "articles.create",
36
42
  "note": "标题最多 30 字。正文可以先不给、之后再补。summaries 要写成用户在 plan 摘要里一眼能判断对不对的样子,别自己编一堆凑数。"
37
43
  },
38
44
  {
39
- "step": 6,
45
+ "step": 7,
40
46
  "action": "要改文章:先 articles.get 读到当前内容,再 plan articles.update",
41
47
  "capability": "articles.update",
42
48
  "note": "正文、标签、摘要都是整体覆盖。想在原文后面加一段,得先把原文读出来、拼好完整的新正文再传,不能只传新增的那段。"
43
49
  },
44
50
  {
45
- "step": 7,
51
+ "step": 8,
46
52
  "action": "把 plan 返回的 summary 原样念给用户,等他明确同意后再 apply",
47
53
  "note": "正文在摘要里只给字数和首尾各 100 字——那是为了不撑爆上下文,不是内容被截断了。用户要核对全文就让他去网页看。"
54
+ },
55
+ {
56
+ "step": 9,
57
+ "action": "要换文件夹或改审核状态:articles.moveFolder / articles.setStatus",
58
+ "capability": "articles.moveFolder",
59
+ "note": "这两件事 articles.update 做不了,得用专门的能力,两个都支持一次给多篇。移动只能在同一个 GEO 项目内,跨项目会被拒。状态是 0=待审核 1=已通过 2=已拒绝。两个都不改文章内容、也不扣费。"
48
60
  }
49
61
  ],
50
62
  "askUserWhen": [
@@ -61,7 +73,8 @@
61
73
  "不要把 articles.update 当成追加。正文/标签/摘要都是整体覆盖,只传一段新内容会把原来的全冲掉",
62
74
  "不要在用户没同意 plan 摘要之前就 apply。他说「帮我写篇文章」不等于同意了你写的这一篇",
63
75
  "不要为了省事把 articles.create 连着调好几次试效果——每调一次都真的建出一篇,多出来的还得让用户一篇篇去网页删;而且按篇计费",
64
- "已经建好的文章改不了所属项目和文件夹(新建时可以用 folderId 指定),用户要动那两个就让他去网页的文章管理"
76
+ "已经建好的文章改不了所属项目和文件夹(新建时可以用 folderId 指定),用户要动那两个就让他去网页的文章管理",
77
+ "不要凭印象填 folderId。合法 id 只能来自 folders.list,猜一个过去会被服务端拒掉"
65
78
  ],
66
79
  "errorRecovery": {
67
80
  "ACCESS_DENIED": "这篇文章所属公司不在密钥授权范围内。回到 companies.list 确认范围,或让用户去网页把这家公司加进这把密钥的授权。",
@@ -40,6 +40,12 @@
40
40
  "step": 6,
41
41
  "action": "apply 之后告诉用户「已提交、正在解析」,不要说成「已完成」",
42
42
  "note": "解析是后台异步做的,刚建完还不能用于检索。用户要确认可用了没有,稍后用 knowledge.get 查文档状态。"
43
+ },
44
+ {
45
+ "step": 7,
46
+ "action": "要往已有知识库补资料:knowledge.addFiles",
47
+ "capability": "knowledge.addFiles",
48
+ "note": "**不要另建一个库**。同一个主题散成好几个库,AI 检索时反而更差。按文档计费,加进去要后台解析一会儿才检索得到 —— 别提交完就跟用户说「可以用了」。"
43
49
  }
44
50
  ],
45
51
  "askUserWhen": [
@@ -50,7 +56,8 @@
50
56
  "不要跳过 plan 直接写入",
51
57
  "不要跳过 notice 里的计费提示。用户看不到界面,你不念他就不知道自己要付出什么",
52
58
  "不要在 apply 成功后就说知识库已经能用了——那时候还在解析",
53
- "不要把用户没给的内容自己编进 files。知识库是写作依据,编出来的东西会一路影响后面生成的文章"
59
+ "不要把用户没给的内容自己编进 files。知识库是写作依据,编出来的东西会一路影响后面生成的文章",
60
+ "用户说「补进 XX 知识库」时不要新建库。那是 knowledge.addFiles 的活"
54
61
  ],
55
62
  "errorRecovery": {
56
63
  "ACCESS_DENIED": "公司或项目不在密钥授权范围内。回到 companies.list 确认范围。",
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": "publication",
3
+ "title": "内容发出去:自媒体发布与媒体投稿",
4
+ "whenToUse": "用户想把内容发出去,或者问「这篇发出去了没有」「发到哪个链接了」「为什么发失败」「投稿花了多少钱」。也包括他问「能发到哪些平台」「有哪些媒体可以投」的时候。",
5
+ "prerequisites": [
6
+ "已完成 best-geo auth login",
7
+ "已确定公司(发布账号和投稿记录都按公司隔离)"
8
+ ],
9
+ "workflow": [
10
+ {
11
+ "step": 1,
12
+ "action": "先分清用户说的是哪一件事",
13
+ "note": "**自媒体发布**是用用户自己绑定的账号发(知乎、小红书这些),按发布记录条数计费;**媒体投稿**是花钱请第三方媒体发稿,按家计价、单价从几块到几百不等。两条链路的表、状态含义、计费方式完全不同,问清楚再动手,别拿投稿记录回答发布的问题。"
14
+ },
15
+ {
16
+ "step": 2,
17
+ "action": "查发布任务的整体情况用 publicationTasks.list",
18
+ "capability": "publicationTasks.list",
19
+ "note": "这里只给任务级汇总。用户问的是具体某篇发没发,别停在这一步。"
20
+ },
21
+ {
22
+ "step": 3,
23
+ "action": "查每条内容的实际下场用 publicationRecords.list",
24
+ "capability": "publicationRecords.list",
25
+ "note": "这是「发出去了没有、链接是什么」的唯一出处。念状态用 statusLabel 不要用 status 数值。成功的把 publishedUrl 给出来——那是用户最想要的。**自媒体发布查不到失败原因**:数据库里就没有这一列,失败时只能如实说「发布失败了,系统没有记下具体原因」,不要编一个理由,也不要去找 errorMessage 字段(不存在)。"
26
+ },
27
+ {
28
+ "step": 4,
29
+ "action": "要建发布任务,先把平台和账号查清楚",
30
+ "capability": "publicationAccounts.list",
31
+ "note": "顺序是:publicationPlatforms.list(带 contentType)看能发到哪儿 → publicationAccounts.list 看这个公司绑了哪些号 → 再建任务。平台名猜得出来,账号 id 猜不出来,不查就建必然失败。**挑号只挑 usable=true 的**,登录过期或已停用的号建任务时会被拒。**挑文章时用 articles.list 带上 status=1 和 mustHaveCover=true**——未审核或没封面的文章发不出去。这两件事都是先筛掉比建任务被拒再回头省事。"
32
+ },
33
+ {
34
+ "step": 5,
35
+ "action": "建发布任务:publicationTasks.createArticle / createVideo",
36
+ "capability": "publicationTasks.createArticle",
37
+ "note": "**先 plan,把计划里逐条列的「哪篇发到哪个号、什么时候发」念给用户,等他确认再 apply**。执行之后稿子会真的发出去,CLI 撤不回来。aigc(要不要打 AI 创作声明)必须问用户,别替他决定。定时发布传 publishTime,不传就是立即发。费用按发布记录条数算——一篇发 3 个号就是 3 条,跟用户说清楚这个口径。"
38
+ },
39
+ {
40
+ "step": 6,
41
+ "action": "任务建完后查进展,别反复重建",
42
+ "capability": "publicationRecords.list",
43
+ "note": "发布是异步的,apply 完不会马上有链接。等一会儿用 publicationRecords.list 看。每建一次任务就是一批新的发布,重建 = 重复发稿 + 重复扣费。"
44
+ },
45
+ {
46
+ "step": 7,
47
+ "action": "要停下来用 publicationTasks.pause,改主意了用 delete",
48
+ "capability": "publicationTasks.pause",
49
+ "note": "两个都只对**还没发出去**的记录有效。已经发成功的稿子留在平台上,CLI 撤不回来——用户要撤那些,只能去各平台自己删,这一点必须说明白,别让他以为暂停就等于撤回。"
50
+ },
51
+ {
52
+ "step": 8,
53
+ "action": "媒体投稿:先 mediaPlatforms.list 看有哪些媒体,报价前用 mediaPlatforms.get 查实时价",
54
+ "capability": "mediaPlatforms.get",
55
+ "note": "**报价必须用 get 那条**。列表是分页快照,遇上刚调过价就会和实际扣费对不上——用户按你报的数点了头,扣的却是另一个数。"
56
+ },
57
+ {
58
+ "step": 9,
59
+ "action": "投稿:mediaPublications.create(一家)/ batchCreate(多家,最多 20)",
60
+ "capability": "mediaPublications.batchCreate",
61
+ "note": "**计划里逐家列出了媒体名和单价,要一家一家念给用户听,再给合计**——这是按明细收费的操作,用户确认的就是这份账单,只说「一共多少钱」不够。批量允许部分成功:某家失败不影响别家,失败的那家不扣费。一次只能投一篇文章,投多篇就一篇一篇来。"
62
+ },
63
+ {
64
+ "step": 10,
65
+ "action": "查投稿进展用 mediaPublications.list,要整体情况用 mediaPublications.summary",
66
+ "capability": "mediaPublications.summary",
67
+ "note": "投稿动辄上百条。用户问「投出去的都怎么样了」直接用 summary,念 items 里的 statusLabel(「已拒稿 × 15」),别念 counts 里的数值。投稿有 failReason,被拒稿时把它念出来——这条链路和自媒体发布不同,是有失败原因的。**被拒稿的还要看 refundStatusLabel**:拒稿会原路退款,但退款偶尔会没退成(显示「待退款」,系统会自动补退)——用户问「钱退了吗」看的是这个字段,不是 status。"
68
+ }
69
+ ],
70
+ "askUserWhen": [
71
+ "分不清他要问的是自媒体发布还是媒体投稿",
72
+ "他有多家公司,而没说这次问的是哪家",
73
+ "他说「发一下」但没说发哪篇、发到哪个平台、用哪个账号",
74
+ "要不要打「AI 创作」声明(aigc)——这是他的合规选择,不能替他定",
75
+ "他说「明天发」这类相对时间,而你不确定具体是几点"
76
+ ],
77
+ "forbidden": [
78
+ "不要在用户确认之前 apply 任何发布或投稿的计划——执行之后稿子就真的出去了",
79
+ "不要只报总数或总价就让用户确认。发布要念「哪篇发到哪个号」,投稿要念「哪家多少钱」",
80
+ "不要拿投稿记录回答自媒体发布的问题,反过来也一样——两条链路的状态含义不同",
81
+ "不要用列表里的媒体价格给用户报价,必须用 mediaPlatforms.get 的实时价",
82
+ "不要给自媒体发布的失败编造原因,也不要去读 errorMessage——那个字段不存在",
83
+ "不要把 refund_pending 说成「已退款」——那笔钱现在还在用户账外,说错了他就不会再追",
84
+ "不要把 status 数值念给用户,用 statusLabel",
85
+ "不要说「暂停」或「删除任务」能撤回已经发出去的稿子——撤不了",
86
+ "不要拿未审核或没封面的文章去发布/投稿,会被拒。挑文章时就用 status=1 + mustHaveCover=true 筛掉"
87
+ ],
88
+ "errorRecovery": [
89
+ {
90
+ "code": "ACCESS_DENIED",
91
+ "action": "这条记录不属于当前密钥授权的公司。先用 companies.list 确认在哪家公司下找。"
92
+ },
93
+ {
94
+ "code": "VALIDATION_FAILED",
95
+ "action": "按 capabilities 里的 schema 修正参数。平台名要来自 publicationPlatforms.list、账号 id 来自 publicationAccounts.list,别自己拼。报「文章没有封面」「标题超过媒体限制」「时间已经过去了」时,是内容或参数本身的问题,改完再重新生成计划。"
96
+ },
97
+ {
98
+ "code": "PLAN_COST_CHANGED",
99
+ "action": "媒体价格在用户确认的这段时间里变了。**不要直接重试**——重新生成计划,把新的价格明细念给用户,让他重新确认。"
100
+ },
101
+ {
102
+ "code": "PLAN_STALE",
103
+ "action": "有媒体在确认期间下架了。重新查一遍还在架上的媒体,重新生成计划让用户确认。"
104
+ },
105
+ {
106
+ "code": "QUOTA_EXCEEDED",
107
+ "action": "余额不足。告诉用户还差多少、去哪儿充值,别反复重试。"
108
+ }
109
+ ],
110
+ "completionCriteria": [
111
+ "回答「发了没有」时给出了状态名称、以及成功的链接或失败的说明",
112
+ "批量投稿执行完,报的是结果里的 netChargedTotal(单位元),不是自己按成功家数乘单价算出来的",
113
+ "有 refund_pending 的项时,说清楚「这笔钱还没退回来,系统会自动补退」,不能说成已退款",
114
+ "涉及花钱的投稿,报价用的是 mediaPlatforms.get 的实时价,且逐家念过明细",
115
+ "建任务或投稿前,把「哪篇发到哪儿、花多少钱、发出去撤不回来」都跟用户讲清楚了,他明确点头才 apply"
116
+ ]
117
+ }
@@ -34,6 +34,12 @@
34
34
  "action": "批量新增或修改搜索问题时走 plan/apply",
35
35
  "capability": "questions.create / questions.update",
36
36
  "note": "questions 传字符串数组,一次最多 100 条。计划摘要会分别列出「将新增」「已存在跳过」「重复/空值跳过」。"
37
+ },
38
+ {
39
+ "step": 6,
40
+ "action": "给问题挂知识库:questions.linkKnowledge / unlinkKnowledge",
41
+ "capability": "questions.linkKnowledge",
42
+ "note": "AI 写这个问题的文章时会去绑定的知识库里检索,绑错了内容就跑偏,所以绑之前先用 knowledge.list 确认是哪几个库。重复绑定会自动跳过;解绑只断开关系,知识库本身还在。两个都不扣费。"
37
43
  }
38
44
  ],
39
45
  "askUserWhen": [
@@ -40,16 +40,22 @@
40
40
  "step": 6,
41
41
  "action": "想知道有没有效果,看指标",
42
42
  "capability": "scheduledIndexing.metrics",
43
- "note": "收录看 mentionRate(提及率)和 avgRank(被提到时排第几,越小越靠前);舆情看 positiveWords / negativeWords 里具体的词。这两套指标不是一回事,别拿收录的口径去解释舆情的数。"
43
+ "note": "收录看 mentionRate(提及率)和 avgRank(被提到时排第几,越小越靠前);舆情看 positiveWords / negativeWords 里具体的词。这两套指标不是一回事,别拿收录的口径去解释舆情的数。 **但 metrics 只给数字**——用户问「AI 到底怎么说我们的」时它答不了,那要用下一步的明细。"
44
44
  },
45
45
  {
46
46
  "step": 7,
47
+ "action": "用户想知道 AI 具体说了什么,看明细",
48
+ "capability": "scheduledIndexing.answers",
49
+ "note": "answers 给每一次提问的记录和 AI 回答原文(**默认只给前 200 字预览**,确实要读全文再对那几条传 withContent=true,否则一页就把上下文占满);citations 给 AI 引用了哪些来源——它直接回答「该往哪儿发内容」,AI 常引谁就该去谁那儿发;topicStats 按问题维度看哪几句有效果。舆情侧同名能力用法一样,但**舆情的 topicStats 和收录不是一回事**:舆情那边一行是一句问句加各平台状态,没有提及率和排名。"
50
+ },
51
+ {
52
+ "step": 8,
47
53
  "action": "要改配置就 update,只传要改的字段",
48
54
  "capability": "scheduledIndexing.update",
49
55
  "note": "公司和项目定了就不能改,要换只能新建。平台和采集方式是**一起判**的:只改其中一个也可能凑出跑不了的组合,报错里会写清是哪几个平台不行。"
50
56
  },
51
57
  {
52
- "step": 8,
58
+ "step": 9,
53
59
  "action": "用户等不及排期时才用 runNow",
54
60
  "capability": "scheduledIndexing.runNow",
55
61
  "note": "跑的就是计划当前那份配置,不能临时改参数——要改先 update。云端采集当场扣算力,摘要里写了这次问多少次,念给用户听。发出去之后用 runs 看进度,不要接着查指标。"
@@ -70,7 +76,8 @@
70
76
  "不要拿收录的指标口径去解释舆情的数,反过来也不行。两套指标答的不是同一个问题",
71
77
  "不要把执行记录的 runId 当成计划的 planId 用,那是两套 id 空间",
72
78
  "也不要把计划的 planId 和 plan/apply 那个单号搞混:前者是整数、长期有效,后者是 plan 返回的字符串、30 分钟过期,只能喂给 apply",
73
- "不要为了「让计划停下来」去改问题或平台。停用就用 update 把 enabled 设成 false,历史记录和指标都还在"
79
+ "不要为了「让计划停下来」去改问题或平台。停用就用 update 把 enabled 设成 false,历史记录和指标都还在",
80
+ "不要拿 metrics 的数字去回答「AI 具体怎么说的」。那是 answers 的活,metrics 里没有一个字是 AI 说的原话"
74
81
  ],
75
82
  "completionCriteria": [
76
83
  "新建/修改类:apply 返回成功,并且把摘要里的计划名、每轮提问次数、频率复述给用户确认过",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "best-geo-test",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Best GEO CLI — 给本地 AI 助手调用的 GEO 命令行工具",
5
5
  "bin": {
6
6
  "best-geo-test": "dist/index.cjs"
@@ -24,6 +24,7 @@ best-geo guide get material # 要查图片/视频素材,或给素材改名
24
24
  best-geo guide get question-task # 要让 AI 想一批搜索问题
25
25
  best-geo guide get article-task # 要让 AI 批量写一批文章
26
26
  best-geo guide get scheduled-monitor # 要定期盯 AI 有没有提到你、怎么评价你
27
+ best-geo guide get publication # 要把内容发出去/投稿,或查发出去没有、发到哪个链接、花了多少钱
27
28
  ```
28
29
 
29
30
  ## 调用业务能力
@@ -100,6 +101,13 @@ best-geo plan companies.update --input '{"companyId":6,"description":"新描述"
100
101
  - **任务类操作(`questionTasks.*` / `articleTasks.*`)apply 成功不等于事情做完了**:结果里的 `pending: true` 表示任务刚排进后台队列。这时候要做的是**回话告诉用户在跑了**,不是接着查结果——刚提交那一刻一定是空的。更不要因为查不到就再建一个,每建一次都真的多跑一个任务,多出来的那批还得用户回头自己收拾。
101
102
  - `questions.create` 的摘要会分别列出「将新增」「已存在跳过」「重复/空值跳过」。告诉用户真实会新增几条,不要照抄他给的原始条数。
102
103
  - 用户没同意就别 apply。他要是改主意了,直接丢掉这个 planId 重新 plan 即可,不需要"取消"。
104
+ - **删除是唯一不可逆的一类**(`*.delete`)。别的写操作改错了还能再改回来,删掉的东西找不回来。
105
+ 所以:摘要里那句连带影响必须**原样念给用户**(比如删知识库会让绑了它的搜索问题失去这份资料),
106
+ 并且要等他**明确说删**,不能拿「帮我清理一下」当作同意。拿不准就先用查询能力把要删的东西
107
+ 列给他看,让他逐条确认。
108
+ - **公司和 GEO 项目删不了**,这是有意的:它们是级联删除,一条命令能连带清掉下面的项目、文章、
109
+ 知识库、素材、定时计划。用户要删这两样,请他到网页上删——不要试图用别的能力绕(比如逐个删完
110
+ 下面的东西),那既做不到也不是他要的。
103
111
 
104
112
  ## 读输出的规则
105
113