best-geo-test 2.0.0 → 2.0.2-beta

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.
@@ -235,7 +235,7 @@
235
235
  "maxLength": 255
236
236
  },
237
237
  "maxItems": 100,
238
- "description": "问题文本数组,不是换行字符串"
238
+ "description": "问题文本数组,不是换行字符串。每条里不能带换行,带了会被服务端拒绝——一条问题就是一个数组元素"
239
239
  },
240
240
  "tags": {
241
241
  "type": "array",
@@ -2200,9 +2200,9 @@
2200
2200
  {
2201
2201
  "name": "indexingQueries.create",
2202
2202
  "mode": "write",
2203
- "hidden": true,
2203
+ "guide": "indexing-query",
2204
2204
  "requiresPlan": true,
2205
- "description": "AI 查询任务:拿一个问题去问几个 AI 平台,只走云端采集,执行一次。可以指定采集厂商 provider(moli / deepgeo,不传按后台默认;手机端平台固定走 moli)。会扣费,plan 摘要里写了扣几次。apply 返回 taskId,用 indexingQueries.get 查结果。",
2205
+ "description": "AI 查询任务:拿几个问题去问几个 AI 平台(问题 × 平台,多对多),只走云端采集,执行一次。可以指定采集厂商 provider(moli / deepgeo,不传按后台默认;手机端平台固定走 moli)。按「问题数 × 平台数」扣费(开了 withShareUrl 的平台一次提问算两份),plan 摘要里写了扣几次。问题会同时加进这个 GEO 项目的搜索问题库。apply 返回 taskId,用 indexingQueries.get 查结果。",
2206
2206
  "inputSchema": {
2207
2207
  "type": "object",
2208
2208
  "properties": {
@@ -2217,11 +2217,16 @@
2217
2217
  "maxLength": 128,
2218
2218
  "description": "任务名,建议「设备名 + 时间」"
2219
2219
  },
2220
- "question": {
2221
- "type": "string",
2222
- "minLength": 1,
2223
- "maxLength": 255,
2224
- "description": "要问的问题"
2220
+ "questions": {
2221
+ "type": "array",
2222
+ "minItems": 1,
2223
+ "maxItems": 100,
2224
+ "items": {
2225
+ "type": "string",
2226
+ "minLength": 1,
2227
+ "maxLength": 255
2228
+ },
2229
+ "description": "要问的问题,1~100 个,自动去重去首尾空白"
2225
2230
  },
2226
2231
  "platforms": {
2227
2232
  "type": "array",
@@ -2247,7 +2252,7 @@
2247
2252
  "required": [
2248
2253
  "projectId",
2249
2254
  "name",
2250
- "question",
2255
+ "questions",
2251
2256
  "platforms"
2252
2257
  ],
2253
2258
  "additionalProperties": false
@@ -2256,9 +2261,9 @@
2256
2261
  {
2257
2262
  "name": "indexingQueries.get",
2258
2263
  "mode": "read",
2259
- "hidden": true,
2264
+ "guide": "indexing-query",
2260
2265
  "requiresPlan": false,
2261
- "description": "查一个 AI 查询任务的结果:整体进度 status,以及每个平台的回答正文(全文)、信源 sources、拆解词 searchKeywords、对话分享链接 shareUrl。status 为 pending 或 running 时稍后再查;paused、timed_out、failed、finished 都不会再变,不用再查,把 statusLabel 和 errorMessage 念给用户。",
2266
+ "description": "查一个 AI 查询任务的结果:整体进度 status(按全部提问算,不受分页影响),以及分页的回答,每条是一个问题 × 一个平台,含正文全文 content、信源 sources、拆解词 searchKeywords、对话分享链接 shareUrl。status 为 pending 或 running 时稍后再查;paused、timed_out、failed、finished 都不会再变,不用再查,把 statusLabel 和 errorMessage 念给用户。回答按 total 翻页;只看某个问题传 topicId(取自出参 questions[].id),只看某个平台传 platform。",
2262
2267
  "inputSchema": {
2263
2268
  "type": "object",
2264
2269
  "properties": {
@@ -2271,6 +2276,28 @@
2271
2276
  "type": "integer",
2272
2277
  "minimum": 1,
2273
2278
  "description": "indexingQueries.create 返回的 taskId"
2279
+ },
2280
+ "topicId": {
2281
+ "type": "integer",
2282
+ "minimum": 1,
2283
+ "description": "只看某个问题的回答,取自出参 questions[].id"
2284
+ },
2285
+ "platform": {
2286
+ "type": "string",
2287
+ "description": "只看某个 AI 平台的回答"
2288
+ },
2289
+ "page": {
2290
+ "type": "integer",
2291
+ "minimum": 1,
2292
+ "default": 1,
2293
+ "description": "第几页"
2294
+ },
2295
+ "limit": {
2296
+ "type": "integer",
2297
+ "minimum": 1,
2298
+ "maximum": 100,
2299
+ "default": 20,
2300
+ "description": "每页几条回答。回答是全文,一条可能上千字,按需要取"
2274
2301
  }
2275
2302
  },
2276
2303
  "required": [
@@ -3539,14 +3566,14 @@
3539
3566
  "mode": "read",
3540
3567
  "guide": "publication",
3541
3568
  "requiresPlan": false,
3542
- "description": "当前能用的自媒体发布平台。文章平台和视频平台是两批,建发布任务前先按 contentType 取对应的那批——拿文章平台去发视频会被拒。返回里的 **limitConfig 是这个平台对文章的字数要求**(titleMaxLength 标题上限 / contentMinLength 正文下限 / contentMaxLength 正文上限,0 表示该项不限;为 null 表示这个平台不限字数)——**只对文章任务生效,视频任务不查字数**,视频平台这一项恒为 null。**remark 是投稿要求备注**(比如不收带外链的稿子)。不满足字数要求的文章建任务时会被拒,挑文章前先看这里。",
3569
+ "description": "当前能用的自媒体发布平台。文章平台、视频平台、图文平台是三批,建发布任务前先按 contentType 取对应的那批——拿文章平台去发视频或图文会被拒。返回里的 **limitConfig 是这个平台对内容的字数/张数要求**:文章平台是 titleMaxLength 标题上限 / contentMinLength 正文下限 / contentMaxLength 正文上限(0 表示该项不限;为 null 表示这个平台不限字数),**视频任务不查字数**,视频平台这一项恒为 null;**图文平台**看的是标题长度(titleMinLength / titleMaxLength)、描述长度(summaryMinLength / summaryMaxLength,对应答案卡的发布描述),建图文任务时按它校验答案卡;**图片张数上限以 plan 阶段的报错为准**(各图文平台不同,不要只凭 imageMaxCount 判断)。**remark 是投稿要求备注**(比如不收带外链的稿子)。不满足要求的内容建任务时会被拒,挑内容前先看这里。",
3543
3570
  "inputSchema": {
3544
3571
  "type": "object",
3545
3572
  "properties": {
3546
3573
  "contentType": {
3547
3574
  "type": "string",
3548
- "enum": ["article", "video"],
3549
- "description": "只看发文章的还是只看发视频的。不传就是全部"
3575
+ "enum": ["article", "video", "image"],
3576
+ "description": "只看发文章的、发视频的还是发图文的(图文内容来自 AI 答案卡)。不传就是全部"
3550
3577
  }
3551
3578
  },
3552
3579
  "additionalProperties": false
@@ -3593,7 +3620,7 @@
3593
3620
  "mode": "read",
3594
3621
  "guide": "publication",
3595
3622
  "requiresPlan": false,
3596
- "description": "发布记录:每条内容在每个平台的实际下场。限定在当前 GEO 项目内。这是「发出去了没有、发到哪个链接、失败为什么」的唯一出处——用户问「小红书那篇发了吗」就查这里。status 同时给数值和 statusLabel,念给用户用后者。",
3623
+ "description": "发布记录:每条内容在每个平台的实际下场。限定在当前 GEO 项目内。这是「发出去了没有、发到哪个链接、失败为什么」的唯一出处——用户问「小红书那篇发了吗」就查这里。contentType 区分 article / video / image,图文记录没有 articleId,来源答案卡在 answerCardTaskId,title 是答案卡的发布标题。status 同时给数值和 statusLabel,念给用户用后者。",
3597
3624
  "inputSchema": {
3598
3625
  "type": "object",
3599
3626
  "properties": {
@@ -3630,7 +3657,7 @@
3630
3657
  "mode": "read",
3631
3658
  "guide": "publication",
3632
3659
  "requiresPlan": false,
3633
- "description": "单个媒体的实时状态与当前价格。**报价给用户前必须查这条**——列表是分页快照,遇上刚调过价就会和实际扣费对不上。",
3660
+ "description": "单个媒体的实时状态与当前价格。**报价给用户前必须查这条**——列表是分页快照,遇上刚调过价就会和实际扣费对不上。**单位注意**:这里的价格字段是 points,单位是算力(1 元 = 100 算力);mediaPlatforms.list 的 price 和 plan 摘要里的金额单位都是元。给用户报价时统一换算成元,例如 points=5000 就是 50 元。",
3634
3661
  "inputSchema": {
3635
3662
  "type": "object",
3636
3663
  "properties": {
@@ -3858,12 +3885,64 @@
3858
3885
  "additionalProperties": false
3859
3886
  }
3860
3887
  },
3888
+ {
3889
+ "name": "publicationTasks.createImage",
3890
+ "mode": "write",
3891
+ "guide": "publication",
3892
+ "requiresPlan": true,
3893
+ "description": "建图文发布任务:把 AI 答案卡(answerCards)做好的图发到图文平台(抖音图文、视频号图文等)。和 createArticle 同一套结构,只把 articleId 换成 answerCardTaskId,平台要用 contentType=image 那批——拿文章或视频平台发图文会被拒。**执行后会真的发出去,CLI 撤不回来**。费用按发布记录条数算——一张答案卡发 3 个账号就是 3 条。**挑已生成完成(status=8)且发布标题(publishTitle)不为空的答案卡**,图要出齐(服务端只校验图是否出齐和标题,不校验 status,但没完成的卡多半图不全);缺标题先用 answerCards.savePublishInfo 补。标题、描述、图片张数按平台自己的 limitConfig 校验,同一张卡发不同平台,张数上限可能不同。**不用问 aigc**:网页端图文已经没有「AI 创作声明」,不传就是不打。",
3894
+ "inputSchema": {
3895
+ "type": "object",
3896
+ "properties": {
3897
+ "name": { "type": "string", "minLength": 1, "maxLength": 100, "description": "任务名,给用户认的" },
3898
+ "projectId": { "type": "integer", "minimum": 1, "description": "发哪个 GEO 项目的内容" },
3899
+ "aigc": { "type": "boolean", "description": "要不要打「AI 创作」声明。图文可以不传,默认 false" },
3900
+ "items": {
3901
+ "type": "array",
3902
+ "minItems": 1,
3903
+ "description": "每项是「一张答案卡 + 它要发到哪些图文平台的哪些账号」",
3904
+ "items": {
3905
+ "type": "object",
3906
+ "properties": {
3907
+ "answerCardTaskId": { "type": "integer", "minimum": 1, "description": "答案卡任务 id,来自 answerCards.list" },
3908
+ "platforms": {
3909
+ "type": "array",
3910
+ "minItems": 1,
3911
+ "items": {
3912
+ "type": "object",
3913
+ "properties": {
3914
+ "platform": { "type": "string", "description": "图文平台标识,填 publicationPlatforms.list(contentType=image)返回的 platform 值" },
3915
+ "publishAccountIds": {
3916
+ "type": "array",
3917
+ "minItems": 1,
3918
+ "items": { "type": "integer", "minimum": 1 },
3919
+ "description": "用哪些账号发。一个账号一条发布记录"
3920
+ },
3921
+ "publishTime": {
3922
+ "type": "string",
3923
+ "description": "定时发布时间,ISO 格式如 2026-09-01T09:00:00+08:00。**不传 = 立即发布**。不能填过去的时间"
3924
+ }
3925
+ },
3926
+ "required": ["platform", "publishAccountIds"],
3927
+ "additionalProperties": false
3928
+ }
3929
+ }
3930
+ },
3931
+ "required": ["answerCardTaskId", "platforms"],
3932
+ "additionalProperties": false
3933
+ }
3934
+ }
3935
+ },
3936
+ "required": ["name", "projectId", "items"],
3937
+ "additionalProperties": false
3938
+ }
3939
+ },
3861
3940
  {
3862
3941
  "name": "publicationTasks.delete",
3863
3942
  "mode": "write",
3864
3943
  "guide": "publication",
3865
3944
  "requiresPlan": true,
3866
- "description": "删发布任务。只删任务和它名下**还没发出去**的记录——已经发布成功的稿子留在平台上不受影响,要撤那些得去各平台自己删。一次只能删当前 GEO 项目的。",
3945
+ "description": "删发布任务。普通任务只删任务和它名下**还没发出去**的记录——已经发布成功的稿子留在平台上不受影响,要撤那些得去各平台自己删。**例外:外部导入的任务**(publicationTasks.list 里 typeLabel=外部导入)会连同名下已发布的记录一起删掉,收录统计也会跟着减少,计划摘要里会单独写出来,必须念给用户。一次只能删当前 GEO 项目的。",
3867
3946
  "inputSchema": {
3868
3947
  "type": "object",
3869
3948
  "properties": {
@@ -3911,6 +3990,39 @@
3911
3990
  "additionalProperties": false
3912
3991
  }
3913
3992
  },
3993
+ {
3994
+ "name": "publicationTasks.importLinks",
3995
+ "mode": "write",
3996
+ "guide": "publication",
3997
+ "requiresPlan": true,
3998
+ "description": "导入用户**已经在外面发出去**的文章链接,登记成一个「外部导入」发布任务,让这些链接参与收录匹配和统计。不扣费,也不会往任何平台发东西。articleId 和 title 必须且只能给一个:链接发的是系统里已有的文章就给 articleId;在外面写的给 title,会新建一篇只有标题的外部文章(之后不能再拿去发布或投稿)。计划里会逐条写明哪条能导、哪条跳过及原因(链接无效、网站暂不支持提取文章 ID、已经导入或发布过),念给用户再确认;一条都导不了时 plan 直接报错。",
3999
+ "inputSchema": {
4000
+ "type": "object",
4001
+ "properties": {
4002
+ "projectId": { "type": "integer", "minimum": 1, "description": "GEO 项目 id,来自 projects.list" },
4003
+ "urls": {
4004
+ "type": "array",
4005
+ "minItems": 1,
4006
+ "maxItems": 20,
4007
+ "items": { "type": "string", "minLength": 1 },
4008
+ "description": "外部文章链接,一次最多 20 条,用户给的原样传入"
4009
+ },
4010
+ "articleId": {
4011
+ "type": "integer",
4012
+ "minimum": 1,
4013
+ "description": "链接对应系统里已有的哪篇文章,来自 articles.list,必须属于当前 GEO 项目。和 title 二选一"
4014
+ },
4015
+ "title": {
4016
+ "type": "string",
4017
+ "minLength": 1,
4018
+ "maxLength": 255,
4019
+ "description": "外面写的文章标题,用来新建一篇外部文章。和 articleId 二选一"
4020
+ }
4021
+ },
4022
+ "required": ["projectId", "urls"],
4023
+ "additionalProperties": false
4024
+ }
4025
+ },
3914
4026
  {
3915
4027
  "name": "mediaPublications.create",
3916
4028
  "mode": "write",
@@ -3955,7 +4067,7 @@
3955
4067
  "name": "textToImages.models",
3956
4068
  "mode": "read",
3957
4069
  "guide": "material",
3958
- "description": "列出可用的 AI 出图档位。不同档位计费不同(返回里的 toolScore 是计费口径),建图之前先调这个看有哪些能用。",
4070
+ "description": "列出可用的 AI 出图档位。不同档位计费不同(返回里的 toolScore 是计费口径),建图之前先调这个看有哪些能用。maxInputImages 是这个档位最多能喂几张输入图(0 表示不支持参考图),答案卡选参考图前要用它算上限。",
3959
4071
  "inputSchema": { "type": "object", "properties": {}, "additionalProperties": false }
3960
4072
  },
3961
4073
  {
@@ -4459,7 +4571,7 @@
4459
4571
  "visualMode": {
4460
4572
  "type": "integer",
4461
4573
  "enum": [1, 2, 3],
4462
- "description": "视觉方式:1 AI 智能匹配(后端从可用模板里自动挑一套,不用再给 templateId 或 customStylePrompt)/ 2 指定模板(需一并给 templateId)/ 3 自定义风格(需一并给 customStylePrompt)"
4574
+ "description": "视觉方式:1 AI 智能匹配(后端从可用模板里自动挑一套,不用再给 templateId 或 customStylePrompt)/ 2 指定模板(需一并给 templateId)/ 3 自定义风格(需一并给 customStylePrompt)。1 和 2 要把模板图喂给模型,所选档位的 maxInputImages 为 0 时只能用 3"
4463
4575
  },
4464
4576
  "templateId": {
4465
4577
  "type": "integer",
@@ -4488,7 +4600,7 @@
4488
4600
  "type": "integer",
4489
4601
  "minimum": 1
4490
4602
  },
4491
- "description": "参考素材图 id 列表,有序,用 images.list 查,最多 10 张"
4603
+ "description": "参考素材图 id 列表,有序,用 images.list 查。**真实上限看所选档位**:textToImages.models 里该档位的 maxInputImages;visualMode=1 或 2 时模板图要先占 1 张,用户能给的再少 1 张。超了 plan 能过、apply 会被拒,所以 plan 前先算好"
4492
4604
  }
4493
4605
  },
4494
4606
  "required": ["projectId", "sourceType", "visualMode", "richness", "modelCode"],
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Vt=Object.defineProperty;var Ft=(e,t,n)=>t in e?Vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var ae=(e,t,n)=>Ft(e,typeof t!="symbol"?t+"":t,n);var le="https://nbgeo.aimusiclj.com",Ne="best-geo-test",Pe="best-geo-test",Le="bg-test-cli-",De="2.0.0";var B=2,E=De,D=Pe,p=Ne,Ue="dev",J=Kt(Bt());function Bt(){var e;return(e=process.env.BEST_GEO_API_BASE)!=null?e:le}var Q=Le,Me=300*1e3,je=30*1e3,Ve=300*1e3;function Kt(e){return e.replace(/\/+$/,"")}var rt=require("node:child_process");var ze=require("node:crypto"),X=require("node:os");var d=require("node:fs"),Fe=require("node:os"),S=require("node:path");var de=require("node:crypto");var _=class extends Error{constructor(n,r,o){super(o);ae(this,"reason",n);ae(this,"path",r);this.name="LocalConfigError"}},qt={schemaVersion:1,device:null,activeCredential:null,pendingCredential:null};function K(){var e;return(e=process.env.BEST_GEO_CONFIG_DIR)!=null?e:(0,S.join)((0,Fe.homedir)(),`.${p}`)}function O(){return(0,S.join)(K(),"config.json")}function C(){var n,r,o;let e=O(),t;try{if(!(0,d.existsSync)(e))return null;Ht(e),t=(0,d.readFileSync)(e,"utf8")}catch(i){throw i instanceof _?i:Be(i,e)}try{let i=JSON.parse(t);if(typeof i!="object"||i==null||i.schemaVersion!==1)throw new Error("unexpected shape");return{schemaVersion:1,device:(n=i.device)!=null?n:null,activeCredential:(r=i.activeCredential)!=null?r:null,pendingCredential:(o=i.pendingCredential)!=null?o:null}}catch{throw new _("corrupted",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5185\u5BB9\u4E0D\u5B8C\u6574\u6216\u683C\u5F0F\u4E0D\u5BF9\uFF1A${e}`)}}function Gt(e){let t=K(),n=O(),r=(0,S.join)(t,`.config.json.${(0,de.randomBytes)(6).toString("hex")}.tmp`);try{(0,d.existsSync)(t)||(0,d.mkdirSync)(t,{recursive:!0,mode:448});let o=(0,d.openSync)(r,"wx",384);try{(0,d.writeSync)(o,`${JSON.stringify(e,null,2)}
3
- `),(0,d.fsyncSync)(o)}finally{(0,d.closeSync)(o)}(0,d.renameSync)(r,n)}catch(o){if((0,d.existsSync)(r))try{(0,d.unlinkSync)(r)}catch{}throw Be(o,n)}}function T(e){var n;let t=e((n=C())!=null?n:{...qt});return Gt(t),t}function Ht(e){var r;if(process.platform==="win32")return;let t=(0,d.statSync)(e),n=(r=process.getuid)==null?void 0:r.call(process);if(n!=null&&t.uid!==n)throw new _("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 _("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 Be(e,t){let n=e==null?void 0:e.code;return n==="EACCES"||n==="EPERM"||n==="EROFS"?new _("denied",t,`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\uFF1A${t}`):e instanceof Error?e:new Error(String(e))}var Ke=3600*1e3;function qe(){return(0,S.join)(K(),"pending-uploads")}var zt=/^plan_[0-9a-zA-Z]+$/;function ce(e){return zt.test(e)?(0,S.join)(qe(),`${e}.json`):null}function W(e){var n;let t=ce(e);if(t==null||!(0,d.existsSync)(t))return null;try{let r=JSON.parse((0,d.readFileSync)(t,"utf8"));return Date.now()-((n=r==null?void 0:r.createdAt)!=null?n:0)<Ke?r:null}catch{return null}}function Ge(e,t){let n=ce(e);if(n==null)throw new Error(`\u4E0D\u5408\u6CD5\u7684\u8BA1\u5212 ID:${e}`);let r=qe();(0,d.mkdirSync)(r,{recursive:!0,mode:448}),Jt(r);let o=(0,S.join)(r,`.${e}.${(0,de.randomBytes)(6).toString("hex")}.tmp`);try{(0,d.writeFileSync)(o,JSON.stringify(t),{mode:384}),(0,d.renameSync)(o,n)}catch(i){if((0,d.existsSync)(o))try{(0,d.unlinkSync)(o)}catch{}throw i}}function He(e){let t=ce(e);if(t!=null)try{(0,d.unlinkSync)(t)}catch{}}function Jt(e){let t=(0,S.join)(K(),"pending-uploads.json");try{(0,d.existsSync)(t)&&(0,d.unlinkSync)(t)}catch{}let n;try{n=(0,d.readdirSync)(e)}catch{return}for(let r of n){if(r.endsWith(".tmp")){try{let i=(0,S.join)(e,r);Date.now()-(0,d.statSync)(i).mtimeMs>=Ke&&(0,d.unlinkSync)(i)}catch{}continue}if(!r.endsWith(".json"))continue;let o=r.slice(0,-5);if(W(o)==null)try{(0,d.unlinkSync)((0,S.join)(e,r))}catch{}}}function Je(){var t,n;let e=(t=C())==null?void 0:t.device;return(n=e==null?void 0:e.deviceId)!=null&&n.startsWith(Q)?e.deviceId:null}function Y(){var r,o;let e={deviceName:(0,X.hostname)().slice(0,50),platform:`${(0,X.platform)()}-${process.arch}`},t=(r=C())==null?void 0:r.device;if((o=t==null?void 0:t.deviceId)!=null&&o.startsWith(Q))return t.deviceName===e.deviceName&&t.platform===e.platform?t:T(i=>({...i,device:{...t,...e}})).device;let n={deviceId:`${Q}${(0,ze.randomUUID)()}`,...e};return T(i=>({...i,device:n})).device}function Qe(){return`cli_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function I(e,t=Qe()){return{ok:!0,code:"OK",requestId:t,data:e}}function l(e,t,n={}){var r;return{ok:!1,code:e,message:t,requestId:(r=n.requestId)!=null?r:Qe(),...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 x(e,t={}){var i,s;let n=new URL(`${J}/v1/agent-cli${e}`);for(let[c,f]of Object.entries((i=t.query)!=null?i:{}))if(f!=null)for(let m of Array.isArray(f)?f:[f])n.searchParams.append(c,String(m));let r={"X-GEO-CLI-Version":E,"X-GEO-Protocol-Version":String(B),"X-GEO-CLI-Package":D};t.projectId!=null&&(r["X-Geo-Product-Id"]=String(t.projectId));let o=null;try{o=Je()}catch{}o&&(r["X-Device-ID"]=o),t.apiKey&&(r.Authorization=`Bearer ${t.apiKey}`),t.body!=null&&(r["Content-Type"]="application/json");try{let c=await fetch(n,{method:(s=t.method)!=null?s:"GET",headers:r,body:t.body==null?void 0:JSON.stringify(t.body),signal:AbortSignal.timeout(t.isWrite?Ve:je)}),f=await c.text();try{let m=JSON.parse(f);return Qt(m)?m:l("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${c.status}\uFF09`,{data:{transportFailure:!0}})}catch{return l("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${c.status}\uFF09`,{data:{transportFailure:!0}})}}catch(c){return c instanceof Error&&(c.name==="TimeoutError"||c.name==="AbortError")?l("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"}}):l("SERVER_ERROR",`\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF1A${c instanceof Error?c.message:String(c)}`,{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 Qt(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.ok=="boolean"&&typeof t.code=="string"}function Wt(e){var t;return!e.ok&&((t=e.data)==null?void 0:t.transportFailure)===!0}function pe(e){return e.ok||Wt(e)?!1:["AUTH_EXPIRED","DEVICE_MISMATCH","ACCESS_DENIED","AUTH_REQUIRED","VALIDATION_FAILED"].includes(e.code)}function U(){var e,t,n;return(n=(t=(e=C())==null?void 0:e.activeCredential)==null?void 0:t.apiKey)!=null?n:null}function Z(){var e,t;return(t=(e=C())==null?void 0:e.activeCredential)!=null?t:null}function We(){var e,t;return(t=(e=C())==null?void 0:e.pendingCredential)!=null?t:null}function Xe(e){T(t=>({...t,pendingCredential:{apiKey:e,startedAt:new Date().toISOString()}}))}function ue(){T(e=>({...e,pendingCredential:null}))}function me(e){return T(t=>{let n=t.pendingCredential;return n?{...t,activeCredential:{apiKey:n.apiKey,...e},pendingCredential:null}:t}).activeCredential}function Ye(){T(e=>({...e,activeCredential:null,pendingCredential:null}))}var R=require("node:crypto"),tt=require("node:http");function Ze(e){let t=`
2
+ "use strict";var jt=Object.defineProperty;var Vt=(e,t,n)=>t in e?jt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var se=(e,t,n)=>Vt(e,typeof t!="symbol"?t+"":t,n);var ae="https://nbgeo.aimusiclj.com",Oe="best-geo-test",$e="best-geo-test",Ne="bg-test-cli-",Pe="2.0.2-beta";var B=2,k=Pe,D=$e,p=Oe,Le="dev",J=Bt(Ft());function Ft(){var e;return(e=process.env.BEST_GEO_API_BASE)!=null?e:ae}var Q=Ne,De=300*1e3,Ue=30*1e3,Me=300*1e3;function Bt(e){return e.replace(/\/+$/,"")}var tt=require("node:child_process");var Ge=require("node:crypto"),X=require("node:os");var d=require("node:fs"),je=require("node:os"),A=require("node:path");var le=require("node:crypto");var _=class extends Error{constructor(n,r,o){super(o);se(this,"reason",n);se(this,"path",r);this.name="LocalConfigError"}},qt={schemaVersion:1,device:null,activeCredential:null,pendingCredential:null};function q(){var e;return(e=process.env.BEST_GEO_CONFIG_DIR)!=null?e:(0,A.join)((0,je.homedir)(),`.${p}`)}function O(){return(0,A.join)(q(),"config.json")}function C(){var n,r,o;let e=O(),t;try{if(!(0,d.existsSync)(e))return null;Gt(e),t=(0,d.readFileSync)(e,"utf8")}catch(i){throw i instanceof _?i:Ve(i,e)}try{let i=JSON.parse(t);if(typeof i!="object"||i==null||i.schemaVersion!==1)throw new Error("unexpected shape");return{schemaVersion:1,device:(n=i.device)!=null?n:null,activeCredential:(r=i.activeCredential)!=null?r:null,pendingCredential:(o=i.pendingCredential)!=null?o:null}}catch{throw new _("corrupted",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5185\u5BB9\u4E0D\u5B8C\u6574\u6216\u683C\u5F0F\u4E0D\u5BF9\uFF1A${e}`)}}function Kt(e){let t=q(),n=O(),r=(0,A.join)(t,`.config.json.${(0,le.randomBytes)(6).toString("hex")}.tmp`);try{(0,d.existsSync)(t)||(0,d.mkdirSync)(t,{recursive:!0,mode:448});let o=(0,d.openSync)(r,"wx",384);try{(0,d.writeSync)(o,`${JSON.stringify(e,null,2)}
3
+ `),(0,d.fsyncSync)(o)}finally{(0,d.closeSync)(o)}(0,d.renameSync)(r,n)}catch(o){if((0,d.existsSync)(r))try{(0,d.unlinkSync)(r)}catch{}throw Ve(o,n)}}function T(e){var n;let t=e((n=C())!=null?n:{...qt});return Kt(t),t}function Gt(e){var r;if(process.platform==="win32")return;let t=(0,d.statSync)(e),n=(r=process.getuid)==null?void 0:r.call(process);if(n!=null&&t.uid!==n)throw new _("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 _("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 Ve(e,t){let n=e==null?void 0:e.code;return n==="EACCES"||n==="EPERM"||n==="EROFS"?new _("denied",t,`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\uFF1A${t}`):e instanceof Error?e:new Error(String(e))}var Fe=3600*1e3;function Be(){return(0,A.join)(q(),"pending-uploads")}var Ht=/^plan_[0-9a-zA-Z]+$/;function de(e){return Ht.test(e)?(0,A.join)(Be(),`${e}.json`):null}function W(e){var n;let t=de(e);if(t==null||!(0,d.existsSync)(t))return null;try{let r=JSON.parse((0,d.readFileSync)(t,"utf8"));return Date.now()-((n=r==null?void 0:r.createdAt)!=null?n:0)<Fe?r:null}catch{return null}}function qe(e,t){let n=de(e);if(n==null)throw new Error(`\u4E0D\u5408\u6CD5\u7684\u8BA1\u5212 ID:${e}`);let r=Be();(0,d.mkdirSync)(r,{recursive:!0,mode:448}),zt(r);let o=(0,A.join)(r,`.${e}.${(0,le.randomBytes)(6).toString("hex")}.tmp`);try{(0,d.writeFileSync)(o,JSON.stringify(t),{mode:384}),(0,d.renameSync)(o,n)}catch(i){if((0,d.existsSync)(o))try{(0,d.unlinkSync)(o)}catch{}throw i}}function Ke(e){let t=de(e);if(t!=null)try{(0,d.unlinkSync)(t)}catch{}}function zt(e){let t=(0,A.join)(q(),"pending-uploads.json");try{(0,d.existsSync)(t)&&(0,d.unlinkSync)(t)}catch{}let n;try{n=(0,d.readdirSync)(e)}catch{return}for(let r of n){if(r.endsWith(".tmp")){try{let i=(0,A.join)(e,r);Date.now()-(0,d.statSync)(i).mtimeMs>=Fe&&(0,d.unlinkSync)(i)}catch{}continue}if(!r.endsWith(".json"))continue;let o=r.slice(0,-5);if(W(o)==null)try{(0,d.unlinkSync)((0,A.join)(e,r))}catch{}}}function He(){var t,n;let e=(t=C())==null?void 0:t.device;return(n=e==null?void 0:e.deviceId)!=null&&n.startsWith(Q)?e.deviceId:null}function Y(){var r,o;let e={deviceName:(0,X.hostname)().slice(0,50),platform:`${(0,X.platform)()}-${process.arch}`},t=(r=C())==null?void 0:r.device;if((o=t==null?void 0:t.deviceId)!=null&&o.startsWith(Q))return t.deviceName===e.deviceName&&t.platform===e.platform?t:T(i=>({...i,device:{...t,...e}})).device;let n={deviceId:`${Q}${(0,Ge.randomUUID)()}`,...e};return T(i=>({...i,device:n})).device}function ze(){return`cli_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function E(e,t=ze()){return{ok:!0,code:"OK",requestId:t,data:e}}function l(e,t,n={}){var r;return{ok:!1,code:e,message:t,requestId:(r=n.requestId)!=null?r:ze(),...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 x(e,t={}){var i,s;let n=new URL(`${J}/v1/agent-cli${e}`);for(let[c,f]of Object.entries((i=t.query)!=null?i:{}))if(f!=null)for(let m of Array.isArray(f)?f:[f])n.searchParams.append(c,String(m));let r={"X-GEO-CLI-Version":k,"X-GEO-Protocol-Version":String(B),"X-GEO-CLI-Package":D};t.projectId!=null&&(r["X-Geo-Product-Id"]=String(t.projectId));let o=null;try{o=He()}catch{}o&&(r["X-Device-ID"]=o),t.apiKey&&(r.Authorization=`Bearer ${t.apiKey}`),t.body!=null&&(r["Content-Type"]="application/json");try{let c=await fetch(n,{method:(s=t.method)!=null?s:"GET",headers:r,body:t.body==null?void 0:JSON.stringify(t.body),signal:AbortSignal.timeout(t.isWrite?Me:Ue)}),f=await c.text();try{let m=JSON.parse(f);return Jt(m)?m:l("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${c.status}\uFF09`,{data:{transportFailure:!0}})}catch{return l("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${c.status}\uFF09`,{data:{transportFailure:!0}})}}catch(c){return c instanceof Error&&(c.name==="TimeoutError"||c.name==="AbortError")?l("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"}}):l("SERVER_ERROR",`\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF1A${c instanceof Error?c.message:String(c)}`,{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 Jt(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.ok=="boolean"&&typeof t.code=="string"}function Qt(e){var t;return!e.ok&&((t=e.data)==null?void 0:t.transportFailure)===!0}function ce(e){return e.ok||Qt(e)?!1:["AUTH_EXPIRED","DEVICE_MISMATCH","ACCESS_DENIED","AUTH_REQUIRED","VALIDATION_FAILED"].includes(e.code)}function U(){var e,t,n;return(n=(t=(e=C())==null?void 0:e.activeCredential)==null?void 0:t.apiKey)!=null?n:null}function Z(){var e,t;return(t=(e=C())==null?void 0:e.activeCredential)!=null?t:null}function Je(){var e,t;return(t=(e=C())==null?void 0:e.pendingCredential)!=null?t:null}function Qe(e){T(t=>({...t,pendingCredential:{apiKey:e,startedAt:new Date().toISOString()}}))}function pe(){T(e=>({...e,pendingCredential:null}))}function ue(e){return T(t=>{let n=t.pendingCredential;return n?{...t,activeCredential:{apiKey:n.apiKey,...e},pendingCredential:null}:t}).activeCredential}function We(){T(e=>({...e,activeCredential:null,pendingCredential:null}))}var R=require("node:crypto"),Ze=require("node:http");function Xe(e){let t=`
5
5
  (function () {
6
6
  var shell = document.getElementById('shell');
7
7
  var form = document.getElementById('f');
@@ -357,13 +357,13 @@ input::placeholder { color: color-mix(in srgb, var(--muted) 72%, transparent); }
357
357
  </main>
358
358
  <script>${t}</script>
359
359
  </body>
360
- </html>`,scriptHash:t}}var Xt=256,Yt=4*1024,ge=3e4;function Zt(){if(!1)return ge;let e=Number(process.env.BEST_GEO_TEST_CLAIM_WAIT_MS);return!Number.isFinite(e)||e<=0?ge:Math.min(e,ge)}var en=1500,fe=15e3;function tn(){if(!1)return fe;let e=Number(process.env.BEST_GEO_TEST_RESULT_TTL_MS);return!Number.isFinite(e)||e<=0?fe:Math.min(e,fe)}async function nt(){let e=(0,R.randomBytes)(16).toString("hex"),t=(0,R.randomBytes)(16).toString("hex"),n=(0,R.randomBytes)(16).toString("hex"),{html:r,scriptHash:o}=Ze(t),i=(0,R.createHash)("sha256").update(o).digest("base64"),s=null;function c(){let g=new Promise((u,P)=>{s={resolve:u,reject:P}});return g.catch(()=>{}),g}let f=c(),m=!1,y=!1,b=null,k=null,v=null,F=null;function Lt(){F==null&&(F=setTimeout(()=>H(),en),F.unref())}let A=(0,tt.createServer)((g,u)=>{Dt(g,u).catch(()=>{u.writeHead(500,{"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!1,message:"internal error"}))})});async function Dt(g,u){var Ae,Se,_e,Ce,Te,Re,Oe;let P=new URL((Ae=g.url)!=null?Ae:"/","http://127.0.0.1");if(g.method==="GET"&&P.pathname==="/"){if(P.searchParams.get("state")!==e){u.writeHead(404).end();return}u.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":["default-src 'none'",`script-src 'sha256-${i}'`,"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"}),u.end(r);return}if(g.method==="POST"&&P.pathname==="/submit"){let Mt=g.headers.origin,jt=`http://127.0.0.1:${A.address().port}`;if(Mt!==jt){h(u,403,{ok:!1,message:"origin rejected"});return}if(!et(String((Se=g.headers["x-csrf-token"])!=null?Se:""),t)){h(u,403,{ok:!1,message:"csrf rejected"});return}if(!String((_e=g.headers.cookie)!=null?_e:"").includes(`bg_session=${n}`)){h(u,403,{ok:!1,message:"session rejected"});return}if(!String((Ce=g.headers["content-type"])!=null?Ce:"").includes("application/json")){h(u,415,{ok:!1,message:"content-type rejected"});return}if(m){h(u,409,{ok:!1,message:"already submitted"});return}let $e=await nn(g);if($e==null){h(u,413,{ok:!1,message:"body too large"});return}let z="";try{z=String((Te=JSON.parse($e).key)!=null?Te:"").trim()}catch{h(u,400,{ok:!1,message:"invalid json"});return}if(!z||z.length>Xt){h(u,400,{ok:!1,message:"invalid key"});return}m=!0,y=!0,b=null,h(u,200,{ok:!0}),s==null||s.resolve(z),clearTimeout(se),k=setTimeout(()=>{ve({ok:!1,message:"\u6821\u9A8C\u8D85\u65F6\u3002\u8BF7\u56DE\u5230 AI \u52A9\u624B\u67E5\u770B\u8FD9\u6B21\u767B\u5F55\u7684\u7ED3\u679C\u3002"})},Zt()),k.unref();return}if(g.method==="GET"&&P.pathname==="/result"){if(!et(String((Re=g.headers["x-csrf-token"])!=null?Re:""),t)){h(u,403,{ok:!1,message:"csrf rejected"});return}if(!String((Oe=g.headers.cookie)!=null?Oe:"").includes(`bg_session=${n}`)){h(u,403,{ok:!1,message:"session rejected"});return}if(!y){h(u,409,{ok:!1,message:"not submitted"});return}if(b==null){h(u,200,{state:"pending"});return}h(u,200,{state:"done",...b}),b.retryable||Lt();return}u.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"});A.on("error",g=>{s==null||s.reject(g)}),await new Promise((g,u)=>{A.once("error",u),A.listen(0,"127.0.0.1",()=>{A.removeListener("error",u),g()})});let Ut=A.address().port,se=Ie();function Ie(){let g=setTimeout(()=>{s==null||s.reject(new Error("LOCAL_INTAKE_TIMEOUT")),H()},Me);return g.unref(),g}function ve(g){if(b==null){if(b=g,k&&(clearTimeout(k),k=null),g.retryable){m=!1,f=c(),se=Ie();return}v=setTimeout(()=>H(),tn()),v.unref()}}let we=!1;function H(){var g;if(!we){we=!0,clearTimeout(se);for(let u of[k,v,F])u&&clearTimeout(u);k=null,v=null,F=null,(g=A.closeAllConnections)==null||g.call(A),A.close()}}return{url:`http://127.0.0.1:${Ut}/?state=${e}`,nextKey:()=>f,publishResult:ve,close:H}}function h(e,t,n){e.writeHead(t,{"Content-Type":"application/json","Cache-Control":"no-store"}),e.end(JSON.stringify(n))}async function nn(e){let t=[],n=0;for await(let r of e){if(n+=r.length,n>Yt)return null;t.push(r)}return Buffer.concat(t).toString("utf8")}function et(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&(0,R.timingSafeEqual)(n,r)}async function q(){let e=We();if(!e)return null;let t=await lt(e.apiKey);return t.ok?(me({userId:t.data.user.id,agentId:t.data.agentId,companyIds:t.data.companyIds}),null):pe(t)?(ue(),null):l("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 ot(){let e=Y(),t=await q();if(t){a(t);return}let n=U(),r;try{r=await nt()}catch(s){a(l("HOST_PERMISSION_REQUIRED",`\u65E0\u6CD5\u5728\u672C\u673A\u542F\u52A8\u5F55\u5165\u670D\u52A1\uFF1A${sn(s)}`,{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:`${p} auth login`}}));return}on(r.url);let o=`[${p}]`;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
360
+ </html>`,scriptHash:t}}var Wt=256,Xt=4*1024,me=3e4;function Yt(){if(!1)return me;let e=Number(process.env.BEST_GEO_TEST_CLAIM_WAIT_MS);return!Number.isFinite(e)||e<=0?me:Math.min(e,me)}var Zt=1500,ge=15e3;function en(){if(!1)return ge;let e=Number(process.env.BEST_GEO_TEST_RESULT_TTL_MS);return!Number.isFinite(e)||e<=0?ge:Math.min(e,ge)}async function et(){let e=(0,R.randomBytes)(16).toString("hex"),t=(0,R.randomBytes)(16).toString("hex"),n=(0,R.randomBytes)(16).toString("hex"),{html:r,scriptHash:o}=Xe(t),i=(0,R.createHash)("sha256").update(o).digest("base64"),s=null;function c(){let g=new Promise((u,P)=>{s={resolve:u,reject:P}});return g.catch(()=>{}),g}let f=c(),m=!1,y=!1,b=null,v=null,S=null,F=null;function Pt(){F==null&&(F=setTimeout(()=>H(),Zt),F.unref())}let w=(0,Ze.createServer)((g,u)=>{Lt(g,u).catch(()=>{u.writeHead(500,{"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!1,message:"internal error"}))})});async function Lt(g,u){var ve,we,Ae,Se,_e,Ce,Te;let P=new URL((ve=g.url)!=null?ve:"/","http://127.0.0.1");if(g.method==="GET"&&P.pathname==="/"){if(P.searchParams.get("state")!==e){u.writeHead(404).end();return}u.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":["default-src 'none'",`script-src 'sha256-${i}'`,"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"}),u.end(r);return}if(g.method==="POST"&&P.pathname==="/submit"){let Ut=g.headers.origin,Mt=`http://127.0.0.1:${w.address().port}`;if(Ut!==Mt){h(u,403,{ok:!1,message:"origin rejected"});return}if(!Ye(String((we=g.headers["x-csrf-token"])!=null?we:""),t)){h(u,403,{ok:!1,message:"csrf rejected"});return}if(!String((Ae=g.headers.cookie)!=null?Ae:"").includes(`bg_session=${n}`)){h(u,403,{ok:!1,message:"session rejected"});return}if(!String((Se=g.headers["content-type"])!=null?Se:"").includes("application/json")){h(u,415,{ok:!1,message:"content-type rejected"});return}if(m){h(u,409,{ok:!1,message:"already submitted"});return}let Re=await tn(g);if(Re==null){h(u,413,{ok:!1,message:"body too large"});return}let z="";try{z=String((_e=JSON.parse(Re).key)!=null?_e:"").trim()}catch{h(u,400,{ok:!1,message:"invalid json"});return}if(!z||z.length>Wt){h(u,400,{ok:!1,message:"invalid key"});return}m=!0,y=!0,b=null,h(u,200,{ok:!0}),s==null||s.resolve(z),clearTimeout(ie),v=setTimeout(()=>{Ee({ok:!1,message:"\u6821\u9A8C\u8D85\u65F6\u3002\u8BF7\u56DE\u5230 AI \u52A9\u624B\u67E5\u770B\u8FD9\u6B21\u767B\u5F55\u7684\u7ED3\u679C\u3002"})},Yt()),v.unref();return}if(g.method==="GET"&&P.pathname==="/result"){if(!Ye(String((Ce=g.headers["x-csrf-token"])!=null?Ce:""),t)){h(u,403,{ok:!1,message:"csrf rejected"});return}if(!String((Te=g.headers.cookie)!=null?Te:"").includes(`bg_session=${n}`)){h(u,403,{ok:!1,message:"session rejected"});return}if(!y){h(u,409,{ok:!1,message:"not submitted"});return}if(b==null){h(u,200,{state:"pending"});return}h(u,200,{state:"done",...b}),b.retryable||Pt();return}u.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"});w.on("error",g=>{s==null||s.reject(g)}),await new Promise((g,u)=>{w.once("error",u),w.listen(0,"127.0.0.1",()=>{w.removeListener("error",u),g()})});let Dt=w.address().port,ie=ke();function ke(){let g=setTimeout(()=>{s==null||s.reject(new Error("LOCAL_INTAKE_TIMEOUT")),H()},De);return g.unref(),g}function Ee(g){if(b==null){if(b=g,v&&(clearTimeout(v),v=null),g.retryable){m=!1,f=c(),ie=ke();return}S=setTimeout(()=>H(),en()),S.unref()}}let Ie=!1;function H(){var g;if(!Ie){Ie=!0,clearTimeout(ie);for(let u of[v,S,F])u&&clearTimeout(u);v=null,S=null,F=null,(g=w.closeAllConnections)==null||g.call(w),w.close()}}return{url:`http://127.0.0.1:${Dt}/?state=${e}`,nextKey:()=>f,publishResult:Ee,close:H}}function h(e,t,n){e.writeHead(t,{"Content-Type":"application/json","Cache-Control":"no-store"}),e.end(JSON.stringify(n))}async function tn(e){let t=[],n=0;for await(let r of e){if(n+=r.length,n>Xt)return null;t.push(r)}return Buffer.concat(t).toString("utf8")}function Ye(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&(0,R.timingSafeEqual)(n,r)}async function K(){let e=Je();if(!e)return null;let t=await st(e.apiKey);return t.ok?(ue({userId:t.data.user.id,agentId:t.data.agentId,companyIds:t.data.companyIds}),null):ce(t)?(pe(),null):l("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 nt(){let e=Y(),t=await K();if(t){a(t);return}let n=U(),r;try{r=await et()}catch(s){a(l("HOST_PERMISSION_REQUIRED",`\u65E0\u6CD5\u5728\u672C\u673A\u542F\u52A8\u5F55\u5165\u670D\u52A1\uFF1A${on(s)}`,{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:`${p} auth login`}}));return}rn(r.url);let o=`[${p}]`;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
361
361
  ${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
362
362
  ${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
363
363
  ${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
364
364
  `),process.stderr.write(`${o} \u672C\u5730\u9875\u9762\uFF1A${r.url}
365
365
  `),n&&process.stderr.write(`${o} \u672C\u673A\u5DF2\u6709\u4E00\u4EFD\u6388\u6743\uFF0C\u5F55\u5165\u65B0\u5BC6\u94A5\u4F1A\u66FF\u6362\u5B83\u3002
366
366
  `);let i;for(;;){let s;try{s=await r.nextKey()}catch{r.close(),a(l("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:`${p} auth login`}}));return}process.stderr.write(`${o} \u5DF2\u6536\u5230\u5BC6\u94A5\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
367
- `),Xe(s),i=await lt(s);let c=!i.ok&&pe(i);if(c&&ue(),r.publishResult({ok:i.ok,message:i.ok?"\u5DF2\u5B8C\u6210\u7ED1\u5B9A\uFF0C\u53EF\u4EE5\u56DE\u5230 AI \u52A9\u624B\u7EE7\u7EED\u64CD\u4F5C\u4E86\u3002":rn(i),retryable:c}),i.ok)break;if(c){process.stderr.write(`${o} \u8FD9\u628A\u5BC6\u94A5\u88AB\u670D\u52A1\u7AEF\u62D2\u7EDD\uFF0C\u9875\u9762\u4E0A\u5DF2\u63D0\u793A\u7528\u6237\u6362\u4E00\u628A\u91CD\u8BD5\u3002
367
+ `),Qe(s),i=await st(s);let c=!i.ok&&ce(i);if(c&&pe(),r.publishResult({ok:i.ok,message:i.ok?"\u5DF2\u5B8C\u6210\u7ED1\u5B9A\uFF0C\u53EF\u4EE5\u56DE\u5230 AI \u52A9\u624B\u7EE7\u7EED\u64CD\u4F5C\u4E86\u3002":nn(i),retryable:c}),i.ok)break;if(c){process.stderr.write(`${o} \u8FD9\u628A\u5BC6\u94A5\u88AB\u670D\u52A1\u7AEF\u62D2\u7EDD\uFF0C\u9875\u9762\u4E0A\u5DF2\u63D0\u793A\u7528\u6237\u6362\u4E00\u628A\u91CD\u8BD5\u3002
368
368
  `);continue}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 ${p} \u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\u3002
369
- `),a(i);return}me({userId:i.data.user.id,agentId:i.data.agentId,companyIds:i.data.companyIds}),a(I({user:i.data.user,device:i.data.device,replacedPreviousAuthorization:i.data.replacedPreviousAuthorization,configPath:O()},i.requestId))}async function it(){let e=await q();if(e){a(e);return}let t=U();if(!t){a(at());return}let n=await x("/projects",{apiKey:t,query:{page:1,limit:100}});if(!n.ok){a(n);return}let r=Y();a(I({loggedIn:!0,device:{deviceId:r.deviceId,deviceName:r.deviceName,platform:r.platform},user:Z()?{id:Z().userId,agentId:Z().agentId}:null,projects:n.data.data.map(o=>({id:o.id,name:o.name})),total:n.data.total,configPath:O()},n.requestId))}async function st(){let e=await q();if(e){a(e);return}let t=U();if(!t){a(at());return}let n=await x("/auth/logout",{method:"POST",apiKey:t});if(!n.ok){a(n);return}Ye(),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 at(){return l("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\u52FE\u9009\u8981\u6388\u6743\u7684 GEO \u9879\u76EE\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:`${p} auth login`}})}function rn(e){var t;return e.code==="AUTH_REQUIRED"?"\u8FD9\u628A\u5BC6\u94A5\u7528\u4E0D\u4E86\uFF08\u65E0\u6548\u6216\u5DF2\u5931\u6548\uFF09\u3002\u8BF7\u786E\u8BA4\u6574\u4E32\u90FD\u590D\u5236\u5B8C\u6574\u4E86\uFF0C\u6216\u5230\u7F51\u9875\u91CD\u65B0\u521B\u5EFA\u4E00\u628A\u518D\u7C98\u8D34\u3002":e.code==="DEVICE_MISMATCH"?"\u8FD9\u628A\u5BC6\u94A5\u5DF2\u7ECF\u7ED1\u5B9A\u5230\u53E6\u4E00\u53F0\u8BBE\u5907\u3002\u8BF7\u5230\u7F51\u9875\u65B0\u5EFA\u4E00\u628A\u5BC6\u94A5\uFF0C\u518D\u7C98\u8D34\u5230\u8FD9\u91CC\u3002":(t=e.message)!=null?t:"\u767B\u5F55\u5931\u8D25\u3002\u8BF7\u56DE\u5230 AI \u52A9\u624B\u67E5\u770B\u8BE6\u60C5\u3002"}function lt(e){let t=Y();return x("/auth/claim",{method:"POST",apiKey:e,body:{...t,cliVersion:E}})}function on(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,rt.execFile)(t,n,()=>{})}function sn(e){return e instanceof Error?e.message:String(e)}async function G(){let e=await q();if(e)return{ok:!1,envelope:e};let t=U();return t?{ok:!0,apiKey:t}:{ok:!1,envelope:l("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\u52FE\u9009\u8981\u6388\u6743\u7684 GEO \u9879\u76EE\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:`${p} auth login`}})}}var ct=require("node:fs"),M=require("node:path"),pt=require("node:url");function an(e){if(e.cjsDir)return(0,M.join)(e.cjsDir,"..");if(!e.moduleUrl)throw new Error("\u7F3A\u5C11 CLI \u8FD0\u884C\u4F4D\u7F6E");return(0,M.join)((0,M.dirname)((0,pt.fileURLToPath)(e.moduleUrl)),"..","..","..")}function ln(){return an({cjsDir:typeof __dirname=="string"?__dirname:void 0,moduleUrl:void 0})}function j(...e){return(0,ct.readFileSync)((0,M.join)(ln(),...e),"utf8")}function ut(){a(I({package:D,version:E,protocolVersion:B,commands:[{command:`${p} version --check`,description:"\u68C0\u67E5\u7248\u672C\u662F\u5426\u9700\u8981\u5347\u7EA7"},{command:`${p} capabilities`,description:"\u5217\u51FA\u53EF\u7528\u80FD\u529B\u53CA\u5176\u8F93\u5165 schema"},{command:`${p} 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:`${p} skill get`,description:"\u4EE5 JSON \u4FE1\u5C01\u8FD4\u56DE Skill \u5185\u5BB9\u548C revision"},{command:`${p} guide list`,description:"\u5217\u51FA\u4E1A\u52A1\u6307\u5357"},{command:`${p} guide get <name>`,description:"\u8BFB\u53D6\u4E00\u4EFD\u4E1A\u52A1\u6307\u5357"},{command:`${p} auth login`,description:"\u6253\u5F00\u672C\u5730\u9875\u9762\u5F55\u5165\u5BC6\u94A5\u5E76\u7ED1\u5B9A\u672C\u673A"},{command:`${p} auth status`,description:"\u67E5\u770B\u5F53\u524D\u6388\u6743\u72B6\u6001"},{command:`${p} auth logout`,description:"\u64A4\u9500\u670D\u52A1\u7AEF\u5BC6\u94A5\u5E76\u6E05\u9664\u672C\u673A\u51ED\u636E"},{command:`${p} call <capability> --input '<JSON>'`,description:"\u8C03\u7528\u4E00\u4E2A\u67E5\u8BE2\u80FD\u529B"},{command:`${p} 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:`${p} 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:`${p} 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 mt(e){if(!e){a(I({package:D,version:E,protocolVersion:B,env:Ue,apiBase:J}));return}let t=await x("/meta");if(!t.ok){a(t);return}if(dt(E,t.data.minimumCliVersion)<0){a(l("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 ${D}@latest`}}));return}a(I({current:E,...t.data,updateAvailable:dt(E,t.data.latestCliVersion)<0},t.requestId))}function dn(){let e=JSON.parse(j("capabilities","capabilities.json"));return{...e,capabilities:e.capabilities.filter(t=>t.hidden!==!0)}}function gt(){a(I(dn()))}function ft(e){let t=yt(j("skills","best-geo","SKILL.md"));if(e){process.stdout.write(t);return}a(I({name:p,revision:1,content:t}))}var be=["project","question","article","knowledge","material","question-task","article-task","scheduled-monitor","publication","video","answer-card"];function bt(){a(I({guides:be.map(e=>{let t=JSON.parse(j("guides",`${e}.json`));return{name:t.name,title:t.title,whenToUse:t.whenToUse}})}))}function ht(e){if(!be.includes(e)){a(l("GUIDE_NOT_FOUND",`\u6CA1\u6709\u540D\u4E3A ${e} \u7684\u6307\u5357`,{data:{available:be}}));return}a(I(JSON.parse(yt(j("guides",`${e}.json`)))))}function dt(e,t){var o,i;let n=e.split(".").map(s=>Number.parseInt(s,10)||0),r=t.split(".").map(s=>Number.parseInt(s,10)||0);for(let s=0;s<Math.max(n.length,r.length);s+=1){let c=((o=n[s])!=null?o:0)-((i=r[s])!=null?i:0);if(c!==0)return c<0?-1:1}return 0}function yt(e){return p==="best-geo"?e:e.replace(/\bbest-geo\b(?!-)/g,p)}var he=null,ye=null;function ke(){return he===null&&(he=JSON.parse(j("capabilities","capabilities.json")).capabilities),he}function cn(){return ye===null&&(ye=new Map(ke().filter(e=>e.inputSchema!==void 0).map(e=>[e.name,e.inputSchema]))),ye}function ee(){return ke().filter(e=>e.mode==="write").map(e=>e.name)}function te(){return new Set(ke().filter(e=>e.hidden===!0).map(e=>e.name))}function ne(e,t){let n=cn().get(e);return n===void 0?[]:Ee(t,n,"")}function Ee(e,t,n){if(t.type==="object"||t.properties!==void 0)return pn(e,t,n);let r=xt(e,t,n);if(r!==null)return[r];let o=[];return typeof e=="string"&&t.minLength!==void 0&&e.length<t.minLength&&o.push(t.minLength===1?`${n} \u4E0D\u80FD\u662F\u7A7A\u5B57\u7B26\u4E32`:`${n} \u81F3\u5C11 ${t.minLength} \u4E2A\u5B57\u7B26\uFF0C\u5F53\u524D ${e.length} \u4E2A`),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 ${$(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((i,s)=>{o.push(...Ee(i,t.items,`${n}[${s}]`))})),o}function pn(e,t,n){var c,f;if(typeof e!="object"||e===null||Array.isArray(e))return[`${n||"\u5165\u53C2"} \u5FC5\u987B\u662F\u5BF9\u8C61`];let r=e,o=(c=t.properties)!=null?c:{},i=(f=t.required)!=null?f:[],s=[];for(let m of i)(r[m]===void 0||r[m]===null)&&s.push(`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 ${xe(n,m)}`);if(t.additionalProperties===!1){let m=Object.keys(o);for(let y of Object.keys(r))m.includes(y)||s.push(`\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5 ${xe(n,y)}\uFF0C\u53EF\u7528\u5B57\u6BB5\uFF1A${m.join("\u3001")}`)}for(let[m,y]of Object.entries(o)){let b=r[m];b===void 0||b===null&&i.includes(m)||s.push(...Ee(b,y,xe(n,m)))}return s}function xt(e,t,n){if(Array.isArray(t.type)){let r=t.type.map(o=>xt(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 ${$(e)}`;case"string":return typeof e=="string"?null:`${n} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF0C\u6536\u5230 ${$(e)}`;case"number":return typeof e=="number"&&Number.isFinite(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u5B57\uFF0C\u6536\u5230 ${$(e)}`;case"integer":return typeof e=="number"&&Number.isInteger(e)?null:`${n} \u5FC5\u987B\u662F\u6574\u6570\uFF0C\u6536\u5230 ${$(e)}`;case"boolean":return typeof e=="boolean"?null:`${n} \u5FC5\u987B\u662F true \u6216 false\uFF0C\u6536\u5230 ${$(e)}`;case"array":return Array.isArray(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u7EC4\uFF0C\u6536\u5230 ${$(e)}`;default:return null}}function xe(e,t){return e===""?t:`${e}.${t}`}function $(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 "${un(t)}"`:t}function un(e){return e.length>20?`${e.slice(0,20)}\u2026`:e}function re(e,t){let n=t.includes("\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 projectId");return l("VALIDATION_FAILED",`\u5165\u53C2\u4E0D\u5408\u6CD5\uFF1A${t.join("\uFF1B")}`,{data:{name:e,errors:t},nextAction:{type:"ask_user",message:n?"\u5148\u7528 projects.list \u67E5\u4E00\u4E0B\u5F53\u524D\u80FD\u64CD\u4F5C\u54EA\u4E9B GEO \u9879\u76EE\uFF0C\u518D\u628A projectId \u8865\u4E0A\u91CD\u8BD5":"\u6309 capabilities \u91CC\u7684 inputSchema \u4FEE\u6B63\u53C2\u6570\u540E\u91CD\u8BD5\uFF1B\u7F3A\u7684\u4FE1\u606F\u95EE\u7528\u6237"}})}function oe(e){let{projectId:t,...n}=e;return{projectId:typeof t=="number"?t:null,rest:n}}var kt={"projects.list":e=>({path:"/projects",query:e}),"projects.get":()=>({path:"/projects/current"}),"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"}),"indexingQueries.get":e=>({path:`/indexing-queries/${Number(e.taskId)}`}),"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:w(e)}),"scheduledIndexing.metrics":e=>({path:`/scheduled-indexing/${Number(e.planId)}/metrics`,query:w(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:w(e)}),"scheduledSentiment.metrics":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/metrics`,query:w(e)}),"scheduledIndexing.answers":e=>({path:`/scheduled-indexing/${Number(e.planId)}/answers`,query:w(e)}),"scheduledIndexing.citations":e=>({path:`/scheduled-indexing/${Number(e.planId)}/citations`,query:w(e)}),"scheduledIndexing.topicStats":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-stats`,query:w(e)}),"scheduledIndexing.topicPlatformMatrix":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-platform-matrix`,query:w(e)}),"scheduledSentiment.answers":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/answers`,query:w(e)}),"scheduledSentiment.citations":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/citations`,query:w(e)}),"scheduledSentiment.topicStats":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/topic-stats`,query:w(e)}),"textToImages.models":()=>({path:"/text-to-image-models"}),"textToImages.list":e=>({path:"/text-to-images",query:e}),"textToImages.get":e=>({path:`/text-to-images/${Number(e.id)}`}),"textToImages.countUncompleted":()=>({path:"/text-to-images/count-uncompleted"}),"dhVideos.avatars":e=>({path:"/dh-videos/avatars",method:"POST",body:e}),"dhVideos.voices":e=>({path:"/dh-videos/voices",method:"POST",body:e}),"dhVideos.list":e=>({path:"/dh-videos",query:e}),"dhVideos.get":e=>({path:`/dh-videos/${Number(e.id)}`}),"clipTasks.templates":e=>({path:"/clip-tasks/templates",method:"POST",body:e}),"clipTasks.bgm":e=>({path:"/clip-tasks/bgm",method:"POST",body:e}),"clipTasks.list":e=>({path:"/clip-tasks",query:e}),"clipTasks.get":e=>({path:`/clip-tasks/${Number(e.id)}`}),"answerCards.list":e=>({path:"/answer-cards",query:e}),"answerCards.templates":()=>({path:"/answer-cards/templates"}),"answerCards.get":e=>({path:`/answer-cards/${Number(e.id)}`}),"answerCards.batch":e=>({path:`/answer-cards/${Number(e.taskId)}/batches/${Number(e.batchId)}`})};function w(e){let{planId:t,...n}=e;return n}function mn(){return Object.keys(kt)}async function Et(e,t){let n=kt[e];if(!n&&ee().includes(e)){a(l("VALIDATION_FAILED",`${e} \u662F\u5199\u80FD\u529B\uFF0C\u4E0D\u80FD\u7528 call \u8C03\uFF0C\u8981\u8D70 plan \u2192 \u7528\u6237\u786E\u8BA4 \u2192 apply`,{nextAction:{type:"ask_user",message:`\u6539\u7528 best-geo plan ${e} --input '<\u540C\u6837\u7684\u5165\u53C2>'\uFF0C\u628A\u8FD4\u56DE\u7684\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D best-geo apply <planId>`}}));return}if(!n){a(l("VALIDATION_FAILED",`\u672A\u77E5\u80FD\u529B\uFF1A${e}`,{data:{available:mn().filter(k=>!te().has(k))},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(l("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let o=ne(e,r);if(o.length>0){a(re(e,o));return}let i=await G();if(!i.ok){a(i.envelope);return}let{projectId:s,rest:c}=oe(r),{path:f,query:m,method:y,body:b}=n(c);a(await x(f,{apiKey:i.apiKey,query:m,method:y,body:b,projectId:s}))}var N=require("node:fs"),V=require("node:path");var gn={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"}},fn={".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"}]},bn=900*1e3;function vt(e){return It[e]!==void 0}function wt(e){return W(e)!==null}function At(e,t){var i;let n=(i=It[e])!=null?i:[],r={...t},o={};for(let s of n){let c=t[s.pathKey];if(typeof c!="string"||!c.trim())return{ok:!1,envelope:xn(s)};let f=(0,V.resolve)(c.trim()),m=yn(f,s);if(!m.ok)return{ok:!1,envelope:m.envelope};delete r[s.pathKey],r[s.metaKey]={name:(0,V.basename)(f),size:m.size},o[s.uploadField]=f}return{ok:!0,input:r,paths:o}}function St(e,t){Ge(e,{paths:t,createdAt:Date.now()})}async function _t(e,t){let n=W(e);if(!n)return{ok:!1,envelope:l("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,i]of Object.entries(n.paths)){if(!(0,N.existsSync)(i))return{ok:!1,envelope:l("VALIDATION_FAILED",`\u6587\u4EF6\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF1A${i}`)};let s=await x(`/plans/${encodeURIComponent(e)}/uploads/presign`,{method:"POST",apiKey:t,body:{field:o,fileName:(0,V.basename)(i)}});if(!s.ok)return{ok:!1,envelope:s};let c=await hn(s.data,i);if(!c.ok)return{ok:!1,envelope:c.envelope};r[o]=s.data.uploadUrl}return{ok:!0,uploads:r}}function Ct(e){He(e)}async function hn(e,t){let n=fn[Tt(t)];if(!n)return{ok:!1,envelope:l("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,N.openAsBlob)(t,{type:n}),(0,V.basename)(t));try{let o=await fetch(e.host,{method:"POST",body:r,signal:AbortSignal.timeout(bn)}),i=(await o.text().catch(()=>"")).slice(0,300);if(!o.ok)return{ok:!1,envelope:l("UPLOAD_FAILED",`\u4E0A\u4F20\u5931\u8D25\uFF08HTTP ${o.status}\uFF09\uFF1A${i}`,{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 s=kn(i);return s?{ok:!1,envelope:l("UPLOAD_FAILED",`\u6587\u4EF6\u5DF2\u4E0A\u4F20\uFF0C\u4F46\u767B\u8BB0\u5931\u8D25\uFF1A${s}`,{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:l("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 yn(e,t){let n=gn[t.kind];if(!(0,N.existsSync)(e))return{ok:!1,envelope:l("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,N.statSync)(e);if(!r.isFile())return{ok:!1,envelope:l("VALIDATION_FAILED",`${e} \u4E0D\u662F\u4E00\u4E2A\u6587\u4EF6`)};let o=Tt(e);return n.extensions.includes(o)?r.size>n.maxBytes?{ok:!1,envelope:l("VALIDATION_FAILED",`${n.label}\u6700\u5927 ${ie(n.maxBytes)}\uFF0C\u5F53\u524D ${ie(r.size)}\uFF0C\u8D85\u51FA ${ie(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 ${ie(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:l("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 xn(e){return l("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 ie(e){return e>=1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${Math.max(1,Math.round(e/1024))}KB`}function kn(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 Tt(e){let t=e.lastIndexOf(".");return t===-1?"":e.toLowerCase().slice(t)}async function Rt(e,t,n){var k;let r=ee();if(!e||!r.includes(e)){a(l("VALIDATION_FAILED",`\u672A\u77E5\u7684\u5199\u64CD\u4F5C\uFF1A${e!=null?e:"(\u7A7A)"}`,{data:{available:r.filter(v=>!te().has(v))},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(l("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(l("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let i=ne(e,o);if(i.length>0){a(re(e,i));return}let{projectId:s,rest:c}=oe(o),f=c,m=null;if(vt(e)){let v=At(e,c);if(!v.ok){a(v.envelope);return}f=v.input,m=v.paths}let y=await G();if(!y.ok){a(y.envelope);return}let b=await x("/plans",{method:"POST",apiKey:y.apiKey,body:{operation:e,input:f},projectId:s});b.ok&&m&&((k=b.data)!=null&&k.planId)&&St(b.data.planId,m),a(b)}async function Ot(e){if(!e){a(l("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 G();if(!t.ok){a(t.envelope);return}let n;if(wt(e)){let o=await _t(e,t.apiKey);if(!o.ok){a(o.envelope);return}n=o.uploads}let r=await x(`/plans/${encodeURIComponent(e)}/apply`,{method:"POST",apiKey:t.apiKey,body:n?{uploads:n}:{},isWrite:!0});r.ok&&Ct(e),a(r)}function $t(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),i=e[n+1];i&&!i.startsWith("--")?(t[o]=i,n+=1):t[o]=!0}return t}function Nt(e,t){let n=O();if(e.reason==="denied")return l("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 l("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 l("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:`${p} auth login`}})}function Pt(e){return e instanceof _}async function En(){process.stdout.on("error",r=>process.exit(r.code==="EPIPE"?0:1));let[e,...t]=process.argv.slice(2),n=$t(t);switch(e){case void 0:case"help":ut();return;case"version":await mt(n.check===!0);return;case"capabilities":gt();return;case"skill":if(t[0]==="get"){ft(n.raw===!0);return}break;case"guide":if(t[0]==="list"){bt();return}if(t[0]==="get"&&t[1]){ht(t[1]);return}break;case"auth":if(t[0]==="login")return ot();if(t[0]==="status")return it();if(t[0]==="logout")return st();break;case"plan":await Rt(t[0],typeof n.input=="string"?n.input:void 0,t[1]);return;case"apply":await Ot(t[0]);return;case"call":if(t[0]){await Et(t[0],typeof n.input=="string"?n.input:void 0);return}break;default:break}a(l("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}En().catch(e=>{if(Pt(e)){a(Nt(e,{capability:e.reason==="denied"?"config_write":"config_read",retryCommand:In()})),process.exitCode=1;return}a(l("SERVER_ERROR",e instanceof Error?e.message:String(e))),process.exitCode=1});function In(){let[e,t]=process.argv.slice(2);if(e==="auth"&&(t==="login"||t==="status"||t==="logout"))return`${p} auth ${t}`}
369
+ `),a(i);return}ue({userId:i.data.user.id,agentId:i.data.agentId,companyIds:i.data.companyIds}),a(E({user:i.data.user,device:i.data.device,replacedPreviousAuthorization:i.data.replacedPreviousAuthorization,configPath:O()},i.requestId))}async function rt(){let e=await K();if(e){a(e);return}let t=U();if(!t){a(it());return}let n=await x("/projects",{apiKey:t,query:{page:1,limit:100}});if(!n.ok){a(n);return}let r=Y();a(E({loggedIn:!0,device:{deviceId:r.deviceId,deviceName:r.deviceName,platform:r.platform},user:Z()?{id:Z().userId,agentId:Z().agentId}:null,projects:n.data.data.map(o=>({id:o.id,name:o.name})),total:n.data.total,configPath:O()},n.requestId))}async function ot(){let e=await K();if(e){a(e);return}let t=U();if(!t){a(it());return}let n=await x("/auth/logout",{method:"POST",apiKey:t});if(!n.ok){a(n);return}We(),a(E({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 it(){return l("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\u52FE\u9009\u8981\u6388\u6743\u7684 GEO \u9879\u76EE\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:`${p} auth login`}})}function nn(e){var t;return e.code==="AUTH_REQUIRED"?"\u8FD9\u628A\u5BC6\u94A5\u7528\u4E0D\u4E86\uFF08\u65E0\u6548\u6216\u5DF2\u5931\u6548\uFF09\u3002\u8BF7\u786E\u8BA4\u6574\u4E32\u90FD\u590D\u5236\u5B8C\u6574\u4E86\uFF0C\u6216\u5230\u7F51\u9875\u91CD\u65B0\u521B\u5EFA\u4E00\u628A\u518D\u7C98\u8D34\u3002":e.code==="DEVICE_MISMATCH"?"\u8FD9\u628A\u5BC6\u94A5\u5DF2\u7ECF\u7ED1\u5B9A\u5230\u53E6\u4E00\u53F0\u8BBE\u5907\u3002\u8BF7\u5230\u7F51\u9875\u65B0\u5EFA\u4E00\u628A\u5BC6\u94A5\uFF0C\u518D\u7C98\u8D34\u5230\u8FD9\u91CC\u3002":(t=e.message)!=null?t:"\u767B\u5F55\u5931\u8D25\u3002\u8BF7\u56DE\u5230 AI \u52A9\u624B\u67E5\u770B\u8BE6\u60C5\u3002"}function st(e){let t=Y();return x("/auth/claim",{method:"POST",apiKey:e,body:{...t,cliVersion:k}})}function rn(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,tt.execFile)(t,n,()=>{})}function on(e){return e instanceof Error?e.message:String(e)}async function G(){let e=await K();if(e)return{ok:!1,envelope:e};let t=U();return t?{ok:!0,apiKey:t}:{ok:!1,envelope:l("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\u52FE\u9009\u8981\u6388\u6743\u7684 GEO \u9879\u76EE\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:`${p} auth login`}})}}var lt=require("node:fs"),M=require("node:path"),dt=require("node:url");function sn(e){if(e.cjsDir)return(0,M.join)(e.cjsDir,"..");if(!e.moduleUrl)throw new Error("\u7F3A\u5C11 CLI \u8FD0\u884C\u4F4D\u7F6E");return(0,M.join)((0,M.dirname)((0,dt.fileURLToPath)(e.moduleUrl)),"..","..","..")}function an(){return sn({cjsDir:typeof __dirname=="string"?__dirname:void 0,moduleUrl:void 0})}function j(...e){return(0,lt.readFileSync)((0,M.join)(an(),...e),"utf8")}function ct(){a(E({package:D,version:k,protocolVersion:B,commands:[{command:`${p} version --check`,description:"\u68C0\u67E5\u7248\u672C\u662F\u5426\u9700\u8981\u5347\u7EA7"},{command:`${p} capabilities`,description:"\u5217\u51FA\u53EF\u7528\u80FD\u529B\u53CA\u5176\u8F93\u5165 schema"},{command:`${p} 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:`${p} skill get`,description:"\u4EE5 JSON \u4FE1\u5C01\u8FD4\u56DE Skill \u5185\u5BB9\u548C revision"},{command:`${p} guide list`,description:"\u5217\u51FA\u4E1A\u52A1\u6307\u5357"},{command:`${p} guide get <name>`,description:"\u8BFB\u53D6\u4E00\u4EFD\u4E1A\u52A1\u6307\u5357"},{command:`${p} auth login`,description:"\u6253\u5F00\u672C\u5730\u9875\u9762\u5F55\u5165\u5BC6\u94A5\u5E76\u7ED1\u5B9A\u672C\u673A"},{command:`${p} auth status`,description:"\u67E5\u770B\u5F53\u524D\u6388\u6743\u72B6\u6001"},{command:`${p} auth logout`,description:"\u64A4\u9500\u670D\u52A1\u7AEF\u5BC6\u94A5\u5E76\u6E05\u9664\u672C\u673A\u51ED\u636E"},{command:`${p} call <capability> --input '<JSON>'`,description:"\u8C03\u7528\u4E00\u4E2A\u67E5\u8BE2\u80FD\u529B"},{command:`${p} 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:`${p} 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:`${p} 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 pt(e){if(!e){a(E({package:D,version:k,protocolVersion:B,env:Le,apiBase:J}));return}let t=await x("/meta");if(!t.ok){a(t);return}if(at(k,t.data.minimumCliVersion)<0){a(l("CLI_UPDATE_REQUIRED",`\u5F53\u524D\u7248\u672C ${k} \u4F4E\u4E8E\u6700\u4F4E\u8981\u6C42 ${t.data.minimumCliVersion}`,{requestId:t.requestId,data:{current:k,...t.data},nextAction:{type:"upgrade",message:"\u5347\u7EA7\u540E\u91CD\u8BD5",command:`npm install -g ${D}@latest`}}));return}a(E({current:k,...t.data,updateAvailable:at(k,t.data.latestCliVersion)<0},t.requestId))}function ut(){a(E(JSON.parse(j("capabilities","capabilities.json"))))}function mt(e){let t=bt(j("skills","best-geo","SKILL.md"));if(e){process.stdout.write(t);return}a(E({name:p,revision:1,content:t}))}var fe=["project","question","article","knowledge","material","question-task","article-task","scheduled-monitor","indexing-query","publication","video","answer-card"];function gt(){a(E({guides:fe.map(e=>{let t=JSON.parse(j("guides",`${e}.json`));return{name:t.name,title:t.title,whenToUse:t.whenToUse}})}))}function ft(e){if(!fe.includes(e)){a(l("GUIDE_NOT_FOUND",`\u6CA1\u6709\u540D\u4E3A ${e} \u7684\u6307\u5357`,{data:{available:fe}}));return}a(E(JSON.parse(bt(j("guides",`${e}.json`)))))}function at(e,t){var o,i;let n=e.split(".").map(s=>Number.parseInt(s,10)||0),r=t.split(".").map(s=>Number.parseInt(s,10)||0);for(let s=0;s<Math.max(n.length,r.length);s+=1){let c=((o=n[s])!=null?o:0)-((i=r[s])!=null?i:0);if(c!==0)return c<0?-1:1}return 0}function bt(e){return p==="best-geo"?e:e.replace(/\bbest-geo\b(?!-)/g,p)}var be=null,he=null;function ht(){return be===null&&(be=JSON.parse(j("capabilities","capabilities.json")).capabilities),be}function ln(){return he===null&&(he=new Map(ht().filter(e=>e.inputSchema!==void 0).map(e=>[e.name,e.inputSchema]))),he}function ee(){return ht().filter(e=>e.mode==="write").map(e=>e.name)}function te(e,t){let n=ln().get(e);return n===void 0?[]:xe(t,n,"")}function xe(e,t,n){if(t.type==="object"||t.properties!==void 0)return dn(e,t,n);let r=yt(e,t,n);if(r!==null)return[r];let o=[];return typeof e=="string"&&t.minLength!==void 0&&e.length<t.minLength&&o.push(t.minLength===1?`${n} \u4E0D\u80FD\u662F\u7A7A\u5B57\u7B26\u4E32`:`${n} \u81F3\u5C11 ${t.minLength} \u4E2A\u5B57\u7B26\uFF0C\u5F53\u524D ${e.length} \u4E2A`),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 ${$(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((i,s)=>{o.push(...xe(i,t.items,`${n}[${s}]`))})),o}function dn(e,t,n){var c,f;if(typeof e!="object"||e===null||Array.isArray(e))return[`${n||"\u5165\u53C2"} \u5FC5\u987B\u662F\u5BF9\u8C61`];let r=e,o=(c=t.properties)!=null?c:{},i=(f=t.required)!=null?f:[],s=[];for(let m of i)(r[m]===void 0||r[m]===null)&&s.push(`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 ${ye(n,m)}`);if(t.additionalProperties===!1){let m=Object.keys(o);for(let y of Object.keys(r))m.includes(y)||s.push(`\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5 ${ye(n,y)}\uFF0C\u53EF\u7528\u5B57\u6BB5\uFF1A${m.join("\u3001")}`)}for(let[m,y]of Object.entries(o)){let b=r[m];b===void 0||b===null&&i.includes(m)||s.push(...xe(b,y,ye(n,m)))}return s}function yt(e,t,n){if(Array.isArray(t.type)){let r=t.type.map(o=>yt(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 ${$(e)}`;case"string":return typeof e=="string"?null:`${n} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF0C\u6536\u5230 ${$(e)}`;case"number":return typeof e=="number"&&Number.isFinite(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u5B57\uFF0C\u6536\u5230 ${$(e)}`;case"integer":return typeof e=="number"&&Number.isInteger(e)?null:`${n} \u5FC5\u987B\u662F\u6574\u6570\uFF0C\u6536\u5230 ${$(e)}`;case"boolean":return typeof e=="boolean"?null:`${n} \u5FC5\u987B\u662F true \u6216 false\uFF0C\u6536\u5230 ${$(e)}`;case"array":return Array.isArray(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u7EC4\uFF0C\u6536\u5230 ${$(e)}`;default:return null}}function ye(e,t){return e===""?t:`${e}.${t}`}function $(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 "${cn(t)}"`:t}function cn(e){return e.length>20?`${e.slice(0,20)}\u2026`:e}function ne(e,t){let n=t.includes("\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 projectId");return l("VALIDATION_FAILED",`\u5165\u53C2\u4E0D\u5408\u6CD5\uFF1A${t.join("\uFF1B")}`,{data:{name:e,errors:t},nextAction:{type:"ask_user",message:n?"\u5148\u7528 projects.list \u67E5\u4E00\u4E0B\u5F53\u524D\u80FD\u64CD\u4F5C\u54EA\u4E9B GEO \u9879\u76EE\uFF0C\u518D\u628A projectId \u8865\u4E0A\u91CD\u8BD5":"\u6309 capabilities \u91CC\u7684 inputSchema \u4FEE\u6B63\u53C2\u6570\u540E\u91CD\u8BD5\uFF1B\u7F3A\u7684\u4FE1\u606F\u95EE\u7528\u6237"}})}function re(e){let{projectId:t,...n}=e;return{projectId:typeof t=="number"?t:null,rest:n}}var xt={"projects.list":e=>({path:"/projects",query:e}),"projects.get":()=>({path:"/projects/current"}),"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"}),"indexingQueries.get":({taskId:e,...t})=>({path:`/indexing-queries/${Number(e)}`,query:t}),"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)}),"textToImages.models":()=>({path:"/text-to-image-models"}),"textToImages.list":e=>({path:"/text-to-images",query:e}),"textToImages.get":e=>({path:`/text-to-images/${Number(e.id)}`}),"textToImages.countUncompleted":()=>({path:"/text-to-images/count-uncompleted"}),"dhVideos.avatars":e=>({path:"/dh-videos/avatars",method:"POST",body:e}),"dhVideos.voices":e=>({path:"/dh-videos/voices",method:"POST",body:e}),"dhVideos.list":e=>({path:"/dh-videos",query:e}),"dhVideos.get":e=>({path:`/dh-videos/${Number(e.id)}`}),"clipTasks.templates":e=>({path:"/clip-tasks/templates",method:"POST",body:e}),"clipTasks.bgm":e=>({path:"/clip-tasks/bgm",method:"POST",body:e}),"clipTasks.list":e=>({path:"/clip-tasks",query:e}),"clipTasks.get":e=>({path:`/clip-tasks/${Number(e.id)}`}),"answerCards.list":e=>({path:"/answer-cards",query:e}),"answerCards.templates":()=>({path:"/answer-cards/templates"}),"answerCards.get":e=>({path:`/answer-cards/${Number(e.id)}`}),"answerCards.batch":e=>({path:`/answer-cards/${Number(e.taskId)}/batches/${Number(e.batchId)}`})};function I(e){let{planId:t,...n}=e;return n}function pn(){return Object.keys(xt)}async function kt(e,t){let n=xt[e];if(!n&&ee().includes(e)){a(l("VALIDATION_FAILED",`${e} \u662F\u5199\u80FD\u529B\uFF0C\u4E0D\u80FD\u7528 call \u8C03\uFF0C\u8981\u8D70 plan \u2192 \u7528\u6237\u786E\u8BA4 \u2192 apply`,{nextAction:{type:"ask_user",message:`\u6539\u7528 best-geo plan ${e} --input '<\u540C\u6837\u7684\u5165\u53C2>'\uFF0C\u628A\u8FD4\u56DE\u7684\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D best-geo apply <planId>`}}));return}if(!n){a(l("VALIDATION_FAILED",`\u672A\u77E5\u80FD\u529B\uFF1A${e}`,{data:{available:pn()},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(l("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let o=te(e,r);if(o.length>0){a(ne(e,o));return}let i=await G();if(!i.ok){a(i.envelope);return}let{projectId:s,rest:c}=re(r),{path:f,query:m,method:y,body:b}=n(c);a(await x(f,{apiKey:i.apiKey,query:m,method:y,body:b,projectId:s}))}var N=require("node:fs"),V=require("node:path");var un={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"}},mn={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".mp4":"video/mp4"},Et={"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"}]},gn=900*1e3;function It(e){return Et[e]!==void 0}function vt(e){return W(e)!==null}function wt(e,t){var i;let n=(i=Et[e])!=null?i:[],r={...t},o={};for(let s of n){let c=t[s.pathKey];if(typeof c!="string"||!c.trim())return{ok:!1,envelope:hn(s)};let f=(0,V.resolve)(c.trim()),m=bn(f,s);if(!m.ok)return{ok:!1,envelope:m.envelope};delete r[s.pathKey],r[s.metaKey]={name:(0,V.basename)(f),size:m.size},o[s.uploadField]=f}return{ok:!0,input:r,paths:o}}function At(e,t){qe(e,{paths:t,createdAt:Date.now()})}async function St(e,t){let n=W(e);if(!n)return{ok:!1,envelope:l("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,i]of Object.entries(n.paths)){if(!(0,N.existsSync)(i))return{ok:!1,envelope:l("VALIDATION_FAILED",`\u6587\u4EF6\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF1A${i}`)};let s=await x(`/plans/${encodeURIComponent(e)}/uploads/presign`,{method:"POST",apiKey:t,body:{field:o,fileName:(0,V.basename)(i)}});if(!s.ok)return{ok:!1,envelope:s};let c=await fn(s.data,i);if(!c.ok)return{ok:!1,envelope:c.envelope};r[o]=s.data.uploadUrl}return{ok:!0,uploads:r}}function _t(e){Ke(e)}async function fn(e,t){let n=mn[Ct(t)];if(!n)return{ok:!1,envelope:l("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,N.openAsBlob)(t,{type:n}),(0,V.basename)(t));try{let o=await fetch(e.host,{method:"POST",body:r,signal:AbortSignal.timeout(gn)}),i=(await o.text().catch(()=>"")).slice(0,300);if(!o.ok)return{ok:!1,envelope:l("UPLOAD_FAILED",`\u4E0A\u4F20\u5931\u8D25\uFF08HTTP ${o.status}\uFF09\uFF1A${i}`,{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 s=yn(i);return s?{ok:!1,envelope:l("UPLOAD_FAILED",`\u6587\u4EF6\u5DF2\u4E0A\u4F20\uFF0C\u4F46\u767B\u8BB0\u5931\u8D25\uFF1A${s}`,{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:l("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 bn(e,t){let n=un[t.kind];if(!(0,N.existsSync)(e))return{ok:!1,envelope:l("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,N.statSync)(e);if(!r.isFile())return{ok:!1,envelope:l("VALIDATION_FAILED",`${e} \u4E0D\u662F\u4E00\u4E2A\u6587\u4EF6`)};let o=Ct(e);return n.extensions.includes(o)?r.size>n.maxBytes?{ok:!1,envelope:l("VALIDATION_FAILED",`${n.label}\u6700\u5927 ${oe(n.maxBytes)}\uFF0C\u5F53\u524D ${oe(r.size)}\uFF0C\u8D85\u51FA ${oe(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 ${oe(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:l("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 hn(e){return l("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 oe(e){return e>=1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${Math.max(1,Math.round(e/1024))}KB`}function yn(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 Ct(e){let t=e.lastIndexOf(".");return t===-1?"":e.toLowerCase().slice(t)}async function Tt(e,t,n){var v;let r=ee();if(!e||!r.includes(e)){a(l("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(l("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(l("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let i=te(e,o);if(i.length>0){a(ne(e,i));return}let{projectId:s,rest:c}=re(o),f=c,m=null;if(It(e)){let S=wt(e,c);if(!S.ok){a(S.envelope);return}f=S.input,m=S.paths}let y=await G();if(!y.ok){a(y.envelope);return}let b=await x("/plans",{method:"POST",apiKey:y.apiKey,body:{operation:e,input:f},projectId:s});b.ok&&m&&((v=b.data)!=null&&v.planId)&&At(b.data.planId,m),a(b)}async function Rt(e){if(!e){a(l("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 G();if(!t.ok){a(t.envelope);return}let n;if(vt(e)){let o=await St(e,t.apiKey);if(!o.ok){a(o.envelope);return}n=o.uploads}let r=await x(`/plans/${encodeURIComponent(e)}/apply`,{method:"POST",apiKey:t.apiKey,body:n?{uploads:n}:{},isWrite:!0});r.ok&&_t(e),a(r)}function Ot(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),i=e[n+1];i&&!i.startsWith("--")?(t[o]=i,n+=1):t[o]=!0}return t}function $t(e,t){let n=O();if(e.reason==="denied")return l("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 l("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 l("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:`${p} auth login`}})}function Nt(e){return e instanceof _}async function xn(){process.stdout.on("error",r=>process.exit(r.code==="EPIPE"?0:1));let[e,...t]=process.argv.slice(2),n=Ot(t);switch(e){case void 0:case"help":ct();return;case"version":await pt(n.check===!0);return;case"capabilities":ut();return;case"skill":if(t[0]==="get"){mt(n.raw===!0);return}break;case"guide":if(t[0]==="list"){gt();return}if(t[0]==="get"&&t[1]){ft(t[1]);return}break;case"auth":if(t[0]==="login")return nt();if(t[0]==="status")return rt();if(t[0]==="logout")return ot();break;case"plan":await Tt(t[0],typeof n.input=="string"?n.input:void 0,t[1]);return;case"apply":await Rt(t[0]);return;case"call":if(t[0]){await kt(t[0],typeof n.input=="string"?n.input:void 0);return}break;default:break}a(l("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}xn().catch(e=>{if(Nt(e)){a($t(e,{capability:e.reason==="denied"?"config_write":"config_read",retryCommand:kn()})),process.exitCode=1;return}a(l("SERVER_ERROR",e instanceof Error?e.message:String(e))),process.exitCode=1});function kn(){let[e,t]=process.argv.slice(2);if(e==="auth"&&(t==="login"||t==="status"||t==="logout"))return`${p} auth ${t}`}
@@ -10,7 +10,7 @@
10
10
  {
11
11
  "step": 1,
12
12
  "action": "确定内容来源与视觉方式",
13
- "note": "内容来源二选一:sourceType=1 用已有文章(给 articleId,从 articles.list 查)、sourceType=2 用自定义正文(给 content,至少 20 个有效字符)。视觉方式三选一:visualMode=1 让 AI 自动挑模板(最省事)、=2 指定模板(先用 answerCards.templates 查可用模板拿 templateId)、=3 自定义风格(给 customStylePrompt)。richness 决定页数档位,模型档位用 textToImages.models 查 modelCode。"
13
+ "note": "内容来源二选一:sourceType=1 用已有文章(给 articleId,从 articles.list 查)、sourceType=2 用自定义正文(给 content,至少 20 个有效字符)。视觉方式三选一:visualMode=1 让 AI 自动挑模板(最省事)、=2 指定模板(先用 answerCards.templates 查可用模板拿 templateId)、=3 自定义风格(给 customStylePrompt)。richness 决定页数档位,模型档位用 textToImages.models 查 modelCode。**参考图上限看档位**:每个档位最多能喂 maxInputImages 张图;visualMode=1 或 2 时模板图先占 1 张,用户能选的再少 1 张;maxInputImages 为 0 的档位只能用 visualMode=3。超了 plan 能过、apply 才被拒,plan 前就要算好。"
14
14
  },
15
15
  {
16
16
  "step": 2,
@@ -70,7 +70,8 @@
70
70
  "VALIDATION_FAILED": "参数不合法,按 capabilities 里的 inputSchema 修正后重试。提示词/模型不存在、提示词类型不对、项目下没有知识资料、图片数量不够配图,都走这个码,message 里写明了是哪一种。",
71
71
  "PLAN_EXPIRED": "计划超过 30 分钟没执行。重新 plan,把新摘要再给用户确认一次——旧 planId 已经不能用了。",
72
72
  "PLAN_COST_CHANGED": "扣费方式在确认期间变了。重新 plan,把新的费用说明再念给用户。",
73
- "SERVER_ERROR": "看它出现在哪一步。**apply 阶段**多半是余额不足——建任务要按篇数扣费,扣费失败会落成这个码;**先别重试 apply**,把 message 原样转达给用户,让他确认账户余额。**plan 阶段**则与余额无关,按 message 说的处理。"
73
+ "QUOTA_EXCEEDED": "账户余额(积分/算力)不足——建任务要按篇数扣费。把 message 原样转达给用户,让他确认账户余额或联系管理员充值,不要重试 apply——余额不够重试也不会成功。",
74
+ "SERVER_ERROR": "服务端出错,**不是余额问题**(余额不足是 QUOTA_EXCEEDED)。常见原因是站点侧配置缺失或服务端临时故障。**apply 阶段先别重试**——可能已经建出来了,先用 articleTasks.list 确认;把 message 和 requestId 一起转达给用户,让他联系服务商。"
74
75
  },
75
76
  "completionCriteria": "读:已经如实说明任务跑到哪一步、写出来多少篇、审核通过多少。写:plan 摘要已原样念给用户、用户明确同意、apply 成功,并告诉了他任务在后台跑、大概要等一会儿。"
76
77
  }
@@ -73,16 +73,17 @@
73
73
  "不要把 articles.update 当成追加。正文/标签/摘要都是整体覆盖,只传一段新内容会把原来的全冲掉",
74
74
  "不要在用户没同意 plan 摘要之前就 apply。他说「帮我写篇文章」不等于同意了你写的这一篇",
75
75
  "不要为了省事把 articles.create 连着调好几次试效果——每调一次都真的建出一篇,多出来的还得让用户一篇篇去网页删;而且按篇计费",
76
- "已经建好的文章改不了所属项目和文件夹(新建时可以用 folderId 指定),用户要动那两个就让他去网页的文章管理",
76
+ "已经建好的文章改不了所属 GEO 项目,用户要换项目就让他去网页的文章管理。换文件夹用 articles.moveFolder,不用去网页",
77
77
  "不要凭印象填 folderId。合法 id 只能来自 folders.list,猜一个过去会被服务端拒掉"
78
78
  ],
79
79
  "errorRecovery": {
80
- "ACCESS_DENIED": "这条数据不在当前 GEO 项目里,用当前项目的列表能力重新查;要换项目先问用户。",
81
- "VALIDATION_FAILED": "参数不合法,按 capabilities 里的 inputSchema 修正后重试。message 里写明了是哪个字段;长度类还会给出当前值和上限。文章不存在也走这个码——读不到一律当不存在,不区分「没有」和「不是你的」。",
80
+ "ACCESS_DENIED": "这条数据不在当前 GEO 项目里,或者已经不存在了(读不到一律当不存在,不区分「没有」和「不是你的」)。用当前项目的列表能力重新查;要换项目先问用户。",
81
+ "VALIDATION_FAILED": "参数不合法,按 capabilities 里的 inputSchema 修正后重试。message 里写明了是哪个字段;长度类还会给出当前值和上限。",
82
82
  "PLAN_STALE": "这篇文章在用户确认期间被别人改过。重新 articles.get 读当前内容、重新 plan,把新摘要再给用户确认一次。不要拿旧 planId 重试。",
83
83
  "PLAN_EXPIRED": "计划超过 30 分钟没执行。重新 plan,把新摘要再给用户确认一次——旧 planId 已经不能用了。",
84
84
  "PLAN_COST_CHANGED": "扣费方式在确认期间变了。重新 plan,把新的费用说明再念给用户。",
85
- "SERVER_ERROR": "看它出现在哪一步。**apply 阶段**多半是余额不足——新建文章是这条链路上唯一会扣费的动作,扣费失败会落成这个码;**先别重试 apply**,把 message 原样转达给用户,让他确认账户余额。**plan 阶段**则与余额无关,按 message 说的处理,别让用户去查余额。"
85
+ "QUOTA_EXCEEDED": "账户余额(积分/算力)不足。这条链路上新建、复制、生成摘要、生成封面都会扣费。把 message 原样转达给用户,让他确认账户余额或联系管理员充值,不要重试 apply——余额不够重试也不会成功。",
86
+ "SERVER_ERROR": "服务端出错,**不是余额问题**(余额不足是 QUOTA_EXCEEDED)。常见原因是站点侧配置缺失或服务端临时故障。**apply 阶段先别重试**——可能已经写进去了,先用 articles.list 确认;把 message 和 requestId 一起转达给用户,让他联系服务商。"
86
87
  },
87
88
  "completionCriteria": "读:已经如实呈现用户关心的文章列表(含总数)或指定那一篇的信息,用户要正文时才给了正文。写:plan 摘要已原样念给用户、用户明确同意、apply 成功,并把结果(文章 ID、还差不差封面)告诉了他。"
88
89
  }
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "indexing-query",
3
+ "title": "AI 查询:拿几个问题现在就去问几家 AI,取回每家的原话、引用来源和拆解词",
4
+ "whenToUse": "用户说「现在帮我问问豆包/DeepSeek 这几个问题」「看看 AI 现在怎么回答这句话」「这几个问题各家 AI 会引用哪些网站」,或者要拿 AI 的原始回答去分析、写内容时。只问一次、马上要结果;要**定期**盯着看趋势的,用 scheduled-monitor。",
5
+ "prerequisites": [
6
+ "已完成 best-geo auth login",
7
+ "已确定在哪个 GEO 项目里问,用 projects.list 拿到 projectId",
8
+ "问之前先跑一次 indexingPlatforms.list"
9
+ ],
10
+ "workflow": [
11
+ {
12
+ "step": 1,
13
+ "action": "查 indexingPlatforms.list,挑云端能跑的平台",
14
+ "capability": "indexingPlatforms.list",
15
+ "note": "AI 查询只走云端采集:只能选 sources 里含 3 的平台。平台名带 App 的是手机版(如 doubaoApp),和电脑版是两个独立平台,可以同时选。清单随代理配置变,以返回为准。"
16
+ },
17
+ {
18
+ "step": 2,
19
+ "action": "跟用户对齐问哪些问题、问哪几家",
20
+ "note": "问题和平台是多对多:questions(1~100 个)× platforms,每个组合问一次。提问次数 = 问题数 × 平台数,直接决定这次要扣多少,所以要用户点头。常见的是一个平台问多个问题,也可以多个平台对比同一批问题。"
21
+ },
22
+ {
23
+ "step": 3,
24
+ "action": "按需决定两个可选项:provider 和 withShareUrl",
25
+ "note": "provider 指定采集厂商(moli / deepgeo),不传按后台默认。指定之后只投这一家,这家拒单到上限就判这个平台失败、不会改投别家;手机端平台不受影响,固定走 moli。用户没提就别传。withShareUrl 要截图或对话分享链接,打开后这些平台一次提问按两份计费,用户要「原始对话凭证」时才开。"
26
+ },
27
+ {
28
+ "step": 4,
29
+ "action": "plan create,把摘要原样念给用户,等他同意再 apply",
30
+ "capability": "indexingQueries.create",
31
+ "note": "name 按「设备名 + 时间」起,设备名取 auth status 里的 device.deviceName。摘要里列出了全部问题原文、共问几次、扣几次费用,整段念给用户。问题会同时加进这个 GEO 项目的搜索问题库(已有的直接复用)。apply 返回 taskId,记住它。"
32
+ },
33
+ {
34
+ "step": 5,
35
+ "action": "隔一会儿用 indexingQueries.get 查结果,看 status 决定下一步",
36
+ "capability": "indexingQueries.get",
37
+ "note": "执行是异步的,一般几分钟出结果。status 为 pending(等待下发)或 running(采集中)就稍后再查,建议间隔 30~60 秒;finished、timed_out、paused、failed 都不会再变,停止轮询。settledCount / totalCount 是整体进度,按全部提问算,不受分页影响。failed 时把 errorMessage 念给用户,里面写了原因和能不能重跑。"
38
+ },
39
+ {
40
+ "step": 6,
41
+ "action": "按需翻页、按问题或平台筛选,取回答原文",
42
+ "capability": "indexingQueries.get",
43
+ "note": "answers 分页给(默认 20 条、最多 100 条),每条是一个问题 × 一个平台,正文 content 是全文、一条可能上千字,按需要取,别一次拉满。total 是回答总条数。只看某个问题传 topicId(取自出参 questions[].id),只看某家 AI 传 platform。每条回答里:indexed 表示有没有提到本项目的品牌词,competitors 是提到的竞品,sources 是 AI 引用的网页(说明该往哪儿发内容),searchKeywords 是 AI 联网搜索前把问题拆成的搜索词,shareUrl / screenshotUrl 是对话凭证,errorMessage 是这个平台采集失败的原因。"
44
+ }
45
+ ],
46
+ "askUserWhen": [
47
+ "要问哪些问题没定下来——问偏了,这次的提问次数全花在用户不关心的问题上",
48
+ "要问哪几家 AI 没说清;别自己挑一批平台就提交",
49
+ "问题数 × 平台数比较多(比如上百次)时,先把次数说给用户听,确认再 plan",
50
+ "用户要对话截图或分享链接时才开 withShareUrl,开了这些平台按两份计费"
51
+ ],
52
+ "forbidden": [
53
+ "不要凭印象填 platforms,必须以 indexingPlatforms.list 的返回为准,并且只选支持云端(sources 含 3)的",
54
+ "不要在用户没提的情况下传 provider。指定厂商后拒单不会改投别家,平白多一种失败的可能",
55
+ "不要 apply 完马上查结果就下结论。刚发出去那一刻是 pending,不是失败",
56
+ "不要因为「等太久了」就再建一个同样的任务。每建一次都真的多问一轮、多扣一次,先看 status 和 settledCount",
57
+ "不要把 taskId 和 plan/apply 的 planId 搞混:taskId 是整数、长期有效,planId 是 plan 返回的字符串、30 分钟过期,只能喂给 apply",
58
+ "不要一次把所有回答全文都拉进来。多问题 × 多平台时回答很多、每条很长,先按问题或平台筛、按页取",
59
+ "不要拿周期执行或插件采集的定时收录计划的 id 来调 indexingQueries.get,会报不是 AI 查询任务;那种计划用 scheduledIndexing.answers 查"
60
+ ],
61
+ "completionCriteria": [
62
+ "下发:apply 成功、拿到 taskId,并把问了哪些问题、哪几家、共几次复述给用户",
63
+ "取结果:status 到了 finished / timed_out,把各平台的回答按用户的问题整理出来;失败的平台说清原因",
64
+ "timed_out 时明确告诉用户哪些平台没采到,不要当成全部完成"
65
+ ],
66
+ "errorRecovery": {
67
+ "ACCESS_DENIED": "taskId 不在当前 GEO 项目里,确认 projectId 和建任务时是同一个;要换项目先问用户。",
68
+ "VALIDATION_FAILED": "参数不合法,message 里写明了是哪一种:平台当前不可用、云端跑不了某个平台、指定的厂商跑不了某个平台、问题超过 100 个、或 taskId 不是 AI 查询任务(周期执行或插件采集的计划)。按 message 改,改完重新 plan。",
69
+ "QUOTA_EXCEEDED": "有两种:账户余额不足,或这个 GEO 项目的搜索问题库满了(新问题会加进问题库)。任务都没有建出来。不要自己猜是哪种,照 nextAction.message 转达给用户——余额不足要充值,问题库满了要先到网页清理不再需要的搜索问题,然后重新 plan。",
70
+ "PLAN_COST_CHANGED": "扣费方式在确认期间变了。重新 plan,把新的费用说明再念给用户。",
71
+ "PLAN_EXPIRED": "计划超过 30 分钟没执行。重新 plan,把新摘要再给用户确认一次,旧 planId 已经不能用了。"
72
+ }
73
+ }
@@ -34,7 +34,7 @@
34
34
  "step": 5,
35
35
  "action": "改名称或标签走 knowledge.update",
36
36
  "capability": "knowledge.update",
37
- "note": "同样先 plan 再 apply。只能改这两样,改所属项目、加删文档都要去网页。"
37
+ "note": "同样先 plan 再 apply。只能改这两样。加文档用 knowledge.addFiles;改所属项目、删文档要去网页。"
38
38
  },
39
39
  {
40
40
  "step": 6,
@@ -60,11 +60,12 @@
60
60
  "用户说「补进 XX 知识库」时不要新建库。那是 knowledge.addFiles 的活"
61
61
  ],
62
62
  "errorRecovery": {
63
- "ACCESS_DENIED": "这条数据不在当前 GEO 项目里,用当前项目的列表能力重新查;要换项目先问用户。",
64
- "VALIDATION_FAILED": "参数不合法。常见原因:files 为空、某个文档缺 name 或 file、知识库名称为空或只有空格、以及**知识库不存在**(读不到一律当不存在,不区分「没有」和「不是你的」)。按提示补齐后重试。**还有一种与参数无关的情况**:站点还没配置这个功能的价格——这时按 nextAction 说的让用户联系服务商,别去改参数重试,改了也过不去。分辨方法是看 nextAction.message。",
63
+ "ACCESS_DENIED": "这条数据不在当前 GEO 项目里,或者已经不存在了(读不到一律当不存在,不区分「没有」和「不是你的」)。用当前项目的列表能力重新查;要换项目先问用户。",
64
+ "VALIDATION_FAILED": "参数不合法。常见原因:files 为空、某个文档缺 name 或 file、知识库名称为空或只有空格。按提示补齐后重试。**还有一种与参数无关的情况**:站点还没配置这个功能的价格——这时按 nextAction 说的让用户联系服务商,别去改参数重试,改了也过不去。分辨方法是看 nextAction.message。",
65
65
  "PLAN_STALE": "确认期间这个知识库被别人改过。重新 plan,把新摘要再给用户确认一次。",
66
66
  "PLAN_COST_CHANGED": "确认之后扣费方式变了(比如管理员把这个功能改成从另一种账户扣)。用户上次点头同意的不是现在这笔,**别直接重试 apply**。重新 plan,把新的费用说明再给用户确认一次。注意:响应里**不含**「原来是什么、现在是什么」,别向用户复述具体是从哪种变成了哪种。",
67
- "SERVER_ERROR": "看它出现在哪一步。**apply 阶段**多半是余额不足——这是唯一会扣费的能力,扣费失败会落成这个码;**先别重试 apply**,把 message 原样转达给用户,让他确认账户余额。**plan 阶段**则与余额无关,按 message 说的处理,别让用户去查余额。"
67
+ "QUOTA_EXCEEDED": "账户余额(积分/算力)不足。knowledge.create 和 knowledge.addFiles 都按文档扣费。把 message 原样转达给用户,让他确认账户余额或联系管理员充值,不要重试 apply——余额不够重试也不会成功。",
68
+ "SERVER_ERROR": "服务端出错,**不是余额问题**(余额不足是 QUOTA_EXCEEDED)。常见原因是站点侧配置缺失或服务端临时故障。**apply 阶段先别重试**——可能已经写进去了,先用 knowledge.get / knowledge.list 确认;把 message 和 requestId 一起转达给用户,让他联系服务商。"
68
69
  },
69
70
  "completionCriteria": "查询类:已如实呈现知识库列表或指定那个的文档解析状态。新建类:用户看过摘要并明确同意后才执行,且执行后说清了「正在解析、暂不可用」。",
70
71
  "writeFlow": {
@@ -79,7 +80,7 @@
79
80
  "计划 30 分钟内有效,只能执行一次。",
80
81
  "notice 里会写清这次要新增几个文档、按文档计费扣几次——按下去之前用户就该知道。",
81
82
  "摘要里的 files 只列文档名,不回显正文。用户要核对内容,让他看自己给你的原始资料。",
82
- "knowledge.update 只能改名称和标签。改所属项目、加文档、删文档都要去网页做。"
83
+ "knowledge.update 只能改名称和标签。加文档用 knowledge.addFiles;改所属项目、删文档要去网页做。"
83
84
  ]
84
85
  }
85
86
  }
@@ -78,7 +78,8 @@
78
78
  "PLAN_EXPIRED": "计划超过 30 分钟没执行。重新 plan,把新摘要再给用户确认一次——旧 planId 已经不能用了,文件也要重新走一遍上传。",
79
79
  "UPLOAD_FAILED": "文件传到一半断了。素材记录还没建,什么都没留下——把情况告诉用户,重新走一遍 plan 就行,不要反复重试 apply。",
80
80
  "PLAN_COST_CHANGED": "扣费方式在确认期间变了。重新 plan,把新的费用说明再念给用户。",
81
- "SERVER_ERROR": "看它出现在哪一步。**apply 阶段**多半是余额不足——传图片是这条链路上唯一会扣费的动作,扣费失败会落成这个码;**先别重试 apply**,把 message 原样转达给用户,让他确认账户余额。**plan 阶段**则与余额无关,按 message 说的处理。"
81
+ "QUOTA_EXCEEDED": "账户余额(积分/算力)不足——传图片会扣费。把 message 原样转达给用户,让他确认账户余额或联系管理员充值,不要重试 apply——余额不够重试也不会成功。",
82
+ "SERVER_ERROR": "服务端出错,**不是余额问题**(余额不足是 QUOTA_EXCEEDED)。常见原因是站点侧配置缺失或服务端临时故障。**apply 阶段先别重试**——可能已经建出来了,先用 images.list / videos.list 确认;把 message 和 requestId 一起转达给用户,让他联系服务商。"
82
83
  },
83
84
  "completionCriteria": "查询类:已如实呈现用户关心的素材列表或指定那一条的信息。写入类(新建/改名/改标签):用户看过 plan 摘要并明确同意后才执行,执行完把结果告诉了他。",
84
85
  "writeFlow": {
@@ -32,46 +32,58 @@
32
32
  },
33
33
  {
34
34
  "step": 5,
35
- "action": "建发布任务:publicationTasks.createArticle / createVideo",
35
+ "action": "建发布任务:publicationTasks.createArticle / createVideo / createImage",
36
36
  "capability": "publicationTasks.createArticle",
37
- "note": "**先 plan,把计划里逐条列的「哪篇发到哪个号、什么时候发」念给用户,等他确认再 apply**。执行之后稿子会真的发出去,CLI 撤不回来。aigc(要不要打 AI 创作声明)必须问用户,别替他决定。定时发布传 publishTime,不传就是立即发。费用按发布记录条数算——一篇发 3 个号就是 3 条,跟用户说清楚这个口径。**plan 阶段就会查字数**:报「不满足平台的字数要求」时,错误信息里点名了是哪篇文章投哪个平台、差多少字——把这句原样念给用户,让他定是改文章还是不发那个平台,别自己挑一个继续重试(这种失败重试多少次都过不去)。"
37
+ "note": "**先 plan,把计划里逐条列的「哪篇发到哪个号、什么时候发」念给用户,等他确认再 apply**。执行之后稿子会真的发出去,CLI 撤不回来。aigc(要不要打 AI 创作声明)发文章、视频时必须问用户,别替他决定;**图文不用问**,网页端图文已经没有这个声明,不传就是不打。定时发布传 publishTime,不传就是立即发。费用按发布记录条数算——一篇发 3 个号就是 3 条,跟用户说清楚这个口径。**plan 阶段就会查字数**:报「不满足平台的字数要求」时,错误信息里点名了是哪篇文章投哪个平台、差多少字——把这句原样念给用户,让他定是改文章还是不发那个平台,别自己挑一个继续重试(这种失败重试多少次都过不去)。"
38
38
  },
39
39
  {
40
40
  "step": 6,
41
+ "action": "发图文:内容来自 AI 答案卡,用 publicationTasks.createImage",
42
+ "capability": "publicationTasks.createImage",
43
+ "note": "流程和发文章一样(先 plan、念逐条明细、用户确认再 apply),区别在三处:① 平台用 publicationPlatforms.list 带 contentType=image,图文平台和文章、视频平台是三批,混用会被拒;② 每项给的是 answerCardTaskId 而不是 articleId,**挑答案卡要选 status=8(已完成)且 publishTitle 不为空的**——还在生成、部分失败或没填发布标题的发不了,缺标题先用 answerCards.savePublishInfo 补;③ 图片张数、标题和描述长度由平台规则校验,张数上限以 plan 的报错为准,同一张卡发不同平台,张数上限可能不同,plan 报「不满足平台要求」时把错误原样念给用户,让他定改卡还是不发那个平台。发出去之后在 publicationRecords.list 里 contentType=image,title 是答案卡的发布标题,answerCardTaskId 是来源答案卡。"
44
+ },
45
+ {
46
+ "step": 7,
41
47
  "action": "任务建完后查进展,别反复重建",
42
48
  "capability": "publicationRecords.list",
43
49
  "note": "发布是异步的,apply 完不会马上有链接。等一会儿用 publicationRecords.list 看。每建一次任务就是一批新的发布,重建 = 重复发稿 + 重复扣费。"
44
50
  },
45
51
  {
46
- "step": 7,
52
+ "step": 8,
47
53
  "action": "要停下来用 publicationTasks.pause,改主意了用 delete",
48
54
  "capability": "publicationTasks.pause",
49
- "note": "两个都只对**还没发出去**的记录有效(删除会连暂停中的一起删掉)。已经发成功的稿子留在平台上,CLI 撤不回来——用户要撤那些,只能去各平台自己删,这一点必须说明白,别让他以为暂停就等于撤回。另外建任务时费用就按记录条数扣过了,删除不改变这笔扣费,用户点删除前得知道。"
55
+ "note": "两个都只对**还没发出去**的记录有效(删除会连暂停中的一起删掉)。已经发成功的稿子留在平台上,CLI 撤不回来——用户要撤那些,只能去各平台自己删,这一点必须说明白,别让他以为暂停就等于撤回。另外建任务时费用就按记录条数扣过了,删除不改变这笔扣费,用户点删除前得知道。**例外是外部导入的任务**(typeLabel=外部导入):它不能暂停或恢复;删除时会连同名下已发布的记录一起删掉,收录统计也会跟着减少,计划摘要会单独写出来,一定要念给用户。"
50
56
  },
51
57
  {
52
- "step": 8,
58
+ "step": 9,
53
59
  "action": "媒体投稿:先 mediaPlatforms.list 看有哪些媒体,报价前用 mediaPlatforms.get 查实时价",
54
60
  "capability": "mediaPlatforms.get",
55
61
  "note": "**报价必须用 get 那条**。列表是分页快照,遇上刚调过价就会和实际扣费对不上——用户按你报的数点了头,扣的却是另一个数。"
56
62
  },
57
63
  {
58
- "step": 9,
64
+ "step": 10,
59
65
  "action": "投稿:mediaPublications.create(一家)/ batchCreate(多家,最多 20)",
60
66
  "capability": "mediaPublications.batchCreate",
61
67
  "note": "**计划里逐家列出了媒体名和单价,要一家一家念给用户听,再给合计**——这是按明细收费的操作,用户确认的就是这份账单,只说「一共多少钱」不够。批量允许部分成功:某家失败不影响别家,失败的那家不扣费。一次只能投一篇文章,投多篇就一篇一篇来。"
62
68
  },
63
69
  {
64
- "step": 10,
70
+ "step": 11,
65
71
  "action": "查投稿进展用 mediaPublications.list,要整体情况用 mediaPublications.summary",
66
72
  "capability": "mediaPublications.summary",
67
73
  "note": "投稿动辄上百条。用户问「投出去的都怎么样了」直接用 summary,念 items 里的 statusLabel(「已拒稿 × 15」),别念 counts 里的数值。投稿有 failReason,被拒稿时把它念出来——这条链路和自媒体发布不同,是有失败原因的。**被拒稿的还要看 refundStatusLabel**:拒稿会原路退款,但退款偶尔会没退成(显示「待退款」,系统会自动补退)——用户问「钱退了吗」看的是这个字段,不是 status。"
74
+ },
75
+ {
76
+ "step": 12,
77
+ "action": "用户在外面自己发过的文章,要算进收录统计:publicationTasks.importLinks",
78
+ "capability": "publicationTasks.importLinks",
79
+ "note": "这是**登记**,不是发布:不扣费,也不会往任何平台发东西。先问清这些链接发的是系统里已有的哪篇文章(用 articles.list 找到 articleId),不是的话问用户要标题(title)新建一篇外部文章——两个只给一个。plan 里逐条写明哪条能导、哪条跳过,**把跳过的和原因念给用户**,别只报「导入 N 条」。「网站暂不支持」的链接导进来也匹配不上收录,不要换个写法重试。导入后在 publicationTasks.list 里是一个「外部导入」任务,apply 结果里的 results 是逐条最终结果,以它为准告诉用户导进去了几条。"
68
80
  }
69
81
  ],
70
82
  "askUserWhen": [
71
83
  "分不清他要问的是自媒体发布还是媒体投稿",
72
84
  "他有多个 GEO 项目,而没说这次问的是哪个",
73
85
  "他说「发一下」但没说发哪篇、发到哪个平台、用哪个账号",
74
- "要不要打「AI 创作」声明(aigc)——这是他的合规选择,不能替他定",
86
+ "发文章、视频时要不要打「AI 创作」声明(aigc)——这是他的合规选择,不能替他定(图文不用问,默认不打)",
75
87
  "他说「明天发」这类相对时间,而你不确定具体是几点"
76
88
  ],
77
89
  "forbidden": [
@@ -67,7 +67,8 @@
67
67
  "PLAN_STALE": "任务在用户确认期间被动过(多半是别人也导了一批)。重新 questionTasks.get 读当前状态、重新 plan,把新摘要再给用户确认一次。",
68
68
  "PLAN_EXPIRED": "计划超过 30 分钟没执行。重新 plan,把新摘要再给用户确认一次——旧 planId 已经不能用了。",
69
69
  "PLAN_COST_CHANGED": "扣费方式在确认期间变了。重新 plan,把新的费用说明再念给用户。",
70
- "SERVER_ERROR": "看它出现在哪一步。**apply 阶段**多半是余额不足——创建和重试都要扣费,扣费失败会落成这个码;**先别重试 apply**,把 message 原样转达给用户,让他确认账户余额。**plan 阶段**则与余额无关,按 message 说的处理。"
70
+ "QUOTA_EXCEEDED": "账户余额(积分/算力)不足——创建和重试都要扣费。把 message 原样转达给用户,让他确认账户余额或联系管理员充值,不要重试 apply——余额不够重试也不会成功。",
71
+ "SERVER_ERROR": "服务端出错,**不是余额问题**(余额不足是 QUOTA_EXCEEDED)。常见原因是站点侧配置缺失或服务端临时故障。**apply 阶段先别重试**——可能已经建出来了,先用 questionTasks.list 确认;把 message 和 requestId 一起转达给用户,让他联系服务商。"
71
72
  },
72
73
  "completionCriteria": "读:已经如实说明任务跑到哪一步、生成了哪些问题。写:plan 摘要已原样念给用户、用户明确同意、apply 成功,并告诉了他任务在后台跑(新建/重试)或者哪些问题已经进了问题库(导入)。"
73
74
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "scheduled-monitor",
3
3
  "title": "定时监控:让 AI 定期替你去问,看各家大模型有没有提到你、怎么说你",
4
- "whenToUse": "用户说「我想持续盯着 AI 有没有推荐我们」「定期看看 AI 怎么评价我们」「这个月效果怎么样」「上次那个监控跑完没有」,或者要新建、修改、立刻跑一次定时计划时。",
4
+ "whenToUse": "用户说「我想持续盯着 AI 有没有推荐我们」「定期看看 AI 怎么评价我们」「这个月效果怎么样」「上次那个监控跑完没有」,或者要新建、修改、立刻跑一次定时计划时。只想现在问一次、拿回 AI 的原话去分析,不用建计划,读 indexing-query。",
5
5
  "prerequisites": [
6
6
  "已完成 best-geo auth login",
7
7
  "已确定要给哪个 GEO 项目建计划,用 projects.list 拿到 projectId",
@@ -91,6 +91,7 @@
91
91
  "PLAN_COST_CHANGED": "扣费方式在确认期间变了。重新 plan,把新的费用说明再念给用户。",
92
92
  "PLAN_STALE": "计划在用户确认期间被改过。重新 get 读当前配置、重新 plan,把新摘要再给用户确认一次——runNow 也一样,因为摘要里承诺的提问次数可能已经变了。",
93
93
  "PLAN_EXPIRED": "计划超过 30 分钟没执行。重新 plan,把新摘要再给用户确认一次,旧 planId 已经不能用了。",
94
- "SERVER_ERROR": "看它出现在哪一步。**apply 阶段**多半是余额不足——云端采集要扣算力,扣费失败会落成这个码;**先别重试 apply**,把 message 原样转达给用户,让他确认账户余额。**plan 阶段**与余额无关,把 requestId 一起给用户去查。"
94
+ "QUOTA_EXCEEDED": "账户余额(积分/算力)不足——云端采集要扣费。把 message 原样转达给用户,让他确认账户余额或联系管理员充值,不要重试 apply——余额不够重试也不会成功。",
95
+ "SERVER_ERROR": "服务端出错,**不是余额问题**(余额不足是 QUOTA_EXCEEDED)。runNow 时最常见的原因是**这个计划已经有一次执行在跑**——用 runs 看最近一次的状态,跑完了再重新 plan runNow,别连着重试。其他情况多半是站点侧配置缺失或服务端临时故障,把 message 和 requestId 一起转达给用户。"
95
96
  }
96
97
  }
package/guides/video.json CHANGED
@@ -73,7 +73,8 @@
73
73
  "PLAN_STALE": "确认期间来源数字人任务合成完了、回填了真实时长,那份按兜底秒数算出来的报价已经不作数。重新 plan,把新的金额再念给用户确认一次——底板只是进度在动不会触发这个码,所以不用担心一直撞。",
74
74
  "PLAN_EXPIRED": "计划超过 30 分钟没执行。重新 plan,把新摘要再给用户确认一次。",
75
75
  "PLAN_COST_CHANGED": "单价在确认期间被改过。重新 plan,把新的费用说明再念给用户。",
76
- "SERVER_ERROR": "看它出现在哪一步。**apply 阶段**多半是余额不足:提交时虽然不扣费,但会校验余额够不够,不够会挡在这里。先别重试,把 message 原样转达给用户,让他确认余额。**plan 阶段**与余额无关,按 message 说的处理。"
76
+ "QUOTA_EXCEEDED": "账户余额(积分/算力)不足:提交时虽然不扣费,但会校验余额够不够,不够会挡在这里。把 message 原样转达给用户,让他确认余额或联系管理员充值,不要重试 apply。",
77
+ "SERVER_ERROR": "服务端出错,**不是余额问题**(余额不足是 QUOTA_EXCEEDED)。常见原因是站点侧配置缺失或服务端临时故障。**apply 阶段先别重试**——可能已经提交了,先用 dhVideos.list / clipTasks.list 确认;把 message 和 requestId 一起转达给用户,让他联系服务商。"
77
78
  },
78
79
  "completionCriteria": "查询类:已如实呈现任务状态或资源列表;任务没跑完就说清它还在哪个阶段,不要拿空的 videoUrl 当「失败」。写入类:用户看过 plan 摘要(含费用说明)并明确同意,apply 已返回任务号,并告诉了用户去哪儿查进度。",
79
80
  "writeFlow": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "best-geo-test",
3
- "version": "2.0.0",
3
+ "version": "2.0.2-beta",
4
4
  "description": "Best GEO CLI — 给本地 AI 助手调用的 GEO 命令行工具",
5
5
  "bin": {
6
6
  "best-geo-test": "dist/index.cjs"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: best-geo
3
- description: 通过 Best GEO CLI 查询和维护用户在 GEO 系统里的 GEO 项目、搜索问题、文章、知识库、图片/视频素材,以及定时监控计划——定期问各家 AI 有没有提到、怎么评价用户的品牌(新增/修改需用户确认)。当用户提到自己的品牌、GEO 项目、搜索问题、文章、知识库或素材,想新建、修改这些内容,或者想持续盯着 AI 有没有推荐自己、定期看 AI 怎么评价自己、查某个监控计划跑完没有时使用。
3
+ description: 通过 Best GEO CLI 查询和维护用户在 GEO 系统里的 GEO 项目、搜索问题、文章、知识库、图片/视频素材,以及定时监控计划——定期问各家 AI 有没有提到、怎么评价用户的品牌;也能现在就拿几个问题去问几家 AI,取回原话、引用来源和拆解词(新增/修改需用户确认)。当用户提到自己的品牌、GEO 项目、搜索问题、文章、知识库或素材,想新建、修改这些内容,或者想持续盯着 AI 有没有推荐自己、定期看 AI 怎么评价自己、查某个监控计划跑完没有,或者想看各家 AI 现在怎么回答某几个问题时使用。
4
4
  ---
5
5
 
6
6
  # Best GEO
@@ -41,6 +41,7 @@ best-geo guide get material # 要查图片/视频素材,或给素材改名
41
41
  best-geo guide get question-task # 要让 AI 想一批搜索问题
42
42
  best-geo guide get article-task # 要让 AI 批量写一批文章
43
43
  best-geo guide get scheduled-monitor # 要定期盯 AI 有没有提到你、怎么评价你
44
+ best-geo guide get indexing-query # 现在就拿几个问题去问几家 AI,取回原话、引用来源和拆解词
44
45
  best-geo guide get publication # 要把内容发出去/投稿,或查发出去没有、发到哪个链接、花了多少钱
45
46
  ```
46
47