best-geo-test 0.3.6 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -256,7 +256,7 @@
256
256
  "mode": "read",
257
257
  "guide": "question",
258
258
  "requiresPlan": false,
259
- "description": "列出搜索问题。可按公司或 GEO 项目限定。",
259
+ "description": "列出搜索问题。可按公司或 GEO 项目限定。每条问题的来源、类型、营销阶段念 sourceLabel / questionTypeLabel / stageLabel,Label 为空是老数据没有这一项。",
260
260
  "inputSchema": {
261
261
  "type": "object",
262
262
  "properties": {
@@ -740,7 +740,7 @@
740
740
  "mode": "read",
741
741
  "guide": "knowledge",
742
742
  "requiresPlan": false,
743
- "description": "按 ID 读一个知识库,含每个文档的解析状态。新建之后就是靠它确认解析完没完。文档状态取值:0=待处理,1=解析中,2=可用,3=失败——和知识库本体的状态不是同一套编码。",
743
+ "description": "按 ID 读一个知识库,含每个文档的解析状态。新建之后就是靠它确认解析完没完。文档的解析状态念 documents[].statusLabel,别拿数值自己翻——文档的 2 才是「可用」,和知识库本体那套编码正好错开一位。",
744
744
  "inputSchema": {
745
745
  "type": "object",
746
746
  "properties": {
@@ -1655,7 +1655,7 @@
1655
1655
  "mode": "read",
1656
1656
  "guide": "scheduled-monitor",
1657
1657
  "requiresPlan": false,
1658
- "description": "定时收录计划的执行历史。想知道「上次跑完了没、跑到第几个」看这里:taskTotal 是这次要问多少次,taskFinished 是已经问完多少次。status:0=还在跑,1=已跑完,2=超时,3=失败。",
1658
+ "description": "定时收录计划的执行历史。想知道「上次跑完了没、跑到第几个」看这里:taskTotal 是这次要问多少次,taskFinished 是已经问完多少次。跑成什么样念 statusLabel;「已超时」和「已失败」不是一回事,超时那次通常已经采到一部分数据。",
1659
1659
  "inputSchema": {
1660
1660
  "type": "object",
1661
1661
  "properties": {
@@ -1739,7 +1739,7 @@
1739
1739
  "mode": "read",
1740
1740
  "guide": "scheduled-monitor",
1741
1741
  "requiresPlan": false,
1742
- "description": "定时舆情计划的执行历史。想知道「上次跑完了没、跑到第几个」看这里:taskTotal 是这次要问多少次,taskFinished 是已经问完多少次。status:0=还在跑,1=已跑完,2=超时,3=失败。",
1742
+ "description": "定时舆情计划的执行历史。想知道「上次跑完了没、跑到第几个」看这里:taskTotal 是这次要问多少次,taskFinished 是已经问完多少次。跑成什么样念 statusLabel;「已超时」和「已失败」不是一回事,超时那次通常已经采到一部分数据。",
1743
1743
  "inputSchema": {
1744
1744
  "type": "object",
1745
1745
  "properties": {
@@ -2423,7 +2423,7 @@
2423
2423
  "mode": "read",
2424
2424
  "guide": "scheduled-monitor",
2425
2425
  "requiresPlan": false,
2426
- "description": "定时收录:每一次提问的记录,含 AI 回答原文。metrics 只给数字(提及率、平均排名),这里给的是**AI 到底怎么说的**——要回答「豆包最近怎么评价我们」「它推荐了哪几家」就查这里。",
2426
+ "description": "定时收录:每一次提问的记录,含 AI 回答原文。metrics 只给数字(提及率、平均排名),这里给的是**AI 到底怎么说的**——要回答「豆包最近怎么评价我们」「它推荐了哪几家」就查这里。情感倾向念 rateLabel(rate 取值含 -1,是「消极」不是异常);rateLabel 为空表示这条还没打分。注意打分链路整体失败时会降级落 0(中立),所以一批记录清一色「中立」时,更可能是没打上分而不是 AI 真的都很中立。",
2427
2427
  "inputSchema": {
2428
2428
  "type": "object",
2429
2429
  "properties": {
@@ -2618,7 +2618,7 @@
2618
2618
  "mode": "read",
2619
2619
  "guide": "scheduled-monitor",
2620
2620
  "requiresPlan": false,
2621
- "description": "定时舆情:每一次提问的记录,含 AI 回答原文。要回答「AI 具体是怎么评价我们的」就查这里,metrics 只给褒贬词的汇总。",
2621
+ "description": "定时舆情:每一次提问的记录,含 AI 回答原文。要回答「AI 具体是怎么评价我们的」就查这里,metrics 只给褒贬词的汇总。情感倾向念 rateLabel(rate 取值含 -1,是「消极」不是异常);rateLabel 为空表示这条还没打分。",
2622
2622
  "inputSchema": {
2623
2623
  "type": "object",
2624
2624
  "properties": {
@@ -3805,6 +3805,269 @@
3805
3805
  "required": ["articleId"],
3806
3806
  "additionalProperties": false
3807
3807
  }
3808
+ },
3809
+ {
3810
+ "name": "dhVideos.avatars",
3811
+ "mode": "read",
3812
+ "guide": "video",
3813
+ "requiresPlan": false,
3814
+ "description": "列出可用的数字人形象,拿它的 id 当 trainingId 用。scope 不传只看自己训练的私有形象(多数账号是空的),要用平台公共形象就传 scope=public。",
3815
+ "inputSchema": {
3816
+ "type": "object",
3817
+ "properties": {
3818
+ "scope": { "type": "string", "enum": ["mine", "public"], "description": "mine 私有(默认)/ public 平台公共" },
3819
+ "sex": { "type": "integer", "enum": [1, 2], "description": "1 男 / 2 女" },
3820
+ "page": { "type": "integer", "default": 1 },
3821
+ "limit": { "type": "integer", "default": 20, "maximum": 100 }
3822
+ },
3823
+ "additionalProperties": false
3824
+ }
3825
+ },
3826
+ {
3827
+ "name": "dhVideos.voices",
3828
+ "mode": "read",
3829
+ "guide": "video",
3830
+ "requiresPlan": false,
3831
+ "description": "列出可用音色,拿它的 voiceId 用于文字合成。同形象,私有音色多数账号是空的,要平台公共音色就传 scope=public。",
3832
+ "inputSchema": {
3833
+ "type": "object",
3834
+ "properties": {
3835
+ "scope": { "type": "string", "enum": ["mine", "public"], "description": "mine 私有(默认)/ public 平台公共" },
3836
+ "status": { "type": "integer", "description": "状态过滤,仅 scope=mine 生效;不传或 4 = 全部" },
3837
+ "langCode": { "type": "string", "description": "语言码,如 zh-CN(仅 scope=public 生效)" },
3838
+ "sex": { "type": "integer", "enum": [1, 2], "description": "1 男 / 2 女(仅 scope=public 生效)" },
3839
+ "localName": { "type": "string", "description": "名称模糊搜索(仅 scope=public 生效)" },
3840
+ "page": { "type": "integer", "default": 1 },
3841
+ "limit": { "type": "integer", "default": 20, "maximum": 100 }
3842
+ },
3843
+ "additionalProperties": false
3844
+ }
3845
+ },
3846
+ {
3847
+ "name": "dhVideos.list",
3848
+ "mode": "read",
3849
+ "guide": "video",
3850
+ "requiresPlan": false,
3851
+ "description": "数字人合成任务列表。status 的负数不是错误:-3 等待音频 / -2 排队等待 / 0 合成中,都还在跑;1 才是成功(这时才有 videoUrl),2 是失败。",
3852
+ "inputSchema": {
3853
+ "type": "object",
3854
+ "properties": {
3855
+ "companyId": { "type": "integer", "minimum": 1 },
3856
+ "status": { "type": "integer", "enum": [-3, -2, 0, 1, 2] },
3857
+ "page": { "type": "integer", "default": 1 },
3858
+ "limit": { "type": "integer", "default": 20, "maximum": 100 }
3859
+ },
3860
+ "additionalProperties": false
3861
+ }
3862
+ },
3863
+ {
3864
+ "name": "dhVideos.get",
3865
+ "mode": "read",
3866
+ "guide": "video",
3867
+ "requiresPlan": false,
3868
+ "description": "查一条数字人合成任务。提交之后轮询它看进度,status=1 时 videoUrl 才有值。",
3869
+ "inputSchema": {
3870
+ "type": "object",
3871
+ "properties": { "id": { "type": "integer", "minimum": 1 } },
3872
+ "required": ["id"],
3873
+ "additionalProperties": false
3874
+ }
3875
+ },
3876
+ {
3877
+ "name": "clipTasks.templates",
3878
+ "mode": "read",
3879
+ "guide": "video",
3880
+ "requiresPlan": false,
3881
+ "description": "列出可用剪辑模板,拿 code 当 template 用。注意 requireAiMedia=true 的模板必须同时把 enableAiMedia 设成 true,否则上游报参数错误。",
3882
+ "inputSchema": {
3883
+ "type": "object",
3884
+ "properties": {
3885
+ "keyword": { "type": "string", "description": "按 code / name 模糊搜索" },
3886
+ "templateType": { "type": "string", "enum": ["blog-talk", "mix-cut", "podcast"], "description": "口播 / 混剪 / 播客" },
3887
+ "page": { "type": "integer", "default": 1 },
3888
+ "limit": { "type": "integer", "default": 20, "maximum": 100 }
3889
+ },
3890
+ "additionalProperties": false
3891
+ }
3892
+ },
3893
+ {
3894
+ "name": "clipTasks.bgm",
3895
+ "mode": "read",
3896
+ "guide": "video",
3897
+ "requiresPlan": false,
3898
+ "description": "系统背景音乐曲库,拿返回的 url 填到 clipEnhance.bgmUrl。不填的话上游会按字幕语义自动选曲,多数情况不用管这个。",
3899
+ "inputSchema": {
3900
+ "type": "object",
3901
+ "properties": {
3902
+ "keyword": { "type": "string", "description": "曲名模糊搜索" },
3903
+ "page": { "type": "integer", "default": 1 },
3904
+ "limit": { "type": "integer", "default": 20, "maximum": 100 }
3905
+ },
3906
+ "additionalProperties": false
3907
+ }
3908
+ },
3909
+ {
3910
+ "name": "clipTasks.list",
3911
+ "mode": "read",
3912
+ "guide": "video",
3913
+ "requiresPlan": false,
3914
+ "description": "智能剪辑任务列表。status 不按流程顺序排:-2 预处理中 / -1 等待派单 / 4 渲染中都还在跑,1 才是完成,2 是失败。想确认某条成片剪过没有,带上 dhVideoTaskId 查,别翻页去对。",
3915
+ "inputSchema": {
3916
+ "type": "object",
3917
+ "properties": {
3918
+ "companyId": { "type": "integer", "minimum": 1 },
3919
+ "status": { "type": "integer", "enum": [-2, -1, 1, 2, 4] },
3920
+ "dhVideoTaskId": { "type": "array", "items": { "type": "integer", "minimum": 1 }, "description": "按来源数字人任务过滤" },
3921
+ "page": { "type": "integer", "default": 1 },
3922
+ "limit": { "type": "integer", "default": 20, "maximum": 100 }
3923
+ },
3924
+ "additionalProperties": false
3925
+ }
3926
+ },
3927
+ {
3928
+ "name": "clipTasks.get",
3929
+ "mode": "read",
3930
+ "guide": "video",
3931
+ "requiresPlan": false,
3932
+ "description": "查一条剪辑任务。status=1 时 outputMp4Url 才有值。",
3933
+ "inputSchema": {
3934
+ "type": "object",
3935
+ "properties": { "id": { "type": "integer", "minimum": 1 } },
3936
+ "required": ["id"],
3937
+ "additionalProperties": false
3938
+ }
3939
+ },
3940
+ {
3941
+ "name": "dhVideos.create",
3942
+ "mode": "write",
3943
+ "guide": "video",
3944
+ "requiresPlan": true,
3945
+ "description": "提交数字人视频合成。文字合成(text + voiceId + voiceExtra.languageBoost)与声音合成(audioUrl)二选一,都传或都不传都会被拒。按成片时长计费,PRO 画质的计费秒数按倍率放大。⚠️ 提交时不扣费,成片之后按真实时长结算,所以计划里的金额是预估值。打开 enableClip 可以在合成成功后自动发起智能剪辑,那是**另一笔钱**。合成是异步的,执行完只拿到任务号,要用 dhVideos.get 轮询。",
3946
+ "inputSchema": {
3947
+ "type": "object",
3948
+ "properties": {
3949
+ "companyId": { "type": "integer", "minimum": 1 },
3950
+ "productId": { "type": "integer", "minimum": 1, "description": "归到哪个 GEO 项目,可不填" },
3951
+ "trainingId": { "type": "integer", "minimum": 1, "description": "数字人形象ID,用 dhVideos.avatars 查" },
3952
+ "avatarName": { "type": "string", "maxLength": 100, "description": "形象名称快照,可不填" },
3953
+ "version": { "type": "integer", "enum": [1, 2], "description": "1 LITE 标准 / 2 PRO 高清(PRO 更贵)" },
3954
+ "videoName": { "type": "string", "maxLength": 30 },
3955
+ "text": { "type": "string", "maxLength": 10000, "description": "文字合成模式:要念的文案" },
3956
+ "voiceId": { "type": "string", "maxLength": 100, "description": "文字合成模式:音色ID,用 dhVideos.voices 查" },
3957
+ "audioUrl": { "type": "string", "maxLength": 1000, "description": "声音合成模式:公网可直连的 http(s) 音频地址" },
3958
+ "voiceExtra": {
3959
+ "type": "object",
3960
+ "description": "文字合成模式必填(至少给 languageBoost)",
3961
+ "properties": {
3962
+ "languageBoost": { "type": "string", "minLength": 1, "maxLength": 50, "description": "语种增强,如 Chinese / English / auto" },
3963
+ "speed": { "type": "number", "minimum": 0.5, "maximum": 2, "description": "语速" },
3964
+ "vol": { "type": "number", "minimum": 0.01, "maximum": 10, "description": "音量" },
3965
+ "pitch": { "type": "number", "minimum": -12, "maximum": 12, "description": "语调" },
3966
+ "emotion": { "type": "string", "maxLength": 50 },
3967
+ "timbre": { "type": "number", "minimum": -100, "maximum": 100, "description": "音色" },
3968
+ "soundEffects": { "type": "string", "maxLength": 50 }
3969
+ },
3970
+ "required": ["languageBoost"],
3971
+ "additionalProperties": false
3972
+ },
3973
+ "enableClip": { "type": "boolean", "description": "合成成功后自动发起智能剪辑。**这是另一笔钱**,要问过用户" },
3974
+ "clipTemplate": { "type": "string", "maxLength": 64, "description": "enableClip 为 true 时必填,用 clipTasks.templates 查" },
3975
+ "clipEnableAiMedia": { "type": "boolean", "description": "允许剪辑用 AI 生图,按张另外计费。选中 requireAiMedia=true 的模板时必须为 true" },
3976
+ "clipEnhance": {
3977
+ "type": "object",
3978
+ "description": "剪辑的画面增强,enableClip 为 true 时才生效",
3979
+ "properties": {
3980
+ "personName": { "type": "string", "maxLength": 50, "description": "人物名片·姓名。必须和 personIntro 一起给" },
3981
+ "personIntro": { "type": "string", "maxLength": 50, "description": "人物名片·一句话介绍。必须和 personName 一起给" },
3982
+ "bgmUrl": { "type": "string", "maxLength": 512, "description": "背景音乐地址,必须是 http(s)。不传则上游自动选曲" },
3983
+ "coverUrl": { "type": "string", "maxLength": 512, "description": "成片封面地址,必须是 http(s)。不传则自动截首帧" },
3984
+ "materials": {
3985
+ "type": "array",
3986
+ "maxItems": 20,
3987
+ "description": "补充素材,只收图片素材库的 id,最多 20 条",
3988
+ "items": {
3989
+ "type": "object",
3990
+ "properties": {
3991
+ "id": { "type": "integer", "minimum": 1 },
3992
+ "description": { "type": "string", "maxLength": 500, "description": "画面描述;不传则用素材库里的语义描述" }
3993
+ },
3994
+ "required": ["id"],
3995
+ "additionalProperties": false
3996
+ }
3997
+ }
3998
+ },
3999
+ "additionalProperties": false
4000
+ },
4001
+ "publishMeta": {
4002
+ "type": "object",
4003
+ "description": "发布四件套,成片归档进素材库时用",
4004
+ "properties": {
4005
+ "mainTitle": { "type": "string", "maxLength": 10, "description": "封面主标题" },
4006
+ "subTitle": { "type": "string", "maxLength": 12, "description": "封面副标题" },
4007
+ "description": { "type": "string", "maxLength": 300, "description": "视频描述" },
4008
+ "topics": { "type": "array", "maxItems": 10, "items": { "type": "string", "maxLength": 20 }, "description": "话题,纯词不带 #" }
4009
+ },
4010
+ "additionalProperties": false
4011
+ }
4012
+ },
4013
+ "required": ["companyId", "trainingId", "version"],
4014
+ "additionalProperties": false
4015
+ }
4016
+ },
4017
+ {
4018
+ "name": "clipTasks.create",
4019
+ "mode": "write",
4020
+ "guide": "video",
4021
+ "requiresPlan": true,
4022
+ "description": "拿一条已提交的数字人任务当底板发起智能剪辑。系统里没有凭空剪辑的入口,必须先有数字人任务。不要求它已经合成完——剪辑会自己等底板成片,但那时报价只能按兜底秒数估。⚠️ 提交时不扣费,成片之后按真实时长结算。剪辑是异步的,用 clipTasks.get 轮询。",
4023
+ "inputSchema": {
4024
+ "type": "object",
4025
+ "properties": {
4026
+ "dhVideoTaskId": { "type": "integer", "minimum": 1, "description": "来源数字人任务ID,用 dhVideos.list 查" },
4027
+ "template": { "type": "string", "minLength": 1, "maxLength": 64, "description": "剪辑模板 code,用 clipTasks.templates 查" },
4028
+ "workName": { "type": "string", "maxLength": 100, "description": "作品命名;不传则沿用数字人的视频名称" },
4029
+ "userPrompt": { "type": "string", "maxLength": 500, "description": "自然语言的剪辑偏好,比如「节奏明快一些」" },
4030
+ "enableAiMedia": { "type": "boolean", "description": "允许 AI 生图,按张另外计费。选中 requireAiMedia=true 的模板时必须为 true" },
4031
+ "clipEnhance": {
4032
+ "type": "object",
4033
+ "description": "画面增强:人物名片 / 背景音乐 / 补充素材 / 成片封面",
4034
+ "properties": {
4035
+ "personName": { "type": "string", "maxLength": 50, "description": "人物名片·姓名。必须和 personIntro 一起给" },
4036
+ "personIntro": { "type": "string", "maxLength": 50, "description": "人物名片·一句话介绍。必须和 personName 一起给" },
4037
+ "bgmUrl": { "type": "string", "maxLength": 512, "description": "背景音乐地址,必须是 http(s)。不传则上游自动选曲" },
4038
+ "coverUrl": { "type": "string", "maxLength": 512, "description": "成片封面地址,必须是 http(s)。不传则自动截首帧" },
4039
+ "materials": {
4040
+ "type": "array",
4041
+ "maxItems": 20,
4042
+ "description": "补充素材,只收图片素材库的 id,最多 20 条",
4043
+ "items": {
4044
+ "type": "object",
4045
+ "properties": {
4046
+ "id": { "type": "integer", "minimum": 1 },
4047
+ "description": { "type": "string", "maxLength": 500, "description": "画面描述;不传则用素材库里的语义描述" }
4048
+ },
4049
+ "required": ["id"],
4050
+ "additionalProperties": false
4051
+ }
4052
+ }
4053
+ },
4054
+ "additionalProperties": false
4055
+ },
4056
+ "publishMeta": {
4057
+ "type": "object",
4058
+ "description": "发布四件套,成片归档进素材库时用;不传则沿用数字人任务上的那份",
4059
+ "properties": {
4060
+ "mainTitle": { "type": "string", "maxLength": 10 },
4061
+ "subTitle": { "type": "string", "maxLength": 12 },
4062
+ "description": { "type": "string", "maxLength": 300 },
4063
+ "topics": { "type": "array", "maxItems": 10, "items": { "type": "string", "maxLength": 20 }, "description": "话题,纯词不带 #" }
4064
+ },
4065
+ "additionalProperties": false
4066
+ }
4067
+ },
4068
+ "required": ["dhVideoTaskId", "template"],
4069
+ "additionalProperties": false
4070
+ }
3808
4071
  }
3809
4072
  ]
3810
4073
  }
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Pt=Object.defineProperty;var Dt=(e,t,n)=>t in e?Pt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var oe=(e,t,n)=>Dt(e,typeof t!="symbol"?t+"":t,n);var ie="https://nbgeo.aimusiclj.com",Ce="best-geo-test",Re="best-geo-test",Te="bg-test-cli-",Oe="0.3.6";var B=1,x=Oe,L=Re,p=Ce,$e="dev",Q=Mt(Ut());function Ut(){var e;return(e=process.env.BEST_GEO_API_BASE)!=null?e:ie}var X=Te,Ne=300*1e3,Le=30*1e3,Pe=300*1e3;function Mt(e){return e.replace(/\/+$/,"")}var Xe=require("node:child_process");var Be=require("node:crypto"),W=require("node:os");var f=require("node:fs"),De=require("node:os"),V=require("node:path");var Ue=require("node:crypto");var w=class extends Error{constructor(n,r,o){super(o);oe(this,"reason",n);oe(this,"path",r);this.name="LocalConfigError"}},Ft={schemaVersion:1,device:null,activeCredential:null,pendingCredential:null};function K(){var e;return(e=process.env.BEST_GEO_CONFIG_DIR)!=null?e:(0,V.join)((0,De.homedir)(),`.${p}`)}function R(){return(0,V.join)(K(),"config.json")}function A(){var n,r,o;let e=R(),t;try{if(!(0,f.existsSync)(e))return null;Vt(e),t=(0,f.readFileSync)(e,"utf8")}catch(i){throw i instanceof w?i:Me(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 w("corrupted",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5185\u5BB9\u4E0D\u5B8C\u6574\u6216\u683C\u5F0F\u4E0D\u5BF9\uFF1A${e}`)}}function Bt(e){let t=K(),n=R(),r=(0,V.join)(t,`.config.json.${(0,Ue.randomBytes)(6).toString("hex")}.tmp`);try{(0,f.existsSync)(t)||(0,f.mkdirSync)(t,{recursive:!0,mode:448});let o=(0,f.openSync)(r,"wx",384);try{(0,f.writeSync)(o,`${JSON.stringify(e,null,2)}
3
- `),(0,f.fsyncSync)(o)}finally{(0,f.closeSync)(o)}(0,f.renameSync)(r,n)}catch(o){if((0,f.existsSync)(r))try{(0,f.unlinkSync)(r)}catch{}throw Me(o,n)}}function S(e){var n;let t=e((n=A())!=null?n:{...Ft});return Bt(t),t}function Vt(e){var r;if(process.platform==="win32")return;let t=(0,f.statSync)(e),n=(r=process.getuid)==null?void 0:r.call(process);if(n!=null&&t.uid!==n)throw new w("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 w("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 Me(e,t){let n=e==null?void 0:e.code;return n==="EACCES"||n==="EPERM"||n==="EROFS"?new w("denied",t,`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\uFF1A${t}`):e instanceof Error?e:new Error(String(e))}var Kt=3600*1e3;function Fe(){return(0,V.join)(K(),"pending-uploads.json")}function q(){let e=Fe();if(!(0,f.existsSync)(e))return{};try{let t=JSON.parse((0,f.readFileSync)(e,"utf8")),n=Date.now();return Object.fromEntries(Object.entries(t).filter(([,r])=>{var o;return n-((o=r==null?void 0:r.createdAt)!=null?o:0)<Kt}))}catch{return{}}}function se(e){(0,f.mkdirSync)(K(),{recursive:!0,mode:448}),(0,f.writeFileSync)(Fe(),JSON.stringify(e),{mode:384})}function Ve(){var t,n;let e=(t=A())==null?void 0:t.device;return(n=e==null?void 0:e.deviceId)!=null&&n.startsWith(X)?e.deviceId:null}function Y(){var r,o;let e={deviceName:(0,W.hostname)().slice(0,50),platform:`${(0,W.platform)()}-${process.arch}`},t=(r=A())==null?void 0:r.device;if((o=t==null?void 0:t.deviceId)!=null&&o.startsWith(X))return t.deviceName===e.deviceName&&t.platform===e.platform?t:S(i=>({...i,device:{...t,...e}})).device;let n={deviceId:`${X}${(0,Be.randomUUID)()}`,...e};return S(i=>({...i,device:n})).device}function Ke(){return`cli_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function k(e,t=Ke()){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:Ke(),...n.data==null?{}:{data:n.data},...n.nextAction==null?{}:{nextAction:n.nextAction}}}function a(e){process.stdout.write(`${JSON.stringify(e)}
4
- `),e.ok||(process.exitCode=1)}async function y(e,t={}){var i,s;let n=new URL(`${Q}/v1/agent-cli${e}`);for(let[d,m]of Object.entries((i=t.query)!=null?i:{}))if(m!=null)for(let c of Array.isArray(m)?m:[m])n.searchParams.append(d,String(c));let r={"X-GEO-CLI-Version":x,"X-GEO-Protocol-Version":String(B),"X-GEO-CLI-Package":L},o=null;try{o=Ve()}catch{}o&&(r["X-Device-ID"]=o),t.apiKey&&(r.Authorization=`Bearer ${t.apiKey}`),t.body!=null&&(r["Content-Type"]="application/json");try{let d=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?Pe:Le)}),m=await d.text();try{let c=JSON.parse(m);return qt(c)?c:l("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}catch{return l("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}}catch(d){return d instanceof Error&&(d.name==="TimeoutError"||d.name==="AbortError")?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${d instanceof Error?d.message:String(d)}`,{data:{transportFailure:!0},nextAction:{type:"ask_user",message:"\u8BF7\u786E\u8BA4\u7F51\u7EDC\u53EF\u7528\uFF0C\u4EE5\u53CA\u670D\u52A1\u7AEF\u5730\u5740\u914D\u7F6E\u6B63\u786E"}})}}function qt(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.ok=="boolean"&&typeof t.code=="string"}function jt(e){var t;return!e.ok&&((t=e.data)==null?void 0:t.transportFailure)===!0}function ae(e){return e.ok||jt(e)?!1:["AUTH_EXPIRED","DEVICE_MISMATCH","ACCESS_DENIED","AUTH_REQUIRED","VALIDATION_FAILED"].includes(e.code)}function P(){var e,t,n;return(n=(t=(e=A())==null?void 0:e.activeCredential)==null?void 0:t.apiKey)!=null?n:null}function Z(){var e,t;return(t=(e=A())==null?void 0:e.activeCredential)!=null?t:null}function qe(){var e,t;return(t=(e=A())==null?void 0:e.pendingCredential)!=null?t:null}function je(e){S(t=>({...t,pendingCredential:{apiKey:e,startedAt:new Date().toISOString()}}))}function le(){S(e=>({...e,pendingCredential:null}))}function de(e){return S(t=>{let n=t.pendingCredential;return n?{...t,activeCredential:{apiKey:n.apiKey,...e},pendingCredential:null}:t}).activeCredential}function Ge(){S(e=>({...e,activeCredential:null,pendingCredential:null}))}var _=require("node:crypto"),Je=require("node:http");function He(e){let t=`
2
+ "use strict";var Pt=Object.defineProperty;var Dt=(e,t,n)=>t in e?Pt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var oe=(e,t,n)=>Dt(e,typeof t!="symbol"?t+"":t,n);var ie="https://nbgeo.aimusiclj.com",Ce="best-geo-test",Te="best-geo-test",Re="bg-test-cli-",Oe="1.0.1";var F=1,x=Oe,L=Te,c=Ce,$e="dev",Q=Mt(Ut());function Ut(){var e;return(e=process.env.BEST_GEO_API_BASE)!=null?e:ie}var X=Re,Ne=300*1e3,Le=30*1e3,Pe=300*1e3;function Mt(e){return e.replace(/\/+$/,"")}var Xe=require("node:child_process");var Fe=require("node:crypto"),W=require("node:os");var f=require("node:fs"),De=require("node:os"),B=require("node:path");var Ue=require("node:crypto");var w=class extends Error{constructor(n,r,o){super(o);oe(this,"reason",n);oe(this,"path",r);this.name="LocalConfigError"}},Vt={schemaVersion:1,device:null,activeCredential:null,pendingCredential:null};function K(){var e;return(e=process.env.BEST_GEO_CONFIG_DIR)!=null?e:(0,B.join)((0,De.homedir)(),`.${c}`)}function T(){return(0,B.join)(K(),"config.json")}function A(){var n,r,o;let e=T(),t;try{if(!(0,f.existsSync)(e))return null;Bt(e),t=(0,f.readFileSync)(e,"utf8")}catch(i){throw i instanceof w?i:Me(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 w("corrupted",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5185\u5BB9\u4E0D\u5B8C\u6574\u6216\u683C\u5F0F\u4E0D\u5BF9\uFF1A${e}`)}}function Ft(e){let t=K(),n=T(),r=(0,B.join)(t,`.config.json.${(0,Ue.randomBytes)(6).toString("hex")}.tmp`);try{(0,f.existsSync)(t)||(0,f.mkdirSync)(t,{recursive:!0,mode:448});let o=(0,f.openSync)(r,"wx",384);try{(0,f.writeSync)(o,`${JSON.stringify(e,null,2)}
3
+ `),(0,f.fsyncSync)(o)}finally{(0,f.closeSync)(o)}(0,f.renameSync)(r,n)}catch(o){if((0,f.existsSync)(r))try{(0,f.unlinkSync)(r)}catch{}throw Me(o,n)}}function S(e){var n;let t=e((n=A())!=null?n:{...Vt});return Ft(t),t}function Bt(e){var r;if(process.platform==="win32")return;let t=(0,f.statSync)(e),n=(r=process.getuid)==null?void 0:r.call(process);if(n!=null&&t.uid!==n)throw new w("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 w("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 Me(e,t){let n=e==null?void 0:e.code;return n==="EACCES"||n==="EPERM"||n==="EROFS"?new w("denied",t,`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\uFF1A${t}`):e instanceof Error?e:new Error(String(e))}var Kt=3600*1e3;function Ve(){return(0,B.join)(K(),"pending-uploads.json")}function q(){let e=Ve();if(!(0,f.existsSync)(e))return{};try{let t=JSON.parse((0,f.readFileSync)(e,"utf8")),n=Date.now();return Object.fromEntries(Object.entries(t).filter(([,r])=>{var o;return n-((o=r==null?void 0:r.createdAt)!=null?o:0)<Kt}))}catch{return{}}}function se(e){(0,f.mkdirSync)(K(),{recursive:!0,mode:448}),(0,f.writeFileSync)(Ve(),JSON.stringify(e),{mode:384})}function Be(){var t,n;let e=(t=A())==null?void 0:t.device;return(n=e==null?void 0:e.deviceId)!=null&&n.startsWith(X)?e.deviceId:null}function Y(){var r,o;let e={deviceName:(0,W.hostname)().slice(0,50),platform:`${(0,W.platform)()}-${process.arch}`},t=(r=A())==null?void 0:r.device;if((o=t==null?void 0:t.deviceId)!=null&&o.startsWith(X))return t.deviceName===e.deviceName&&t.platform===e.platform?t:S(i=>({...i,device:{...t,...e}})).device;let n={deviceId:`${X}${(0,Fe.randomUUID)()}`,...e};return S(i=>({...i,device:n})).device}function Ke(){return`cli_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function k(e,t=Ke()){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:Ke(),...n.data==null?{}:{data:n.data},...n.nextAction==null?{}:{nextAction:n.nextAction}}}function a(e){process.stdout.write(`${JSON.stringify(e)}
4
+ `),e.ok||(process.exitCode=1)}async function y(e,t={}){var i,s;let n=new URL(`${Q}/v1/agent-cli${e}`);for(let[d,m]of Object.entries((i=t.query)!=null?i:{}))if(m!=null)for(let p of Array.isArray(m)?m:[m])n.searchParams.append(d,String(p));let r={"X-GEO-CLI-Version":x,"X-GEO-Protocol-Version":String(F),"X-GEO-CLI-Package":L},o=null;try{o=Be()}catch{}o&&(r["X-Device-ID"]=o),t.apiKey&&(r.Authorization=`Bearer ${t.apiKey}`),t.body!=null&&(r["Content-Type"]="application/json");try{let d=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?Pe:Le)}),m=await d.text();try{let p=JSON.parse(m);return qt(p)?p:l("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}catch{return l("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}}catch(d){return d instanceof Error&&(d.name==="TimeoutError"||d.name==="AbortError")?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${d instanceof Error?d.message:String(d)}`,{data:{transportFailure:!0},nextAction:{type:"ask_user",message:"\u8BF7\u786E\u8BA4\u7F51\u7EDC\u53EF\u7528\uFF0C\u4EE5\u53CA\u670D\u52A1\u7AEF\u5730\u5740\u914D\u7F6E\u6B63\u786E"}})}}function qt(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.ok=="boolean"&&typeof t.code=="string"}function jt(e){var t;return!e.ok&&((t=e.data)==null?void 0:t.transportFailure)===!0}function ae(e){return e.ok||jt(e)?!1:["AUTH_EXPIRED","DEVICE_MISMATCH","ACCESS_DENIED","AUTH_REQUIRED","VALIDATION_FAILED"].includes(e.code)}function P(){var e,t,n;return(n=(t=(e=A())==null?void 0:e.activeCredential)==null?void 0:t.apiKey)!=null?n:null}function Z(){var e,t;return(t=(e=A())==null?void 0:e.activeCredential)!=null?t:null}function qe(){var e,t;return(t=(e=A())==null?void 0:e.pendingCredential)!=null?t:null}function je(e){S(t=>({...t,pendingCredential:{apiKey:e,startedAt:new Date().toISOString()}}))}function le(){S(e=>({...e,pendingCredential:null}))}function de(e){return S(t=>{let n=t.pendingCredential;return n?{...t,activeCredential:{apiKey:n.apiKey,...e},pendingCredential:null}:t}).activeCredential}function Ge(){S(e=>({...e,activeCredential:null,pendingCredential:null}))}var _=require("node:crypto"),Je=require("node:http");function He(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 Gt=256,Ht=4*1024,ce=3e4;function zt(){if(!1)return ce;let e=Number(process.env.BEST_GEO_TEST_CLAIM_WAIT_MS);return!Number.isFinite(e)||e<=0?ce:Math.min(e,ce)}var Jt=1500,pe=15e3;function Qt(){if(!1)return pe;let e=Number(process.env.BEST_GEO_TEST_RESULT_TTL_MS);return!Number.isFinite(e)||e<=0?pe:Math.min(e,pe)}async function Qe(){let e=(0,_.randomBytes)(16).toString("hex"),t=(0,_.randomBytes)(16).toString("hex"),n=(0,_.randomBytes)(16).toString("hex"),{html:r,scriptHash:o}=He(t),i=(0,_.createHash)("sha256").update(o).digest("base64"),s=null;function d(){let g=new Promise((u,$)=>{s={resolve:u,reject:$}});return g.catch(()=>{}),g}let m=d(),c=!1,I=!1,b=null,C=null,H=null,F=null;function Tt(){F==null&&(F=setTimeout(()=>z(),Jt),F.unref())}let v=(0,Je.createServer)((g,u)=>{Ot(g,u).catch(()=>{u.writeHead(500,{"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!1,message:"internal error"}))})});async function Ot(g,u){var ke,Ee,Ie,ve,we,Ae,Se;let $=new URL((ke=g.url)!=null?ke:"/","http://127.0.0.1");if(g.method==="GET"&&$.pathname==="/"){if($.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"&&$.pathname==="/submit"){let Nt=g.headers.origin,Lt=`http://127.0.0.1:${v.address().port}`;if(Nt!==Lt){h(u,403,{ok:!1,message:"origin rejected"});return}if(!ze(String((Ee=g.headers["x-csrf-token"])!=null?Ee:""),t)){h(u,403,{ok:!1,message:"csrf rejected"});return}if(!String((Ie=g.headers.cookie)!=null?Ie:"").includes(`bg_session=${n}`)){h(u,403,{ok:!1,message:"session rejected"});return}if(!String((ve=g.headers["content-type"])!=null?ve:"").includes("application/json")){h(u,415,{ok:!1,message:"content-type rejected"});return}if(c){h(u,409,{ok:!1,message:"already submitted"});return}let _e=await Xt(g);if(_e==null){h(u,413,{ok:!1,message:"body too large"});return}let J="";try{J=String((we=JSON.parse(_e).key)!=null?we:"").trim()}catch{h(u,400,{ok:!1,message:"invalid json"});return}if(!J||J.length>Gt){h(u,400,{ok:!1,message:"invalid key"});return}c=!0,I=!0,b=null,h(u,200,{ok:!0}),s==null||s.resolve(J),clearTimeout(re),C=setTimeout(()=>{ye({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()),C.unref();return}if(g.method==="GET"&&$.pathname==="/result"){if(!ze(String((Ae=g.headers["x-csrf-token"])!=null?Ae:""),t)){h(u,403,{ok:!1,message:"csrf rejected"});return}if(!String((Se=g.headers.cookie)!=null?Se:"").includes(`bg_session=${n}`)){h(u,403,{ok:!1,message:"session rejected"});return}if(!I){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||Tt();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"});v.on("error",g=>{s==null||s.reject(g)}),await new Promise((g,u)=>{v.once("error",u),v.listen(0,"127.0.0.1",()=>{v.removeListener("error",u),g()})});let $t=v.address().port,re=he();function he(){let g=setTimeout(()=>{s==null||s.reject(new Error("LOCAL_INTAKE_TIMEOUT")),z()},Ne);return g.unref(),g}function ye(g){if(b==null){if(b=g,C&&(clearTimeout(C),C=null),g.retryable){c=!1,m=d(),re=he();return}H=setTimeout(()=>z(),Qt()),H.unref()}}let xe=!1;function z(){var g;if(!xe){xe=!0,clearTimeout(re);for(let u of[C,H,F])u&&clearTimeout(u);C=null,H=null,F=null,(g=v.closeAllConnections)==null||g.call(v),v.close()}}return{url:`http://127.0.0.1:${$t}/?state=${e}`,nextKey:()=>m,publishResult:ye,close:z}}function h(e,t,n){e.writeHead(t,{"Content-Type":"application/json","Cache-Control":"no-store"}),e.end(JSON.stringify(n))}async function Xt(e){let t=[],n=0;for await(let r of e){if(n+=r.length,n>Ht)return null;t.push(r)}return Buffer.concat(t).toString("utf8")}function ze(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&(0,_.timingSafeEqual)(n,r)}async function j(){let e=qe();if(!e)return null;let t=await tt(e.apiKey);return t.ok?(de({userId:t.data.user.id,agentId:t.data.agentId,companyIds:t.data.companyIds}),null):ae(t)?(le(),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 We(){var d;let e=Y(),t=await j();if(t){a(t);return}let n=P(),r;try{r=await Qe()}catch(m){a(l("HOST_PERMISSION_REQUIRED",`\u65E0\u6CD5\u5728\u672C\u673A\u542F\u52A8\u5F55\u5165\u670D\u52A1\uFF1A${Zt(m)}`,{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}Yt(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 Gt=256,Ht=4*1024,pe=3e4;function zt(){if(!1)return pe;let e=Number(process.env.BEST_GEO_TEST_CLAIM_WAIT_MS);return!Number.isFinite(e)||e<=0?pe:Math.min(e,pe)}var Jt=1500,ce=15e3;function Qt(){if(!1)return ce;let e=Number(process.env.BEST_GEO_TEST_RESULT_TTL_MS);return!Number.isFinite(e)||e<=0?ce:Math.min(e,ce)}async function Qe(){let e=(0,_.randomBytes)(16).toString("hex"),t=(0,_.randomBytes)(16).toString("hex"),n=(0,_.randomBytes)(16).toString("hex"),{html:r,scriptHash:o}=He(t),i=(0,_.createHash)("sha256").update(o).digest("base64"),s=null;function d(){let g=new Promise((u,$)=>{s={resolve:u,reject:$}});return g.catch(()=>{}),g}let m=d(),p=!1,I=!1,b=null,C=null,H=null,V=null;function Rt(){V==null&&(V=setTimeout(()=>z(),Jt),V.unref())}let v=(0,Je.createServer)((g,u)=>{Ot(g,u).catch(()=>{u.writeHead(500,{"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!1,message:"internal error"}))})});async function Ot(g,u){var ke,Ee,Ie,ve,we,Ae,Se;let $=new URL((ke=g.url)!=null?ke:"/","http://127.0.0.1");if(g.method==="GET"&&$.pathname==="/"){if($.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"&&$.pathname==="/submit"){let Nt=g.headers.origin,Lt=`http://127.0.0.1:${v.address().port}`;if(Nt!==Lt){h(u,403,{ok:!1,message:"origin rejected"});return}if(!ze(String((Ee=g.headers["x-csrf-token"])!=null?Ee:""),t)){h(u,403,{ok:!1,message:"csrf rejected"});return}if(!String((Ie=g.headers.cookie)!=null?Ie:"").includes(`bg_session=${n}`)){h(u,403,{ok:!1,message:"session rejected"});return}if(!String((ve=g.headers["content-type"])!=null?ve:"").includes("application/json")){h(u,415,{ok:!1,message:"content-type rejected"});return}if(p){h(u,409,{ok:!1,message:"already submitted"});return}let _e=await Xt(g);if(_e==null){h(u,413,{ok:!1,message:"body too large"});return}let J="";try{J=String((we=JSON.parse(_e).key)!=null?we:"").trim()}catch{h(u,400,{ok:!1,message:"invalid json"});return}if(!J||J.length>Gt){h(u,400,{ok:!1,message:"invalid key"});return}p=!0,I=!0,b=null,h(u,200,{ok:!0}),s==null||s.resolve(J),clearTimeout(re),C=setTimeout(()=>{ye({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()),C.unref();return}if(g.method==="GET"&&$.pathname==="/result"){if(!ze(String((Ae=g.headers["x-csrf-token"])!=null?Ae:""),t)){h(u,403,{ok:!1,message:"csrf rejected"});return}if(!String((Se=g.headers.cookie)!=null?Se:"").includes(`bg_session=${n}`)){h(u,403,{ok:!1,message:"session rejected"});return}if(!I){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||Rt();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"});v.on("error",g=>{s==null||s.reject(g)}),await new Promise((g,u)=>{v.once("error",u),v.listen(0,"127.0.0.1",()=>{v.removeListener("error",u),g()})});let $t=v.address().port,re=he();function he(){let g=setTimeout(()=>{s==null||s.reject(new Error("LOCAL_INTAKE_TIMEOUT")),z()},Ne);return g.unref(),g}function ye(g){if(b==null){if(b=g,C&&(clearTimeout(C),C=null),g.retryable){p=!1,m=d(),re=he();return}H=setTimeout(()=>z(),Qt()),H.unref()}}let xe=!1;function z(){var g;if(!xe){xe=!0,clearTimeout(re);for(let u of[C,H,V])u&&clearTimeout(u);C=null,H=null,V=null,(g=v.closeAllConnections)==null||g.call(v),v.close()}}return{url:`http://127.0.0.1:${$t}/?state=${e}`,nextKey:()=>m,publishResult:ye,close:z}}function h(e,t,n){e.writeHead(t,{"Content-Type":"application/json","Cache-Control":"no-store"}),e.end(JSON.stringify(n))}async function Xt(e){let t=[],n=0;for await(let r of e){if(n+=r.length,n>Ht)return null;t.push(r)}return Buffer.concat(t).toString("utf8")}function ze(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&(0,_.timingSafeEqual)(n,r)}async function j(){let e=qe();if(!e)return null;let t=await tt(e.apiKey);return t.ok?(de({userId:t.data.user.id,agentId:t.data.agentId,companyIds:t.data.companyIds}),null):ae(t)?(le(),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 We(){var d;let e=Y(),t=await j();if(t){a(t);return}let n=P(),r;try{r=await Qe()}catch(m){a(l("HOST_PERMISSION_REQUIRED",`\u65E0\u6CD5\u5728\u672C\u673A\u542F\u52A8\u5F55\u5165\u670D\u52A1\uFF1A${Zt(m)}`,{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:`${c} auth login`}}));return}Yt(r.url);let o=`[${c}]`;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
- `);let i;for(;;){let m;try{m=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
- `),je(m),i=await tt(m);let c=!i.ok&&ae(i);if(c&&le(),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":Wt(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
- `);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}let s=de({userId:i.data.user.id,agentId:i.data.agentId,companyIds:i.data.companyIds});a(k({user:i.data.user,device:i.data.device,companyIds:(d=s==null?void 0:s.companyIds)!=null?d:i.data.companyIds,replacedPreviousAuthorization:i.data.replacedPreviousAuthorization,configPath:R()},i.requestId))}async function Ye(){let e=await j();if(e){a(e);return}let t=P();if(!t){a(et());return}let n=await y("/companies",{apiKey:t,query:{page:1,limit:100}});if(!n.ok){a(n);return}let r=Y();a(k({loggedIn:!0,device:{deviceId:r.deviceId,deviceName:r.deviceName,platform:r.platform},user:Z()?{id:Z().userId,agentId:Z().agentId}:null,companies:n.data.data.map(o=>({id:o.id,name:o.name})),configPath:R()},n.requestId))}async function Ze(){let e=await j();if(e){a(e);return}let t=P();if(!t){a(et());return}let n=await y("/auth/logout",{method:"POST",apiKey:t});if(!n.ok){a(n);return}Ge(),a(k({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 et(){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\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002\u6267\u884C\u671F\u95F4\u628A stderr \u91CC\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u4FDD\u6301\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\u3002",command:`${p} auth login`}})}function Wt(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 tt(e){let t=Y();return y("/auth/claim",{method:"POST",apiKey:e,body:{...t,cliVersion:x}})}function Yt(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,Xe.execFile)(t,n,()=>{})}function Zt(e){return e instanceof Error?e.message:String(e)}async function G(){let e=await j();if(e)return{ok:!1,envelope:e};let t=P();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\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002",command:`${p} auth login`}})}}var rt=require("node:fs"),D=require("node:path"),ot=require("node:url");function en(e){if(e.cjsDir)return(0,D.join)(e.cjsDir,"..");if(!e.moduleUrl)throw new Error("\u7F3A\u5C11 CLI \u8FD0\u884C\u4F4D\u7F6E");return(0,D.join)((0,D.dirname)((0,ot.fileURLToPath)(e.moduleUrl)),"..","..","..")}function tn(){return en({cjsDir:typeof __dirname=="string"?__dirname:void 0,moduleUrl:void 0})}function U(...e){return(0,rt.readFileSync)((0,D.join)(tn(),...e),"utf8")}function it(){a(k({package:L,version:x,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 st(e){if(!e){a(k({package:L,version:x,protocolVersion:B,env:$e,apiBase:Q}));return}let t=await y("/meta");if(!t.ok){a(t);return}if(nt(x,t.data.minimumCliVersion)<0){a(l("CLI_UPDATE_REQUIRED",`\u5F53\u524D\u7248\u672C ${x} \u4F4E\u4E8E\u6700\u4F4E\u8981\u6C42 ${t.data.minimumCliVersion}`,{requestId:t.requestId,data:{current:x,...t.data},nextAction:{type:"upgrade",message:"\u5347\u7EA7\u540E\u91CD\u8BD5",command:`npm install -g ${L}@latest`}}));return}a(k({current:x,...t.data,updateAvailable:nt(x,t.data.latestCliVersion)<0},t.requestId))}function at(){a(k(JSON.parse(U("capabilities","capabilities.json"))))}function lt(e){let t=pt(U("skills","best-geo","SKILL.md"));if(e){process.stdout.write(t);return}a(k({name:p,revision:1,content:t}))}var ue=["company","product","question","article","knowledge","material","question-task","article-task","scheduled-monitor","publication"];function dt(){a(k({guides:ue.map(e=>{let t=JSON.parse(U("guides",`${e}.json`));return{name:t.name,title:t.title,whenToUse:t.whenToUse}})}))}function ct(e){if(!ue.includes(e)){a(l("GUIDE_NOT_FOUND",`\u6CA1\u6709\u540D\u4E3A ${e} \u7684\u6307\u5357`,{data:{available:ue}}));return}a(k(JSON.parse(pt(U("guides",`${e}.json`)))))}function nt(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 d=((o=n[s])!=null?o:0)-((i=r[s])!=null?i:0);if(d!==0)return d<0?-1:1}return 0}function pt(e){return p==="best-geo"?e:e.replace(/\bbest-geo\b(?!-)/g,p)}var me=null,ge=null;function ut(){return me===null&&(me=JSON.parse(U("capabilities","capabilities.json")).capabilities),me}function nn(){return ge===null&&(ge=new Map(ut().filter(e=>e.inputSchema!==void 0).map(e=>[e.name,e.inputSchema]))),ge}function mt(){return ut().filter(e=>e.mode==="write").map(e=>e.name)}function ee(e,t){let n=nn().get(e);return n===void 0?[]:be(t,n,"")}function be(e,t,n){if(t.type==="object"||t.properties!==void 0)return rn(e,t,n);let r=gt(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 ${T(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(...be(i,t.items,`${n}[${s}]`))})),o}function rn(e,t,n){var d,m;if(typeof e!="object"||e===null||Array.isArray(e))return[`${n||"\u5165\u53C2"} \u5FC5\u987B\u662F\u5BF9\u8C61`];let r=e,o=(d=t.properties)!=null?d:{},i=(m=t.required)!=null?m:[],s=[];for(let c of i)(r[c]===void 0||r[c]===null)&&s.push(`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 ${fe(n,c)}`);if(t.additionalProperties===!1){let c=Object.keys(o);for(let I of Object.keys(r))c.includes(I)||s.push(`\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5 ${fe(n,I)}\uFF0C\u53EF\u7528\u5B57\u6BB5\uFF1A${c.join("\u3001")}`)}for(let[c,I]of Object.entries(o)){let b=r[c];b===void 0||b===null&&i.includes(c)||s.push(...be(b,I,fe(n,c)))}return s}function gt(e,t,n){if(Array.isArray(t.type)){let r=t.type.map(o=>gt(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 ${T(e)}`;case"string":return typeof e=="string"?null:`${n} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF0C\u6536\u5230 ${T(e)}`;case"number":return typeof e=="number"&&Number.isFinite(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u5B57\uFF0C\u6536\u5230 ${T(e)}`;case"integer":return typeof e=="number"&&Number.isInteger(e)?null:`${n} \u5FC5\u987B\u662F\u6574\u6570\uFF0C\u6536\u5230 ${T(e)}`;case"boolean":return typeof e=="boolean"?null:`${n} \u5FC5\u987B\u662F true \u6216 false\uFF0C\u6536\u5230 ${T(e)}`;case"array":return Array.isArray(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u7EC4\uFF0C\u6536\u5230 ${T(e)}`;default:return null}}function fe(e,t){return e===""?t:`${e}.${t}`}function T(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 "${on(t)}"`:t}function on(e){return e.length>20?`${e.slice(0,20)}\u2026`:e}function te(e,t){return l("VALIDATION_FAILED",`\u5165\u53C2\u4E0D\u5408\u6CD5\uFF1A${t.join("\uFF1B")}`,{data:{name:e,errors:t},nextAction:{type:"ask_user",message:"\u6309 capabilities \u91CC\u7684 inputSchema \u4FEE\u6B63\u53C2\u6570\u540E\u91CD\u8BD5\uFF1B\u7F3A\u7684\u4FE1\u606F\u95EE\u7528\u6237"}})}var ft={"companies.list":e=>({path:"/companies",query:e}),"companies.get":e=>({path:`/companies/${Number(e.id)}`}),"products.list":e=>({path:"/products",query:e}),"products.get":e=>({path:`/products/${Number(e.id)}`}),"questions.list":e=>({path:"/questions",query:e}),"questions.get":e=>({path:`/questions/${Number(e.id)}`}),"articles.list":e=>({path:"/articles",query:e}),"articles.get":e=>({path:`/articles/${Number(e.id)}`,query:e.withContent===!0?{withContent:"true"}:void 0}),"knowledge.list":e=>({path:"/knowledge",query:e}),"knowledge.get":e=>({path:`/knowledge/${Number(e.id)}`}),"images.list":e=>({path:"/images",query:e}),"images.get":e=>({path:`/images/${Number(e.id)}`}),"videos.list":e=>({path:"/videos",query:e}),"videos.get":e=>({path:`/videos/${Number(e.id)}`}),"prompts.list":e=>({path:"/prompts",query:e}),"models.list":e=>({path:"/models",query:e}),"questionTasks.list":e=>({path:"/question-tasks",query:e}),"questionTasks.get":e=>({path:`/question-tasks/${Number(e.taskId)}`}),"articleTasks.list":e=>({path:"/article-tasks",query:e}),"articleTasks.get":e=>({path:`/article-tasks/${Number(e.taskId)}`}),"keywordTasks.list":e=>({path:"/keyword-tasks",query:e}),"keywordTasks.get":e=>({path:`/keyword-tasks/${Number(e.taskId)}`}),"tags.list":e=>({path:"/tags",query:e}),"folders.list":e=>({path:"/article-folders",query:e}),"publicationPlatforms.list":e=>({path:"/publication-platforms",query:e}),"publicationAccounts.list":e=>({path:"/publication-accounts",query:e}),"publicationTasks.list":e=>({path:"/publication-tasks",query:e}),"publicationRecords.list":e=>({path:"/publication-records",query:e}),"mediaPlatforms.list":e=>({path:"/media-platforms",query:e}),"mediaPlatforms.get":e=>({path:`/media-platforms/${Number(e.mediaId)}`}),"mediaPublications.list":e=>({path:"/media-publications",query:e}),"mediaPublications.summary":e=>({path:"/media-publications/summary",query:e}),"articleTasks.reuseConfig":e=>({path:`/article-tasks/${Number(e.taskId)}/reuse-config`}),"scheduledSentiment.generateQuestions":e=>({path:"/scheduled-sentiment/generate-questions",method:"POST",body:e}),"indexing.suggestCompetitors":e=>({path:"/suggest-competitors",method:"POST",body:e}),"indexingPlatforms.list":()=>({path:"/indexing-platforms"}),"scheduledIndexing.list":e=>({path:"/scheduled-indexing",query:e}),"scheduledIndexing.get":e=>({path:`/scheduled-indexing/${Number(e.planId)}`}),"scheduledIndexing.runs":e=>({path:`/scheduled-indexing/${Number(e.planId)}/runs`,query:E(e)}),"scheduledIndexing.metrics":e=>({path:`/scheduled-indexing/${Number(e.planId)}/metrics`,query:E(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:E(e)}),"scheduledSentiment.metrics":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/metrics`,query:E(e)}),"scheduledIndexing.answers":e=>({path:`/scheduled-indexing/${Number(e.planId)}/answers`,query:E(e)}),"scheduledIndexing.citations":e=>({path:`/scheduled-indexing/${Number(e.planId)}/citations`,query:E(e)}),"scheduledIndexing.topicStats":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-stats`,query:E(e)}),"scheduledIndexing.topicPlatformMatrix":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-platform-matrix`,query:E(e)}),"scheduledSentiment.answers":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/answers`,query:E(e)}),"scheduledSentiment.citations":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/citations`,query:E(e)}),"scheduledSentiment.topicStats":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/topic-stats`,query:E(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"})};function E(e){let{planId:t,...n}=e;return n}function sn(){return Object.keys(ft)}async function bt(e,t){let n=ft[e];if(!n){a(l("VALIDATION_FAILED",`\u672A\u77E5\u80FD\u529B\uFF1A${e}`,{data:{available:sn()},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=ee(e,r);if(o.length>0){a(te(e,o));return}let i=await G();if(!i.ok){a(i.envelope);return}let{path:s,query:d,method:m,body:c}=n(r);a(await y(s,{apiKey:i.apiKey,query:d,method:m,body:c}))}var O=require("node:fs"),M=require("node:path");var an={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"}},ln={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".mp4":"video/mp4"},ht={"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"}]},dn=900*1e3;function yt(e){return ht[e]!==void 0}function xt(e){return q()[e]!==void 0}function kt(e,t){var i;let n=(i=ht[e])!=null?i:[],r={...t},o={};for(let s of n){let d=t[s.pathKey];if(typeof d!="string"||!d.trim())return{ok:!1,envelope:un(s)};let m=(0,M.resolve)(d.trim()),c=pn(m,s);if(!c.ok)return{ok:!1,envelope:c.envelope};delete r[s.pathKey],r[s.metaKey]={name:(0,M.basename)(m),size:c.size},o[s.uploadField]=m}return{ok:!0,input:r,paths:o}}function Et(e,t){se({...q(),[e]:{paths:t,createdAt:Date.now()}})}async function It(e,t){let n=q()[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,O.existsSync)(i))return{ok:!1,envelope:l("VALIDATION_FAILED",`\u6587\u4EF6\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF1A${i}`)};let s=await y(`/plans/${encodeURIComponent(e)}/uploads/presign`,{method:"POST",apiKey:t,body:{field:o,fileName:(0,M.basename)(i)}});if(!s.ok)return{ok:!1,envelope:s};let d=await cn(s.data,i);if(!d.ok)return{ok:!1,envelope:d.envelope};r[o]=s.data.uploadUrl}return{ok:!0,uploads:r}}function vt(e){let t=q();delete t[e],se(t)}async function cn(e,t){let n=ln[wt(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,O.openAsBlob)(t,{type:n}),(0,M.basename)(t));try{let o=await fetch(e.host,{method:"POST",body:r,signal:AbortSignal.timeout(dn)}),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=mn(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 pn(e,t){let n=an[t.kind];if(!(0,O.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,O.statSync)(e);if(!r.isFile())return{ok:!1,envelope:l("VALIDATION_FAILED",`${e} \u4E0D\u662F\u4E00\u4E2A\u6587\u4EF6`)};let o=wt(e);return n.extensions.includes(o)?r.size>n.maxBytes?{ok:!1,envelope:l("VALIDATION_FAILED",`${n.label}\u6700\u5927 ${ne(n.maxBytes)}\uFF0C\u5F53\u524D ${ne(r.size)}\uFF0C\u8D85\u51FA ${ne(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 ${ne(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 un(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 ne(e){return e>=1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${Math.max(1,Math.round(e/1024))}KB`}function mn(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 wt(e){let t=e.lastIndexOf(".");return t===-1?"":e.toLowerCase().slice(t)}async function At(e,t,n){var I;let r=mt();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=ee(e,o);if(i.length>0){a(te(e,i));return}let s=o,d=null;if(yt(e)){let b=kt(e,o);if(!b.ok){a(b.envelope);return}s=b.input,d=b.paths}let m=await G();if(!m.ok){a(m.envelope);return}let c=await y("/plans",{method:"POST",apiKey:m.apiKey,body:{operation:e,input:s}});c.ok&&d&&((I=c.data)!=null&&I.planId)&&Et(c.data.planId,d),a(c)}async function St(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(xt(e)){let o=await It(e,t.apiKey);if(!o.ok){a(o.envelope);return}n=o.uploads}let r=await y(`/plans/${encodeURIComponent(e)}/apply`,{method:"POST",apiKey:t.apiKey,body:n?{uploads:n}:{},isWrite:!0});r.ok&&vt(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 Ct(e,t){let n=R();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 Rt(e){return e instanceof w}async function gn(){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":it();return;case"version":await st(n.check===!0);return;case"capabilities":at();return;case"skill":if(t[0]==="get"){lt(n.raw===!0);return}break;case"guide":if(t[0]==="list"){dt();return}if(t[0]==="get"&&t[1]){ct(t[1]);return}break;case"auth":if(t[0]==="login")return We();if(t[0]==="status")return Ye();if(t[0]==="logout")return Ze();break;case"plan":await At(t[0],typeof n.input=="string"?n.input:void 0,t[1]);return;case"apply":await St(t[0]);return;case"call":if(t[0]){await bt(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}gn().catch(e=>{if(Rt(e)){a(Ct(e,{capability:e.reason==="denied"?"config_write":"config_read",retryCommand:fn()})),process.exitCode=1;return}a(l("SERVER_ERROR",e instanceof Error?e.message:String(e))),process.exitCode=1});function fn(){let[e,t]=process.argv.slice(2);if(e==="auth"&&(t==="login"||t==="status"||t==="logout"))return`${p} auth ${t}`}
366
+ `);let i;for(;;){let m;try{m=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:`${c} 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
+ `),je(m),i=await tt(m);let p=!i.ok&&ae(i);if(p&&le(),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":Wt(i),retryable:p}),i.ok)break;if(p){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
+ `);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 ${c} \u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\u3002
369
+ `),a(i);return}let s=de({userId:i.data.user.id,agentId:i.data.agentId,companyIds:i.data.companyIds});a(k({user:i.data.user,device:i.data.device,companyIds:(d=s==null?void 0:s.companyIds)!=null?d:i.data.companyIds,replacedPreviousAuthorization:i.data.replacedPreviousAuthorization,configPath:T()},i.requestId))}async function Ye(){let e=await j();if(e){a(e);return}let t=P();if(!t){a(et());return}let n=await y("/companies",{apiKey:t,query:{page:1,limit:100}});if(!n.ok){a(n);return}let r=Y();a(k({loggedIn:!0,device:{deviceId:r.deviceId,deviceName:r.deviceName,platform:r.platform},user:Z()?{id:Z().userId,agentId:Z().agentId}:null,companies:n.data.data.map(o=>({id:o.id,name:o.name})),configPath:T()},n.requestId))}async function Ze(){let e=await j();if(e){a(e);return}let t=P();if(!t){a(et());return}let n=await y("/auth/logout",{method:"POST",apiKey:t});if(!n.ok){a(n);return}Ge(),a(k({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 et(){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\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002\u6267\u884C\u671F\u95F4\u628A stderr \u91CC\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u4FDD\u6301\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\u3002",command:`${c} auth login`}})}function Wt(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 tt(e){let t=Y();return y("/auth/claim",{method:"POST",apiKey:e,body:{...t,cliVersion:x}})}function Yt(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,Xe.execFile)(t,n,()=>{})}function Zt(e){return e instanceof Error?e.message:String(e)}async function G(){let e=await j();if(e)return{ok:!1,envelope:e};let t=P();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\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002",command:`${c} auth login`}})}}var rt=require("node:fs"),D=require("node:path"),ot=require("node:url");function en(e){if(e.cjsDir)return(0,D.join)(e.cjsDir,"..");if(!e.moduleUrl)throw new Error("\u7F3A\u5C11 CLI \u8FD0\u884C\u4F4D\u7F6E");return(0,D.join)((0,D.dirname)((0,ot.fileURLToPath)(e.moduleUrl)),"..","..","..")}function tn(){return en({cjsDir:typeof __dirname=="string"?__dirname:void 0,moduleUrl:void 0})}function U(...e){return(0,rt.readFileSync)((0,D.join)(tn(),...e),"utf8")}function it(){a(k({package:L,version:x,protocolVersion:F,commands:[{command:`${c} version --check`,description:"\u68C0\u67E5\u7248\u672C\u662F\u5426\u9700\u8981\u5347\u7EA7"},{command:`${c} capabilities`,description:"\u5217\u51FA\u53EF\u7528\u80FD\u529B\u53CA\u5176\u8F93\u5165 schema"},{command:`${c} 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:`${c} skill get`,description:"\u4EE5 JSON \u4FE1\u5C01\u8FD4\u56DE Skill \u5185\u5BB9\u548C revision"},{command:`${c} guide list`,description:"\u5217\u51FA\u4E1A\u52A1\u6307\u5357"},{command:`${c} guide get <name>`,description:"\u8BFB\u53D6\u4E00\u4EFD\u4E1A\u52A1\u6307\u5357"},{command:`${c} auth login`,description:"\u6253\u5F00\u672C\u5730\u9875\u9762\u5F55\u5165\u5BC6\u94A5\u5E76\u7ED1\u5B9A\u672C\u673A"},{command:`${c} auth status`,description:"\u67E5\u770B\u5F53\u524D\u6388\u6743\u72B6\u6001"},{command:`${c} auth logout`,description:"\u64A4\u9500\u670D\u52A1\u7AEF\u5BC6\u94A5\u5E76\u6E05\u9664\u672C\u673A\u51ED\u636E"},{command:`${c} call <capability> --input '<JSON>'`,description:"\u8C03\u7528\u4E00\u4E2A\u67E5\u8BE2\u80FD\u529B"},{command:`${c} 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:`${c} 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:`${c} 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 st(e){if(!e){a(k({package:L,version:x,protocolVersion:F,env:$e,apiBase:Q}));return}let t=await y("/meta");if(!t.ok){a(t);return}if(nt(x,t.data.minimumCliVersion)<0){a(l("CLI_UPDATE_REQUIRED",`\u5F53\u524D\u7248\u672C ${x} \u4F4E\u4E8E\u6700\u4F4E\u8981\u6C42 ${t.data.minimumCliVersion}`,{requestId:t.requestId,data:{current:x,...t.data},nextAction:{type:"upgrade",message:"\u5347\u7EA7\u540E\u91CD\u8BD5",command:`npm install -g ${L}@latest`}}));return}a(k({current:x,...t.data,updateAvailable:nt(x,t.data.latestCliVersion)<0},t.requestId))}function at(){a(k(JSON.parse(U("capabilities","capabilities.json"))))}function lt(e){let t=ct(U("skills","best-geo","SKILL.md"));if(e){process.stdout.write(t);return}a(k({name:c,revision:1,content:t}))}var ue=["company","product","question","article","knowledge","material","question-task","article-task","scheduled-monitor","publication","video"];function dt(){a(k({guides:ue.map(e=>{let t=JSON.parse(U("guides",`${e}.json`));return{name:t.name,title:t.title,whenToUse:t.whenToUse}})}))}function pt(e){if(!ue.includes(e)){a(l("GUIDE_NOT_FOUND",`\u6CA1\u6709\u540D\u4E3A ${e} \u7684\u6307\u5357`,{data:{available:ue}}));return}a(k(JSON.parse(ct(U("guides",`${e}.json`)))))}function nt(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 d=((o=n[s])!=null?o:0)-((i=r[s])!=null?i:0);if(d!==0)return d<0?-1:1}return 0}function ct(e){return c==="best-geo"?e:e.replace(/\bbest-geo\b(?!-)/g,c)}var me=null,ge=null;function ut(){return me===null&&(me=JSON.parse(U("capabilities","capabilities.json")).capabilities),me}function nn(){return ge===null&&(ge=new Map(ut().filter(e=>e.inputSchema!==void 0).map(e=>[e.name,e.inputSchema]))),ge}function mt(){return ut().filter(e=>e.mode==="write").map(e=>e.name)}function ee(e,t){let n=nn().get(e);return n===void 0?[]:be(t,n,"")}function be(e,t,n){if(t.type==="object"||t.properties!==void 0)return rn(e,t,n);let r=gt(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 ${R(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(...be(i,t.items,`${n}[${s}]`))})),o}function rn(e,t,n){var d,m;if(typeof e!="object"||e===null||Array.isArray(e))return[`${n||"\u5165\u53C2"} \u5FC5\u987B\u662F\u5BF9\u8C61`];let r=e,o=(d=t.properties)!=null?d:{},i=(m=t.required)!=null?m:[],s=[];for(let p of i)(r[p]===void 0||r[p]===null)&&s.push(`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 ${fe(n,p)}`);if(t.additionalProperties===!1){let p=Object.keys(o);for(let I of Object.keys(r))p.includes(I)||s.push(`\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5 ${fe(n,I)}\uFF0C\u53EF\u7528\u5B57\u6BB5\uFF1A${p.join("\u3001")}`)}for(let[p,I]of Object.entries(o)){let b=r[p];b===void 0||b===null&&i.includes(p)||s.push(...be(b,I,fe(n,p)))}return s}function gt(e,t,n){if(Array.isArray(t.type)){let r=t.type.map(o=>gt(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 ${R(e)}`;case"string":return typeof e=="string"?null:`${n} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF0C\u6536\u5230 ${R(e)}`;case"number":return typeof e=="number"&&Number.isFinite(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u5B57\uFF0C\u6536\u5230 ${R(e)}`;case"integer":return typeof e=="number"&&Number.isInteger(e)?null:`${n} \u5FC5\u987B\u662F\u6574\u6570\uFF0C\u6536\u5230 ${R(e)}`;case"boolean":return typeof e=="boolean"?null:`${n} \u5FC5\u987B\u662F true \u6216 false\uFF0C\u6536\u5230 ${R(e)}`;case"array":return Array.isArray(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u7EC4\uFF0C\u6536\u5230 ${R(e)}`;default:return null}}function fe(e,t){return e===""?t:`${e}.${t}`}function R(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 "${on(t)}"`:t}function on(e){return e.length>20?`${e.slice(0,20)}\u2026`:e}function te(e,t){return l("VALIDATION_FAILED",`\u5165\u53C2\u4E0D\u5408\u6CD5\uFF1A${t.join("\uFF1B")}`,{data:{name:e,errors:t},nextAction:{type:"ask_user",message:"\u6309 capabilities \u91CC\u7684 inputSchema \u4FEE\u6B63\u53C2\u6570\u540E\u91CD\u8BD5\uFF1B\u7F3A\u7684\u4FE1\u606F\u95EE\u7528\u6237"}})}var ft={"companies.list":e=>({path:"/companies",query:e}),"companies.get":e=>({path:`/companies/${Number(e.id)}`}),"products.list":e=>({path:"/products",query:e}),"products.get":e=>({path:`/products/${Number(e.id)}`}),"questions.list":e=>({path:"/questions",query:e}),"questions.get":e=>({path:`/questions/${Number(e.id)}`}),"articles.list":e=>({path:"/articles",query:e}),"articles.get":e=>({path:`/articles/${Number(e.id)}`,query:e.withContent===!0?{withContent:"true"}:void 0}),"knowledge.list":e=>({path:"/knowledge",query:e}),"knowledge.get":e=>({path:`/knowledge/${Number(e.id)}`}),"images.list":e=>({path:"/images",query:e}),"images.get":e=>({path:`/images/${Number(e.id)}`}),"videos.list":e=>({path:"/videos",query:e}),"videos.get":e=>({path:`/videos/${Number(e.id)}`}),"prompts.list":e=>({path:"/prompts",query:e}),"models.list":e=>({path:"/models",query:e}),"questionTasks.list":e=>({path:"/question-tasks",query:e}),"questionTasks.get":e=>({path:`/question-tasks/${Number(e.taskId)}`}),"articleTasks.list":e=>({path:"/article-tasks",query:e}),"articleTasks.get":e=>({path:`/article-tasks/${Number(e.taskId)}`}),"keywordTasks.list":e=>({path:"/keyword-tasks",query:e}),"keywordTasks.get":e=>({path:`/keyword-tasks/${Number(e.taskId)}`}),"tags.list":e=>({path:"/tags",query:e}),"folders.list":e=>({path:"/article-folders",query:e}),"publicationPlatforms.list":e=>({path:"/publication-platforms",query:e}),"publicationAccounts.list":e=>({path:"/publication-accounts",query:e}),"publicationTasks.list":e=>({path:"/publication-tasks",query:e}),"publicationRecords.list":e=>({path:"/publication-records",query:e}),"mediaPlatforms.list":e=>({path:"/media-platforms",query:e}),"mediaPlatforms.get":e=>({path:`/media-platforms/${Number(e.mediaId)}`}),"mediaPublications.list":e=>({path:"/media-publications",query:e}),"mediaPublications.summary":e=>({path:"/media-publications/summary",query:e}),"articleTasks.reuseConfig":e=>({path:`/article-tasks/${Number(e.taskId)}/reuse-config`}),"scheduledSentiment.generateQuestions":e=>({path:"/scheduled-sentiment/generate-questions",method:"POST",body:e}),"indexing.suggestCompetitors":e=>({path:"/suggest-competitors",method:"POST",body:e}),"indexingPlatforms.list":()=>({path:"/indexing-platforms"}),"scheduledIndexing.list":e=>({path:"/scheduled-indexing",query:e}),"scheduledIndexing.get":e=>({path:`/scheduled-indexing/${Number(e.planId)}`}),"scheduledIndexing.runs":e=>({path:`/scheduled-indexing/${Number(e.planId)}/runs`,query:E(e)}),"scheduledIndexing.metrics":e=>({path:`/scheduled-indexing/${Number(e.planId)}/metrics`,query:E(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:E(e)}),"scheduledSentiment.metrics":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/metrics`,query:E(e)}),"scheduledIndexing.answers":e=>({path:`/scheduled-indexing/${Number(e.planId)}/answers`,query:E(e)}),"scheduledIndexing.citations":e=>({path:`/scheduled-indexing/${Number(e.planId)}/citations`,query:E(e)}),"scheduledIndexing.topicStats":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-stats`,query:E(e)}),"scheduledIndexing.topicPlatformMatrix":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-platform-matrix`,query:E(e)}),"scheduledSentiment.answers":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/answers`,query:E(e)}),"scheduledSentiment.citations":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/citations`,query:E(e)}),"scheduledSentiment.topicStats":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/topic-stats`,query:E(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)}`})};function E(e){let{planId:t,...n}=e;return n}function sn(){return Object.keys(ft)}async function bt(e,t){let n=ft[e];if(!n){a(l("VALIDATION_FAILED",`\u672A\u77E5\u80FD\u529B\uFF1A${e}`,{data:{available:sn()},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=ee(e,r);if(o.length>0){a(te(e,o));return}let i=await G();if(!i.ok){a(i.envelope);return}let{path:s,query:d,method:m,body:p}=n(r);a(await y(s,{apiKey:i.apiKey,query:d,method:m,body:p}))}var O=require("node:fs"),M=require("node:path");var an={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"}},ln={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".mp4":"video/mp4"},ht={"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"}]},dn=900*1e3;function yt(e){return ht[e]!==void 0}function xt(e){return q()[e]!==void 0}function kt(e,t){var i;let n=(i=ht[e])!=null?i:[],r={...t},o={};for(let s of n){let d=t[s.pathKey];if(typeof d!="string"||!d.trim())return{ok:!1,envelope:un(s)};let m=(0,M.resolve)(d.trim()),p=cn(m,s);if(!p.ok)return{ok:!1,envelope:p.envelope};delete r[s.pathKey],r[s.metaKey]={name:(0,M.basename)(m),size:p.size},o[s.uploadField]=m}return{ok:!0,input:r,paths:o}}function Et(e,t){se({...q(),[e]:{paths:t,createdAt:Date.now()}})}async function It(e,t){let n=q()[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,O.existsSync)(i))return{ok:!1,envelope:l("VALIDATION_FAILED",`\u6587\u4EF6\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF1A${i}`)};let s=await y(`/plans/${encodeURIComponent(e)}/uploads/presign`,{method:"POST",apiKey:t,body:{field:o,fileName:(0,M.basename)(i)}});if(!s.ok)return{ok:!1,envelope:s};let d=await pn(s.data,i);if(!d.ok)return{ok:!1,envelope:d.envelope};r[o]=s.data.uploadUrl}return{ok:!0,uploads:r}}function vt(e){let t=q();delete t[e],se(t)}async function pn(e,t){let n=ln[wt(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,O.openAsBlob)(t,{type:n}),(0,M.basename)(t));try{let o=await fetch(e.host,{method:"POST",body:r,signal:AbortSignal.timeout(dn)}),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=mn(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 cn(e,t){let n=an[t.kind];if(!(0,O.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,O.statSync)(e);if(!r.isFile())return{ok:!1,envelope:l("VALIDATION_FAILED",`${e} \u4E0D\u662F\u4E00\u4E2A\u6587\u4EF6`)};let o=wt(e);return n.extensions.includes(o)?r.size>n.maxBytes?{ok:!1,envelope:l("VALIDATION_FAILED",`${n.label}\u6700\u5927 ${ne(n.maxBytes)}\uFF0C\u5F53\u524D ${ne(r.size)}\uFF0C\u8D85\u51FA ${ne(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 ${ne(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 un(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 ne(e){return e>=1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${Math.max(1,Math.round(e/1024))}KB`}function mn(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 wt(e){let t=e.lastIndexOf(".");return t===-1?"":e.toLowerCase().slice(t)}async function At(e,t,n){var I;let r=mt();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=ee(e,o);if(i.length>0){a(te(e,i));return}let s=o,d=null;if(yt(e)){let b=kt(e,o);if(!b.ok){a(b.envelope);return}s=b.input,d=b.paths}let m=await G();if(!m.ok){a(m.envelope);return}let p=await y("/plans",{method:"POST",apiKey:m.apiKey,body:{operation:e,input:s}});p.ok&&d&&((I=p.data)!=null&&I.planId)&&Et(p.data.planId,d),a(p)}async function St(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(xt(e)){let o=await It(e,t.apiKey);if(!o.ok){a(o.envelope);return}n=o.uploads}let r=await y(`/plans/${encodeURIComponent(e)}/apply`,{method:"POST",apiKey:t.apiKey,body:n?{uploads:n}:{},isWrite:!0});r.ok&&vt(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 Ct(e,t){let n=T();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:`${c} auth login`}})}function Tt(e){return e instanceof w}async function gn(){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":it();return;case"version":await st(n.check===!0);return;case"capabilities":at();return;case"skill":if(t[0]==="get"){lt(n.raw===!0);return}break;case"guide":if(t[0]==="list"){dt();return}if(t[0]==="get"&&t[1]){pt(t[1]);return}break;case"auth":if(t[0]==="login")return We();if(t[0]==="status")return Ye();if(t[0]==="logout")return Ze();break;case"plan":await At(t[0],typeof n.input=="string"?n.input:void 0,t[1]);return;case"apply":await St(t[0]);return;case"call":if(t[0]){await bt(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}gn().catch(e=>{if(Tt(e)){a(Ct(e,{capability:e.reason==="denied"?"config_write":"config_read",retryCommand:fn()})),process.exitCode=1;return}a(l("SERVER_ERROR",e instanceof Error?e.message:String(e))),process.exitCode=1});function fn(){let[e,t]=process.argv.slice(2);if(e==="auth"&&(t==="login"||t==="status"||t==="logout"))return`${c} auth ${t}`}
@@ -0,0 +1,93 @@
1
+ {
2
+ "name": "video",
3
+ "title": "数字人视频与智能剪辑",
4
+ "whenToUse": "用户想用数字人形象合成一条口播视频,想把已有的数字人成片做成剪辑作品,或者想查这两类任务的进度和成片地址时。",
5
+ "prerequisites": [
6
+ "已完成 best-geo auth login",
7
+ "已经确定是哪家公司(用 companies.list 确认)"
8
+ ],
9
+ "workflow": [
10
+ {
11
+ "step": 1,
12
+ "action": "先确认公司,再挑形象和音色",
13
+ "capability": "dhVideos.avatars / dhVideos.voices",
14
+ "note": "两个查询默认只看私有资源(scope=mine),多数账号是空的。空了就用 scope=public 查平台公共资源,公共形象和音色一样能直接拿来合成。形象返回的 id 就是提交时的 trainingId。"
15
+ },
16
+ {
17
+ "step": 2,
18
+ "action": "确定输入模式:文字合成还是声音合成",
19
+ "note": "文字合成给 text + voiceId + voiceExtra.languageBoost(语种,中文填 Chinese);声音合成只给 audioUrl,要一个公网能直连的 http(s) 音频地址。两种**只能选一种**,都给或都不给都会被拒。"
20
+ },
21
+ {
22
+ "step": 3,
23
+ "action": "问清画质",
24
+ "note": "1 是 LITE 标准、2 是 PRO 高清。PRO 的计费秒数按倍率放大,同样长度更贵——别替用户默认选 PRO。"
25
+ },
26
+ {
27
+ "step": 4,
28
+ "action": "如果用户还要剪辑成片,在提交时一并打开",
29
+ "capability": "clipTasks.templates",
30
+ "note": "把 enableClip 设成 true 并给 clipTemplate(模板 code 从 clipTasks.templates 查)。这样数字人成片后会自动发起剪辑,不用再提交一次。**但这是另一笔钱**,要先问过用户。"
31
+ },
32
+ {
33
+ "step": 5,
34
+ "action": "走 plan 让用户确认费用,再 apply",
35
+ "capability": "dhVideos.create",
36
+ "note": "plan 的 notice 里写着预估金额和「最终按成片真实时长结算」,原样念给用户,别只说一个数字。"
37
+ },
38
+ {
39
+ "step": 6,
40
+ "action": "提交后轮询进度",
41
+ "capability": "dhVideos.get",
42
+ "note": "合成是异步的,apply 只拿到任务号。status=1 时 videoUrl 才有值。"
43
+ },
44
+ {
45
+ "step": 7,
46
+ "action": "想给一条已有的成片单独发起剪辑时走这条",
47
+ "capability": "clipTasks.create",
48
+ "note": "必须先有一条数字人任务当底板,系统里没有凭空剪辑的入口。查它剪过没有就用 clipTasks.list 带上 dhVideoTaskId,别翻页去对。"
49
+ }
50
+ ],
51
+ "askUserWhen": [
52
+ "用户没说画质:LITE 和 PRO 差价明显,让他自己选,别默认",
53
+ "用户没说要不要剪辑:剪辑是独立的一笔费用,不能替他决定",
54
+ "选中的模板 requireAiMedia 是 true:AI 生图按张另外计费,必须先问过再把 enableAiMedia 设成 true",
55
+ "用户只说了「做个视频」但没给文案,也没给音频地址:这两样必须有一样,问清楚要哪种",
56
+ "私有形象/音色查出来是空的:告诉用户可以用平台公共资源,让他从公共库里挑一个,不要自己随便选一个就提交"
57
+ ],
58
+ "forbidden": [
59
+ "不要同时传 text 和 audioUrl。两种输入模式只能选一种,都传会被直接拒绝",
60
+ "不要在没问过用户的情况下打开 enableClip 或 clipEnableAiMedia。这两个都会额外产生费用",
61
+ "不要把 plan 里的预估金额说成最终价格。这条链路提交时不扣费,成片之后按真实时长结算,实际可能多也可能少——照实说",
62
+ "不要只填 personName 或只填 personIntro。人物名片必须成对,只给一半的话模板会拿预置的示例内容把另一半填上,成片上就出现一个不存在的人",
63
+ "不要自己编 trainingId / voiceId / template。这三个都要从对应的查询接口里取,猜的值提交后会被上游拒",
64
+ "不要把内网地址或 javascript: 之类的串填进 bgmUrl / coverUrl / audioUrl。上游不转存、会长期原样使用这些地址,填错了事后改不掉",
65
+ "不要因为 status 是负数就说任务失败了。-3 等待音频、-2 排队等待、0 合成中都还在正常跑,只有 2 才是失败",
66
+ "不要因为剪辑的 status 是 4 就以为快好了。剪辑的状态值不按流程顺序排:4 是渲染中,1 才是完成",
67
+ "不要跳过 plan 直接提交。写操作没有一步到位的入口",
68
+ "不要为了发起剪辑去等数字人合成完。剪辑会自己等底板成片——但底板还没有时长时,报价只能按兜底秒数估,这一点要跟用户说明"
69
+ ],
70
+ "errorRecovery": {
71
+ "ACCESS_DENIED": "这家公司或这条任务不在密钥授权范围内。回到 companies.list 确认范围,或让用户去网页把这家公司加进这把密钥的授权(改完立即生效,不用重新登录)。查别人的数字人任务也报这个码——不区分「不存在」和「不是你的」。",
72
+ "VALIDATION_FAILED": "参数不合法。常见原因:两种输入模式都传了或都没传、文字合成缺 voiceExtra.languageBoost、打开 enableClip 却没给 clipTemplate、人物名片只填了一半、补充素材超过 20 条、bgmUrl / coverUrl 不是 http(s) 链接。message 里说的是哪个字段就改哪个。",
73
+ "PLAN_STALE": "确认期间来源数字人任务合成完了、回填了真实时长,那份按兜底秒数算出来的报价已经不作数。重新 plan,把新的金额再念给用户确认一次——底板只是进度在动不会触发这个码,所以不用担心一直撞。",
74
+ "PLAN_EXPIRED": "计划超过 30 分钟没执行。重新 plan,把新摘要再给用户确认一次。",
75
+ "PLAN_COST_CHANGED": "单价在确认期间被改过。重新 plan,把新的费用说明再念给用户。",
76
+ "SERVER_ERROR": "看它出现在哪一步。**apply 阶段**多半是余额不足:提交时虽然不扣费,但会校验余额够不够,不够会挡在这里。先别重试,把 message 原样转达给用户,让他确认余额。**plan 阶段**与余额无关,按 message 说的处理。"
77
+ },
78
+ "completionCriteria": "查询类:已如实呈现任务状态或资源列表;任务没跑完就说清它还在哪个阶段,不要拿空的 videoUrl 当「失败」。写入类:用户看过 plan 摘要(含费用说明)并明确同意,apply 已返回任务号,并告诉了用户去哪儿查进度。",
79
+ "writeFlow": {
80
+ "title": "写数据:先 plan,用户同意后才 apply",
81
+ "steps": [
82
+ "执行 best-geo plan dhVideos.create --input '<JSON>'(独立剪辑用 clipTasks.create),此时什么都没提交。",
83
+ "把返回的 summary 原样念给用户听,**notice 里的费用说明一条都不能漏**——尤其是「两笔费用」和「最终按成片真实时长结算」。",
84
+ "等用户明确说同意。用户最初提的目标不算对这份摘要的确认。",
85
+ "同意之后执行 best-geo apply <planId>。"
86
+ ],
87
+ "notes": [
88
+ "计划 30 分钟内有效,只能执行一次。",
89
+ "apply 成功只代表任务提交了,片子还没出——把返回的任务号告诉用户,并说明要用 dhVideos.get / clipTasks.get 查进度。",
90
+ "打开 enableClip 时是两笔费用,摘要里会分开列出来,念的时候别合成一个数。"
91
+ ]
92
+ }
93
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "best-geo-test",
3
- "version": "0.3.6",
3
+ "version": "1.0.1",
4
4
  "description": "Best GEO CLI — 给本地 AI 助手调用的 GEO 命令行工具",
5
5
  "bin": {
6
6
  "best-geo-test": "dist/index.cjs"
@@ -7,6 +7,24 @@ description: 通过 Best GEO CLI 查询和维护用户在 GEO 系统里的公司
7
7
 
8
8
  用 `best-geo` 命令查询用户在 GEO 系统里的数据。命令的标准输出**永远是一个 JSON 对象**,直接解析即可。
9
9
 
10
+ ## 带 Label 的字段怎么念
11
+
12
+ 出参里编码成数值的字段,绝大多数**成对给**:一个数值,一个同名加 `Label` 的中文名。
13
+
14
+ ```
15
+ status / statusLabel stageStatus / stageStatusLabel
16
+ source / sourceLabel type / typeLabel
17
+ stage / stageLabel taskType / taskTypeLabel
18
+ rate / rateLabel refundStatus / refundStatusLabel
19
+ usage / usageLabels(数组,逐项对应)
20
+ ```
21
+
22
+ - **说给用户听,一律用 Label**,不要念数值,也不要自己把数值翻成中文。同一个数字在不同东西上含义不同(知识库的 `1` 是「可用」,它里面文档的 `1` 却是「解析中」、`2` 才是可用),情感倾向还会给 `-1`(消极,不是异常)——照记忆翻会翻反。
23
+ - **传参过滤、程序判断用数值**:入参 schema 里写的取值就是数值,按 schema 传。
24
+ - **Label 是空串**表示这条还没有值(比如还没打分、老数据没有类型),就照实说「还没有」,别猜一个。
25
+
26
+ 没有 Label 的字段照旧,schema 的 description 里写了取值含义。
27
+
10
28
  ## 先做这两件事
11
29
 
12
30
  1. `best-geo version --check` —— 确认版本可用。返回 `CLI_UPDATE_REQUIRED` 时按 `nextAction.command` 升级后再继续。