best-geo-test 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -454,7 +454,11 @@
454
454
  },
455
455
  "status": {
456
456
  "type": "integer",
457
- "description": "按文章状态过滤。取值:0=待审核,1=已通过,2=已拒绝。不传就是全部状态。"
457
+ "description": "按文章状态过滤。取值:0=待审核,1=已通过,2=已拒绝。不传就是全部状态。要找能发出去的文章就传 1。"
458
+ },
459
+ "mustHaveCover": {
460
+ "type": "boolean",
461
+ "description": "只看有封面图的。要挑文章去发布或投稿时,配上 status=1 一起传,出来的就都是发得出去的——不然查到一篇没封面的,建任务时才被拒。"
458
462
  },
459
463
  "published": {
460
464
  "type": "boolean",
@@ -3186,11 +3190,11 @@
3186
3190
  }
3187
3191
  },
3188
3192
  {
3189
- "name": "companies.delete",
3193
+ "name": "questions.delete",
3190
3194
  "mode": "write",
3191
- "guide": "company",
3195
+ "guide": "question",
3192
3196
  "requiresPlan": true,
3193
- "description": "删除公司。**连带删掉它下面全部 GEO 项目、文章、知识库和素材,不可恢复**。而且如果这是当前密钥唯一授权的公司,密钥会被一并撤销、这台机器上的 CLI 就用不了了。删之前一定要把摘要念给用户听。",
3197
+ "description": "删除搜索问题。已经跑出来的收录记录不受影响,只是这个问题以后不再被问。",
3194
3198
  "inputSchema": {
3195
3199
  "type": "object",
3196
3200
  "properties": {
@@ -3207,11 +3211,11 @@
3207
3211
  }
3208
3212
  },
3209
3213
  {
3210
- "name": "products.delete",
3214
+ "name": "articles.delete",
3211
3215
  "mode": "write",
3212
- "guide": "product",
3216
+ "guide": "article",
3213
3217
  "requiresPlan": true,
3214
- "description": "删除 GEO 项目。连带删掉它下面的文章、搜索问题和定时计划,**不可恢复**。",
3218
+ "description": "删除文章。删了就没了,**不可恢复**。已经发布出去的内容不受影响。",
3215
3219
  "inputSchema": {
3216
3220
  "type": "object",
3217
3221
  "properties": {
@@ -3228,11 +3232,11 @@
3228
3232
  }
3229
3233
  },
3230
3234
  {
3231
- "name": "questions.delete",
3235
+ "name": "knowledge.delete",
3232
3236
  "mode": "write",
3233
- "guide": "question",
3237
+ "guide": "knowledge",
3234
3238
  "requiresPlan": true,
3235
- "description": "删除搜索问题。已经跑出来的收录记录不受影响,只是这个问题以后不再被问。",
3239
+ "description": "删除知识库。库里文档一起删掉,**不可恢复**。绑定了这个库的搜索问题会失去这份资料。",
3236
3240
  "inputSchema": {
3237
3241
  "type": "object",
3238
3242
  "properties": {
@@ -3249,11 +3253,11 @@
3249
3253
  }
3250
3254
  },
3251
3255
  {
3252
- "name": "articles.delete",
3256
+ "name": "prompts.delete",
3253
3257
  "mode": "write",
3254
3258
  "guide": "article",
3255
3259
  "requiresPlan": true,
3256
- "description": "删除文章。删了就没了,**不可恢复**。已经发布出去的内容不受影响。",
3260
+ "description": "删除提示词。已经用它生成过的文章不受影响。系统内置的公共模板删不了。",
3257
3261
  "inputSchema": {
3258
3262
  "type": "object",
3259
3263
  "properties": {
@@ -3270,44 +3274,403 @@
3270
3274
  }
3271
3275
  },
3272
3276
  {
3273
- "name": "knowledge.delete",
3277
+ "name": "publicationPlatforms.list",
3278
+ "mode": "read",
3279
+ "guide": "publication",
3280
+ "requiresPlan": false,
3281
+ "description": "当前能用的自媒体发布平台。文章平台和视频平台是两批,建发布任务前先按 contentType 取对应的那批——拿文章平台去发视频会被拒。",
3282
+ "inputSchema": {
3283
+ "type": "object",
3284
+ "properties": {
3285
+ "contentType": {
3286
+ "type": "string",
3287
+ "enum": ["article", "video"],
3288
+ "description": "只看发文章的还是只看发视频的。不传就是全部"
3289
+ }
3290
+ },
3291
+ "additionalProperties": false
3292
+ }
3293
+ },
3294
+ {
3295
+ "name": "publicationAccounts.list",
3296
+ "mode": "read",
3297
+ "guide": "publication",
3298
+ "requiresPlan": false,
3299
+ "description": "已经绑定到公司的发布账号。平台名猜得出来,账号 id 猜不出来——要发内容必须先从这里拿到 id。**只挑 usable=true 的号**:登录过期或已停用的号建任务时会被拒(statusLabel 会写明是哪种),在这一步避开比建完被拒再回头省事。",
3300
+ "inputSchema": {
3301
+ "type": "object",
3302
+ "properties": {
3303
+ "companyId": { "type": "integer", "minimum": 1, "description": "只看某家公司的" },
3304
+ "platform": { "type": "string", "description": "只看某个平台的。取值来自 publicationPlatforms.list" },
3305
+ "page": { "type": "integer", "minimum": 1 },
3306
+ "limit": { "type": "integer", "minimum": 1, "maximum": 100 }
3307
+ },
3308
+ "additionalProperties": false
3309
+ }
3310
+ },
3311
+ {
3312
+ "name": "publicationTasks.list",
3313
+ "mode": "read",
3314
+ "guide": "publication",
3315
+ "requiresPlan": false,
3316
+ "description": "自媒体发布任务列表。一个任务下面挂着若干条「某篇内容发到某个平台某个账号」的记录,这里只给任务级汇总,要看每条的下场用 publicationRecords.list。",
3317
+ "inputSchema": {
3318
+ "type": "object",
3319
+ "properties": {
3320
+ "companyId": { "type": "integer", "minimum": 1, "description": "只看某家公司的" },
3321
+ "productId": { "type": "integer", "minimum": 1, "description": "只看某个 GEO 项目的" },
3322
+ "name": { "type": "string", "description": "按任务名模糊搜" },
3323
+ "page": { "type": "integer", "minimum": 1 },
3324
+ "limit": { "type": "integer", "minimum": 1, "maximum": 100 }
3325
+ },
3326
+ "additionalProperties": false
3327
+ }
3328
+ },
3329
+ {
3330
+ "name": "publicationRecords.list",
3331
+ "mode": "read",
3332
+ "guide": "publication",
3333
+ "requiresPlan": false,
3334
+ "description": "发布记录:每条内容在每个平台的实际下场。这是「发出去了没有、发到哪个链接、失败为什么」的唯一出处——用户问「小红书那篇发了吗」就查这里。status 同时给数值和 statusLabel,念给用户用后者。",
3335
+ "inputSchema": {
3336
+ "type": "object",
3337
+ "properties": {
3338
+ "taskId": { "type": "integer", "minimum": 1, "description": "只看某个发布任务下的" },
3339
+ "articleId": { "type": "integer", "minimum": 1, "description": "只看某篇文章的" },
3340
+ "platform": { "type": "string", "description": "只看某个平台的" },
3341
+ "status": { "type": "integer", "description": "0待发布 1发布中 2已发布 3失败 4已暂停 5已取消 6人工 7被拒" },
3342
+ "companyId": { "type": "integer", "minimum": 1 },
3343
+ "productId": { "type": "integer", "minimum": 1 },
3344
+ "page": { "type": "integer", "minimum": 1 },
3345
+ "limit": { "type": "integer", "minimum": 1, "maximum": 100 }
3346
+ },
3347
+ "additionalProperties": false
3348
+ }
3349
+ },
3350
+ {
3351
+ "name": "mediaPlatforms.list",
3352
+ "mode": "read",
3353
+ "guide": "publication",
3354
+ "requiresPlan": false,
3355
+ "description": "可投稿的媒体清单,含分类、地区、价格和上下架状态。媒体投稿和自媒体发布是两回事:这个是花钱请媒体发,那个是用自己的账号发。",
3356
+ "inputSchema": {
3357
+ "type": "object",
3358
+ "properties": {
3359
+ "mediaName": { "type": "string", "description": "按媒体名搜" },
3360
+ "page": { "type": "integer", "minimum": 1 },
3361
+ "limit": { "type": "integer", "minimum": 1, "maximum": 100 }
3362
+ },
3363
+ "additionalProperties": false
3364
+ }
3365
+ },
3366
+ {
3367
+ "name": "mediaPlatforms.get",
3368
+ "mode": "read",
3369
+ "guide": "publication",
3370
+ "requiresPlan": false,
3371
+ "description": "单个媒体的实时状态与当前价格。**报价给用户前必须查这条**——列表是分页快照,遇上刚调过价就会和实际扣费对不上。",
3372
+ "inputSchema": {
3373
+ "type": "object",
3374
+ "properties": {
3375
+ "mediaId": { "type": "integer", "minimum": 1, "description": "哪个媒体。id 来自 mediaPlatforms.list" }
3376
+ },
3377
+ "required": ["mediaId"],
3378
+ "additionalProperties": false
3379
+ }
3380
+ },
3381
+ {
3382
+ "name": "mediaPublications.list",
3383
+ "mode": "read",
3384
+ "guide": "publication",
3385
+ "requiresPlan": false,
3386
+ "description": "媒体投稿记录:订单状态、失败原因、发布链接、退款状态。投稿是异步的,提交完要过一阵才出结果,用这条查进展。**status 和 refundStatus 是两件事**——status 说稿子发出去没有,refundStatus 说钱退没退;被拒稿的记录要把两个都念给用户。",
3387
+ "inputSchema": {
3388
+ "type": "object",
3389
+ "properties": {
3390
+ "articleId": { "type": "integer", "minimum": 1, "description": "只看某篇文章投出去的" },
3391
+ "mediaId": { "type": "integer", "minimum": 1, "description": "只看投到某个媒体的" },
3392
+ "companyId": { "type": "integer", "minimum": 1 },
3393
+ "page": { "type": "integer", "minimum": 1 },
3394
+ "limit": { "type": "integer", "minimum": 1, "maximum": 100 }
3395
+ },
3396
+ "additionalProperties": false
3397
+ }
3398
+ },
3399
+ {
3400
+ "name": "mediaPublications.summary",
3401
+ "mode": "read",
3402
+ "guide": "publication",
3403
+ "requiresPlan": false,
3404
+ "description": "投稿记录的状态汇总。要回答「投出去的都怎么样了」用这条,别去翻列表自己数——投稿动辄上百条,翻列表会把上下文占满。念结果用 items 里的 statusLabel(如「已拒稿 × 15」),counts 是给过滤用的原始数值,别把里面的数字念给用户。",
3405
+ "inputSchema": {
3406
+ "type": "object",
3407
+ "properties": {
3408
+ "articleId": { "type": "integer", "minimum": 1 },
3409
+ "mediaId": { "type": "integer", "minimum": 1 },
3410
+ "companyId": { "type": "integer", "minimum": 1 }
3411
+ },
3412
+ "additionalProperties": false
3413
+ }
3414
+ },
3415
+ {
3416
+ "name": "articleTasks.reuseConfig",
3417
+ "mode": "read",
3418
+ "guide": "article-task",
3419
+ "requiresPlan": false,
3420
+ "description": "把一个已有文章任务的参数读回来,供「照着上次再来一批」用。**只读参数,不建任务、不扣费**。拿到后要先跟用户确认(可以改问题、改篇数、换模型),再走 articleTasks.create。返回里 warnings 说明哪些资源已失效,missingRequiredFields 列出必须重新指定的字段——这两项非空时不要直接拿去 create。",
3421
+ "inputSchema": {
3422
+ "type": "object",
3423
+ "properties": {
3424
+ "taskId": { "type": "integer", "minimum": 1, "description": "照着哪个任务。id 来自 articleTasks.list" }
3425
+ },
3426
+ "required": ["taskId"],
3427
+ "additionalProperties": false
3428
+ }
3429
+ },
3430
+ {
3431
+ "name": "articleTasks.delete",
3274
3432
  "mode": "write",
3275
- "guide": "knowledge",
3433
+ "guide": "article-task",
3276
3434
  "requiresPlan": true,
3277
- "description": "删除知识库。库里文档一起删掉,**不可恢复**。绑定了这个库的搜索问题会失去这份资料。",
3435
+ "description": "删除文章任务。⚠️ **会连带删掉这个任务生成的全部文章,不可恢复**(数据库级联,不是可选项)。plan 摘要里会给出确切篇数,那个数必须念给用户听——他多半以为只是清掉一条任务记录。还在跑的任务删不了。",
3278
3436
  "inputSchema": {
3279
3437
  "type": "object",
3280
3438
  "properties": {
3281
- "id": {
3282
- "type": "integer",
3283
- "minimum": 1,
3284
- "description": "要删哪一条"
3285
- }
3439
+ "taskId": { "type": "integer", "minimum": 1, "description": "要删哪个任务" }
3286
3440
  },
3287
- "required": [
3288
- "id"
3289
- ],
3441
+ "required": ["taskId"],
3290
3442
  "additionalProperties": false
3291
3443
  }
3292
3444
  },
3293
3445
  {
3294
- "name": "prompts.delete",
3446
+ "name": "folders.create",
3295
3447
  "mode": "write",
3296
3448
  "guide": "article",
3297
3449
  "requiresPlan": true,
3298
- "description": "删除提示词。已经用它生成过的文章不受影响。系统内置的公共模板删不了。",
3450
+ "description": "新建文章文件夹。建完是空的,文章要另外用 articles.moveFolder 移进来。不扣费。",
3299
3451
  "inputSchema": {
3300
3452
  "type": "object",
3301
3453
  "properties": {
3302
- "id": {
3303
- "type": "integer",
3304
- "minimum": 1,
3305
- "description": "要删哪一条"
3454
+ "productId": { "type": "integer", "minimum": 1, "description": "建在哪个 GEO 项目下" },
3455
+ "name": { "type": "string", "minLength": 1, "description": "文件夹名" },
3456
+ "parentId": { "type": "integer", "minimum": 1, "description": "建成谁的子文件夹。不传就是顶层。id 来自 folders.list" }
3457
+ },
3458
+ "required": ["productId", "name"],
3459
+ "additionalProperties": false
3460
+ }
3461
+ },
3462
+ {
3463
+ "name": "folders.update",
3464
+ "mode": "write",
3465
+ "guide": "article",
3466
+ "requiresPlan": true,
3467
+ "description": "重命名文件夹或把它移到别处。parentId 传 null 表示移到顶层。默认文件夹改不了。只动文件夹本身,里面的文章不受影响。不扣费。",
3468
+ "inputSchema": {
3469
+ "type": "object",
3470
+ "properties": {
3471
+ "folderId": { "type": "integer", "minimum": 1, "description": "改哪个" },
3472
+ "name": { "type": "string", "minLength": 1, "description": "新名字" },
3473
+ "parentId": { "type": ["integer", "null"], "minimum": 1, "description": "移到谁下面。传 null = 移到顶层" }
3474
+ },
3475
+ "required": ["folderId"],
3476
+ "additionalProperties": false
3477
+ }
3478
+ },
3479
+ {
3480
+ "name": "folders.delete",
3481
+ "mode": "write",
3482
+ "guide": "article",
3483
+ "requiresPlan": true,
3484
+ "description": "删除文件夹。**只能删空的**——里面还有文章或子文件夹会被拒绝,不会连带删除任何内容。要先清空就用 articles.moveFolder 把文章移走。默认文件夹删不了。",
3485
+ "inputSchema": {
3486
+ "type": "object",
3487
+ "properties": {
3488
+ "folderId": { "type": "integer", "minimum": 1, "description": "要删哪个" }
3489
+ },
3490
+ "required": ["folderId"],
3491
+ "additionalProperties": false
3492
+ }
3493
+ },
3494
+ {
3495
+ "name": "publicationTasks.createArticle",
3496
+ "mode": "write",
3497
+ "guide": "publication",
3498
+ "requiresPlan": true,
3499
+ "description": "建文章发布任务:把已有文章发到自媒体平台。**执行后稿子会真的发出去,CLI 撤不回来**。费用按发布记录条数算——一篇文章发 3 个账号就是 3 条。建之前先用 publicationPlatforms.list(contentType=article)查平台、publicationAccounts.list 查这个公司绑了哪些账号。**文章必须已审核通过且有封面**,两者缺一发不了——用 articles.list 时带上 status 和 mustHaveCover 就只会看到能发的。",
3500
+ "inputSchema": {
3501
+ "type": "object",
3502
+ "properties": {
3503
+ "name": { "type": "string", "minLength": 1, "maxLength": 100, "description": "任务名,给用户认的" },
3504
+ "productId": { "type": "integer", "minimum": 1, "description": "发哪个 GEO 项目的内容" },
3505
+ "aigc": { "type": "boolean", "description": "要不要打「AI 创作」声明。**得问用户**,别替他决定" },
3506
+ "items": {
3507
+ "type": "array",
3508
+ "minItems": 1,
3509
+ "description": "每项是「一篇文章 + 它要发到哪些平台的哪些账号」",
3510
+ "items": {
3511
+ "type": "object",
3512
+ "properties": {
3513
+ "articleId": { "type": "integer", "minimum": 1 },
3514
+ "platforms": {
3515
+ "type": "array",
3516
+ "minItems": 1,
3517
+ "items": {
3518
+ "type": "object",
3519
+ "properties": {
3520
+ "platform": { "type": "string", "description": "平台标识,填 publicationPlatforms.list 返回的 platform 值" },
3521
+ "publishAccountIds": {
3522
+ "type": "array",
3523
+ "minItems": 1,
3524
+ "items": { "type": "integer", "minimum": 1 },
3525
+ "description": "用哪些账号发。一个账号一条发布记录"
3526
+ },
3527
+ "publishTime": {
3528
+ "type": "string",
3529
+ "description": "定时发布时间,ISO 格式如 2026-09-01T09:00:00+08:00。**不传 = 立即发布**。不能填过去的时间"
3530
+ }
3531
+ },
3532
+ "required": ["platform", "publishAccountIds"],
3533
+ "additionalProperties": false
3534
+ }
3535
+ }
3536
+ },
3537
+ "required": ["articleId", "platforms"],
3538
+ "additionalProperties": false
3539
+ }
3306
3540
  }
3307
3541
  },
3308
- "required": [
3309
- "id"
3310
- ],
3542
+ "required": ["name", "productId", "aigc", "items"],
3543
+ "additionalProperties": false
3544
+ }
3545
+ },
3546
+ {
3547
+ "name": "publicationTasks.createVideo",
3548
+ "mode": "write",
3549
+ "guide": "publication",
3550
+ "requiresPlan": true,
3551
+ "description": "建视频发布任务。和 createArticle 同一套结构,只把 articleId 换成 videoId,平台要用 contentType=video 那批——拿文章平台发视频会被拒。",
3552
+ "inputSchema": {
3553
+ "type": "object",
3554
+ "properties": {
3555
+ "name": { "type": "string", "minLength": 1, "maxLength": 100 },
3556
+ "productId": { "type": "integer", "minimum": 1 },
3557
+ "aigc": { "type": "boolean", "description": "要不要打「AI 创作」声明。**得问用户**" },
3558
+ "items": {
3559
+ "type": "array",
3560
+ "minItems": 1,
3561
+ "items": {
3562
+ "type": "object",
3563
+ "properties": {
3564
+ "videoId": { "type": "integer", "minimum": 1 },
3565
+ "platforms": {
3566
+ "type": "array",
3567
+ "minItems": 1,
3568
+ "items": {
3569
+ "type": "object",
3570
+ "properties": {
3571
+ "platform": { "type": "string" },
3572
+ "publishAccountIds": {
3573
+ "type": "array",
3574
+ "minItems": 1,
3575
+ "items": { "type": "integer", "minimum": 1 }
3576
+ },
3577
+ "publishTime": { "type": "string", "description": "ISO 格式。不传 = 立即发布" }
3578
+ },
3579
+ "required": ["platform", "publishAccountIds"],
3580
+ "additionalProperties": false
3581
+ }
3582
+ }
3583
+ },
3584
+ "required": ["videoId", "platforms"],
3585
+ "additionalProperties": false
3586
+ }
3587
+ }
3588
+ },
3589
+ "required": ["name", "productId", "aigc", "items"],
3590
+ "additionalProperties": false
3591
+ }
3592
+ },
3593
+ {
3594
+ "name": "publicationTasks.delete",
3595
+ "mode": "write",
3596
+ "guide": "publication",
3597
+ "requiresPlan": true,
3598
+ "description": "删发布任务。只删任务和它名下**还没发出去**的记录——已经发布成功的稿子留在平台上不受影响,要撤那些得去各平台自己删。一次只能删同一家公司的。",
3599
+ "inputSchema": {
3600
+ "type": "object",
3601
+ "properties": {
3602
+ "taskIds": {
3603
+ "type": "array",
3604
+ "minItems": 1,
3605
+ "items": { "type": "integer", "minimum": 1 },
3606
+ "description": "要删哪些。必须都属于同一家公司"
3607
+ }
3608
+ },
3609
+ "required": ["taskIds"],
3610
+ "additionalProperties": false
3611
+ }
3612
+ },
3613
+ {
3614
+ "name": "publicationTasks.pause",
3615
+ "mode": "write",
3616
+ "guide": "publication",
3617
+ "requiresPlan": true,
3618
+ "description": "暂停发布任务:把它名下**还没发出去**的记录挂起。已经发成功的撤不回来,正在发的那条也拦不住。不扣费。",
3619
+ "inputSchema": {
3620
+ "type": "object",
3621
+ "properties": { "taskId": { "type": "integer", "minimum": 1 } },
3622
+ "required": ["taskId"],
3623
+ "additionalProperties": false
3624
+ }
3625
+ },
3626
+ {
3627
+ "name": "publicationTasks.resume",
3628
+ "mode": "write",
3629
+ "guide": "publication",
3630
+ "requiresPlan": true,
3631
+ "description": "恢复被暂停的发布任务,挂起的记录重新排队发出去。定时的按原定时间走,时间已经过了的会尽快发。不扣费。",
3632
+ "inputSchema": {
3633
+ "type": "object",
3634
+ "properties": { "taskId": { "type": "integer", "minimum": 1 } },
3635
+ "required": ["taskId"],
3636
+ "additionalProperties": false
3637
+ }
3638
+ },
3639
+ {
3640
+ "name": "mediaPublications.create",
3641
+ "mode": "write",
3642
+ "guide": "publication",
3643
+ "requiresPlan": true,
3644
+ "description": "把一篇文章投给一家付费媒体。**文章必须已审核通过且有封面**。**按家收费,单价各不相同**——计划里会逐家列出名字和价格,念给用户听再让他确认。投出去之后发不发由媒体那边定,被拒稿会原路退款。",
3645
+ "inputSchema": {
3646
+ "type": "object",
3647
+ "properties": {
3648
+ "articleId": { "type": "integer", "minimum": 1, "description": "投哪篇" },
3649
+ "mediaId": { "type": "integer", "minimum": 1, "description": "投给哪家。用 mediaPlatforms.list 查在架的媒体和价格" }
3650
+ },
3651
+ "required": ["articleId", "mediaId"],
3652
+ "additionalProperties": false
3653
+ }
3654
+ },
3655
+ {
3656
+ "name": "mediaPublications.batchCreate",
3657
+ "mode": "write",
3658
+ "guide": "publication",
3659
+ "requiresPlan": true,
3660
+ "description": "把**一篇**文章一次投给多家媒体,最多 20 家。按家收费,计划里逐家列价格和合计。允许部分成功:某家失败不影响别家。执行结果里每家都带 settlementStatus——charged=扣了、not_charged=没扣、refunded=扣了又退回了、refund_pending=扣了但还没退回来(系统会自动补退)。汇总看 netChargedTotal(这次实际净扣多少),**金额单位是元**(结果里的 amountUnit 也写了)。**报账目念这几个数,别自己按成功家数乘单价算**。要重投得重新生成计划。投多篇文章就一篇一篇来。",
3661
+ "inputSchema": {
3662
+ "type": "object",
3663
+ "properties": {
3664
+ "articleId": { "type": "integer", "minimum": 1, "description": "投哪篇。一次只能一篇" },
3665
+ "mediaIds": {
3666
+ "type": "array",
3667
+ "minItems": 1,
3668
+ "maxItems": 20,
3669
+ "items": { "type": "integer", "minimum": 1 },
3670
+ "description": "投给哪几家"
3671
+ }
3672
+ },
3673
+ "required": ["articleId", "mediaIds"],
3311
3674
  "additionalProperties": false
3312
3675
  }
3313
3676
  }
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var At=Object.defineProperty;var bt=(e,t,n)=>t in e?At(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Z=(e,t,n)=>bt(e,typeof t!="symbol"?t+"":t,n);var ee="https://nbgeo.aimusiclj.com",he="best-geo-test",Ie="best-geo-test",ke="bg-test-cli-",Ae="0.3.1";var D=1,E=Ae,O=Ie,l=he,be="dev",q=xt(St());function St(){var e;return(e=process.env.BEST_GEO_API_BASE)!=null?e:ee}var j=ke,Se=300*1e3,xe=30*1e3,_e=300*1e3;function xt(e){return e.replace(/\/+$/,"")}var Ve=require("node:child_process");var Oe=require("node:crypto"),G=require("node:os");var p=require("node:fs"),ve=require("node:os"),L=require("node:path");var we=require("node:crypto");var b=class extends Error{constructor(n,r,o){super(o);Z(this,"reason",n);Z(this,"path",r);this.name="LocalConfigError"}},_t={schemaVersion:1,device:null,activeCredential:null,pendingCredential:null};function U(){var e;return(e=process.env.BEST_GEO_CONFIG_DIR)!=null?e:(0,L.join)((0,ve.homedir)(),`.${l}`)}function w(){return(0,L.join)(U(),"config.json")}function x(){var n,r,o;let e=w(),t;try{if(!(0,p.existsSync)(e))return null;wt(e),t=(0,p.readFileSync)(e,"utf8")}catch(s){throw s instanceof b?s:Ce(s,e)}try{let s=JSON.parse(t);if(typeof s!="object"||s==null||s.schemaVersion!==1)throw new Error("unexpected shape");return{schemaVersion:1,device:(n=s.device)!=null?n:null,activeCredential:(r=s.activeCredential)!=null?r:null,pendingCredential:(o=s.pendingCredential)!=null?o:null}}catch{throw new b("corrupted",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5185\u5BB9\u4E0D\u5B8C\u6574\u6216\u683C\u5F0F\u4E0D\u5BF9\uFF1A${e}`)}}function vt(e){let t=U(),n=w(),r=(0,L.join)(t,`.config.json.${(0,we.randomBytes)(6).toString("hex")}.tmp`);try{(0,p.existsSync)(t)||(0,p.mkdirSync)(t,{recursive:!0,mode:448});let o=(0,p.openSync)(r,"wx",384);try{(0,p.writeSync)(o,`${JSON.stringify(e,null,2)}
3
- `),(0,p.fsyncSync)(o)}finally{(0,p.closeSync)(o)}(0,p.renameSync)(r,n)}catch(o){if((0,p.existsSync)(r))try{(0,p.unlinkSync)(r)}catch{}throw Ce(o,n)}}function _(e){var n;let t=e((n=x())!=null?n:{..._t});return vt(t),t}function wt(e){var r;if(process.platform==="win32")return;let t=(0,p.statSync)(e),n=(r=process.getuid)==null?void 0:r.call(process);if(n!=null&&t.uid!==n)throw new b("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 b("permissions_too_open",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u8FC7\u5BBD\uFF08\u540C\u673A\u5176\u4ED6\u7528\u6237\u53EF\u8BFB\uFF09\uFF1A${e}`)}function Ce(e,t){let n=e==null?void 0:e.code;return n==="EACCES"||n==="EPERM"||n==="EROFS"?new b("denied",t,`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\uFF1A${t}`):e instanceof Error?e:new Error(String(e))}var Ct=3600*1e3;function Re(){return(0,L.join)(U(),"pending-uploads.json")}function M(){let e=Re();if(!(0,p.existsSync)(e))return{};try{let t=JSON.parse((0,p.readFileSync)(e,"utf8")),n=Date.now();return Object.fromEntries(Object.entries(t).filter(([,r])=>{var o;return n-((o=r==null?void 0:r.createdAt)!=null?o:0)<Ct}))}catch{return{}}}function te(e){(0,p.mkdirSync)(U(),{recursive:!0,mode:448}),(0,p.writeFileSync)(Re(),JSON.stringify(e),{mode:384})}function $e(){var t,n;let e=(t=x())==null?void 0:t.device;return(n=e==null?void 0:e.deviceId)!=null&&n.startsWith(j)?e.deviceId:null}function H(){var r,o;let e={deviceName:(0,G.hostname)().slice(0,50),platform:`${(0,G.platform)()}-${process.arch}`},t=(r=x())==null?void 0:r.device;if((o=t==null?void 0:t.deviceId)!=null&&o.startsWith(j))return t.deviceName===e.deviceName&&t.platform===e.platform?t:_(s=>({...s,device:{...t,...e}})).device;let n={deviceId:`${j}${(0,Oe.randomUUID)()}`,...e};return _(s=>({...s,device:n})).device}function Ne(){return`cli_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function h(e,t=Ne()){return{ok:!0,code:"OK",requestId:t,data:e}}function c(e,t,n={}){var r;return{ok:!1,code:e,message:t,requestId:(r=n.requestId)!=null?r:Ne(),...n.data==null?{}:{data:n.data},...n.nextAction==null?{}:{nextAction:n.nextAction}}}function a(e){process.stdout.write(`${JSON.stringify(e)}
4
- `),e.ok||(process.exitCode=1)}async function y(e,t={}){var s,i;let n=new URL(`${q}/v1/agent-cli${e}`);for(let[d,m]of Object.entries((s=t.query)!=null?s:{}))if(m!=null)for(let u of Array.isArray(m)?m:[m])n.searchParams.append(d,String(u));let r={"X-GEO-CLI-Version":E,"X-GEO-Protocol-Version":String(D),"X-GEO-CLI-Package":O},o=null;try{o=$e()}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:(i=t.method)!=null?i:"GET",headers:r,body:t.body==null?void 0:JSON.stringify(t.body),signal:AbortSignal.timeout(t.isWrite?_e:xe)}),m=await d.text();try{let u=JSON.parse(m);return Rt(u)?u:c("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}catch{return c("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}}catch(d){return d instanceof Error&&(d.name==="TimeoutError"||d.name==="AbortError")?c("SERVER_ERROR",t.isWrite?"\u670D\u52A1\u7AEF\u5904\u7406\u8D85\u65F6,\u8FD9\u6B21\u5199\u5165\u7ED3\u679C\u672A\u77E5":"\u670D\u52A1\u7AEF\u54CD\u5E94\u8D85\u65F6",{data:{transportFailure:!0},nextAction:t.isWrite?{type:"ask_user",message:"\u8D85\u65F6\u4E0D\u4EE3\u8868\u6CA1\u5199\u8FDB\u53BB \u2014\u2014 \u670D\u52A1\u7AEF\u53EF\u80FD\u8FD8\u5728\u5904\u7406\u3002**\u5148\u7528\u5BF9\u5E94\u7684\u67E5\u8BE2\u80FD\u529B\u786E\u8BA4\u4E00\u904D**,\u786E\u5B9E\u6CA1\u6709\u518D\u91CD\u65B0 plan;\u76F4\u63A5\u91CD\u8BD5\u4F1A\u5EFA\u51FA\u91CD\u590D\u7684\u4E00\u4EFD,\u800C\u4E14\u4F1A\u518D\u6263\u4E00\u6B21\u8D39\u3002"}:{type:"ask_user",message:"\u670D\u52A1\u7AEF\u54CD\u5E94\u592A\u6162\u3002\u7A0D\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u5373\u53EF,\u67E5\u8BE2\u4E0D\u4F1A\u4EA7\u751F\u4EFB\u4F55\u5199\u5165"}}):c("SERVER_ERROR",`\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF1A${d instanceof Error?d.message:String(d)}`,{data:{transportFailure:!0},nextAction:{type:"ask_user",message:"\u8BF7\u786E\u8BA4\u7F51\u7EDC\u53EF\u7528\uFF0C\u4EE5\u53CA\u670D\u52A1\u7AEF\u5730\u5740\u914D\u7F6E\u6B63\u786E"}})}}function Rt(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.ok=="boolean"&&typeof t.code=="string"}function Ot(e){var t;return!e.ok&&((t=e.data)==null?void 0:t.transportFailure)===!0}function ne(e){return e.ok||Ot(e)?!1:["AUTH_EXPIRED","DEVICE_MISMATCH","ACCESS_DENIED","AUTH_REQUIRED","VALIDATION_FAILED"].includes(e.code)}function $(){var e,t,n;return(n=(t=(e=x())==null?void 0:e.activeCredential)==null?void 0:t.apiKey)!=null?n:null}function J(){var e,t;return(t=(e=x())==null?void 0:e.activeCredential)!=null?t:null}function Te(){var e,t;return(t=(e=x())==null?void 0:e.pendingCredential)!=null?t:null}function Pe(e){_(t=>({...t,pendingCredential:{apiKey:e,startedAt:new Date().toISOString()}}))}function re(){_(e=>({...e,pendingCredential:null}))}function oe(e){return _(t=>{let n=t.pendingCredential;return n?{...t,activeCredential:{apiKey:n.apiKey,...e},pendingCredential:null}:t}).activeCredential}function De(){_(e=>({...e,activeCredential:null,pendingCredential:null}))}var v=require("node:crypto"),Ue=require("node:http");function Le(e){let t=`
2
+ "use strict";var bt=Object.defineProperty;var At=(e,t,n)=>t in e?bt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Z=(e,t,n)=>At(e,typeof t!="symbol"?t+"":t,n);var ee="https://nbgeo.aimusiclj.com",he="best-geo-test",Ie="best-geo-test",ke="bg-test-cli-",be="0.3.2";var D=1,E=be,O=Ie,l=he,Ae="dev",B=xt(St());function St(){var e;return(e=process.env.BEST_GEO_API_BASE)!=null?e:ee}var j=ke,Se=300*1e3,xe=30*1e3,_e=300*1e3;function xt(e){return e.replace(/\/+$/,"")}var Ve=require("node:child_process");var Oe=require("node:crypto"),G=require("node:os");var p=require("node:fs"),ve=require("node:os"),L=require("node:path");var we=require("node:crypto");var A=class extends Error{constructor(n,r,i){super(i);Z(this,"reason",n);Z(this,"path",r);this.name="LocalConfigError"}},_t={schemaVersion:1,device:null,activeCredential:null,pendingCredential:null};function U(){var e;return(e=process.env.BEST_GEO_CONFIG_DIR)!=null?e:(0,L.join)((0,ve.homedir)(),`.${l}`)}function w(){return(0,L.join)(U(),"config.json")}function x(){var n,r,i;let e=w(),t;try{if(!(0,p.existsSync)(e))return null;wt(e),t=(0,p.readFileSync)(e,"utf8")}catch(s){throw s instanceof A?s:Ce(s,e)}try{let s=JSON.parse(t);if(typeof s!="object"||s==null||s.schemaVersion!==1)throw new Error("unexpected shape");return{schemaVersion:1,device:(n=s.device)!=null?n:null,activeCredential:(r=s.activeCredential)!=null?r:null,pendingCredential:(i=s.pendingCredential)!=null?i:null}}catch{throw new A("corrupted",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5185\u5BB9\u4E0D\u5B8C\u6574\u6216\u683C\u5F0F\u4E0D\u5BF9\uFF1A${e}`)}}function vt(e){let t=U(),n=w(),r=(0,L.join)(t,`.config.json.${(0,we.randomBytes)(6).toString("hex")}.tmp`);try{(0,p.existsSync)(t)||(0,p.mkdirSync)(t,{recursive:!0,mode:448});let i=(0,p.openSync)(r,"wx",384);try{(0,p.writeSync)(i,`${JSON.stringify(e,null,2)}
3
+ `),(0,p.fsyncSync)(i)}finally{(0,p.closeSync)(i)}(0,p.renameSync)(r,n)}catch(i){if((0,p.existsSync)(r))try{(0,p.unlinkSync)(r)}catch{}throw Ce(i,n)}}function _(e){var n;let t=e((n=x())!=null?n:{..._t});return vt(t),t}function wt(e){var r;if(process.platform==="win32")return;let t=(0,p.statSync)(e),n=(r=process.getuid)==null?void 0:r.call(process);if(n!=null&&t.uid!==n)throw new A("not_owner",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u4E0D\u5C5E\u4E8E\u5F53\u524D\u7528\u6237\uFF1A${e}`);if((t.mode&63)!==0)throw new A("permissions_too_open",e,`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u8FC7\u5BBD\uFF08\u540C\u673A\u5176\u4ED6\u7528\u6237\u53EF\u8BFB\uFF09\uFF1A${e}`)}function Ce(e,t){let n=e==null?void 0:e.code;return n==="EACCES"||n==="EPERM"||n==="EROFS"?new A("denied",t,`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\uFF1A${t}`):e instanceof Error?e:new Error(String(e))}var Ct=3600*1e3;function Re(){return(0,L.join)(U(),"pending-uploads.json")}function M(){let e=Re();if(!(0,p.existsSync)(e))return{};try{let t=JSON.parse((0,p.readFileSync)(e,"utf8")),n=Date.now();return Object.fromEntries(Object.entries(t).filter(([,r])=>{var i;return n-((i=r==null?void 0:r.createdAt)!=null?i:0)<Ct}))}catch{return{}}}function te(e){(0,p.mkdirSync)(U(),{recursive:!0,mode:448}),(0,p.writeFileSync)(Re(),JSON.stringify(e),{mode:384})}function $e(){var t,n;let e=(t=x())==null?void 0:t.device;return(n=e==null?void 0:e.deviceId)!=null&&n.startsWith(j)?e.deviceId:null}function H(){var r,i;let e={deviceName:(0,G.hostname)().slice(0,50),platform:`${(0,G.platform)()}-${process.arch}`},t=(r=x())==null?void 0:r.device;if((i=t==null?void 0:t.deviceId)!=null&&i.startsWith(j))return t.deviceName===e.deviceName&&t.platform===e.platform?t:_(s=>({...s,device:{...t,...e}})).device;let n={deviceId:`${j}${(0,Oe.randomUUID)()}`,...e};return _(s=>({...s,device:n})).device}function Ne(){return`cli_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function h(e,t=Ne()){return{ok:!0,code:"OK",requestId:t,data:e}}function c(e,t,n={}){var r;return{ok:!1,code:e,message:t,requestId:(r=n.requestId)!=null?r:Ne(),...n.data==null?{}:{data:n.data},...n.nextAction==null?{}:{nextAction:n.nextAction}}}function a(e){process.stdout.write(`${JSON.stringify(e)}
4
+ `),e.ok||(process.exitCode=1)}async function y(e,t={}){var s,o;let n=new URL(`${B}/v1/agent-cli${e}`);for(let[d,m]of Object.entries((s=t.query)!=null?s:{}))if(m!=null)for(let u of Array.isArray(m)?m:[m])n.searchParams.append(d,String(u));let r={"X-GEO-CLI-Version":E,"X-GEO-Protocol-Version":String(D),"X-GEO-CLI-Package":O},i=null;try{i=$e()}catch{}i&&(r["X-Device-ID"]=i),t.apiKey&&(r.Authorization=`Bearer ${t.apiKey}`),t.body!=null&&(r["Content-Type"]="application/json");try{let d=await fetch(n,{method:(o=t.method)!=null?o:"GET",headers:r,body:t.body==null?void 0:JSON.stringify(t.body),signal:AbortSignal.timeout(t.isWrite?_e:xe)}),m=await d.text();try{let u=JSON.parse(m);return Rt(u)?u:c("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}catch{return c("SERVER_ERROR",`\u670D\u52A1\u7AEF\u8FD4\u56DE\u4E86\u975E\u9884\u671F\u5185\u5BB9\uFF08HTTP ${d.status}\uFF09`,{data:{transportFailure:!0}})}}catch(d){return d instanceof Error&&(d.name==="TimeoutError"||d.name==="AbortError")?c("SERVER_ERROR",t.isWrite?"\u670D\u52A1\u7AEF\u5904\u7406\u8D85\u65F6,\u8FD9\u6B21\u5199\u5165\u7ED3\u679C\u672A\u77E5":"\u670D\u52A1\u7AEF\u54CD\u5E94\u8D85\u65F6",{data:{transportFailure:!0},nextAction:t.isWrite?{type:"ask_user",message:"\u8D85\u65F6\u4E0D\u4EE3\u8868\u6CA1\u5199\u8FDB\u53BB \u2014\u2014 \u670D\u52A1\u7AEF\u53EF\u80FD\u8FD8\u5728\u5904\u7406\u3002**\u5148\u7528\u5BF9\u5E94\u7684\u67E5\u8BE2\u80FD\u529B\u786E\u8BA4\u4E00\u904D**,\u786E\u5B9E\u6CA1\u6709\u518D\u91CD\u65B0 plan;\u76F4\u63A5\u91CD\u8BD5\u4F1A\u5EFA\u51FA\u91CD\u590D\u7684\u4E00\u4EFD,\u800C\u4E14\u4F1A\u518D\u6263\u4E00\u6B21\u8D39\u3002"}:{type:"ask_user",message:"\u670D\u52A1\u7AEF\u54CD\u5E94\u592A\u6162\u3002\u7A0D\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u5373\u53EF,\u67E5\u8BE2\u4E0D\u4F1A\u4EA7\u751F\u4EFB\u4F55\u5199\u5165"}}):c("SERVER_ERROR",`\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF1A${d instanceof Error?d.message:String(d)}`,{data:{transportFailure:!0},nextAction:{type:"ask_user",message:"\u8BF7\u786E\u8BA4\u7F51\u7EDC\u53EF\u7528\uFF0C\u4EE5\u53CA\u670D\u52A1\u7AEF\u5730\u5740\u914D\u7F6E\u6B63\u786E"}})}}function Rt(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.ok=="boolean"&&typeof t.code=="string"}function Ot(e){var t;return!e.ok&&((t=e.data)==null?void 0:t.transportFailure)===!0}function ne(e){return e.ok||Ot(e)?!1:["AUTH_EXPIRED","DEVICE_MISMATCH","ACCESS_DENIED","AUTH_REQUIRED","VALIDATION_FAILED"].includes(e.code)}function $(){var e,t,n;return(n=(t=(e=x())==null?void 0:e.activeCredential)==null?void 0:t.apiKey)!=null?n:null}function J(){var e,t;return(t=(e=x())==null?void 0:e.activeCredential)!=null?t:null}function Te(){var e,t;return(t=(e=x())==null?void 0:e.pendingCredential)!=null?t:null}function Pe(e){_(t=>({...t,pendingCredential:{apiKey:e,startedAt:new Date().toISOString()}}))}function re(){_(e=>({...e,pendingCredential:null}))}function ie(e){return _(t=>{let n=t.pendingCredential;return n?{...t,activeCredential:{apiKey:n.apiKey,...e},pendingCredential:null}:t}).activeCredential}function De(){_(e=>({...e,activeCredential:null,pendingCredential:null}))}var v=require("node:crypto"),Ue=require("node:http");function Le(e){let t=`
5
5
  (function () {
6
6
  var form = document.getElementById('f');
7
7
  var input = document.getElementById('k');
@@ -84,12 +84,12 @@ button:disabled { opacity: .6; cursor: default; }
84
84
  </div>
85
85
  <script>${t}</script>
86
86
  </body>
87
- </html>`,scriptHash:t}}var $t=256,Nt=4*1024;async function Me(){let e=(0,v.randomBytes)(16).toString("hex"),t=(0,v.randomBytes)(16).toString("hex"),n=(0,v.randomBytes)(16).toString("hex"),{html:r,scriptHash:o}=Le(t),s=(0,v.createHash)("sha256").update(o).digest("base64"),i=null,d=new Promise((g,f)=>{i={resolve:g,reject:f}});d.catch(()=>{});let m=!1,u=(0,Ue.createServer)((g,f)=>{A(g,f).catch(()=>{f.writeHead(500,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!1,message:"internal error"}))})});async function A(g,f){var pe,me,fe,ge,ye;let Y=new URL((pe=g.url)!=null?pe:"/","http://127.0.0.1");if(g.method==="GET"&&Y.pathname==="/"){if(Y.searchParams.get("state")!==e){f.writeHead(404).end();return}f.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":["default-src 'none'",`script-src 'sha256-${s}'`,"style-src 'unsafe-inline'","connect-src 'self'","form-action 'none'","base-uri 'none'","frame-ancestors 'none'"].join("; "),"Set-Cookie":`bg_session=${n}; HttpOnly; SameSite=Strict; Path=/`,"Cache-Control":"no-store","Referrer-Policy":"no-referrer"}),f.end(r);return}if(g.method==="POST"&&Y.pathname==="/submit"){let It=g.headers.origin,kt=`http://127.0.0.1:${u.address().port}`;if(It!==kt){S(f,403,{ok:!1,message:"origin rejected"});return}if(!Pt(String((me=g.headers["x-csrf-token"])!=null?me:""),t)){S(f,403,{ok:!1,message:"csrf rejected"});return}if(!String((fe=g.headers.cookie)!=null?fe:"").includes(`bg_session=${n}`)){S(f,403,{ok:!1,message:"session rejected"});return}if(!String((ge=g.headers["content-type"])!=null?ge:"").includes("application/json")){S(f,415,{ok:!1,message:"content-type rejected"});return}if(m){S(f,409,{ok:!1,message:"already submitted"});return}let Ee=await Tt(g);if(Ee==null){S(f,413,{ok:!1,message:"body too large"});return}let F="";try{F=String((ye=JSON.parse(Ee).key)!=null?ye:"").trim()}catch{S(f,400,{ok:!1,message:"invalid json"});return}if(!F||F.length>$t){S(f,400,{ok:!1,message:"invalid key"});return}m=!0,S(f,200,{ok:!0}),i==null||i.resolve(F),setTimeout(()=>W(),200).unref();return}f.writeHead(404).end()}if(process.env.BEST_GEO_TEST_FORCE_LISTEN_ERROR==="1")throw Object.assign(new Error("listen EACCES: permission denied 127.0.0.1"),{code:"EACCES"});u.on("error",g=>{i==null||i.reject(g)}),await new Promise((g,f)=>{u.once("error",f),u.listen(0,"127.0.0.1",()=>{u.removeListener("error",f),g()})});let k=u.address().port,de=setTimeout(()=>{i==null||i.reject(new Error("LOCAL_INTAKE_TIMEOUT")),W()},Se);de.unref();let le=!1;function W(){var g;le||(le=!0,clearTimeout(de),(g=u.closeAllConnections)==null||g.call(u),u.close())}return{url:`http://127.0.0.1:${k}/?state=${e}`,waitForKey:d,close:W}}function S(e,t,n){e.writeHead(t,{"Content-Type":"application/json","Cache-Control":"no-store"}),e.end(JSON.stringify(n))}async function Tt(e){let t=[],n=0;for await(let r of e){if(n+=r.length,n>Nt)return null;t.push(r)}return Buffer.concat(t).toString("utf8")}function Pt(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&(0,v.timingSafeEqual)(n,r)}async function V(){let e=Te();if(!e)return null;let t=await je(e.apiKey);return t.ok?(oe({userId:t.data.user.id,agentId:t.data.agentId,companyIds:t.data.companyIds}),null):ne(t)?(re(),null):c("SERVER_ERROR",`\u672C\u673A\u6709\u4E00\u4EFD\u5F85\u786E\u8BA4\u7684\u6388\u6743\uFF0C\u6682\u65F6\u65E0\u6CD5\u4E0E\u670D\u52A1\u7AEF\u786E\u8BA4\uFF1A${t.message}`,{requestId:t.requestId,nextAction:{type:"ask_user",message:"\u7F51\u7EDC\u6062\u590D\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\uFF1B\u5728\u6B64\u4E4B\u524D\u4E0D\u8981\u91CD\u65B0\u767B\u5F55\uFF0C\u4E5F\u4E0D\u8981\u5220\u9664\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u3002"}})}async function Ke(){var m;let e=H(),t=await V();if(t){a(t);return}let n=$(),r;try{r=await Me()}catch(u){a(c("HOST_PERMISSION_REQUIRED",`\u65E0\u6CD5\u5728\u672C\u673A\u542F\u52A8\u5F55\u5165\u670D\u52A1\uFF1A${Lt(u)}`,{nextAction:{type:"request_host_approval",message:"Best GEO \u9700\u8981\u5728 127.0.0.1 \u4E0A\u76D1\u542C\u4E00\u4E2A\u968F\u673A\u7AEF\u53E3\u6765\u63A5\u6536\u7528\u6237\u7C98\u8D34\u7684\u5BC6\u94A5\uFF08\u4E0D\u5BF9\u5916\u66B4\u9732\uFF09\u3002\u8BF7\u7528\u5F53\u524D\u5DE5\u5177\u7684\u6743\u9650\u786E\u8BA4\u673A\u5236\u6388\u6743\u672C\u673A\u56DE\u73AF\u7AEF\u53E3\u76D1\u542C\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u3002",capability:"loopback_port",command:`${l} auth login`}}));return}Dt(r.url);let o=`[${l}]`;process.stderr.write(`${o} auth login \u5DF2\u542F\u52A8\u672C\u673A\u5F55\u5165\u670D\u52A1\uFF0C\u4F1A\u963B\u585E\u7B49\u5F85\u7528\u6237\u7C98\u8D34\u5BC6\u94A5\uFF0C\u6700\u957F 5 \u5206\u949F\u3002
88
- ${o} \u8C03\u7528\u65B9\u8BF7\u4FDD\u6301\u672C\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\u3001\u4E0D\u8981\u8F6C\u4EA4\u7ED9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\uFF1B
89
- ${o} \u8FDB\u7A0B\u9000\u51FA\u65F6 stdout \u4F1A\u7ED9\u51FA\u552F\u4E00\u4E00\u4E2A JSON \u7ED3\u679C\uFF0C\u90A3\u65F6\u518D\u5411\u7528\u6237\u6C47\u62A5\u6210\u8D25\u3002
90
- ${o} \u73B0\u5728\u8BF7\u628A\u4E0B\u9762\u8FD9\u4E2A\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u8BA9\u4ED6\u5728\u6D4F\u89C8\u5668\u91CC\u6253\u5F00\u5E76\u7C98\u8D34\u5BC6\u94A5\uFF08\u5BC6\u94A5\u4E0D\u8981\u7ECF\u8FC7\u4F60\uFF09\uFF1A
91
- `),process.stderr.write(`${o} \u672C\u5730\u9875\u9762\uFF1A${r.url}
92
- `),n&&process.stderr.write(`${o} \u672C\u673A\u5DF2\u6709\u4E00\u4EFD\u6388\u6743\uFF0C\u5F55\u5165\u65B0\u5BC6\u94A5\u4F1A\u66FF\u6362\u5B83\u3002
93
- `);let s;try{s=await r.waitForKey}catch{r.close(),a(c("AUTH_REQUIRED","\u672C\u5730\u5F55\u5165\u8D85\u65F6\u6216\u88AB\u53D6\u6D88",{nextAction:{type:"auth_login",message:"\u7528\u6237\u5728 5 \u5206\u949F\u5185\u6CA1\u6709\u5B8C\u6210\u7C98\u8D34\u3002\u5148\u95EE\u6E05\u4ED6\u662F\u5426\u5DF2\u7ECF\u62FF\u5230\u5BC6\u94A5\uFF0C\u518D\u7531\u4F60\u91CD\u65B0\u6267\u884C command\uFF0C\u5E76\u628A\u65B0\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u4ED6\u3002",command:`${l} auth login`}}));return}process.stderr.write(`${o} \u5DF2\u6536\u5230\u5BC6\u94A5\uFF0C\u672C\u673A\u5F55\u5165\u670D\u52A1\u5DF2\u5173\u95ED\uFF0C\u6B63\u5728\u5411\u670D\u52A1\u7AEF\u6821\u9A8C\u5E76\u7ED1\u5B9A\u672C\u673A\uFF0C\u8BF7\u7EE7\u7EED\u7B49\u5F85\u672C\u8FDB\u7A0B\u9000\u51FA\u3002
94
- `),Pe(s);let i=await je(s);if(!i.ok){ne(i)?re():process.stderr.write(`${o} \u672A\u80FD\u786E\u8BA4\u7ED1\u5B9A\u7ED3\u679C\uFF0C\u5DF2\u4FDD\u7559\u8FD9\u628A\u5F85\u786E\u8BA4\u7684\u5BC6\u94A5\u3002\u7F51\u7EDC\u6062\u590D\u540E\u6267\u884C\u4EFB\u610F ${l} \u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\u3002
95
- `),a(i);return}let d=oe({userId:i.data.user.id,agentId:i.data.agentId,companyIds:i.data.companyIds});a(h({user:i.data.user,device:i.data.device,companyIds:(m=d==null?void 0:d.companyIds)!=null?m:i.data.companyIds,replacedPreviousAuthorization:i.data.replacedPreviousAuthorization,configPath:w()},i.requestId))}async function Fe(){let e=await V();if(e){a(e);return}let t=$();if(!t){a(qe());return}let n=await y("/companies",{apiKey:t,query:{page:1,limit:100}});if(!n.ok){a(n);return}let r=H();a(h({loggedIn:!0,device:{deviceId:r.deviceId,deviceName:r.deviceName,platform:r.platform},user:J()?{id:J().userId,agentId:J().agentId}:null,companies:n.data.data.map(o=>({id:o.id,name:o.name})),configPath:w()},n.requestId))}async function Be(){let e=await V();if(e){a(e);return}let t=$();if(!t){a(qe());return}let n=await y("/auth/logout",{method:"POST",apiKey:t});if(!n.ok){a(n);return}De(),a(h({loggedOut:!0,revoked:n.data,note:"\u670D\u52A1\u7AEF\u5BC6\u94A5\u5DF2\u64A4\u9500\uFF0C\u672C\u673A\u51ED\u636E\u5DF2\u6E05\u9664\u3002\u8BBE\u5907\u8EAB\u4EFD\u4FDD\u7559\uFF0C\u91CD\u65B0\u767B\u5F55\u4F1A\u590D\u7528\u540C\u4E00\u53F0\u8BBE\u5907\u3002"},n.requestId))}function qe(){return c("AUTH_REQUIRED","\u672C\u673A\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u6388\u6743",{nextAction:{type:"auth_login",message:"\u5148\u8BA9\u7528\u6237\u5230\u6240\u5C5E SaaS \u7F51\u9875\u7684\u5BC6\u94A5\u7BA1\u7406\u91CC\u521B\u5EFA\u300CAI \u52A9\u624B\u5BC6\u94A5\u300D\u5E76\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002\u6267\u884C\u671F\u95F4\u628A stderr \u91CC\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u4FDD\u6301\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\u3002",command:`${l} auth login`}})}function je(e){let t=H();return y("/auth/claim",{method:"POST",apiKey:e,body:{...t,cliVersion:E}})}function Dt(e){if(process.env.BEST_GEO_NO_BROWSER==="1")return;let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",n=process.platform==="win32"?["/c","start","",e]:[e];(0,Ve.execFile)(t,n,()=>{})}function Lt(e){return e instanceof Error?e.message:String(e)}async function K(){let e=await V();if(e)return{ok:!1,envelope:e};let t=$();return t?{ok:!0,apiKey:t}:{ok:!1,envelope:c("AUTH_REQUIRED","\u672C\u673A\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u6388\u6743",{nextAction:{type:"auth_login",message:"\u5148\u8BA9\u7528\u6237\u5230\u6240\u5C5E SaaS \u7F51\u9875\u7684\u5BC6\u94A5\u7BA1\u7406\u91CC\u521B\u5EFA\u300CAI \u52A9\u624B\u5BC6\u94A5\u300D\u5E76\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002",command:`${l} auth login`}})}}var He=require("node:fs"),N=require("node:path"),Je=require("node:url");function Ut(e){if(e.cjsDir)return(0,N.join)(e.cjsDir,"..");if(!e.moduleUrl)throw new Error("\u7F3A\u5C11 CLI \u8FD0\u884C\u4F4D\u7F6E");return(0,N.join)((0,N.dirname)((0,Je.fileURLToPath)(e.moduleUrl)),"..","..","..")}function Mt(){return Ut({cjsDir:typeof __dirname=="string"?__dirname:void 0,moduleUrl:void 0})}function T(...e){return(0,He.readFileSync)((0,N.join)(Mt(),...e),"utf8")}function ze(){a(h({package:O,version:E,protocolVersion:D,commands:[{command:`${l} version --check`,description:"\u68C0\u67E5\u7248\u672C\u662F\u5426\u9700\u8981\u5347\u7EA7"},{command:`${l} capabilities`,description:"\u5217\u51FA\u53EF\u7528\u80FD\u529B\u53CA\u5176\u8F93\u5165 schema"},{command:`${l} skill get --raw > <\u4F60\u7684 skill \u76EE\u5F55>/best-geo/SKILL.md`,description:"\u76F4\u63A5\u628A Skill \u5199\u6210\u6587\u4EF6\uFF08\u63A8\u8350\uFF1B--raw \u8F93\u51FA markdown \u539F\u6587\uFF0C\u4E0D\u662F JSON\uFF09"},{command:`${l} skill get`,description:"\u4EE5 JSON \u4FE1\u5C01\u8FD4\u56DE Skill \u5185\u5BB9\u548C revision"},{command:`${l} guide list`,description:"\u5217\u51FA\u4E1A\u52A1\u6307\u5357"},{command:`${l} guide get <name>`,description:"\u8BFB\u53D6\u4E00\u4EFD\u4E1A\u52A1\u6307\u5357"},{command:`${l} auth login`,description:"\u6253\u5F00\u672C\u5730\u9875\u9762\u5F55\u5165\u5BC6\u94A5\u5E76\u7ED1\u5B9A\u672C\u673A"},{command:`${l} auth status`,description:"\u67E5\u770B\u5F53\u524D\u6388\u6743\u72B6\u6001"},{command:`${l} auth logout`,description:"\u64A4\u9500\u670D\u52A1\u7AEF\u5BC6\u94A5\u5E76\u6E05\u9664\u672C\u673A\u51ED\u636E"},{command:`${l} call <capability> --input '<JSON>'`,description:"\u8C03\u7528\u4E00\u4E2A\u67E5\u8BE2\u80FD\u529B"},{command:`${l} plan <operation> --input '<JSON>'`,description:"\u751F\u6210\u5199\u64CD\u4F5C\u8BA1\u5212\uFF0C\u8FD4\u56DE\u7ED9\u7528\u6237\u770B\u7684\u53D8\u66F4\u6458\u8981\uFF08\u4E0D\u5199\u6570\u636E\uFF09"},{command:`${l} apply <planId>`,description:"\u6267\u884C\u8BA1\u5212\u3002\u5FC5\u987B\u5148\u628A plan \u7684\u6458\u8981\u7ED9\u7528\u6237\u770B\u8FC7\u5E76\u5F97\u5230\u540C\u610F"}],nextAction:{type:"install_skill",command:`${l} skill get --raw`,message:"\u6309\u5F53\u524D AI \u5DE5\u5177\u7684 Skill \u673A\u5236\u9009\u4E00\u4E2A\u5B89\u88C5\u76EE\u5F55\uFF0C\u7528 best-geo skill get --raw \u628A\u5185\u5BB9\u76F4\u63A5\u91CD\u5B9A\u5411\u6210 SKILL.md\uFF0C\u7136\u540E\u52A0\u8F7D\u5B83"}}))}async function Qe(e){if(!e){a(h({package:O,version:E,protocolVersion:D,env:be,apiBase:q}));return}let t=await y("/meta");if(!t.ok){a(t);return}if(Ge(E,t.data.minimumCliVersion)<0){a(c("CLI_UPDATE_REQUIRED",`\u5F53\u524D\u7248\u672C ${E} \u4F4E\u4E8E\u6700\u4F4E\u8981\u6C42 ${t.data.minimumCliVersion}`,{requestId:t.requestId,data:{current:E,...t.data},nextAction:{type:"upgrade",message:"\u5347\u7EA7\u540E\u91CD\u8BD5",command:`npm install -g ${O}@latest`}}));return}a(h({current:E,...t.data,updateAvailable:Ge(E,t.data.latestCliVersion)<0},t.requestId))}function Xe(){a(h(JSON.parse(T("capabilities","capabilities.json"))))}function We(e){let t=et(T("skills","best-geo","SKILL.md"));if(e){process.stdout.write(t);return}a(h({name:l,revision:1,content:t}))}var ie=["company","product","question","article","knowledge","material","question-task","article-task","scheduled-monitor"];function Ye(){a(h({guides:ie.map(e=>{let t=JSON.parse(T("guides",`${e}.json`));return{name:t.name,title:t.title,whenToUse:t.whenToUse}})}))}function Ze(e){if(!ie.includes(e)){a(c("GUIDE_NOT_FOUND",`\u6CA1\u6709\u540D\u4E3A ${e} \u7684\u6307\u5357`,{data:{available:ie}}));return}a(h(JSON.parse(et(T("guides",`${e}.json`)))))}function Ge(e,t){var o,s;let n=e.split(".").map(i=>Number.parseInt(i,10)||0),r=t.split(".").map(i=>Number.parseInt(i,10)||0);for(let i=0;i<Math.max(n.length,r.length);i+=1){let d=((o=n[i])!=null?o:0)-((s=r[i])!=null?s:0);if(d!==0)return d<0?-1:1}return 0}function et(e){return l==="best-geo"?e:e.replace(/\bbest-geo\b(?!-)/g,l)}var se=null,ae=null;function tt(){return se===null&&(se=JSON.parse(T("capabilities","capabilities.json")).capabilities),se}function Vt(){return ae===null&&(ae=new Map(tt().filter(e=>e.inputSchema!==void 0).map(e=>[e.name,e.inputSchema]))),ae}function nt(){return tt().filter(e=>e.mode==="write").map(e=>e.name)}function z(e,t){let n=Vt().get(e);return n===void 0?[]:ue(t,n,"")}function ue(e,t,n){if(t.type==="object"||t.properties!==void 0)return Kt(e,t,n);let r=rt(e,t,n);if(r!==null)return[r];let o=[];return typeof e=="string"&&t.maxLength!==void 0&&e.length>t.maxLength&&o.push(`${n} \u6700\u591A ${t.maxLength} \u4E2A\u5B57\u7B26\uFF0C\u5F53\u524D ${e.length} \u4E2A`),typeof e=="number"&&(t.maximum!==void 0&&e>t.maximum&&o.push(`${n} \u4E0D\u80FD\u5927\u4E8E ${t.maximum}`),t.minimum!==void 0&&e<t.minimum&&o.push(`${n} \u4E0D\u80FD\u5C0F\u4E8E ${t.minimum}`)),t.enum!==void 0&&!t.enum.includes(e)&&o.push(`${n} \u53EA\u80FD\u662F ${t.enum.join(" / ")} \u4E4B\u4E00\uFF0C\u6536\u5230 ${C(e)}`),Array.isArray(e)&&(t.minItems!==void 0&&e.length<t.minItems&&o.push(`${n} \u81F3\u5C11\u8981 ${t.minItems} \u9879\uFF0C\u5F53\u524D ${e.length} \u9879`),t.maxItems!==void 0&&e.length>t.maxItems&&o.push(`${n} \u6700\u591A ${t.maxItems} \u9879\uFF0C\u5F53\u524D ${e.length} \u9879`),t.items!==void 0&&e.forEach((s,i)=>{o.push(...ue(s,t.items,`${n}[${i}]`))})),o}function Kt(e,t,n){var 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:{},s=(m=t.required)!=null?m:[],i=[];for(let u of s)(r[u]===void 0||r[u]===null)&&i.push(`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 ${ce(n,u)}`);if(t.additionalProperties===!1){let u=Object.keys(o);for(let A of Object.keys(r))u.includes(A)||i.push(`\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5 ${ce(n,A)}\uFF0C\u53EF\u7528\u5B57\u6BB5\uFF1A${u.join("\u3001")}`)}for(let[u,A]of Object.entries(o)){let k=r[u];k===void 0||k===null&&s.includes(u)||i.push(...ue(k,A,ce(n,u)))}return i}function rt(e,t,n){if(Array.isArray(t.type)){let r=t.type.map(o=>rt(e,{...t,type:o},n));return r.some(o=>o===null)?null:r[0]}switch(t.type){case"null":return e===null?null:`${n} \u5FC5\u987B\u662F null\uFF0C\u6536\u5230 ${C(e)}`;case"string":return typeof e=="string"?null:`${n} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF0C\u6536\u5230 ${C(e)}`;case"number":return typeof e=="number"&&Number.isFinite(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u5B57\uFF0C\u6536\u5230 ${C(e)}`;case"integer":return typeof e=="number"&&Number.isInteger(e)?null:`${n} \u5FC5\u987B\u662F\u6574\u6570\uFF0C\u6536\u5230 ${C(e)}`;case"boolean":return typeof e=="boolean"?null:`${n} \u5FC5\u987B\u662F true \u6216 false\uFF0C\u6536\u5230 ${C(e)}`;case"array":return Array.isArray(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u7EC4\uFF0C\u6536\u5230 ${C(e)}`;default:return null}}function ce(e,t){return e===""?t:`${e}.${t}`}function C(e){if(e===null)return"null";if(Array.isArray(e))return"\u6570\u7EC4";if(typeof e=="object")return"\u5BF9\u8C61";let t=String(e);return typeof e=="string"?`\u5B57\u7B26\u4E32 "${Ft(t)}"`:t}function Ft(e){return e.length>20?`${e.slice(0,20)}\u2026`:e}function Q(e,t){return c("VALIDATION_FAILED",`\u5165\u53C2\u4E0D\u5408\u6CD5\uFF1A${t.join("\uFF1B")}`,{data:{name:e,errors:t},nextAction:{type:"ask_user",message:"\u6309 capabilities \u91CC\u7684 inputSchema \u4FEE\u6B63\u53C2\u6570\u540E\u91CD\u8BD5\uFF1B\u7F3A\u7684\u4FE1\u606F\u95EE\u7528\u6237"}})}var ot={"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}),"scheduledSentiment.generateQuestions":e=>({path:"/scheduled-sentiment/generate-questions",method:"POST",body:e}),"indexing.suggestCompetitors":e=>({path:"/suggest-competitors",method:"POST",body:e}),"indexingPlatforms.list":()=>({path:"/indexing-platforms"}),"scheduledIndexing.list":e=>({path:"/scheduled-indexing",query:e}),"scheduledIndexing.get":e=>({path:`/scheduled-indexing/${Number(e.planId)}`}),"scheduledIndexing.runs":e=>({path:`/scheduled-indexing/${Number(e.planId)}/runs`,query:I(e)}),"scheduledIndexing.metrics":e=>({path:`/scheduled-indexing/${Number(e.planId)}/metrics`,query:I(e)}),"scheduledSentiment.list":e=>({path:"/scheduled-sentiment",query:e}),"scheduledSentiment.get":e=>({path:`/scheduled-sentiment/${Number(e.planId)}`}),"scheduledSentiment.runs":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/runs`,query:I(e)}),"scheduledSentiment.metrics":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/metrics`,query:I(e)}),"scheduledIndexing.answers":e=>({path:`/scheduled-indexing/${Number(e.planId)}/answers`,query:I(e)}),"scheduledIndexing.citations":e=>({path:`/scheduled-indexing/${Number(e.planId)}/citations`,query:I(e)}),"scheduledIndexing.topicStats":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-stats`,query:I(e)}),"scheduledIndexing.topicPlatformMatrix":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-platform-matrix`,query:I(e)}),"scheduledSentiment.answers":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/answers`,query:I(e)}),"scheduledSentiment.citations":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/citations`,query:I(e)}),"scheduledSentiment.topicStats":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/topic-stats`,query:I(e)})};function I(e){let{planId:t,...n}=e;return n}function Bt(){return Object.keys(ot)}async function it(e,t){let n=ot[e];if(!n){a(c("VALIDATION_FAILED",`\u672A\u77E5\u80FD\u529B\uFF1A${e}`,{data:{available:Bt()},nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo capabilities \u67E5\u770B\u53EF\u7528\u80FD\u529B"}}));return}let r={};if(t)try{r=JSON.parse(t)}catch{a(c("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let o=z(e,r);if(o.length>0){a(Q(e,o));return}let s=await K();if(!s.ok){a(s.envelope);return}let{path:i,query:d,method:m,body:u}=n(r);a(await y(i,{apiKey:s.apiKey,query:d,method:m,body:u}))}var R=require("node:fs"),P=require("node:path");var qt={image:{maxBytes:2*1024*1024,extensions:[".png",".jpg",".jpeg"],label:"\u56FE\u7247"},video:{maxBytes:200*1024*1024,extensions:[".mp4"],label:"\u89C6\u9891"},thumbnail:{maxBytes:5*1024*1024,extensions:[".png",".jpg",".jpeg"],label:"\u5C01\u9762\u56FE"}},jt={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".mp4":"video/mp4"},st={"images.create":[{pathKey:"filePath",metaKey:"file",uploadField:"fileUrl",kind:"image"}],"videos.create":[{pathKey:"videoPath",metaKey:"video",uploadField:"videoUrl",kind:"video"},{pathKey:"thumbnailPath",metaKey:"thumbnail",uploadField:"thumbnail",kind:"thumbnail"}]},Gt=900*1e3;function at(e){return st[e]!==void 0}function ct(e){return M()[e]!==void 0}function ut(e,t){var s;let n=(s=st[e])!=null?s:[],r={...t},o={};for(let i of n){let d=t[i.pathKey];if(typeof d!="string"||!d.trim())return{ok:!1,envelope:zt(i)};let m=(0,P.resolve)(d.trim()),u=Jt(m,i);if(!u.ok)return{ok:!1,envelope:u.envelope};delete r[i.pathKey],r[i.metaKey]={name:(0,P.basename)(m),size:u.size},o[i.uploadField]=m}return{ok:!0,input:r,paths:o}}function dt(e,t){te({...M(),[e]:{paths:t,createdAt:Date.now()}})}async function lt(e,t){let n=M()[e];if(!n)return{ok:!1,envelope:c("VALIDATION_FAILED","\u672C\u673A\u6CA1\u6709\u8FD9\u4E2A\u8BA1\u5212\u7684\u5F85\u4F20\u6587\u4EF6\u8BB0\u5F55",{nextAction:{type:"ask_user",message:"\u91CD\u65B0\u6267\u884C best-geo plan \u751F\u6210\u8BA1\u5212\uFF0C\u628A\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D apply\u2014\u2014\u8BA1\u5212\u548C\u5F85\u4F20\u6587\u4EF6\u662F\u4E00\u8D77\u751F\u6210\u7684"}})};let r={};for(let[o,s]of Object.entries(n.paths)){if(!(0,R.existsSync)(s))return{ok:!1,envelope:c("VALIDATION_FAILED",`\u6587\u4EF6\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF1A${s}`)};let i=await y(`/plans/${encodeURIComponent(e)}/uploads/presign`,{method:"POST",apiKey:t,body:{field:o,fileName:(0,P.basename)(s)}});if(!i.ok)return{ok:!1,envelope:i};let d=await Ht(i.data,s);if(!d.ok)return{ok:!1,envelope:d.envelope};r[o]=i.data.uploadUrl}return{ok:!0,uploads:r}}function pt(e){let t=M();delete t[e],te(t)}async function Ht(e,t){let n=jt[mt(t)];if(!n)return{ok:!1,envelope:c("UPLOAD_FAILED",`${t} \u7684\u6587\u4EF6\u7C7B\u578B\u6CA1\u6709\u767B\u8BB0 MIME\uFF0C\u4F20\u4E0D\u4E86`)};let r=new FormData;r.append("key",e.key),r.append("policy",e.policy),r.append("OSSAccessKeyId",e.OSSAccessKeyId),r.append("signature",e.signature),r.append("callback",e.callback),r.append("Content-Disposition",e["Content-Disposition"]),r.append("success_action_status","200"),r.append("file",await(0,R.openAsBlob)(t,{type:n}),(0,P.basename)(t));try{let o=await fetch(e.host,{method:"POST",body:r,signal:AbortSignal.timeout(Gt)}),s=(await o.text().catch(()=>"")).slice(0,300);if(!o.ok)return{ok:!1,envelope:c("UPLOAD_FAILED",`\u4E0A\u4F20\u5931\u8D25\uFF08HTTP ${o.status}\uFF09\uFF1A${s}`,{nextAction:{type:"ask_user",message:"\u628A\u8FD9\u4E2A\u60C5\u51B5\u544A\u8BC9\u7528\u6237\uFF0C\u7A0D\u540E\u91CD\u65B0\u6267\u884C\u4E00\u6B21 plan \u518D\u8BD5"}})};let i=Qt(s);return i?{ok:!1,envelope:c("UPLOAD_FAILED",`\u6587\u4EF6\u5DF2\u4E0A\u4F20\uFF0C\u4F46\u767B\u8BB0\u5931\u8D25\uFF1A${i}`,{nextAction:{type:"ask_user",message:"\u628A\u8FD9\u53E5\u62A5\u9519\u539F\u6837\u544A\u8BC9\u7528\u6237\uFF0C\u8BA9\u4ED6\u8054\u7CFB\u670D\u52A1\u5546\u3002\u91CD\u8BD5\u591A\u534A\u4E0D\u4F1A\u597D\u3002"}})}:{ok:!0}}catch(o){return{ok:!1,envelope:c("UPLOAD_FAILED",`\u4E0A\u4F20\u4E2D\u65AD\uFF1A${o instanceof Error?o.message:String(o)}`,{nextAction:{type:"ask_user",message:"\u4E0A\u4F20\u6CA1\u80FD\u5B8C\u6210\uFF0C\u539F\u56E0\u89C1\u4E0A\u9762\u7684\u62A5\u9519\u539F\u6587\u3002\u544A\u8BC9\u7528\u6237\uFF0C\u7A0D\u540E\u91CD\u65B0\u8D70\u4E00\u904D"}})}}}function Jt(e,t){let n=qt[t.kind];if(!(0,R.existsSync)(e))return{ok:!1,envelope:c("VALIDATION_FAILED",`\u627E\u4E0D\u5230\u6587\u4EF6\uFF1A${e}`,{nextAction:{type:"ask_user",message:"\u8BA9\u7528\u6237\u786E\u8BA4\u6587\u4EF6\u8DEF\u5F84\u3002\u76F8\u5BF9\u8DEF\u5F84\u662F\u76F8\u5BF9\u4F60\u5F53\u524D\u7684\u5DE5\u4F5C\u76EE\u5F55\u7B97\u7684"}})};let r=(0,R.statSync)(e);if(!r.isFile())return{ok:!1,envelope:c("VALIDATION_FAILED",`${e} \u4E0D\u662F\u4E00\u4E2A\u6587\u4EF6`)};let o=mt(e);return n.extensions.includes(o)?r.size>n.maxBytes?{ok:!1,envelope:c("VALIDATION_FAILED",`${n.label}\u6700\u5927 ${X(n.maxBytes)}\uFF0C\u5F53\u524D ${X(r.size)}\uFF0C\u8D85\u51FA ${X(r.size-n.maxBytes)}`,{nextAction:{type:"ask_user",message:`\u544A\u8BC9\u7528\u6237\u8FD9\u4E2A\u6587\u4EF6\u8D85\u4E86\u591A\u5C11\uFF0C\u5E76\u95EE\u4ED6\u8981\u4E0D\u8981\u4F60\u5148\u628A\u5B83\u538B\u5230 ${X(n.maxBytes)} \u4EE5\u5185\u518D\u4F20\u3002\u4F60\u53EF\u4EE5\u7528\u7528\u6237\u673A\u5668\u4E0A\u73B0\u6210\u7684\u5DE5\u5177\u5904\u7406\uFF08macOS \u81EA\u5E26 sips\uFF0C\u591A\u6570\u673A\u5668\u6709 ffmpeg\uFF09\uFF0C\u5904\u7406\u5B8C\u7528\u65B0\u6587\u4EF6\u91CD\u65B0 plan\u3002`}})}:{ok:!0,size:r.size}:{ok:!1,envelope:c("VALIDATION_FAILED",`${n.label}\u53EA\u652F\u6301 ${n.extensions.join(" / ")}\uFF0C\u5F53\u524D\u662F ${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 zt(e){return c("VALIDATION_FAILED",`\u7F3A\u5C11 ${e.pathKey}`,{nextAction:{type:"ask_user",message:`${e.pathKey} \u8981\u7ED9\u4E00\u4E2A\u672C\u673A\u6587\u4EF6\u8DEF\u5F84\u3002\u95EE\u7528\u6237\u6587\u4EF6\u653E\u5728\u54EA\uFF0C\u4E0D\u8981\u81EA\u5DF1\u7F16\u4E00\u4E2A\u8DEF\u5F84\u3002`}})}function X(e){return e>=1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${Math.max(1,Math.round(e/1024))}KB`}function Qt(e){try{let t=JSON.parse(e),n=Number(t.statusCode);if(Number.isFinite(n)&&n!==0&&n!==200)return typeof t.message=="string"?t.message:`statusCode ${n}`}catch{}return null}function mt(e){let t=e.lastIndexOf(".");return t===-1?"":e.toLowerCase().slice(t)}async function ft(e,t,n){var A;let r=nt();if(!e||!r.includes(e)){a(c("VALIDATION_FAILED",`\u672A\u77E5\u7684\u5199\u64CD\u4F5C\uFF1A${e!=null?e:"(\u7A7A)"}`,{data:{available:r},nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo capabilities \u67E5\u770B\u53EF\u7528\u80FD\u529B\u548C\u5B83\u4EEC\u7684\u5165\u53C2"}}));return}if(!t&&(n!=null&&n.trim().startsWith("{"))){a(c("VALIDATION_FAILED","\u5165\u53C2\u8981\u653E\u5728 --input \u540E\u9762",{nextAction:{type:"ask_user",message:`\u6B63\u786E\u5199\u6CD5\uFF1Abest-geo plan ${e} --input '<JSON>'`}}));return}let o;try{o=t?JSON.parse(t):{}}catch{a(c("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let s=z(e,o);if(s.length>0){a(Q(e,s));return}let i=o,d=null;if(at(e)){let k=ut(e,o);if(!k.ok){a(k.envelope);return}i=k.input,d=k.paths}let m=await K();if(!m.ok){a(m.envelope);return}let u=await y("/plans",{method:"POST",apiKey:m.apiKey,body:{operation:e,input:i}});u.ok&&d&&((A=u.data)!=null&&A.planId)&&dt(u.data.planId,d),a(u)}async function gt(e){if(!e){a(c("VALIDATION_FAILED","\u7F3A\u5C11 planId",{nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo plan <operation> \u751F\u6210\u8BA1\u5212\uFF0C\u628A\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D\u6267\u884C"}}));return}let t=await K();if(!t.ok){a(t.envelope);return}let n;if(ct(e)){let o=await lt(e,t.apiKey);if(!o.ok){a(o.envelope);return}n=o.uploads}let r=await y(`/plans/${encodeURIComponent(e)}/apply`,{method:"POST",apiKey:t.apiKey,body:n?{uploads:n}:{},isWrite:!0});r.ok&&pt(e),a(r)}function yt(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];if(!r.startsWith("--"))continue;let o=r.slice(2),s=e[n+1];s&&!s.startsWith("--")?(t[o]=s,n+=1):t[o]=!0}return t}function Et(e,t){let n=w();if(e.reason==="denied")return c("HOST_PERMISSION_REQUIRED",`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\u6587\u4EF6\uFF1A${n}`,{nextAction:{type:"request_host_approval",message:`Best GEO \u9700\u8981\u8BFB\u5199 ${n} \u6765\u4FDD\u5B58\u672C\u673A\u7684\u8BBE\u5907\u8EAB\u4EFD\u548C\u6388\u6743\u3002\u8BF7\u7528\u5F53\u524D\u5DE5\u5177\u81EA\u5E26\u7684\u6743\u9650\u786E\u8BA4\u673A\u5236\u7533\u8BF7\u5BF9\u8BE5\u6587\u4EF6\u7684\u8BFB\u5199\u6743\u9650\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\uFF0C\u4E0D\u8981\u5173\u95ED\u6574\u4E2A\u6C99\u7BB1\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u628A\u5BC6\u94A5\u8D34\u8FDB\u5BF9\u8BDD\u3002`,capability:t.capability,...t.retryCommand?{command:t.retryCommand}:{}}});if(e.reason==="permissions_too_open"||e.reason==="not_owner"){let r=e.reason==="not_owner"?"\u8BE5\u6587\u4EF6\u4E0D\u5C5E\u4E8E\u5F53\u524D\u7CFB\u7EDF\u7528\u6237\uFF0C\u8BF7\u8BA9\u7528\u6237\u786E\u8BA4\u540E\u5220\u9664\u6216\u4FEE\u6B63\u5C5E\u4E3B":`\u8BF7\u8BA9\u7528\u6237\u6267\u884C\uFF1Achmod 600 ${n}`;return c("HOST_PERMISSION_REQUIRED",`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u4E0D\u5B89\u5168\uFF1A${n}`,{nextAction:{type:"ask_user",message:`${e.message}\u3002${r}\uFF0C\u7136\u540E\u91CD\u8BD5\u3002`}})}return c("HOST_PERMISSION_REQUIRED",`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5DF2\u635F\u574F\uFF1A${n}`,{nextAction:{type:"ask_user",message:`\u8BF7\u8BA9\u7528\u6237\u5220\u9664 ${n} \u540E\u91CD\u65B0\u6267\u884C\u767B\u5F55\u3002\u8BE5\u6587\u4EF6\u91CC\u53EA\u6709\u672C\u673A\u8BBE\u5907\u8EAB\u4EFD\u548C\u6388\u6743\uFF0C\u5220\u9664\u4E0D\u4F1A\u5F71\u54CD\u670D\u52A1\u7AEF\u6570\u636E\u3002`,command:`${l} auth login`}})}function ht(e){return e instanceof b}async function Xt(){let[e,...t]=process.argv.slice(2),n=yt(t);switch(e){case void 0:case"help":ze();return;case"version":await Qe(n.check===!0);return;case"capabilities":Xe();return;case"skill":if(t[0]==="get"){We(n.raw===!0);return}break;case"guide":if(t[0]==="list"){Ye();return}if(t[0]==="get"&&t[1]){Ze(t[1]);return}break;case"auth":if(t[0]==="login")return Ke();if(t[0]==="status")return Fe();if(t[0]==="logout")return Be();break;case"plan":await ft(t[0],typeof n.input=="string"?n.input:void 0,t[1]);return;case"apply":await gt(t[0]);return;case"call":if(t[0]){await it(t[0],typeof n.input=="string"?n.input:void 0);return}break;default:break}a(c("VALIDATION_FAILED",`\u65E0\u6CD5\u8BC6\u522B\u7684\u547D\u4EE4\uFF1A${[e,...t].filter(Boolean).join(" ")}`,{nextAction:{type:"ask_user",message:"\u6267\u884C best-geo help \u67E5\u770B\u53EF\u7528\u547D\u4EE4"}})),process.exitCode=1}Xt().catch(e=>{if(ht(e)){a(Et(e,{capability:e.reason==="denied"?"config_write":"config_read",retryCommand:Wt()})),process.exitCode=1;return}a(c("SERVER_ERROR",e instanceof Error?e.message:String(e))),process.exitCode=1});function Wt(){let[e,t]=process.argv.slice(2);if(e==="auth"&&(t==="login"||t==="status"||t==="logout"))return`${l} auth ${t}`}
87
+ </html>`,scriptHash:t}}var $t=256,Nt=4*1024;async function Me(){let e=(0,v.randomBytes)(16).toString("hex"),t=(0,v.randomBytes)(16).toString("hex"),n=(0,v.randomBytes)(16).toString("hex"),{html:r,scriptHash:i}=Le(t),s=(0,v.createHash)("sha256").update(i).digest("base64"),o=null,d=new Promise((g,f)=>{o={resolve:g,reject:f}});d.catch(()=>{});let m=!1,u=(0,Ue.createServer)((g,f)=>{b(g,f).catch(()=>{f.writeHead(500,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!1,message:"internal error"}))})});async function b(g,f){var pe,me,fe,ge,ye;let Y=new URL((pe=g.url)!=null?pe:"/","http://127.0.0.1");if(g.method==="GET"&&Y.pathname==="/"){if(Y.searchParams.get("state")!==e){f.writeHead(404).end();return}f.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":["default-src 'none'",`script-src 'sha256-${s}'`,"style-src 'unsafe-inline'","connect-src 'self'","form-action 'none'","base-uri 'none'","frame-ancestors 'none'"].join("; "),"Set-Cookie":`bg_session=${n}; HttpOnly; SameSite=Strict; Path=/`,"Cache-Control":"no-store","Referrer-Policy":"no-referrer"}),f.end(r);return}if(g.method==="POST"&&Y.pathname==="/submit"){let It=g.headers.origin,kt=`http://127.0.0.1:${u.address().port}`;if(It!==kt){S(f,403,{ok:!1,message:"origin rejected"});return}if(!Pt(String((me=g.headers["x-csrf-token"])!=null?me:""),t)){S(f,403,{ok:!1,message:"csrf rejected"});return}if(!String((fe=g.headers.cookie)!=null?fe:"").includes(`bg_session=${n}`)){S(f,403,{ok:!1,message:"session rejected"});return}if(!String((ge=g.headers["content-type"])!=null?ge:"").includes("application/json")){S(f,415,{ok:!1,message:"content-type rejected"});return}if(m){S(f,409,{ok:!1,message:"already submitted"});return}let Ee=await Tt(g);if(Ee==null){S(f,413,{ok:!1,message:"body too large"});return}let K="";try{K=String((ye=JSON.parse(Ee).key)!=null?ye:"").trim()}catch{S(f,400,{ok:!1,message:"invalid json"});return}if(!K||K.length>$t){S(f,400,{ok:!1,message:"invalid key"});return}m=!0,S(f,200,{ok:!0}),o==null||o.resolve(K),setTimeout(()=>W(),200).unref();return}f.writeHead(404).end()}if(process.env.BEST_GEO_TEST_FORCE_LISTEN_ERROR==="1")throw Object.assign(new Error("listen EACCES: permission denied 127.0.0.1"),{code:"EACCES"});u.on("error",g=>{o==null||o.reject(g)}),await new Promise((g,f)=>{u.once("error",f),u.listen(0,"127.0.0.1",()=>{u.removeListener("error",f),g()})});let k=u.address().port,de=setTimeout(()=>{o==null||o.reject(new Error("LOCAL_INTAKE_TIMEOUT")),W()},Se);de.unref();let le=!1;function W(){var g;le||(le=!0,clearTimeout(de),(g=u.closeAllConnections)==null||g.call(u),u.close())}return{url:`http://127.0.0.1:${k}/?state=${e}`,waitForKey:d,close:W}}function S(e,t,n){e.writeHead(t,{"Content-Type":"application/json","Cache-Control":"no-store"}),e.end(JSON.stringify(n))}async function Tt(e){let t=[],n=0;for await(let r of e){if(n+=r.length,n>Nt)return null;t.push(r)}return Buffer.concat(t).toString("utf8")}function Pt(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&(0,v.timingSafeEqual)(n,r)}async function V(){let e=Te();if(!e)return null;let t=await je(e.apiKey);return t.ok?(ie({userId:t.data.user.id,agentId:t.data.agentId,companyIds:t.data.companyIds}),null):ne(t)?(re(),null):c("SERVER_ERROR",`\u672C\u673A\u6709\u4E00\u4EFD\u5F85\u786E\u8BA4\u7684\u6388\u6743\uFF0C\u6682\u65F6\u65E0\u6CD5\u4E0E\u670D\u52A1\u7AEF\u786E\u8BA4\uFF1A${t.message}`,{requestId:t.requestId,nextAction:{type:"ask_user",message:"\u7F51\u7EDC\u6062\u590D\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\uFF1B\u5728\u6B64\u4E4B\u524D\u4E0D\u8981\u91CD\u65B0\u767B\u5F55\uFF0C\u4E5F\u4E0D\u8981\u5220\u9664\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u3002"}})}async function qe(){var m;let e=H(),t=await V();if(t){a(t);return}let n=$(),r;try{r=await Me()}catch(u){a(c("HOST_PERMISSION_REQUIRED",`\u65E0\u6CD5\u5728\u672C\u673A\u542F\u52A8\u5F55\u5165\u670D\u52A1\uFF1A${Lt(u)}`,{nextAction:{type:"request_host_approval",message:"Best GEO \u9700\u8981\u5728 127.0.0.1 \u4E0A\u76D1\u542C\u4E00\u4E2A\u968F\u673A\u7AEF\u53E3\u6765\u63A5\u6536\u7528\u6237\u7C98\u8D34\u7684\u5BC6\u94A5\uFF08\u4E0D\u5BF9\u5916\u66B4\u9732\uFF09\u3002\u8BF7\u7528\u5F53\u524D\u5DE5\u5177\u7684\u6743\u9650\u786E\u8BA4\u673A\u5236\u6388\u6743\u672C\u673A\u56DE\u73AF\u7AEF\u53E3\u76D1\u542C\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\u3002",capability:"loopback_port",command:`${l} auth login`}}));return}Dt(r.url);let i=`[${l}]`;process.stderr.write(`${i} auth login \u5DF2\u542F\u52A8\u672C\u673A\u5F55\u5165\u670D\u52A1\uFF0C\u4F1A\u963B\u585E\u7B49\u5F85\u7528\u6237\u7C98\u8D34\u5BC6\u94A5\uFF0C\u6700\u957F 5 \u5206\u949F\u3002
88
+ ${i} \u8C03\u7528\u65B9\u8BF7\u4FDD\u6301\u672C\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\u3001\u4E0D\u8981\u8F6C\u4EA4\u7ED9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\uFF1B
89
+ ${i} \u8FDB\u7A0B\u9000\u51FA\u65F6 stdout \u4F1A\u7ED9\u51FA\u552F\u4E00\u4E00\u4E2A JSON \u7ED3\u679C\uFF0C\u90A3\u65F6\u518D\u5411\u7528\u6237\u6C47\u62A5\u6210\u8D25\u3002
90
+ ${i} \u73B0\u5728\u8BF7\u628A\u4E0B\u9762\u8FD9\u4E2A\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u8BA9\u4ED6\u5728\u6D4F\u89C8\u5668\u91CC\u6253\u5F00\u5E76\u7C98\u8D34\u5BC6\u94A5\uFF08\u5BC6\u94A5\u4E0D\u8981\u7ECF\u8FC7\u4F60\uFF09\uFF1A
91
+ `),process.stderr.write(`${i} \u672C\u5730\u9875\u9762\uFF1A${r.url}
92
+ `),n&&process.stderr.write(`${i} \u672C\u673A\u5DF2\u6709\u4E00\u4EFD\u6388\u6743\uFF0C\u5F55\u5165\u65B0\u5BC6\u94A5\u4F1A\u66FF\u6362\u5B83\u3002
93
+ `);let s;try{s=await r.waitForKey}catch{r.close(),a(c("AUTH_REQUIRED","\u672C\u5730\u5F55\u5165\u8D85\u65F6\u6216\u88AB\u53D6\u6D88",{nextAction:{type:"auth_login",message:"\u7528\u6237\u5728 5 \u5206\u949F\u5185\u6CA1\u6709\u5B8C\u6210\u7C98\u8D34\u3002\u5148\u95EE\u6E05\u4ED6\u662F\u5426\u5DF2\u7ECF\u62FF\u5230\u5BC6\u94A5\uFF0C\u518D\u7531\u4F60\u91CD\u65B0\u6267\u884C command\uFF0C\u5E76\u628A\u65B0\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u4ED6\u3002",command:`${l} auth login`}}));return}process.stderr.write(`${i} \u5DF2\u6536\u5230\u5BC6\u94A5\uFF0C\u672C\u673A\u5F55\u5165\u670D\u52A1\u5DF2\u5173\u95ED\uFF0C\u6B63\u5728\u5411\u670D\u52A1\u7AEF\u6821\u9A8C\u5E76\u7ED1\u5B9A\u672C\u673A\uFF0C\u8BF7\u7EE7\u7EED\u7B49\u5F85\u672C\u8FDB\u7A0B\u9000\u51FA\u3002
94
+ `),Pe(s);let o=await je(s);if(!o.ok){ne(o)?re():process.stderr.write(`${i} \u672A\u80FD\u786E\u8BA4\u7ED1\u5B9A\u7ED3\u679C\uFF0C\u5DF2\u4FDD\u7559\u8FD9\u628A\u5F85\u786E\u8BA4\u7684\u5BC6\u94A5\u3002\u7F51\u7EDC\u6062\u590D\u540E\u6267\u884C\u4EFB\u610F ${l} \u547D\u4EE4\u5373\u53EF\u81EA\u52A8\u6536\u655B\u3002
95
+ `),a(o);return}let d=ie({userId:o.data.user.id,agentId:o.data.agentId,companyIds:o.data.companyIds});a(h({user:o.data.user,device:o.data.device,companyIds:(m=d==null?void 0:d.companyIds)!=null?m:o.data.companyIds,replacedPreviousAuthorization:o.data.replacedPreviousAuthorization,configPath:w()},o.requestId))}async function Ke(){let e=await V();if(e){a(e);return}let t=$();if(!t){a(Be());return}let n=await y("/companies",{apiKey:t,query:{page:1,limit:100}});if(!n.ok){a(n);return}let r=H();a(h({loggedIn:!0,device:{deviceId:r.deviceId,deviceName:r.deviceName,platform:r.platform},user:J()?{id:J().userId,agentId:J().agentId}:null,companies:n.data.data.map(i=>({id:i.id,name:i.name})),configPath:w()},n.requestId))}async function Fe(){let e=await V();if(e){a(e);return}let t=$();if(!t){a(Be());return}let n=await y("/auth/logout",{method:"POST",apiKey:t});if(!n.ok){a(n);return}De(),a(h({loggedOut:!0,revoked:n.data,note:"\u670D\u52A1\u7AEF\u5BC6\u94A5\u5DF2\u64A4\u9500\uFF0C\u672C\u673A\u51ED\u636E\u5DF2\u6E05\u9664\u3002\u8BBE\u5907\u8EAB\u4EFD\u4FDD\u7559\uFF0C\u91CD\u65B0\u767B\u5F55\u4F1A\u590D\u7528\u540C\u4E00\u53F0\u8BBE\u5907\u3002"},n.requestId))}function Be(){return c("AUTH_REQUIRED","\u672C\u673A\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u6388\u6743",{nextAction:{type:"auth_login",message:"\u5148\u8BA9\u7528\u6237\u5230\u6240\u5C5E SaaS \u7F51\u9875\u7684\u5BC6\u94A5\u7BA1\u7406\u91CC\u521B\u5EFA\u300CAI \u52A9\u624B\u5BC6\u94A5\u300D\u5E76\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002\u6267\u884C\u671F\u95F4\u628A stderr \u91CC\u7684\u672C\u5730\u9875\u9762\u5730\u5740\u8F6C\u8FBE\u7ED9\u7528\u6237\uFF0C\u4FDD\u6301\u8FDB\u7A0B\u8FD0\u884C\u76F4\u5230\u5B83\u81EA\u884C\u9000\u51FA\uFF0C\u4E0D\u8981\u4E2D\u65AD\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u5728\u522B\u5904\u6267\u884C\u3002",command:`${l} auth login`}})}function je(e){let t=H();return y("/auth/claim",{method:"POST",apiKey:e,body:{...t,cliVersion:E}})}function Dt(e){if(process.env.BEST_GEO_NO_BROWSER==="1")return;let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",n=process.platform==="win32"?["/c","start","",e]:[e];(0,Ve.execFile)(t,n,()=>{})}function Lt(e){return e instanceof Error?e.message:String(e)}async function q(){let e=await V();if(e)return{ok:!1,envelope:e};let t=$();return t?{ok:!0,apiKey:t}:{ok:!1,envelope:c("AUTH_REQUIRED","\u672C\u673A\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u6388\u6743",{nextAction:{type:"auth_login",message:"\u5148\u8BA9\u7528\u6237\u5230\u6240\u5C5E SaaS \u7F51\u9875\u7684\u5BC6\u94A5\u7BA1\u7406\u91CC\u521B\u5EFA\u300CAI \u52A9\u624B\u5BC6\u94A5\u300D\u5E76\u9009\u597D\u6388\u6743\u516C\u53F8\uFF1B\u7136\u540E\u7531\u4F60\u76F4\u63A5\u6267\u884C command\uFF0C\u5B83\u4F1A\u963B\u585E\u6700\u957F 5 \u5206\u949F\u7B49\u5F85\u7528\u6237\u5728\u672C\u673A\u9875\u9762\u7C98\u8D34\u5BC6\u94A5\u3002",command:`${l} auth login`}})}}var He=require("node:fs"),N=require("node:path"),Je=require("node:url");function Ut(e){if(e.cjsDir)return(0,N.join)(e.cjsDir,"..");if(!e.moduleUrl)throw new Error("\u7F3A\u5C11 CLI \u8FD0\u884C\u4F4D\u7F6E");return(0,N.join)((0,N.dirname)((0,Je.fileURLToPath)(e.moduleUrl)),"..","..","..")}function Mt(){return Ut({cjsDir:typeof __dirname=="string"?__dirname:void 0,moduleUrl:void 0})}function T(...e){return(0,He.readFileSync)((0,N.join)(Mt(),...e),"utf8")}function ze(){a(h({package:O,version:E,protocolVersion:D,commands:[{command:`${l} version --check`,description:"\u68C0\u67E5\u7248\u672C\u662F\u5426\u9700\u8981\u5347\u7EA7"},{command:`${l} capabilities`,description:"\u5217\u51FA\u53EF\u7528\u80FD\u529B\u53CA\u5176\u8F93\u5165 schema"},{command:`${l} skill get --raw > <\u4F60\u7684 skill \u76EE\u5F55>/best-geo/SKILL.md`,description:"\u76F4\u63A5\u628A Skill \u5199\u6210\u6587\u4EF6\uFF08\u63A8\u8350\uFF1B--raw \u8F93\u51FA markdown \u539F\u6587\uFF0C\u4E0D\u662F JSON\uFF09"},{command:`${l} skill get`,description:"\u4EE5 JSON \u4FE1\u5C01\u8FD4\u56DE Skill \u5185\u5BB9\u548C revision"},{command:`${l} guide list`,description:"\u5217\u51FA\u4E1A\u52A1\u6307\u5357"},{command:`${l} guide get <name>`,description:"\u8BFB\u53D6\u4E00\u4EFD\u4E1A\u52A1\u6307\u5357"},{command:`${l} auth login`,description:"\u6253\u5F00\u672C\u5730\u9875\u9762\u5F55\u5165\u5BC6\u94A5\u5E76\u7ED1\u5B9A\u672C\u673A"},{command:`${l} auth status`,description:"\u67E5\u770B\u5F53\u524D\u6388\u6743\u72B6\u6001"},{command:`${l} auth logout`,description:"\u64A4\u9500\u670D\u52A1\u7AEF\u5BC6\u94A5\u5E76\u6E05\u9664\u672C\u673A\u51ED\u636E"},{command:`${l} call <capability> --input '<JSON>'`,description:"\u8C03\u7528\u4E00\u4E2A\u67E5\u8BE2\u80FD\u529B"},{command:`${l} plan <operation> --input '<JSON>'`,description:"\u751F\u6210\u5199\u64CD\u4F5C\u8BA1\u5212\uFF0C\u8FD4\u56DE\u7ED9\u7528\u6237\u770B\u7684\u53D8\u66F4\u6458\u8981\uFF08\u4E0D\u5199\u6570\u636E\uFF09"},{command:`${l} apply <planId>`,description:"\u6267\u884C\u8BA1\u5212\u3002\u5FC5\u987B\u5148\u628A plan \u7684\u6458\u8981\u7ED9\u7528\u6237\u770B\u8FC7\u5E76\u5F97\u5230\u540C\u610F"}],nextAction:{type:"install_skill",command:`${l} skill get --raw`,message:"\u6309\u5F53\u524D AI \u5DE5\u5177\u7684 Skill \u673A\u5236\u9009\u4E00\u4E2A\u5B89\u88C5\u76EE\u5F55\uFF0C\u7528 best-geo skill get --raw \u628A\u5185\u5BB9\u76F4\u63A5\u91CD\u5B9A\u5411\u6210 SKILL.md\uFF0C\u7136\u540E\u52A0\u8F7D\u5B83"}}))}async function Qe(e){if(!e){a(h({package:O,version:E,protocolVersion:D,env:Ae,apiBase:B}));return}let t=await y("/meta");if(!t.ok){a(t);return}if(Ge(E,t.data.minimumCliVersion)<0){a(c("CLI_UPDATE_REQUIRED",`\u5F53\u524D\u7248\u672C ${E} \u4F4E\u4E8E\u6700\u4F4E\u8981\u6C42 ${t.data.minimumCliVersion}`,{requestId:t.requestId,data:{current:E,...t.data},nextAction:{type:"upgrade",message:"\u5347\u7EA7\u540E\u91CD\u8BD5",command:`npm install -g ${O}@latest`}}));return}a(h({current:E,...t.data,updateAvailable:Ge(E,t.data.latestCliVersion)<0},t.requestId))}function Xe(){a(h(JSON.parse(T("capabilities","capabilities.json"))))}function We(e){let t=et(T("skills","best-geo","SKILL.md"));if(e){process.stdout.write(t);return}a(h({name:l,revision:1,content:t}))}var oe=["company","product","question","article","knowledge","material","question-task","article-task","scheduled-monitor","publication"];function Ye(){a(h({guides:oe.map(e=>{let t=JSON.parse(T("guides",`${e}.json`));return{name:t.name,title:t.title,whenToUse:t.whenToUse}})}))}function Ze(e){if(!oe.includes(e)){a(c("GUIDE_NOT_FOUND",`\u6CA1\u6709\u540D\u4E3A ${e} \u7684\u6307\u5357`,{data:{available:oe}}));return}a(h(JSON.parse(et(T("guides",`${e}.json`)))))}function Ge(e,t){var i,s;let n=e.split(".").map(o=>Number.parseInt(o,10)||0),r=t.split(".").map(o=>Number.parseInt(o,10)||0);for(let o=0;o<Math.max(n.length,r.length);o+=1){let d=((i=n[o])!=null?i:0)-((s=r[o])!=null?s:0);if(d!==0)return d<0?-1:1}return 0}function et(e){return l==="best-geo"?e:e.replace(/\bbest-geo\b(?!-)/g,l)}var se=null,ae=null;function tt(){return se===null&&(se=JSON.parse(T("capabilities","capabilities.json")).capabilities),se}function Vt(){return ae===null&&(ae=new Map(tt().filter(e=>e.inputSchema!==void 0).map(e=>[e.name,e.inputSchema]))),ae}function nt(){return tt().filter(e=>e.mode==="write").map(e=>e.name)}function z(e,t){let n=Vt().get(e);return n===void 0?[]:ue(t,n,"")}function ue(e,t,n){if(t.type==="object"||t.properties!==void 0)return qt(e,t,n);let r=rt(e,t,n);if(r!==null)return[r];let i=[];return typeof e=="string"&&t.maxLength!==void 0&&e.length>t.maxLength&&i.push(`${n} \u6700\u591A ${t.maxLength} \u4E2A\u5B57\u7B26\uFF0C\u5F53\u524D ${e.length} \u4E2A`),typeof e=="number"&&(t.maximum!==void 0&&e>t.maximum&&i.push(`${n} \u4E0D\u80FD\u5927\u4E8E ${t.maximum}`),t.minimum!==void 0&&e<t.minimum&&i.push(`${n} \u4E0D\u80FD\u5C0F\u4E8E ${t.minimum}`)),t.enum!==void 0&&!t.enum.includes(e)&&i.push(`${n} \u53EA\u80FD\u662F ${t.enum.join(" / ")} \u4E4B\u4E00\uFF0C\u6536\u5230 ${C(e)}`),Array.isArray(e)&&(t.minItems!==void 0&&e.length<t.minItems&&i.push(`${n} \u81F3\u5C11\u8981 ${t.minItems} \u9879\uFF0C\u5F53\u524D ${e.length} \u9879`),t.maxItems!==void 0&&e.length>t.maxItems&&i.push(`${n} \u6700\u591A ${t.maxItems} \u9879\uFF0C\u5F53\u524D ${e.length} \u9879`),t.items!==void 0&&e.forEach((s,o)=>{i.push(...ue(s,t.items,`${n}[${o}]`))})),i}function qt(e,t,n){var d,m;if(typeof e!="object"||e===null||Array.isArray(e))return[`${n||"\u5165\u53C2"} \u5FC5\u987B\u662F\u5BF9\u8C61`];let r=e,i=(d=t.properties)!=null?d:{},s=(m=t.required)!=null?m:[],o=[];for(let u of s)(r[u]===void 0||r[u]===null)&&o.push(`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 ${ce(n,u)}`);if(t.additionalProperties===!1){let u=Object.keys(i);for(let b of Object.keys(r))u.includes(b)||o.push(`\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5 ${ce(n,b)}\uFF0C\u53EF\u7528\u5B57\u6BB5\uFF1A${u.join("\u3001")}`)}for(let[u,b]of Object.entries(i)){let k=r[u];k===void 0||k===null&&s.includes(u)||o.push(...ue(k,b,ce(n,u)))}return o}function rt(e,t,n){if(Array.isArray(t.type)){let r=t.type.map(i=>rt(e,{...t,type:i},n));return r.some(i=>i===null)?null:r[0]}switch(t.type){case"null":return e===null?null:`${n} \u5FC5\u987B\u662F null\uFF0C\u6536\u5230 ${C(e)}`;case"string":return typeof e=="string"?null:`${n} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF0C\u6536\u5230 ${C(e)}`;case"number":return typeof e=="number"&&Number.isFinite(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u5B57\uFF0C\u6536\u5230 ${C(e)}`;case"integer":return typeof e=="number"&&Number.isInteger(e)?null:`${n} \u5FC5\u987B\u662F\u6574\u6570\uFF0C\u6536\u5230 ${C(e)}`;case"boolean":return typeof e=="boolean"?null:`${n} \u5FC5\u987B\u662F true \u6216 false\uFF0C\u6536\u5230 ${C(e)}`;case"array":return Array.isArray(e)?null:`${n} \u5FC5\u987B\u662F\u6570\u7EC4\uFF0C\u6536\u5230 ${C(e)}`;default:return null}}function ce(e,t){return e===""?t:`${e}.${t}`}function C(e){if(e===null)return"null";if(Array.isArray(e))return"\u6570\u7EC4";if(typeof e=="object")return"\u5BF9\u8C61";let t=String(e);return typeof e=="string"?`\u5B57\u7B26\u4E32 "${Kt(t)}"`:t}function Kt(e){return e.length>20?`${e.slice(0,20)}\u2026`:e}function Q(e,t){return c("VALIDATION_FAILED",`\u5165\u53C2\u4E0D\u5408\u6CD5\uFF1A${t.join("\uFF1B")}`,{data:{name:e,errors:t},nextAction:{type:"ask_user",message:"\u6309 capabilities \u91CC\u7684 inputSchema \u4FEE\u6B63\u53C2\u6570\u540E\u91CD\u8BD5\uFF1B\u7F3A\u7684\u4FE1\u606F\u95EE\u7528\u6237"}})}var it={"companies.list":e=>({path:"/companies",query:e}),"companies.get":e=>({path:`/companies/${Number(e.id)}`}),"products.list":e=>({path:"/products",query:e}),"products.get":e=>({path:`/products/${Number(e.id)}`}),"questions.list":e=>({path:"/questions",query:e}),"questions.get":e=>({path:`/questions/${Number(e.id)}`}),"articles.list":e=>({path:"/articles",query:e}),"articles.get":e=>({path:`/articles/${Number(e.id)}`,query:e.withContent===!0?{withContent:"true"}:void 0}),"knowledge.list":e=>({path:"/knowledge",query:e}),"knowledge.get":e=>({path:`/knowledge/${Number(e.id)}`}),"images.list":e=>({path:"/images",query:e}),"images.get":e=>({path:`/images/${Number(e.id)}`}),"videos.list":e=>({path:"/videos",query:e}),"videos.get":e=>({path:`/videos/${Number(e.id)}`}),"prompts.list":e=>({path:"/prompts",query:e}),"models.list":e=>({path:"/models",query:e}),"questionTasks.list":e=>({path:"/question-tasks",query:e}),"questionTasks.get":e=>({path:`/question-tasks/${Number(e.taskId)}`}),"articleTasks.list":e=>({path:"/article-tasks",query:e}),"articleTasks.get":e=>({path:`/article-tasks/${Number(e.taskId)}`}),"keywordTasks.list":e=>({path:"/keyword-tasks",query:e}),"keywordTasks.get":e=>({path:`/keyword-tasks/${Number(e.taskId)}`}),"tags.list":e=>({path:"/tags",query:e}),"folders.list":e=>({path:"/article-folders",query:e}),"publicationPlatforms.list":e=>({path:"/publication-platforms",query:e}),"publicationAccounts.list":e=>({path:"/publication-accounts",query:e}),"publicationTasks.list":e=>({path:"/publication-tasks",query:e}),"publicationRecords.list":e=>({path:"/publication-records",query:e}),"mediaPlatforms.list":e=>({path:"/media-platforms",query:e}),"mediaPlatforms.get":e=>({path:`/media-platforms/${Number(e.mediaId)}`}),"mediaPublications.list":e=>({path:"/media-publications",query:e}),"mediaPublications.summary":e=>({path:"/media-publications/summary",query:e}),"articleTasks.reuseConfig":e=>({path:`/article-tasks/${Number(e.taskId)}/reuse-config`}),"scheduledSentiment.generateQuestions":e=>({path:"/scheduled-sentiment/generate-questions",method:"POST",body:e}),"indexing.suggestCompetitors":e=>({path:"/suggest-competitors",method:"POST",body:e}),"indexingPlatforms.list":()=>({path:"/indexing-platforms"}),"scheduledIndexing.list":e=>({path:"/scheduled-indexing",query:e}),"scheduledIndexing.get":e=>({path:`/scheduled-indexing/${Number(e.planId)}`}),"scheduledIndexing.runs":e=>({path:`/scheduled-indexing/${Number(e.planId)}/runs`,query:I(e)}),"scheduledIndexing.metrics":e=>({path:`/scheduled-indexing/${Number(e.planId)}/metrics`,query:I(e)}),"scheduledSentiment.list":e=>({path:"/scheduled-sentiment",query:e}),"scheduledSentiment.get":e=>({path:`/scheduled-sentiment/${Number(e.planId)}`}),"scheduledSentiment.runs":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/runs`,query:I(e)}),"scheduledSentiment.metrics":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/metrics`,query:I(e)}),"scheduledIndexing.answers":e=>({path:`/scheduled-indexing/${Number(e.planId)}/answers`,query:I(e)}),"scheduledIndexing.citations":e=>({path:`/scheduled-indexing/${Number(e.planId)}/citations`,query:I(e)}),"scheduledIndexing.topicStats":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-stats`,query:I(e)}),"scheduledIndexing.topicPlatformMatrix":e=>({path:`/scheduled-indexing/${Number(e.planId)}/topic-platform-matrix`,query:I(e)}),"scheduledSentiment.answers":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/answers`,query:I(e)}),"scheduledSentiment.citations":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/citations`,query:I(e)}),"scheduledSentiment.topicStats":e=>({path:`/scheduled-sentiment/${Number(e.planId)}/topic-stats`,query:I(e)})};function I(e){let{planId:t,...n}=e;return n}function Ft(){return Object.keys(it)}async function ot(e,t){let n=it[e];if(!n){a(c("VALIDATION_FAILED",`\u672A\u77E5\u80FD\u529B\uFF1A${e}`,{data:{available:Ft()},nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo capabilities \u67E5\u770B\u53EF\u7528\u80FD\u529B"}}));return}let r={};if(t)try{r=JSON.parse(t)}catch{a(c("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let i=z(e,r);if(i.length>0){a(Q(e,i));return}let s=await q();if(!s.ok){a(s.envelope);return}let{path:o,query:d,method:m,body:u}=n(r);a(await y(o,{apiKey:s.apiKey,query:d,method:m,body:u}))}var R=require("node:fs"),P=require("node:path");var Bt={image:{maxBytes:2*1024*1024,extensions:[".png",".jpg",".jpeg"],label:"\u56FE\u7247"},video:{maxBytes:200*1024*1024,extensions:[".mp4"],label:"\u89C6\u9891"},thumbnail:{maxBytes:5*1024*1024,extensions:[".png",".jpg",".jpeg"],label:"\u5C01\u9762\u56FE"}},jt={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".mp4":"video/mp4"},st={"images.create":[{pathKey:"filePath",metaKey:"file",uploadField:"fileUrl",kind:"image"}],"videos.create":[{pathKey:"videoPath",metaKey:"video",uploadField:"videoUrl",kind:"video"},{pathKey:"thumbnailPath",metaKey:"thumbnail",uploadField:"thumbnail",kind:"thumbnail"}]},Gt=900*1e3;function at(e){return st[e]!==void 0}function ct(e){return M()[e]!==void 0}function ut(e,t){var s;let n=(s=st[e])!=null?s:[],r={...t},i={};for(let o of n){let d=t[o.pathKey];if(typeof d!="string"||!d.trim())return{ok:!1,envelope:zt(o)};let m=(0,P.resolve)(d.trim()),u=Jt(m,o);if(!u.ok)return{ok:!1,envelope:u.envelope};delete r[o.pathKey],r[o.metaKey]={name:(0,P.basename)(m),size:u.size},i[o.uploadField]=m}return{ok:!0,input:r,paths:i}}function dt(e,t){te({...M(),[e]:{paths:t,createdAt:Date.now()}})}async function lt(e,t){let n=M()[e];if(!n)return{ok:!1,envelope:c("VALIDATION_FAILED","\u672C\u673A\u6CA1\u6709\u8FD9\u4E2A\u8BA1\u5212\u7684\u5F85\u4F20\u6587\u4EF6\u8BB0\u5F55",{nextAction:{type:"ask_user",message:"\u91CD\u65B0\u6267\u884C best-geo plan \u751F\u6210\u8BA1\u5212\uFF0C\u628A\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D apply\u2014\u2014\u8BA1\u5212\u548C\u5F85\u4F20\u6587\u4EF6\u662F\u4E00\u8D77\u751F\u6210\u7684"}})};let r={};for(let[i,s]of Object.entries(n.paths)){if(!(0,R.existsSync)(s))return{ok:!1,envelope:c("VALIDATION_FAILED",`\u6587\u4EF6\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF1A${s}`)};let o=await y(`/plans/${encodeURIComponent(e)}/uploads/presign`,{method:"POST",apiKey:t,body:{field:i,fileName:(0,P.basename)(s)}});if(!o.ok)return{ok:!1,envelope:o};let d=await Ht(o.data,s);if(!d.ok)return{ok:!1,envelope:d.envelope};r[i]=o.data.uploadUrl}return{ok:!0,uploads:r}}function pt(e){let t=M();delete t[e],te(t)}async function Ht(e,t){let n=jt[mt(t)];if(!n)return{ok:!1,envelope:c("UPLOAD_FAILED",`${t} \u7684\u6587\u4EF6\u7C7B\u578B\u6CA1\u6709\u767B\u8BB0 MIME\uFF0C\u4F20\u4E0D\u4E86`)};let r=new FormData;r.append("key",e.key),r.append("policy",e.policy),r.append("OSSAccessKeyId",e.OSSAccessKeyId),r.append("signature",e.signature),r.append("callback",e.callback),r.append("Content-Disposition",e["Content-Disposition"]),r.append("success_action_status","200"),r.append("file",await(0,R.openAsBlob)(t,{type:n}),(0,P.basename)(t));try{let i=await fetch(e.host,{method:"POST",body:r,signal:AbortSignal.timeout(Gt)}),s=(await i.text().catch(()=>"")).slice(0,300);if(!i.ok)return{ok:!1,envelope:c("UPLOAD_FAILED",`\u4E0A\u4F20\u5931\u8D25\uFF08HTTP ${i.status}\uFF09\uFF1A${s}`,{nextAction:{type:"ask_user",message:"\u628A\u8FD9\u4E2A\u60C5\u51B5\u544A\u8BC9\u7528\u6237\uFF0C\u7A0D\u540E\u91CD\u65B0\u6267\u884C\u4E00\u6B21 plan \u518D\u8BD5"}})};let o=Qt(s);return o?{ok:!1,envelope:c("UPLOAD_FAILED",`\u6587\u4EF6\u5DF2\u4E0A\u4F20\uFF0C\u4F46\u767B\u8BB0\u5931\u8D25\uFF1A${o}`,{nextAction:{type:"ask_user",message:"\u628A\u8FD9\u53E5\u62A5\u9519\u539F\u6837\u544A\u8BC9\u7528\u6237\uFF0C\u8BA9\u4ED6\u8054\u7CFB\u670D\u52A1\u5546\u3002\u91CD\u8BD5\u591A\u534A\u4E0D\u4F1A\u597D\u3002"}})}:{ok:!0}}catch(i){return{ok:!1,envelope:c("UPLOAD_FAILED",`\u4E0A\u4F20\u4E2D\u65AD\uFF1A${i instanceof Error?i.message:String(i)}`,{nextAction:{type:"ask_user",message:"\u4E0A\u4F20\u6CA1\u80FD\u5B8C\u6210\uFF0C\u539F\u56E0\u89C1\u4E0A\u9762\u7684\u62A5\u9519\u539F\u6587\u3002\u544A\u8BC9\u7528\u6237\uFF0C\u7A0D\u540E\u91CD\u65B0\u8D70\u4E00\u904D"}})}}}function Jt(e,t){let n=Bt[t.kind];if(!(0,R.existsSync)(e))return{ok:!1,envelope:c("VALIDATION_FAILED",`\u627E\u4E0D\u5230\u6587\u4EF6\uFF1A${e}`,{nextAction:{type:"ask_user",message:"\u8BA9\u7528\u6237\u786E\u8BA4\u6587\u4EF6\u8DEF\u5F84\u3002\u76F8\u5BF9\u8DEF\u5F84\u662F\u76F8\u5BF9\u4F60\u5F53\u524D\u7684\u5DE5\u4F5C\u76EE\u5F55\u7B97\u7684"}})};let r=(0,R.statSync)(e);if(!r.isFile())return{ok:!1,envelope:c("VALIDATION_FAILED",`${e} \u4E0D\u662F\u4E00\u4E2A\u6587\u4EF6`)};let i=mt(e);return n.extensions.includes(i)?r.size>n.maxBytes?{ok:!1,envelope:c("VALIDATION_FAILED",`${n.label}\u6700\u5927 ${X(n.maxBytes)}\uFF0C\u5F53\u524D ${X(r.size)}\uFF0C\u8D85\u51FA ${X(r.size-n.maxBytes)}`,{nextAction:{type:"ask_user",message:`\u544A\u8BC9\u7528\u6237\u8FD9\u4E2A\u6587\u4EF6\u8D85\u4E86\u591A\u5C11\uFF0C\u5E76\u95EE\u4ED6\u8981\u4E0D\u8981\u4F60\u5148\u628A\u5B83\u538B\u5230 ${X(n.maxBytes)} \u4EE5\u5185\u518D\u4F20\u3002\u4F60\u53EF\u4EE5\u7528\u7528\u6237\u673A\u5668\u4E0A\u73B0\u6210\u7684\u5DE5\u5177\u5904\u7406\uFF08macOS \u81EA\u5E26 sips\uFF0C\u591A\u6570\u673A\u5668\u6709 ffmpeg\uFF09\uFF0C\u5904\u7406\u5B8C\u7528\u65B0\u6587\u4EF6\u91CD\u65B0 plan\u3002`}})}:{ok:!0,size:r.size}:{ok:!1,envelope:c("VALIDATION_FAILED",`${n.label}\u53EA\u652F\u6301 ${n.extensions.join(" / ")}\uFF0C\u5F53\u524D\u662F ${i||"(\u6CA1\u6709\u6269\u5C55\u540D)"}`,{nextAction:{type:"ask_user",message:`\u628A\u8FD9\u4E2A\u9650\u5236\u544A\u8BC9\u7528\u6237\uFF0C\u95EE\u4ED6\u8981\u4E0D\u8981\u4F60\u5148\u628A\u6587\u4EF6\u8F6C\u6210 ${n.extensions[0]} \u518D\u4F20`}})}}function zt(e){return c("VALIDATION_FAILED",`\u7F3A\u5C11 ${e.pathKey}`,{nextAction:{type:"ask_user",message:`${e.pathKey} \u8981\u7ED9\u4E00\u4E2A\u672C\u673A\u6587\u4EF6\u8DEF\u5F84\u3002\u95EE\u7528\u6237\u6587\u4EF6\u653E\u5728\u54EA\uFF0C\u4E0D\u8981\u81EA\u5DF1\u7F16\u4E00\u4E2A\u8DEF\u5F84\u3002`}})}function X(e){return e>=1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${Math.max(1,Math.round(e/1024))}KB`}function Qt(e){try{let t=JSON.parse(e),n=Number(t.statusCode);if(Number.isFinite(n)&&n!==0&&n!==200)return typeof t.message=="string"?t.message:`statusCode ${n}`}catch{}return null}function mt(e){let t=e.lastIndexOf(".");return t===-1?"":e.toLowerCase().slice(t)}async function ft(e,t,n){var b;let r=nt();if(!e||!r.includes(e)){a(c("VALIDATION_FAILED",`\u672A\u77E5\u7684\u5199\u64CD\u4F5C\uFF1A${e!=null?e:"(\u7A7A)"}`,{data:{available:r},nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo capabilities \u67E5\u770B\u53EF\u7528\u80FD\u529B\u548C\u5B83\u4EEC\u7684\u5165\u53C2"}}));return}if(!t&&(n!=null&&n.trim().startsWith("{"))){a(c("VALIDATION_FAILED","\u5165\u53C2\u8981\u653E\u5728 --input \u540E\u9762",{nextAction:{type:"ask_user",message:`\u6B63\u786E\u5199\u6CD5\uFF1Abest-geo plan ${e} --input '<JSON>'`}}));return}let i;try{i=t?JSON.parse(t):{}}catch{a(c("VALIDATION_FAILED","--input \u4E0D\u662F\u5408\u6CD5 JSON"));return}let s=z(e,i);if(s.length>0){a(Q(e,s));return}let o=i,d=null;if(at(e)){let k=ut(e,i);if(!k.ok){a(k.envelope);return}o=k.input,d=k.paths}let m=await q();if(!m.ok){a(m.envelope);return}let u=await y("/plans",{method:"POST",apiKey:m.apiKey,body:{operation:e,input:o}});u.ok&&d&&((b=u.data)!=null&&b.planId)&&dt(u.data.planId,d),a(u)}async function gt(e){if(!e){a(c("VALIDATION_FAILED","\u7F3A\u5C11 planId",{nextAction:{type:"ask_user",message:"\u5148\u6267\u884C best-geo plan <operation> \u751F\u6210\u8BA1\u5212\uFF0C\u628A\u6458\u8981\u7ED9\u7528\u6237\u786E\u8BA4\u540E\u518D\u6267\u884C"}}));return}let t=await q();if(!t.ok){a(t.envelope);return}let n;if(ct(e)){let i=await lt(e,t.apiKey);if(!i.ok){a(i.envelope);return}n=i.uploads}let r=await y(`/plans/${encodeURIComponent(e)}/apply`,{method:"POST",apiKey:t.apiKey,body:n?{uploads:n}:{},isWrite:!0});r.ok&&pt(e),a(r)}function yt(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];if(!r.startsWith("--"))continue;let i=r.slice(2),s=e[n+1];s&&!s.startsWith("--")?(t[i]=s,n+=1):t[i]=!0}return t}function Et(e,t){let n=w();if(e.reason==="denied")return c("HOST_PERMISSION_REQUIRED",`\u6CA1\u6709\u6743\u9650\u8BFB\u5199\u672C\u673A\u914D\u7F6E\u6587\u4EF6\uFF1A${n}`,{nextAction:{type:"request_host_approval",message:`Best GEO \u9700\u8981\u8BFB\u5199 ${n} \u6765\u4FDD\u5B58\u672C\u673A\u7684\u8BBE\u5907\u8EAB\u4EFD\u548C\u6388\u6743\u3002\u8BF7\u7528\u5F53\u524D\u5DE5\u5177\u81EA\u5E26\u7684\u6743\u9650\u786E\u8BA4\u673A\u5236\u7533\u8BF7\u5BF9\u8BE5\u6587\u4EF6\u7684\u8BFB\u5199\u6743\u9650\u540E\u91CD\u8BD5\u540C\u4E00\u6761\u547D\u4EE4\uFF0C\u4E0D\u8981\u5173\u95ED\u6574\u4E2A\u6C99\u7BB1\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u7528\u6237\u628A\u5BC6\u94A5\u8D34\u8FDB\u5BF9\u8BDD\u3002`,capability:t.capability,...t.retryCommand?{command:t.retryCommand}:{}}});if(e.reason==="permissions_too_open"||e.reason==="not_owner"){let r=e.reason==="not_owner"?"\u8BE5\u6587\u4EF6\u4E0D\u5C5E\u4E8E\u5F53\u524D\u7CFB\u7EDF\u7528\u6237\uFF0C\u8BF7\u8BA9\u7528\u6237\u786E\u8BA4\u540E\u5220\u9664\u6216\u4FEE\u6B63\u5C5E\u4E3B":`\u8BF7\u8BA9\u7528\u6237\u6267\u884C\uFF1Achmod 600 ${n}`;return c("HOST_PERMISSION_REQUIRED",`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u6743\u9650\u4E0D\u5B89\u5168\uFF1A${n}`,{nextAction:{type:"ask_user",message:`${e.message}\u3002${r}\uFF0C\u7136\u540E\u91CD\u8BD5\u3002`}})}return c("HOST_PERMISSION_REQUIRED",`\u672C\u673A\u914D\u7F6E\u6587\u4EF6\u5DF2\u635F\u574F\uFF1A${n}`,{nextAction:{type:"ask_user",message:`\u8BF7\u8BA9\u7528\u6237\u5220\u9664 ${n} \u540E\u91CD\u65B0\u6267\u884C\u767B\u5F55\u3002\u8BE5\u6587\u4EF6\u91CC\u53EA\u6709\u672C\u673A\u8BBE\u5907\u8EAB\u4EFD\u548C\u6388\u6743\uFF0C\u5220\u9664\u4E0D\u4F1A\u5F71\u54CD\u670D\u52A1\u7AEF\u6570\u636E\u3002`,command:`${l} auth login`}})}function ht(e){return e instanceof A}async function Xt(){let[e,...t]=process.argv.slice(2),n=yt(t);switch(e){case void 0:case"help":ze();return;case"version":await Qe(n.check===!0);return;case"capabilities":Xe();return;case"skill":if(t[0]==="get"){We(n.raw===!0);return}break;case"guide":if(t[0]==="list"){Ye();return}if(t[0]==="get"&&t[1]){Ze(t[1]);return}break;case"auth":if(t[0]==="login")return qe();if(t[0]==="status")return Ke();if(t[0]==="logout")return Fe();break;case"plan":await ft(t[0],typeof n.input=="string"?n.input:void 0,t[1]);return;case"apply":await gt(t[0]);return;case"call":if(t[0]){await ot(t[0],typeof n.input=="string"?n.input:void 0);return}break;default:break}a(c("VALIDATION_FAILED",`\u65E0\u6CD5\u8BC6\u522B\u7684\u547D\u4EE4\uFF1A${[e,...t].filter(Boolean).join(" ")}`,{nextAction:{type:"ask_user",message:"\u6267\u884C best-geo help \u67E5\u770B\u53EF\u7528\u547D\u4EE4"}})),process.exitCode=1}Xt().catch(e=>{if(ht(e)){a(Et(e,{capability:e.reason==="denied"?"config_write":"config_read",retryCommand:Wt()})),process.exitCode=1;return}a(c("SERVER_ERROR",e instanceof Error?e.message:String(e))),process.exitCode=1});function Wt(){let[e,t]=process.argv.slice(2);if(e==="auth"&&(t==="login"||t==="status"||t==="logout"))return`${l} auth ${t}`}
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": "publication",
3
+ "title": "内容发出去:自媒体发布与媒体投稿",
4
+ "whenToUse": "用户想把内容发出去,或者问「这篇发出去了没有」「发到哪个链接了」「为什么发失败」「投稿花了多少钱」。也包括他问「能发到哪些平台」「有哪些媒体可以投」的时候。",
5
+ "prerequisites": [
6
+ "已完成 best-geo auth login",
7
+ "已确定公司(发布账号和投稿记录都按公司隔离)"
8
+ ],
9
+ "workflow": [
10
+ {
11
+ "step": 1,
12
+ "action": "先分清用户说的是哪一件事",
13
+ "note": "**自媒体发布**是用用户自己绑定的账号发(知乎、小红书这些),按发布记录条数计费;**媒体投稿**是花钱请第三方媒体发稿,按家计价、单价从几块到几百不等。两条链路的表、状态含义、计费方式完全不同,问清楚再动手,别拿投稿记录回答发布的问题。"
14
+ },
15
+ {
16
+ "step": 2,
17
+ "action": "查发布任务的整体情况用 publicationTasks.list",
18
+ "capability": "publicationTasks.list",
19
+ "note": "这里只给任务级汇总。用户问的是具体某篇发没发,别停在这一步。"
20
+ },
21
+ {
22
+ "step": 3,
23
+ "action": "查每条内容的实际下场用 publicationRecords.list",
24
+ "capability": "publicationRecords.list",
25
+ "note": "这是「发出去了没有、链接是什么」的唯一出处。念状态用 statusLabel 不要用 status 数值。成功的把 publishedUrl 给出来——那是用户最想要的。**自媒体发布查不到失败原因**:数据库里就没有这一列,失败时只能如实说「发布失败了,系统没有记下具体原因」,不要编一个理由,也不要去找 errorMessage 字段(不存在)。"
26
+ },
27
+ {
28
+ "step": 4,
29
+ "action": "要建发布任务,先把平台和账号查清楚",
30
+ "capability": "publicationAccounts.list",
31
+ "note": "顺序是:publicationPlatforms.list(带 contentType)看能发到哪儿 → publicationAccounts.list 看这个公司绑了哪些号 → 再建任务。平台名猜得出来,账号 id 猜不出来,不查就建必然失败。**挑号只挑 usable=true 的**,登录过期或已停用的号建任务时会被拒。**挑文章时用 articles.list 带上 status=1 和 mustHaveCover=true**——未审核或没封面的文章发不出去。这两件事都是先筛掉比建任务被拒再回头省事。"
32
+ },
33
+ {
34
+ "step": 5,
35
+ "action": "建发布任务:publicationTasks.createArticle / createVideo",
36
+ "capability": "publicationTasks.createArticle",
37
+ "note": "**先 plan,把计划里逐条列的「哪篇发到哪个号、什么时候发」念给用户,等他确认再 apply**。执行之后稿子会真的发出去,CLI 撤不回来。aigc(要不要打 AI 创作声明)必须问用户,别替他决定。定时发布传 publishTime,不传就是立即发。费用按发布记录条数算——一篇发 3 个号就是 3 条,跟用户说清楚这个口径。"
38
+ },
39
+ {
40
+ "step": 6,
41
+ "action": "任务建完后查进展,别反复重建",
42
+ "capability": "publicationRecords.list",
43
+ "note": "发布是异步的,apply 完不会马上有链接。等一会儿用 publicationRecords.list 看。每建一次任务就是一批新的发布,重建 = 重复发稿 + 重复扣费。"
44
+ },
45
+ {
46
+ "step": 7,
47
+ "action": "要停下来用 publicationTasks.pause,改主意了用 delete",
48
+ "capability": "publicationTasks.pause",
49
+ "note": "两个都只对**还没发出去**的记录有效。已经发成功的稿子留在平台上,CLI 撤不回来——用户要撤那些,只能去各平台自己删,这一点必须说明白,别让他以为暂停就等于撤回。"
50
+ },
51
+ {
52
+ "step": 8,
53
+ "action": "媒体投稿:先 mediaPlatforms.list 看有哪些媒体,报价前用 mediaPlatforms.get 查实时价",
54
+ "capability": "mediaPlatforms.get",
55
+ "note": "**报价必须用 get 那条**。列表是分页快照,遇上刚调过价就会和实际扣费对不上——用户按你报的数点了头,扣的却是另一个数。"
56
+ },
57
+ {
58
+ "step": 9,
59
+ "action": "投稿:mediaPublications.create(一家)/ batchCreate(多家,最多 20)",
60
+ "capability": "mediaPublications.batchCreate",
61
+ "note": "**计划里逐家列出了媒体名和单价,要一家一家念给用户听,再给合计**——这是按明细收费的操作,用户确认的就是这份账单,只说「一共多少钱」不够。批量允许部分成功:某家失败不影响别家,失败的那家不扣费。一次只能投一篇文章,投多篇就一篇一篇来。"
62
+ },
63
+ {
64
+ "step": 10,
65
+ "action": "查投稿进展用 mediaPublications.list,要整体情况用 mediaPublications.summary",
66
+ "capability": "mediaPublications.summary",
67
+ "note": "投稿动辄上百条。用户问「投出去的都怎么样了」直接用 summary,念 items 里的 statusLabel(「已拒稿 × 15」),别念 counts 里的数值。投稿有 failReason,被拒稿时把它念出来——这条链路和自媒体发布不同,是有失败原因的。**被拒稿的还要看 refundStatusLabel**:拒稿会原路退款,但退款偶尔会没退成(显示「待退款」,系统会自动补退)——用户问「钱退了吗」看的是这个字段,不是 status。"
68
+ }
69
+ ],
70
+ "askUserWhen": [
71
+ "分不清他要问的是自媒体发布还是媒体投稿",
72
+ "他有多家公司,而没说这次问的是哪家",
73
+ "他说「发一下」但没说发哪篇、发到哪个平台、用哪个账号",
74
+ "要不要打「AI 创作」声明(aigc)——这是他的合规选择,不能替他定",
75
+ "他说「明天发」这类相对时间,而你不确定具体是几点"
76
+ ],
77
+ "forbidden": [
78
+ "不要在用户确认之前 apply 任何发布或投稿的计划——执行之后稿子就真的出去了",
79
+ "不要只报总数或总价就让用户确认。发布要念「哪篇发到哪个号」,投稿要念「哪家多少钱」",
80
+ "不要拿投稿记录回答自媒体发布的问题,反过来也一样——两条链路的状态含义不同",
81
+ "不要用列表里的媒体价格给用户报价,必须用 mediaPlatforms.get 的实时价",
82
+ "不要给自媒体发布的失败编造原因,也不要去读 errorMessage——那个字段不存在",
83
+ "不要把 refund_pending 说成「已退款」——那笔钱现在还在用户账外,说错了他就不会再追",
84
+ "不要把 status 数值念给用户,用 statusLabel",
85
+ "不要说「暂停」或「删除任务」能撤回已经发出去的稿子——撤不了",
86
+ "不要拿未审核或没封面的文章去发布/投稿,会被拒。挑文章时就用 status=1 + mustHaveCover=true 筛掉"
87
+ ],
88
+ "errorRecovery": [
89
+ {
90
+ "code": "ACCESS_DENIED",
91
+ "action": "这条记录不属于当前密钥授权的公司。先用 companies.list 确认在哪家公司下找。"
92
+ },
93
+ {
94
+ "code": "VALIDATION_FAILED",
95
+ "action": "按 capabilities 里的 schema 修正参数。平台名要来自 publicationPlatforms.list、账号 id 来自 publicationAccounts.list,别自己拼。报「文章没有封面」「标题超过媒体限制」「时间已经过去了」时,是内容或参数本身的问题,改完再重新生成计划。"
96
+ },
97
+ {
98
+ "code": "PLAN_COST_CHANGED",
99
+ "action": "媒体价格在用户确认的这段时间里变了。**不要直接重试**——重新生成计划,把新的价格明细念给用户,让他重新确认。"
100
+ },
101
+ {
102
+ "code": "PLAN_STALE",
103
+ "action": "有媒体在确认期间下架了。重新查一遍还在架上的媒体,重新生成计划让用户确认。"
104
+ },
105
+ {
106
+ "code": "QUOTA_EXCEEDED",
107
+ "action": "余额不足。告诉用户还差多少、去哪儿充值,别反复重试。"
108
+ }
109
+ ],
110
+ "completionCriteria": [
111
+ "回答「发了没有」时给出了状态名称、以及成功的链接或失败的说明",
112
+ "批量投稿执行完,报的是结果里的 netChargedTotal(单位元),不是自己按成功家数乘单价算出来的",
113
+ "有 refund_pending 的项时,说清楚「这笔钱还没退回来,系统会自动补退」,不能说成已退款",
114
+ "涉及花钱的投稿,报价用的是 mediaPlatforms.get 的实时价,且逐家念过明细",
115
+ "建任务或投稿前,把「哪篇发到哪儿、花多少钱、发出去撤不回来」都跟用户讲清楚了,他明确点头才 apply"
116
+ ]
117
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "best-geo-test",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Best GEO CLI — 给本地 AI 助手调用的 GEO 命令行工具",
5
5
  "bin": {
6
6
  "best-geo-test": "dist/index.cjs"
@@ -24,6 +24,7 @@ best-geo guide get material # 要查图片/视频素材,或给素材改名
24
24
  best-geo guide get question-task # 要让 AI 想一批搜索问题
25
25
  best-geo guide get article-task # 要让 AI 批量写一批文章
26
26
  best-geo guide get scheduled-monitor # 要定期盯 AI 有没有提到你、怎么评价你
27
+ best-geo guide get publication # 要把内容发出去/投稿,或查发出去没有、发到哪个链接、花了多少钱
27
28
  ```
28
29
 
29
30
  ## 调用业务能力
@@ -101,9 +102,12 @@ best-geo plan companies.update --input '{"companyId":6,"description":"新描述"
101
102
  - `questions.create` 的摘要会分别列出「将新增」「已存在跳过」「重复/空值跳过」。告诉用户真实会新增几条,不要照抄他给的原始条数。
102
103
  - 用户没同意就别 apply。他要是改主意了,直接丢掉这个 planId 重新 plan 即可,不需要"取消"。
103
104
  - **删除是唯一不可逆的一类**(`*.delete`)。别的写操作改错了还能再改回来,删掉的东西找不回来。
104
- 所以:摘要里那句连带影响必须**原样念给用户**(删公司会连带删掉它下面所有东西,还可能把当前
105
- 这把密钥一起撤销),并且要等他**明确说删**,不能拿「帮我清理一下」当作同意。拿不准就先用查询
106
- 能力把要删的东西列给他看,让他逐条确认。
105
+ 所以:摘要里那句连带影响必须**原样念给用户**(比如删知识库会让绑了它的搜索问题失去这份资料),
106
+ 并且要等他**明确说删**,不能拿「帮我清理一下」当作同意。拿不准就先用查询能力把要删的东西
107
+ 列给他看,让他逐条确认。
108
+ - **公司和 GEO 项目删不了**,这是有意的:它们是级联删除,一条命令能连带清掉下面的项目、文章、
109
+ 知识库、素材、定时计划。用户要删这两样,请他到网页上删——不要试图用别的能力绕(比如逐个删完
110
+ 下面的东西),那既做不到也不是他要的。
107
111
 
108
112
  ## 读输出的规则
109
113