best-geo-test 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/capabilities/capabilities.json +671 -9
- package/dist/index.cjs +5 -5
- package/guides/answer-card.json +94 -0
- package/guides/publication.json +5 -4
- package/guides/video.json +93 -0
- package/package.json +1 -1
- package/skills/best-geo/SKILL.md +18 -0
|
@@ -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
|
|
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
|
|
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
|
|
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": {
|
|
@@ -3309,7 +3309,7 @@
|
|
|
3309
3309
|
"mode": "read",
|
|
3310
3310
|
"guide": "publication",
|
|
3311
3311
|
"requiresPlan": false,
|
|
3312
|
-
"description": "当前能用的自媒体发布平台。文章平台和视频平台是两批,建发布任务前先按 contentType
|
|
3312
|
+
"description": "当前能用的自媒体发布平台。文章平台和视频平台是两批,建发布任务前先按 contentType 取对应的那批——拿文章平台去发视频会被拒。返回里的 **limitConfig 是这个平台对文章的字数要求**(titleMaxLength 标题上限 / contentMinLength 正文下限 / contentMaxLength 正文上限,0 表示该项不限;为 null 表示这个平台不限字数)——**只对文章任务生效,视频任务不查字数**,视频平台这一项恒为 null。**remark 是投稿要求备注**(比如不收带外链的稿子)。不满足字数要求的文章建任务时会被拒,挑文章前先看这里。",
|
|
3313
3313
|
"inputSchema": {
|
|
3314
3314
|
"type": "object",
|
|
3315
3315
|
"properties": {
|
|
@@ -3527,7 +3527,7 @@
|
|
|
3527
3527
|
"mode": "write",
|
|
3528
3528
|
"guide": "publication",
|
|
3529
3529
|
"requiresPlan": true,
|
|
3530
|
-
"description": "建文章发布任务:把已有文章发到自媒体平台。**执行后稿子会真的发出去,CLI 撤不回来**。费用按发布记录条数算——一篇文章发 3 个账号就是 3 条。建之前先用 publicationPlatforms.list(contentType=article)查平台、publicationAccounts.list 查这个公司绑了哪些账号。**文章必须已审核通过且有封面**,两者缺一发不了——用 articles.list 时带上 status 和 mustHaveCover
|
|
3530
|
+
"description": "建文章发布任务:把已有文章发到自媒体平台。**执行后稿子会真的发出去,CLI 撤不回来**。费用按发布记录条数算——一篇文章发 3 个账号就是 3 条。建之前先用 publicationPlatforms.list(contentType=article)查平台、publicationAccounts.list 查这个公司绑了哪些账号。**文章必须已审核通过且有封面**,两者缺一发不了——用 articles.list 时带上 status 和 mustHaveCover 就只会看到能发的。**还要满足平台的字数要求**:平台配了 limitConfig 时,标题和正文长度不达标整批都建不了(正文字数按去掉图片地址、空格换行之后算,比原文短)。不确定够不够就先按 limitConfig 挑文章,或者少发那个卡字数的平台。",
|
|
3531
3531
|
"inputSchema": {
|
|
3532
3532
|
"type": "object",
|
|
3533
3533
|
"properties": {
|
|
@@ -3579,7 +3579,7 @@
|
|
|
3579
3579
|
"mode": "write",
|
|
3580
3580
|
"guide": "publication",
|
|
3581
3581
|
"requiresPlan": true,
|
|
3582
|
-
"description": "建视频发布任务。和 createArticle 同一套结构,只把 articleId 换成 videoId,平台要用 contentType=video 那批——拿文章平台发视频会被拒。",
|
|
3582
|
+
"description": "建视频发布任务。和 createArticle 同一套结构,只把 articleId 换成 videoId,平台要用 contentType=video 那批——拿文章平台发视频会被拒。createArticle 那条的字数要求**不适用于视频**:视频任务不查字数。",
|
|
3583
3583
|
"inputSchema": {
|
|
3584
3584
|
"type": "object",
|
|
3585
3585
|
"properties": {
|
|
@@ -3805,6 +3805,668 @@
|
|
|
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
|
+
}
|
|
4071
|
+
},
|
|
4072
|
+
{
|
|
4073
|
+
"name": "answerCards.list",
|
|
4074
|
+
"mode": "read",
|
|
4075
|
+
"guide": "answer-card",
|
|
4076
|
+
"requiresPlan": false,
|
|
4077
|
+
"description": "AI 答案卡任务列表。",
|
|
4078
|
+
"inputSchema": {
|
|
4079
|
+
"type": "object",
|
|
4080
|
+
"properties": {
|
|
4081
|
+
"companyId": {
|
|
4082
|
+
"type": "integer",
|
|
4083
|
+
"minimum": 1,
|
|
4084
|
+
"description": "只看某家公司;不传就是全部授权公司"
|
|
4085
|
+
},
|
|
4086
|
+
"page": {
|
|
4087
|
+
"type": "integer",
|
|
4088
|
+
"default": 1
|
|
4089
|
+
},
|
|
4090
|
+
"limit": {
|
|
4091
|
+
"type": "integer",
|
|
4092
|
+
"default": 10,
|
|
4093
|
+
"maximum": 201
|
|
4094
|
+
}
|
|
4095
|
+
},
|
|
4096
|
+
"additionalProperties": false
|
|
4097
|
+
}
|
|
4098
|
+
},
|
|
4099
|
+
{
|
|
4100
|
+
"name": "answerCards.templates",
|
|
4101
|
+
"mode": "read",
|
|
4102
|
+
"guide": "answer-card",
|
|
4103
|
+
"requiresPlan": false,
|
|
4104
|
+
"description": "答案卡可用视觉模板列表。visualMode=2(指定模板)时,创建任务的 templateId 必须是这里返回的一个 id。",
|
|
4105
|
+
"inputSchema": {
|
|
4106
|
+
"type": "object",
|
|
4107
|
+
"properties": {},
|
|
4108
|
+
"additionalProperties": false
|
|
4109
|
+
}
|
|
4110
|
+
},
|
|
4111
|
+
{
|
|
4112
|
+
"name": "answerCards.get",
|
|
4113
|
+
"mode": "read",
|
|
4114
|
+
"guide": "answer-card",
|
|
4115
|
+
"requiresPlan": false,
|
|
4116
|
+
"description": "答案卡任务详情:任务状态 + 逐页脚本 + 当前活动批次。status=1 分析中,脚本还没出来,先别急着高频轮询;status=2 脚本已就绪,才能看拆好的页、用 answerCards.savePages 改稿或用 answerCards.generate 确认生成。",
|
|
4117
|
+
"inputSchema": {
|
|
4118
|
+
"type": "object",
|
|
4119
|
+
"properties": {
|
|
4120
|
+
"id": {
|
|
4121
|
+
"type": "integer",
|
|
4122
|
+
"minimum": 1
|
|
4123
|
+
}
|
|
4124
|
+
},
|
|
4125
|
+
"required": ["id"],
|
|
4126
|
+
"additionalProperties": false
|
|
4127
|
+
}
|
|
4128
|
+
},
|
|
4129
|
+
{
|
|
4130
|
+
"name": "answerCards.batch",
|
|
4131
|
+
"mode": "read",
|
|
4132
|
+
"guide": "answer-card",
|
|
4133
|
+
"requiresPlan": false,
|
|
4134
|
+
"description": "答案卡批次逐页出图状态与成图地址。answerCards.generate 执行完只回批次号,要用这个轮询到批次终态(status=6 已完成 / 7 部分失败 / 8 失败)才有成片。返回的 items 里 status=4 是失败页——目前没有重跑单页的能力,有失败页时引导用户去网页处理。",
|
|
4135
|
+
"inputSchema": {
|
|
4136
|
+
"type": "object",
|
|
4137
|
+
"properties": {
|
|
4138
|
+
"taskId": {
|
|
4139
|
+
"type": "integer",
|
|
4140
|
+
"minimum": 1
|
|
4141
|
+
},
|
|
4142
|
+
"batchId": {
|
|
4143
|
+
"type": "integer",
|
|
4144
|
+
"minimum": 1
|
|
4145
|
+
}
|
|
4146
|
+
},
|
|
4147
|
+
"required": ["taskId", "batchId"],
|
|
4148
|
+
"additionalProperties": false
|
|
4149
|
+
}
|
|
4150
|
+
},
|
|
4151
|
+
{
|
|
4152
|
+
"name": "answerCards.create",
|
|
4153
|
+
"mode": "write",
|
|
4154
|
+
"guide": "answer-card",
|
|
4155
|
+
"requiresPlan": true,
|
|
4156
|
+
"description": "创建答案卡任务并异步发起脚本分析。这一步不扣费。分析是异步的,执行完只拿到任务号,要用 answerCards.get 轮询到 status=2(脚本已就绪)才能看拆好的页;脚本可以用 answerCards.savePages 改,这一步不扣费,改到满意再用 answerCards.generate 出图,确认生成那一步才开始扣费。",
|
|
4157
|
+
"inputSchema": {
|
|
4158
|
+
"type": "object",
|
|
4159
|
+
"properties": {
|
|
4160
|
+
"companyId": {
|
|
4161
|
+
"type": "integer",
|
|
4162
|
+
"minimum": 1
|
|
4163
|
+
},
|
|
4164
|
+
"productId": {
|
|
4165
|
+
"type": "integer",
|
|
4166
|
+
"minimum": 1,
|
|
4167
|
+
"description": "归到哪个 GEO 项目,用 products.list 查"
|
|
4168
|
+
},
|
|
4169
|
+
"sourceType": {
|
|
4170
|
+
"type": "integer",
|
|
4171
|
+
"enum": [1, 2],
|
|
4172
|
+
"description": "内容来源:1 来自已有文章(需一并给 articleId)/ 2 自定义正文(需一并给 content)"
|
|
4173
|
+
},
|
|
4174
|
+
"articleId": {
|
|
4175
|
+
"type": "integer",
|
|
4176
|
+
"minimum": 1,
|
|
4177
|
+
"description": "sourceType=1 时必填。来源文章 id,用 articles.list 查"
|
|
4178
|
+
},
|
|
4179
|
+
"content": {
|
|
4180
|
+
"type": "string",
|
|
4181
|
+
"maxLength": 50000,
|
|
4182
|
+
"description": "sourceType=2 时必填。自定义正文,去除首尾空白后至少要有 20 个字符"
|
|
4183
|
+
},
|
|
4184
|
+
"visualMode": {
|
|
4185
|
+
"type": "integer",
|
|
4186
|
+
"enum": [1, 2, 3],
|
|
4187
|
+
"description": "视觉方式:1 AI 智能匹配(后端从可用模板里自动挑一套,不用再给 templateId 或 customStylePrompt)/ 2 指定模板(需一并给 templateId)/ 3 自定义风格(需一并给 customStylePrompt)"
|
|
4188
|
+
},
|
|
4189
|
+
"templateId": {
|
|
4190
|
+
"type": "integer",
|
|
4191
|
+
"minimum": 1,
|
|
4192
|
+
"description": "visualMode=2 时必填。模板 id,用 answerCards.templates 查"
|
|
4193
|
+
},
|
|
4194
|
+
"customStylePrompt": {
|
|
4195
|
+
"type": "string",
|
|
4196
|
+
"maxLength": 800,
|
|
4197
|
+
"description": "visualMode=3 时必填。自定义风格与版面要求"
|
|
4198
|
+
},
|
|
4199
|
+
"richness": {
|
|
4200
|
+
"type": "integer",
|
|
4201
|
+
"enum": [1, 2, 3],
|
|
4202
|
+
"description": "内容数量档位:1 精简(2-5 页)/ 2 适中(6-8 页)/ 3 丰富(9-12 页)。最终页数由后端按正文长度和结构在范围内决定;用户改稿后仍可能偏离这个范围,但硬边界始终是 1-12 页"
|
|
4203
|
+
},
|
|
4204
|
+
"modelCode": {
|
|
4205
|
+
"type": "string",
|
|
4206
|
+
"maxLength": 32,
|
|
4207
|
+
"description": "文生图模型档位 code,用 textToImages.models 查"
|
|
4208
|
+
},
|
|
4209
|
+
"referenceImageIds": {
|
|
4210
|
+
"type": "array",
|
|
4211
|
+
"maxItems": 10,
|
|
4212
|
+
"items": {
|
|
4213
|
+
"type": "integer",
|
|
4214
|
+
"minimum": 1
|
|
4215
|
+
},
|
|
4216
|
+
"description": "参考素材图 id 列表,有序,用 images.list 查,最多 10 张"
|
|
4217
|
+
}
|
|
4218
|
+
},
|
|
4219
|
+
"required": ["companyId", "productId", "sourceType", "visualMode", "richness", "modelCode"],
|
|
4220
|
+
"additionalProperties": false
|
|
4221
|
+
}
|
|
4222
|
+
},
|
|
4223
|
+
{
|
|
4224
|
+
"name": "answerCards.savePages",
|
|
4225
|
+
"mode": "write",
|
|
4226
|
+
"guide": "answer-card",
|
|
4227
|
+
"requiresPlan": true,
|
|
4228
|
+
"description": "补丁式改答案卡脚本。只说清「改了什么」——pages 按 id 改字段、insert 插入新页、order 重排、deleteIds 删页,四项至少给一项非空数组,不用把没改过的页也搬一遍原样传回来。服务端按「删 → 改 → 排 → 插」的固定顺序合并:order 只用列已有页的 id(新插入的页此刻还没有 id);insert 的 afterIndex 是「排完序之后」的下标,-1 表示插到最前,其余表示插到该下标对应页之后。这一步不扣费,改到满意再用 answerCards.generate 出图。",
|
|
4229
|
+
"inputSchema": {
|
|
4230
|
+
"type": "object",
|
|
4231
|
+
"properties": {
|
|
4232
|
+
"taskId": {
|
|
4233
|
+
"type": "integer",
|
|
4234
|
+
"minimum": 1
|
|
4235
|
+
},
|
|
4236
|
+
"pages": {
|
|
4237
|
+
"type": "array",
|
|
4238
|
+
"description": "按 id 改现有页的字段,字段缺省表示不动这一项",
|
|
4239
|
+
"items": {
|
|
4240
|
+
"type": "object",
|
|
4241
|
+
"properties": {
|
|
4242
|
+
"id": {
|
|
4243
|
+
"type": "integer",
|
|
4244
|
+
"minimum": 1,
|
|
4245
|
+
"description": "要改哪一页"
|
|
4246
|
+
},
|
|
4247
|
+
"type": {
|
|
4248
|
+
"type": "string",
|
|
4249
|
+
"maxLength": 32,
|
|
4250
|
+
"description": "页面角色,如 cover/conclusion/summary 等"
|
|
4251
|
+
},
|
|
4252
|
+
"layoutType": {
|
|
4253
|
+
"type": "string",
|
|
4254
|
+
"enum": ["cover", "three_cards", "process", "grid"],
|
|
4255
|
+
"description": "版式"
|
|
4256
|
+
},
|
|
4257
|
+
"eyebrow": {
|
|
4258
|
+
"type": "string",
|
|
4259
|
+
"maxLength": 64,
|
|
4260
|
+
"description": "眉题"
|
|
4261
|
+
},
|
|
4262
|
+
"title": {
|
|
4263
|
+
"type": "string",
|
|
4264
|
+
"maxLength": 128,
|
|
4265
|
+
"description": "主标题"
|
|
4266
|
+
},
|
|
4267
|
+
"subtitle": {
|
|
4268
|
+
"type": "string",
|
|
4269
|
+
"maxLength": 128,
|
|
4270
|
+
"description": "副标题"
|
|
4271
|
+
},
|
|
4272
|
+
"body": {
|
|
4273
|
+
"type": "string",
|
|
4274
|
+
"maxLength": 1000,
|
|
4275
|
+
"description": "页面摘要"
|
|
4276
|
+
},
|
|
4277
|
+
"keyPoints": {
|
|
4278
|
+
"type": "array",
|
|
4279
|
+
"items": {
|
|
4280
|
+
"type": "string"
|
|
4281
|
+
},
|
|
4282
|
+
"description": "关键点。四宫格版式(layoutType=grid)最多 4 条,其余版式最多 3 条"
|
|
4283
|
+
},
|
|
4284
|
+
"highlight": {
|
|
4285
|
+
"type": "string",
|
|
4286
|
+
"maxLength": 64,
|
|
4287
|
+
"description": "重点词或数字"
|
|
4288
|
+
},
|
|
4289
|
+
"evidence": {
|
|
4290
|
+
"type": "string",
|
|
4291
|
+
"maxLength": 2000,
|
|
4292
|
+
"description": "内容依据,只能来自原文"
|
|
4293
|
+
},
|
|
4294
|
+
"visualType": {
|
|
4295
|
+
"type": "integer",
|
|
4296
|
+
"enum": [1, 2, 3, 4, 5, 6],
|
|
4297
|
+
"description": "画面素材类型:1 实景 2 人像 3 产品展示 4 数据图表 5 流程/信息图 6 纯文字卡"
|
|
4298
|
+
},
|
|
4299
|
+
"visualSubject": {
|
|
4300
|
+
"type": "string",
|
|
4301
|
+
"maxLength": 255,
|
|
4302
|
+
"description": "画面主体"
|
|
4303
|
+
},
|
|
4304
|
+
"visualInstruction": {
|
|
4305
|
+
"type": "string",
|
|
4306
|
+
"maxLength": 1000,
|
|
4307
|
+
"description": "画面构图要求"
|
|
4308
|
+
}
|
|
4309
|
+
},
|
|
4310
|
+
"required": ["id"],
|
|
4311
|
+
"additionalProperties": false
|
|
4312
|
+
}
|
|
4313
|
+
},
|
|
4314
|
+
"insert": {
|
|
4315
|
+
"type": "array",
|
|
4316
|
+
"description": "插入新页,没有 id",
|
|
4317
|
+
"items": {
|
|
4318
|
+
"type": "object",
|
|
4319
|
+
"properties": {
|
|
4320
|
+
"afterIndex": {
|
|
4321
|
+
"type": "integer",
|
|
4322
|
+
"minimum": -1,
|
|
4323
|
+
"description": "插到排序后第几页(0 起算)之后;-1 表示插到最前"
|
|
4324
|
+
},
|
|
4325
|
+
"type": {
|
|
4326
|
+
"type": "string",
|
|
4327
|
+
"maxLength": 32,
|
|
4328
|
+
"description": "页面角色,如 cover/conclusion/summary 等"
|
|
4329
|
+
},
|
|
4330
|
+
"title": {
|
|
4331
|
+
"type": "string",
|
|
4332
|
+
"maxLength": 128,
|
|
4333
|
+
"description": "主标题"
|
|
4334
|
+
},
|
|
4335
|
+
"visualType": {
|
|
4336
|
+
"type": "integer",
|
|
4337
|
+
"enum": [1, 2, 3, 4, 5, 6],
|
|
4338
|
+
"description": "画面素材类型:1 实景 2 人像 3 产品展示 4 数据图表 5 流程/信息图 6 纯文字卡"
|
|
4339
|
+
},
|
|
4340
|
+
"layoutType": {
|
|
4341
|
+
"type": "string",
|
|
4342
|
+
"enum": ["cover", "three_cards", "process", "grid"],
|
|
4343
|
+
"description": "版式"
|
|
4344
|
+
},
|
|
4345
|
+
"eyebrow": {
|
|
4346
|
+
"type": "string",
|
|
4347
|
+
"maxLength": 64,
|
|
4348
|
+
"description": "眉题"
|
|
4349
|
+
},
|
|
4350
|
+
"subtitle": {
|
|
4351
|
+
"type": "string",
|
|
4352
|
+
"maxLength": 128,
|
|
4353
|
+
"description": "副标题"
|
|
4354
|
+
},
|
|
4355
|
+
"body": {
|
|
4356
|
+
"type": "string",
|
|
4357
|
+
"maxLength": 1000,
|
|
4358
|
+
"description": "页面摘要"
|
|
4359
|
+
},
|
|
4360
|
+
"keyPoints": {
|
|
4361
|
+
"type": "array",
|
|
4362
|
+
"items": {
|
|
4363
|
+
"type": "string"
|
|
4364
|
+
},
|
|
4365
|
+
"description": "关键点。四宫格版式(layoutType=grid)最多 4 条,其余版式最多 3 条"
|
|
4366
|
+
},
|
|
4367
|
+
"highlight": {
|
|
4368
|
+
"type": "string",
|
|
4369
|
+
"maxLength": 64,
|
|
4370
|
+
"description": "重点词或数字"
|
|
4371
|
+
},
|
|
4372
|
+
"evidence": {
|
|
4373
|
+
"type": "string",
|
|
4374
|
+
"maxLength": 2000,
|
|
4375
|
+
"description": "内容依据,只能来自原文"
|
|
4376
|
+
},
|
|
4377
|
+
"visualSubject": {
|
|
4378
|
+
"type": "string",
|
|
4379
|
+
"maxLength": 255,
|
|
4380
|
+
"description": "画面主体"
|
|
4381
|
+
},
|
|
4382
|
+
"visualInstruction": {
|
|
4383
|
+
"type": "string",
|
|
4384
|
+
"maxLength": 1000,
|
|
4385
|
+
"description": "画面构图要求"
|
|
4386
|
+
}
|
|
4387
|
+
},
|
|
4388
|
+
"required": ["afterIndex", "type", "title", "visualType"],
|
|
4389
|
+
"additionalProperties": false
|
|
4390
|
+
}
|
|
4391
|
+
},
|
|
4392
|
+
"order": {
|
|
4393
|
+
"type": "array",
|
|
4394
|
+
"items": {
|
|
4395
|
+
"type": "integer",
|
|
4396
|
+
"minimum": 1
|
|
4397
|
+
},
|
|
4398
|
+
"description": "重排页面顺序。必须列全当前全部页的 id,长度要和当前页数相等,不能重复也不能漏"
|
|
4399
|
+
},
|
|
4400
|
+
"deleteIds": {
|
|
4401
|
+
"type": "array",
|
|
4402
|
+
"items": {
|
|
4403
|
+
"type": "integer",
|
|
4404
|
+
"minimum": 1
|
|
4405
|
+
},
|
|
4406
|
+
"description": "要删除的页面 id"
|
|
4407
|
+
}
|
|
4408
|
+
},
|
|
4409
|
+
"required": ["taskId"],
|
|
4410
|
+
"additionalProperties": false
|
|
4411
|
+
}
|
|
4412
|
+
},
|
|
4413
|
+
{
|
|
4414
|
+
"name": "answerCards.generate",
|
|
4415
|
+
"mode": "write",
|
|
4416
|
+
"guide": "answer-card",
|
|
4417
|
+
"requiresPlan": true,
|
|
4418
|
+
"description": "确认生成整套图。⚠️ 这一步真扣费,一次扣两笔:出图费按页收(页数 × 模型档位单价),另有一笔基础费按任务只收一次。出图是异步的,执行完只拿到批次号,要用 answerCards.batch 轮询到批次终态才有图。出图失败的页会退回那几页的出图费。⚠️ 这份计划有有效期,确认之后不要再用 answerCards.savePages 改脚本——页数一变,apply 时会发现页数对不上而被打回,得重新生成计划让用户重新确认。",
|
|
4419
|
+
"inputSchema": {
|
|
4420
|
+
"type": "object",
|
|
4421
|
+
"properties": {
|
|
4422
|
+
"taskId": {
|
|
4423
|
+
"type": "integer",
|
|
4424
|
+
"minimum": 1
|
|
4425
|
+
}
|
|
4426
|
+
},
|
|
4427
|
+
"required": ["taskId"],
|
|
4428
|
+
"additionalProperties": false
|
|
4429
|
+
}
|
|
4430
|
+
},
|
|
4431
|
+
{
|
|
4432
|
+
"name": "answerCards.savePublishInfo",
|
|
4433
|
+
"mode": "write",
|
|
4434
|
+
"guide": "answer-card",
|
|
4435
|
+
"requiresPlan": true,
|
|
4436
|
+
"description": "保存答案卡的发布资料(标题/描述/话题标签/封面页)。不触发重新生成,也不会直接发布,这一步不扣费。",
|
|
4437
|
+
"inputSchema": {
|
|
4438
|
+
"type": "object",
|
|
4439
|
+
"properties": {
|
|
4440
|
+
"taskId": {
|
|
4441
|
+
"type": "integer",
|
|
4442
|
+
"minimum": 1
|
|
4443
|
+
},
|
|
4444
|
+
"publishTitle": {
|
|
4445
|
+
"type": "string",
|
|
4446
|
+
"maxLength": 30
|
|
4447
|
+
},
|
|
4448
|
+
"publishDescription": {
|
|
4449
|
+
"type": "string",
|
|
4450
|
+
"maxLength": 500
|
|
4451
|
+
},
|
|
4452
|
+
"publishTags": {
|
|
4453
|
+
"type": "array",
|
|
4454
|
+
"maxItems": 8,
|
|
4455
|
+
"items": {
|
|
4456
|
+
"type": "string",
|
|
4457
|
+
"maxLength": 30
|
|
4458
|
+
},
|
|
4459
|
+
"description": "话题标签,不允许空字符串"
|
|
4460
|
+
},
|
|
4461
|
+
"coverPageId": {
|
|
4462
|
+
"type": "integer",
|
|
4463
|
+
"minimum": 1,
|
|
4464
|
+
"description": "封面页 id,须是该任务下已有的一个页面 id"
|
|
4465
|
+
}
|
|
4466
|
+
},
|
|
4467
|
+
"required": ["taskId", "publishTitle"],
|
|
4468
|
+
"additionalProperties": false
|
|
4469
|
+
}
|
|
3808
4470
|
}
|
|
3809
4471
|
]
|
|
3810
4472
|
}
|
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",
|
|
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:{...
|
|
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(
|
|
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.2";var F=1,x=Oe,L=Te,p=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)(),`.${p}`)}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 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(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 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=`
|
|
5
5
|
(function () {
|
|
6
6
|
var shell = document.getElementById('shell');
|
|
7
7
|
var form = document.getElementById('f');
|
|
@@ -357,7 +357,7 @@ 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,
|
|
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,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(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||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){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,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:`${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
|
|
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
|
|
@@ -366,4 +366,4 @@ ${o} \u73B0\u5728\u8BF7\u628A\u4E0B\u9762\u8FD9\u4E2A\u5730\u5740\u8F6C\u8FBE\u7
|
|
|
366
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
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
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}`}
|
|
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:`${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:F,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: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=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","video","answer-card"];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 ${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 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 ${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)}`}),"answerCards.list":e=>({path:"/answer-cards",query:e}),"answerCards.templates":()=>({path:"/answer-cards/templates"}),"answerCards.get":e=>({path:`/answer-cards/${Number(e.id)}`}),"answerCards.batch":e=>({path:`/answer-cards/${Number(e.taskId)}/batches/${Number(e.batchId)}`})};function 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=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:`${p} 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]){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(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`${p} auth ${t}`}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "answer-card",
|
|
3
|
+
"title": "AI 答案卡",
|
|
4
|
+
"whenToUse": "用户想用一篇文章或一段自定义文案,快速生成一套图文并茂的多页答案卡(适合做信息图/知识卡片发布),或者想改一改已生成的脚本、查进度、拿成图地址时。",
|
|
5
|
+
"prerequisites": [
|
|
6
|
+
"已完成 best-geo auth login",
|
|
7
|
+
"已经确定是哪家公司、哪个 GEO 项目(用 companies.list / products.list 确认)"
|
|
8
|
+
],
|
|
9
|
+
"workflow": [
|
|
10
|
+
{
|
|
11
|
+
"step": 1,
|
|
12
|
+
"action": "确定内容来源与视觉方式",
|
|
13
|
+
"note": "内容来源二选一:sourceType=1 用已有文章(给 articleId,从 articles.list 查)、sourceType=2 用自定义正文(给 content,至少 20 个有效字符)。视觉方式三选一:visualMode=1 让 AI 自动挑模板(最省事)、=2 指定模板(先用 answerCards.templates 查可用模板拿 templateId)、=3 自定义风格(给 customStylePrompt)。richness 决定页数档位,模型档位用 textToImages.models 查 modelCode。"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"step": 2,
|
|
17
|
+
"action": "走 plan/apply 提交创建",
|
|
18
|
+
"capability": "answerCards.create",
|
|
19
|
+
"note": "这一步不扣费。apply 成功只拿到 taskId,脚本还在异步分析,不代表已经出来了。"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"step": 3,
|
|
23
|
+
"action": "轮询到脚本就绪",
|
|
24
|
+
"capability": "answerCards.get",
|
|
25
|
+
"note": "status=1 是分析中,别高频轮询;status=2 才是「脚本已就绪」,这时 pages 里才有拆好的逐页内容可以看。"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"step": 4,
|
|
29
|
+
"action": "需要就改脚本,不需要跳过",
|
|
30
|
+
"capability": "answerCards.savePages",
|
|
31
|
+
"note": "补丁式提交:pages 按 id 改字段、insert 插新页、order 重排、deleteIds 删页,只说清改了什么。这一步不花钱,改到满意再出图,不用出完再返工。⚠️ 服务端是删了重建页,不是原地改——每次 savePages 之后,旧的页 id 全部作废,下次再改必须先重新 answerCards.get 拿新 id,拿旧 id 提交会被拒。"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"step": 5,
|
|
35
|
+
"action": "用户点头后确认生成",
|
|
36
|
+
"capability": "answerCards.generate",
|
|
37
|
+
"note": "⚠️ 这一步真扣费,一次扣两笔(出图费 + 基础费),plan 阶段的 notice 里两笔都会写清楚,必须原样念给用户、等明确同意才能 apply。apply 成功只拿到批次号,图还没出。确认之后不要再用 savePages 改脚本——页数变了会被打回,得重新 plan。"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"step": 6,
|
|
41
|
+
"action": "轮询批次到终态",
|
|
42
|
+
"capability": "answerCards.batch",
|
|
43
|
+
"note": "status=6 全部完成、7 部分失败、8 全部失败。看 items 里每一项的 status 和 imageUrls,status=4 是失败页。⚠️ 现在没有重跑单页的能力,有失败页时告知用户失败的页数(失败页的出图费会自动退回),引导他去网页处理,不要自己编一个操作去重试。"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"step": 7,
|
|
47
|
+
"action": "定发布资料",
|
|
48
|
+
"capability": "answerCards.savePublishInfo",
|
|
49
|
+
"note": "标题/描述/话题标签/封面页,不扣费、不触发重新生成、也不会直接发布——纯粹保存资料。"
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"askUserWhen": [
|
|
53
|
+
"用户没说清内容来源:给的是文章还是要自己写一段正文,两者只能选一个",
|
|
54
|
+
"用户没说清视觉方式:不确定就用「AI 智能匹配」(visualMode=1),别替用户随便指定一个模板或编一段风格描述",
|
|
55
|
+
"脚本已就绪(status=2):先把拆好的页面简要说给用户听,问要不要改,不要没确认就直接去 generate",
|
|
56
|
+
"确认生成之前:generate 是真花钱的一步,必须把 plan 里的费用说明(出图费 + 基础费两笔)念清楚,等用户明确同意再 apply",
|
|
57
|
+
"有失败页时:告知用户失败的页数和退款情况,问他要不要去网页处理,不要替他决定"
|
|
58
|
+
],
|
|
59
|
+
"forbidden": [
|
|
60
|
+
"不要替用户决定出不出图。answerCards.generate 是这条链路里唯一花钱的一步,没有得到用户明确同意不能 apply",
|
|
61
|
+
"不要在 status=1(分析中)时反复调 answerCards.get 高频轮询,分析通常需要一些时间",
|
|
62
|
+
"不要在 answerCards.generate 的计划确认之后再用 answerCards.savePages 改脚本。这份计划的报价是按当时的页数定的,页数一变就会被 apply 打回,得重新生成计划让用户重新确认",
|
|
63
|
+
"不要自己编 templateId / modelCode。templateId 从 answerCards.templates 查,modelCode 从 textToImages.models 查,猜的值提交后会被服务端拒",
|
|
64
|
+
"不要把 answerCards.savePages 的 pages/insert/order/deleteIds 全部留空提交。四项至少要给一项非空数组,全空的补丁不会被接受",
|
|
65
|
+
"不要拿 savePages 之前的旧页 id 去提交下一次 savePages 或 generate。savePages 是删了重建页,提交成功后旧 id 全部作废,必须重新 answerCards.get 拿新 id",
|
|
66
|
+
"不要因为批次 status 还没到终态就说任务失败了。4/5 排队中/出图中都还在正常跑,只有 6/7/8 才是终态",
|
|
67
|
+
"现在没有重跑单页失败图的能力,不要替用户编一个「重试」操作,有失败页就引导他去网页处理",
|
|
68
|
+
"不要跳过 plan 直接对写能力发 apply。answerCards.create / savePages / generate / savePublishInfo 都要先 plan 给用户看摘要"
|
|
69
|
+
],
|
|
70
|
+
"errorRecovery": {
|
|
71
|
+
"ACCESS_DENIED": "这个任务所属公司不在密钥授权范围内,或任务不存在。回到 companies.list 确认范围,或让用户去网页把这家公司加进这把密钥的授权。查别人的答案卡任务也报这个码——不区分「不存在」和「不是你的」。",
|
|
72
|
+
"VALIDATION_FAILED": "参数不合法,按 capabilities 里的 inputSchema 修正后重试。message 里写明了是哪个字段;常见原因:sourceType/visualMode 对应的必填项没给全、content 不够 20 个有效字符、savePages 的补丁四项全空、order 没列全所有页 id(或用了 savePages 之前已作废的旧页 id)。",
|
|
73
|
+
"PLAN_STALE": "确认期间这条任务(脚本或发布资料)被别人改过。重新 answerCards.get 读当前内容、重新 plan,把新摘要再给用户确认一次,不要拿旧 planId 重试。",
|
|
74
|
+
"PLAN_EXPIRED": "计划超过 30 分钟没执行。重新 plan,把新摘要再给用户确认一次——旧 planId 已经不能用了。",
|
|
75
|
+
"PLAN_COST_CHANGED": "generate 在 apply 时发现要出的页数和确认时不一样(多半是确认期间脚本被改过),或者单价变了。重新 plan,把新的页数和费用说明再念给用户确认一次,不要直接重试 apply。",
|
|
76
|
+
"QUOTA_EXCEEDED": "账户余额(积分/算力)不足,generate 真扣费的这一步最容易撞到。把 message 原样转达给用户,让他确认账户余额或联系管理员充值,不要重试 apply——余额不够重试也不会成功。",
|
|
77
|
+
"SERVER_ERROR": "服务端故障,稍后重试;反复出现请把 message 告知用户,不要自己判断原因。"
|
|
78
|
+
},
|
|
79
|
+
"completionCriteria": "查询类:已如实呈现任务/批次的真实状态,没跑完就说清它还在哪个阶段。写入类:answerCards.create/savePages/savePublishInfo 是不扣费的资料动作,用户看过 plan 摘要并同意后 apply 即可;answerCards.generate 必须让用户看清两笔费用并明确同意才能 apply,apply 成功后要告诉用户去哪查进度(answerCards.batch)。",
|
|
80
|
+
"writeFlow": {
|
|
81
|
+
"title": "写数据:先 plan,用户同意后才 apply",
|
|
82
|
+
"steps": [
|
|
83
|
+
"执行 best-geo plan answerCards.<operation> --input '<JSON>',此时什么都没提交。",
|
|
84
|
+
"把返回的 summary 原样念给用户听,answerCards.generate 的 notice 里的费用说明一条都不能漏。",
|
|
85
|
+
"等用户明确说同意。用户最初提的目标不算对这份摘要的确认。",
|
|
86
|
+
"同意之后执行 best-geo apply <planId>。"
|
|
87
|
+
],
|
|
88
|
+
"notes": [
|
|
89
|
+
"计划 30 分钟内有效,只能执行一次。",
|
|
90
|
+
"answerCards.create / savePages 之后的下一步都是异步的,apply 成功只代表提交了,要用对应的 get/batch 接口查进度。",
|
|
91
|
+
"answerCards.generate 的计划一旦确认,中途不要再用 savePages 改脚本——页数变了会导致 apply 被打回。"
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
}
|
package/guides/publication.json
CHANGED
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"step": 4,
|
|
29
29
|
"action": "要建发布任务,先把平台和账号查清楚",
|
|
30
30
|
"capability": "publicationAccounts.list",
|
|
31
|
-
"note": "顺序是:publicationPlatforms.list(带 contentType)看能发到哪儿 → publicationAccounts.list 看这个公司绑了哪些号 → 再建任务。平台名猜得出来,账号 id 猜不出来,不查就建必然失败。**挑号只挑 usable=true 的**,登录过期或已停用的号建任务时会被拒。**挑文章时用 articles.list 带上 status=1 和 mustHaveCover=true
|
|
31
|
+
"note": "顺序是:publicationPlatforms.list(带 contentType)看能发到哪儿 → publicationAccounts.list 看这个公司绑了哪些号 → 再建任务。平台名猜得出来,账号 id 猜不出来,不查就建必然失败。**挑号只挑 usable=true 的**,登录过期或已停用的号建任务时会被拒。**挑文章时用 articles.list 带上 status=1 和 mustHaveCover=true**——未审核或没封面的文章发不出去。**平台带 limitConfig 的,还要看字数够不够**:标题超上限、正文低于下限或超上限,建任务时整批会被拒(正文按去掉图片地址和空白之后算,比原文短)。平台的 remark 是投稿要求备注,有的话念给用户听。这几件事都是先筛掉比建任务被拒再回头省事。"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"step": 5,
|
|
35
35
|
"action": "建发布任务:publicationTasks.createArticle / createVideo",
|
|
36
36
|
"capability": "publicationTasks.createArticle",
|
|
37
|
-
"note": "**先 plan,把计划里逐条列的「哪篇发到哪个号、什么时候发」念给用户,等他确认再 apply**。执行之后稿子会真的发出去,CLI 撤不回来。aigc(要不要打 AI 创作声明)必须问用户,别替他决定。定时发布传 publishTime,不传就是立即发。费用按发布记录条数算——一篇发 3 个号就是 3
|
|
37
|
+
"note": "**先 plan,把计划里逐条列的「哪篇发到哪个号、什么时候发」念给用户,等他确认再 apply**。执行之后稿子会真的发出去,CLI 撤不回来。aigc(要不要打 AI 创作声明)必须问用户,别替他决定。定时发布传 publishTime,不传就是立即发。费用按发布记录条数算——一篇发 3 个号就是 3 条,跟用户说清楚这个口径。**plan 阶段就会查字数**:报「不满足平台的字数要求」时,错误信息里点名了是哪篇文章投哪个平台、差多少字——把这句原样念给用户,让他定是改文章还是不发那个平台,别自己挑一个继续重试(这种失败重试多少次都过不去)。"
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"step": 6,
|
|
@@ -84,7 +84,8 @@
|
|
|
84
84
|
"不要拿 currentPrice 当这笔的花费念——那是媒体现在的挂牌价,实际扣了多少看 chargedAmount",
|
|
85
85
|
"不要把 status 数值念给用户,用 statusLabel",
|
|
86
86
|
"不要说「暂停」或「删除任务」能撤回已经发出去的稿子——撤不了",
|
|
87
|
-
"不要拿未审核或没封面的文章去发布/投稿,会被拒。挑文章时就用 status=1 + mustHaveCover=true 筛掉"
|
|
87
|
+
"不要拿未审核或没封面的文章去发布/投稿,会被拒。挑文章时就用 status=1 + mustHaveCover=true 筛掉",
|
|
88
|
+
"平台配了 limitConfig 时,不要把字数不达标的文章塞给那个平台——整批都建不了。字数改不改、还发不发那个平台,让用户定,别自己换一篇重试"
|
|
88
89
|
],
|
|
89
90
|
"errorRecovery": [
|
|
90
91
|
{
|
|
@@ -93,7 +94,7 @@
|
|
|
93
94
|
},
|
|
94
95
|
{
|
|
95
96
|
"code": "VALIDATION_FAILED",
|
|
96
|
-
"action": "按 capabilities 里的 schema 修正参数。平台名要来自 publicationPlatforms.list、账号 id 来自 publicationAccounts.list
|
|
97
|
+
"action": "按 capabilities 里的 schema 修正参数。平台名要来自 publicationPlatforms.list、账号 id 来自 publicationAccounts.list,别自己拼。报「文章没有封面」「标题超过媒体限制」「时间已经过去了」时,是内容或参数本身的问题,改完再重新生成计划。**报「不满足平台的字数要求」时不要改参数重试**——那是文章本身长度不够或超了,改 schema 参数永远修不好。把报错原文念给用户(里面点名了哪篇文章投哪个平台、差多少字),让他定是改文章还是不发那个平台。"
|
|
97
98
|
},
|
|
98
99
|
{
|
|
99
100
|
"code": "PLAN_COST_CHANGED",
|
|
@@ -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
package/skills/best-geo/SKILL.md
CHANGED
|
@@ -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` 升级后再继续。
|