siluzan-tso-cli 1.1.42-beta.3 → 1.1.42-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +208 -28
- package/dist/skill/SKILL.md +1 -0
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/accounts/finance.md +7 -1
- package/dist/skill/references/accounts/open-account-by-media.md +8 -1
- package/dist/skill/references/accounts/open-account-google-ui.md +8 -3
- package/dist/skill/references/analytics/reporting.md +1 -1
- package/dist/skill/references/core/agent-conventions.md +8 -2
- package/dist/skill/references/core/setup.md +1 -0
- package/dist/skill/references/core/workflows.md +1 -1
- package/dist/skill/scripts/install.ps1 +1 -1
- package/dist/skill/scripts/install.sh +1 -1
- package/eval/cases/open-account-google-noninteractive.scenario.json +1 -1
- package/eval/cases/uj-ops-open-google-b2c-usd-shenzhen.scenario.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -51,7 +51,7 @@ siluzan-tso init -d /path/to/skills # 写入自定义目录
|
|
|
51
51
|
siluzan-tso init --force # 强制覆盖已存在文件
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
> **注意**:当前为测试版(1.1.42-beta.
|
|
54
|
+
> **注意**:当前为测试版(1.1.42-beta.5),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
55
55
|
|
|
56
56
|
| 助手 | 建议 `--ai` |
|
|
57
57
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -2289,6 +2289,16 @@ function resolveSiluzanClientRuntime() {
|
|
|
2289
2289
|
if (looksLikeThirdPartyAgentEnv()) return "agent";
|
|
2290
2290
|
return "cli";
|
|
2291
2291
|
}
|
|
2292
|
+
function resolveCompanySourceType(raw = process.env[DEERFLOW_AGENT_ENV]) {
|
|
2293
|
+
const trimmed = raw?.trim();
|
|
2294
|
+
if (!trimmed) return void 0;
|
|
2295
|
+
if (trimmed === "Ctaiad") return "Ctaiad";
|
|
2296
|
+
const key = trimmed.toLowerCase();
|
|
2297
|
+
if (key === "ctaiad" || key === "ctaiad_agent") {
|
|
2298
|
+
return SILUZAN_AGENT_COMPANY_SOURCE_TYPE;
|
|
2299
|
+
}
|
|
2300
|
+
return void 0;
|
|
2301
|
+
}
|
|
2292
2302
|
function getSiluzanSkillVersion() {
|
|
2293
2303
|
return (_resolveVersion?.() ?? "0.0.0").trim() || "0.0.0";
|
|
2294
2304
|
}
|
|
@@ -2296,13 +2306,17 @@ function buildSiluzanClientIdentityHeaders() {
|
|
|
2296
2306
|
const client = getSiluzanClientProduct();
|
|
2297
2307
|
const runtime = resolveSiluzanClientRuntime();
|
|
2298
2308
|
const version = getSiluzanSkillVersion();
|
|
2299
|
-
|
|
2309
|
+
const headers = {
|
|
2300
2310
|
"X-Siluzan-Client": client,
|
|
2301
2311
|
"X-Siluzan-Runtime": runtime,
|
|
2302
2312
|
"X-Siluzan-Skill-Version": version,
|
|
2303
|
-
"X-Company-Source-Type": SILUZAN_AGENT_COMPANY_SOURCE_TYPE,
|
|
2304
2313
|
"User-Agent": `${client}/${version}`
|
|
2305
2314
|
};
|
|
2315
|
+
const companySource = resolveCompanySourceType();
|
|
2316
|
+
if (companySource) {
|
|
2317
|
+
headers["X-Company-Source-Type"] = companySource;
|
|
2318
|
+
}
|
|
2319
|
+
return headers;
|
|
2306
2320
|
}
|
|
2307
2321
|
function isPerfEnabled() {
|
|
2308
2322
|
const v = process.env.SILUZAN_HTTP_PERF;
|
|
@@ -3887,7 +3901,7 @@ async function issueApiKeyWithPhoneCode(opts) {
|
|
|
3887
3901
|
});
|
|
3888
3902
|
return apiKey;
|
|
3889
3903
|
}
|
|
3890
|
-
var import_semver, SILUZAN_DIR, CONFIG_FILE, inProcessLockChain, ALLOWED_HOSTNAME_SUFFIXES, EXACT_ID_FIELD_NAMES, SILUZAN_AGENT_COMPANY_SOURCE_TYPE, _clientProduct, _resolveVersion, DEFAULT_TIMEOUT_MS, MAX_RESPONSE_BYTES, httpsAgent, httpAgent, PERF_PREFIX, DEFAULT_DETAIL_MAX, VERBOSE_DETAIL_MAX, ASCII_TABLE_CHARS, CLI_SNAPSHOT_MANIFEST_FILE, SCHEMA_VERSION, FALLBACK_FIELD_GUIDE_REFS, _cliPackage, _resolveCliVersion, _fieldGuideRefs, OUTLINE_AGENT_HINT, TS_LIKE_ARRAY_SAMPLE_MAX, MAX_INVOCATION_CHARS, currentInvocation, MAX_COMMIT_CHARS, WRITE_AUDIT_AGENT_AUTO_COMMIT, cliCommitOverride, WRITE_AUDIT_SCHEMA_VERSION, MUTATING, BEIJING_TZ, AUDIT_LOG_FILENAME_RE, DEFAULT_MAX_FILE_MB, MIN_SEGMENT_BYTES, MAX_SEGMENT_BYTES, DEFAULT_RETENTION_DAYS, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS, PRUNE_THROTTLE_MS, lastPruneAtMs, MAX_BODY_CHARS, MAX_ERROR_CHARS, DEFAULT_FIND_AUDIT_MAX_DAYS, MAX_SNAPSHOT_FILE_BYTES, API_KEY_SERVICE_VALUES;
|
|
3904
|
+
var import_semver, SILUZAN_DIR, CONFIG_FILE, inProcessLockChain, ALLOWED_HOSTNAME_SUFFIXES, EXACT_ID_FIELD_NAMES, SILUZAN_AGENT_COMPANY_SOURCE_TYPE, DEERFLOW_AGENT_ENV, _clientProduct, _resolveVersion, DEFAULT_TIMEOUT_MS, MAX_RESPONSE_BYTES, httpsAgent, httpAgent, PERF_PREFIX, DEFAULT_DETAIL_MAX, VERBOSE_DETAIL_MAX, ASCII_TABLE_CHARS, CLI_SNAPSHOT_MANIFEST_FILE, SCHEMA_VERSION, FALLBACK_FIELD_GUIDE_REFS, _cliPackage, _resolveCliVersion, _fieldGuideRefs, OUTLINE_AGENT_HINT, TS_LIKE_ARRAY_SAMPLE_MAX, MAX_INVOCATION_CHARS, currentInvocation, MAX_COMMIT_CHARS, WRITE_AUDIT_AGENT_AUTO_COMMIT, cliCommitOverride, WRITE_AUDIT_SCHEMA_VERSION, MUTATING, BEIJING_TZ, AUDIT_LOG_FILENAME_RE, DEFAULT_MAX_FILE_MB, MIN_SEGMENT_BYTES, MAX_SEGMENT_BYTES, DEFAULT_RETENTION_DAYS, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS, PRUNE_THROTTLE_MS, lastPruneAtMs, MAX_BODY_CHARS, MAX_ERROR_CHARS, DEFAULT_FIND_AUDIT_MAX_DAYS, MAX_SNAPSHOT_FILE_BYTES, API_KEY_SERVICE_VALUES;
|
|
3891
3905
|
var init_dist = __esm({
|
|
3892
3906
|
"../common/dist/index.js"() {
|
|
3893
3907
|
"use strict";
|
|
@@ -3934,6 +3948,7 @@ var init_dist = __esm({
|
|
|
3934
3948
|
"userId"
|
|
3935
3949
|
]);
|
|
3936
3950
|
SILUZAN_AGENT_COMPANY_SOURCE_TYPE = "Ctaiad";
|
|
3951
|
+
DEERFLOW_AGENT_ENV = "DEERFLOW_AGENT";
|
|
3937
3952
|
_clientProduct = "siluzan-cli";
|
|
3938
3953
|
DEFAULT_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
3939
3954
|
MAX_RESPONSE_BYTES = 50 * 1024 * 1024;
|
|
@@ -124520,6 +124535,10 @@ async function resolveGoogleMediaAccountGroupId(config, opts) {
|
|
|
124520
124535
|
}
|
|
124521
124536
|
const company = opts.company.trim();
|
|
124522
124537
|
const promotionLink = normalizePromotionLinkForGoogle(opts.promotionLink);
|
|
124538
|
+
const industry = {
|
|
124539
|
+
level1: (opts.industry1 ?? "").trim(),
|
|
124540
|
+
level2: (opts.industry2 ?? "").trim()
|
|
124541
|
+
};
|
|
124523
124542
|
let profile;
|
|
124524
124543
|
try {
|
|
124525
124544
|
profile = await apiFetch2(
|
|
@@ -124544,6 +124563,7 @@ async function resolveGoogleMediaAccountGroupId(config, opts) {
|
|
|
124544
124563
|
const mediaAccountGroupPayload = {
|
|
124545
124564
|
advertiserName: company,
|
|
124546
124565
|
StorageProvider: storageFromGroup ?? "StorageAccount",
|
|
124566
|
+
industry,
|
|
124547
124567
|
promotionLink,
|
|
124548
124568
|
promotionType: opts.promotionType
|
|
124549
124569
|
};
|
|
@@ -125162,6 +125182,46 @@ import * as readline2 from "readline/promises";
|
|
|
125162
125182
|
import { stdin as stdinStream, stdout as stdoutStream } from "process";
|
|
125163
125183
|
init_cli_json_snapshot();
|
|
125164
125184
|
init_cli_table();
|
|
125185
|
+
|
|
125186
|
+
// src/commands/open-account/google-open-account-body.ts
|
|
125187
|
+
function defaultGoogleTimezoneForCurrency(currency) {
|
|
125188
|
+
return currency.trim().toUpperCase() === "CNY" ? "Asia/Shanghai" : "Asia/Hong_Kong";
|
|
125189
|
+
}
|
|
125190
|
+
function buildGoogleCustomerIndustry(industry1, industry2) {
|
|
125191
|
+
const level1 = (industry1 ?? "").trim();
|
|
125192
|
+
const level2 = (industry2 ?? "").trim();
|
|
125193
|
+
if (!level1 && !level2) return "-";
|
|
125194
|
+
return `${level1}-${level2}`;
|
|
125195
|
+
}
|
|
125196
|
+
function resolveGoogleTimezoneForSubmit(currency, timezone) {
|
|
125197
|
+
const t = (timezone ?? "").trim();
|
|
125198
|
+
if (t) return t;
|
|
125199
|
+
return defaultGoogleTimezoneForCurrency(currency);
|
|
125200
|
+
}
|
|
125201
|
+
function buildGoogleAccountInfoItem(opts) {
|
|
125202
|
+
return {
|
|
125203
|
+
advertiser_info: {
|
|
125204
|
+
name: opts.accountName,
|
|
125205
|
+
currency: opts.currency,
|
|
125206
|
+
timezone: opts.timezone,
|
|
125207
|
+
accounttype: "Adwords",
|
|
125208
|
+
inviteduseremail: opts.inviteEmail,
|
|
125209
|
+
inviteduserrole: opts.inviteRole ?? "Standard"
|
|
125210
|
+
},
|
|
125211
|
+
customer_info: {
|
|
125212
|
+
company: opts.company.trim(),
|
|
125213
|
+
industry: buildGoogleCustomerIndustry(opts.industry1, opts.industry2)
|
|
125214
|
+
},
|
|
125215
|
+
qualification_info: {
|
|
125216
|
+
promotion_link: opts.promotionLink,
|
|
125217
|
+
promotion_type: opts.promotionType
|
|
125218
|
+
},
|
|
125219
|
+
auto_allot_mailbox: opts.autoAllotMailbox ?? false,
|
|
125220
|
+
counts: 1
|
|
125221
|
+
};
|
|
125222
|
+
}
|
|
125223
|
+
|
|
125224
|
+
// src/commands/open-account/google.ts
|
|
125165
125225
|
async function fetchGoogleTimezoneRows(config, verbose) {
|
|
125166
125226
|
const raw = await apiFetch2(
|
|
125167
125227
|
`${config.apiBaseUrl}/query/media-account/Google/TimeZoneInfo/ReadFile`,
|
|
@@ -125242,9 +125302,6 @@ Google \u5F00\u6237\u53EF\u9009\u65F6\u533A\uFF08\u4E0E\u7F51\u9875 /openAnAccou
|
|
|
125242
125302
|
"\n\u63D0\u793A\uFF1A\u9009\u5E01\u79CD\u540E\u7F51\u9875\u4F1A\u9ED8\u8BA4 \u2014\u2014 CNY \u2192 Asia/Shanghai\uFF0CUSD \u2192 Asia/Hong_Kong\uFF1B\u5176\u5B83\u65F6\u533A\u8BF7\u4ECE\u4E0A\u8868\u53D6 Code\u3002\n"
|
|
125243
125303
|
);
|
|
125244
125304
|
}
|
|
125245
|
-
function defaultGoogleTimezoneForCurrency(currency) {
|
|
125246
|
-
return currency.trim().toUpperCase() === "CNY" ? "Asia/Shanghai" : "Asia/Hong_Kong";
|
|
125247
|
-
}
|
|
125248
125305
|
async function runOpenAccountGoogleWizard(opts) {
|
|
125249
125306
|
if (!stdinStream.isTTY || !stdoutStream.isTTY) {
|
|
125250
125307
|
console.error(
|
|
@@ -125291,6 +125348,15 @@ async function runOpenAccountGoogleWizard(opts) {
|
|
|
125291
125348
|
let promotionType = "b2b";
|
|
125292
125349
|
if (typeAns === "2") promotionType = "b2c";
|
|
125293
125350
|
else if (typeAns === "3") promotionType = "app";
|
|
125351
|
+
console.log(
|
|
125352
|
+
"\n\u884C\u4E1A\uFF08\u7F51\u9875\u7EA7\u8054\uFF1B\u6587\u6848\u987B\u4E0E open-account google-industries \u4E00\u81F4\uFF0C\u52FF\u7528\u6570\u5B57 ID\uFF09"
|
|
125353
|
+
);
|
|
125354
|
+
const industry1 = await q("\u4E00\u7EA7\u884C\u4E1A\u6587\u6848\uFF1A");
|
|
125355
|
+
const industry2 = await q("\u4E8C\u7EA7\u884C\u4E1A\u6587\u6848\uFF1A");
|
|
125356
|
+
if (!industry1.trim() || !industry2.trim()) {
|
|
125357
|
+
console.error("\n\u274C \u4E00\u7EA7/\u4E8C\u7EA7\u884C\u4E1A\u4E0D\u80FD\u4E3A\u7A7A\uFF08\u4E0E\u7F51\u9875\u9F50\u5168\u8D44\u6599\u4E00\u81F4\uFF09\u3002\u53EF\u5148\u67E5 google-industries\u3002\n");
|
|
125358
|
+
process.exit(1);
|
|
125359
|
+
}
|
|
125294
125360
|
console.log(`
|
|
125295
125361
|
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u3010\u7F51\u9875\u7B2C 2 \u6B65\u3011\u5E7F\u544A\u8D26\u6237\u8868\u683C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
125296
125362
|
`);
|
|
@@ -125346,6 +125412,7 @@ async function runOpenAccountGoogleWizard(opts) {
|
|
|
125346
125412
|
\u516C\u53F8\u540D\uFF1A ${company}
|
|
125347
125413
|
\u63A8\u5E7F\u94FE\u63A5\uFF1A ${promotionLink}
|
|
125348
125414
|
\u63A8\u5E7F\u7C7B\u578B\uFF1A ${promotionType}
|
|
125415
|
+
\u884C\u4E1A\uFF1A ${industry1} / ${industry2}
|
|
125349
125416
|
\u8D26\u6237\u540D\u79F0\uFF1A ${accountName}
|
|
125350
125417
|
\u5E01\u79CD / \u65F6\u533A\uFF1A ${currency} / ${timezone}
|
|
125351
125418
|
\u5F00\u6237\u6570\u91CF\uFF1A ${counts}
|
|
@@ -125361,6 +125428,8 @@ async function runOpenAccountGoogleWizard(opts) {
|
|
|
125361
125428
|
company,
|
|
125362
125429
|
promotionLink,
|
|
125363
125430
|
promotionType,
|
|
125431
|
+
industry1,
|
|
125432
|
+
industry2,
|
|
125364
125433
|
accountName,
|
|
125365
125434
|
currency,
|
|
125366
125435
|
timezone,
|
|
@@ -125382,36 +125451,62 @@ async function runOpenAccountGoogle(opts) {
|
|
|
125382
125451
|
console.error("\n\u274C --invite-email \u4E0D\u662F\u6709\u6548\u7684\u90AE\u7BB1\u683C\u5F0F\uFF08\u9700\u542B @ \u4E0E\u57DF\u540D\uFF09\u3002\n");
|
|
125383
125452
|
process.exit(1);
|
|
125384
125453
|
}
|
|
125454
|
+
const industry1 = opts.industry1.trim();
|
|
125455
|
+
const industry2 = opts.industry2.trim();
|
|
125456
|
+
if (!industry1 || !industry2) {
|
|
125457
|
+
console.error(
|
|
125458
|
+
"\n\u274C --industry1 / --industry2 \u5747\u4E3A\u5FC5\u586B\uFF08\u4E2D\u6587\u6587\u6848\uFF0C\u4E0E\u7F51\u9875\u884C\u4E1A\u7EA7\u8054\u4E00\u81F4\uFF09\u3002\n \u8BF7\u5148\u6267\u884C\uFF1Asiluzan-tso open-account google-industries\n"
|
|
125459
|
+
);
|
|
125460
|
+
process.exit(1);
|
|
125461
|
+
}
|
|
125462
|
+
const timezone = resolveGoogleTimezoneForSubmit(opts.currency, opts.timezone);
|
|
125463
|
+
try {
|
|
125464
|
+
const tzRows = await fetchGoogleTimezoneRows(config, opts.verbose);
|
|
125465
|
+
const codes = new Set(tzRows.map((r) => String(r.Code ?? "").trim()).filter(Boolean));
|
|
125466
|
+
if (codes.size > 0 && !codes.has(timezone)) {
|
|
125467
|
+
console.error(
|
|
125468
|
+
`
|
|
125469
|
+
\u274C --timezone "${timezone}" \u4E0D\u5728 Google \u65F6\u533A\u5217\u8868\u7684 Code \u4E2D\u3002
|
|
125470
|
+
\u8BF7\u6267\u884C open-account google-timezones \u67E5\u770B\uFF1BUSD \u9ED8\u8BA4 Asia/Hong_Kong\uFF0CCNY \u9ED8\u8BA4 Asia/Shanghai\u3002
|
|
125471
|
+
`
|
|
125472
|
+
);
|
|
125473
|
+
process.exit(1);
|
|
125474
|
+
}
|
|
125475
|
+
} catch (err) {
|
|
125476
|
+
console.warn(
|
|
125477
|
+
` \u26A0\uFE0F \u65E0\u6CD5\u6821\u9A8C\u65F6\u533A\u5217\u8868\uFF08${err instanceof Error ? err.message : String(err)}\uFF09\uFF0C\u5DF2\u6309 "${timezone}" \u7EE7\u7EED\u63D0\u4EA4\u3002`
|
|
125478
|
+
);
|
|
125479
|
+
}
|
|
125385
125480
|
const counts = Math.min(Math.max(opts.counts ?? 1, 1), 3);
|
|
125386
125481
|
const magKey = await resolveGoogleMediaAccountGroupId(config, {
|
|
125387
125482
|
advertiserId: opts.advertiserId,
|
|
125388
125483
|
company: opts.company,
|
|
125389
125484
|
promotionLink: opts.promotionLink,
|
|
125390
125485
|
promotionType: opts.promotionType,
|
|
125486
|
+
industry1,
|
|
125487
|
+
industry2,
|
|
125391
125488
|
verbose: opts.verbose
|
|
125392
125489
|
});
|
|
125393
125490
|
const promotionLinkNorm = normalizePromotionLinkForGoogle(opts.promotionLink);
|
|
125394
125491
|
const body = {
|
|
125395
|
-
accountInfo: Array.from({ length: counts }, (_, i) =>
|
|
125396
|
-
|
|
125397
|
-
|
|
125398
|
-
name: counts > 1 ? `${opts.accountName}-${i + 1}` : opts.accountName,
|
|
125492
|
+
accountInfo: Array.from({ length: counts }, (_, i) => {
|
|
125493
|
+
const base = buildGoogleAccountInfoItem({
|
|
125494
|
+
accountName: opts.accountName,
|
|
125399
125495
|
currency: opts.currency,
|
|
125400
|
-
timezone
|
|
125401
|
-
|
|
125402
|
-
|
|
125403
|
-
|
|
125404
|
-
|
|
125405
|
-
|
|
125406
|
-
|
|
125407
|
-
|
|
125408
|
-
|
|
125409
|
-
|
|
125410
|
-
|
|
125411
|
-
}
|
|
125412
|
-
|
|
125413
|
-
|
|
125414
|
-
})),
|
|
125496
|
+
timezone,
|
|
125497
|
+
inviteEmail,
|
|
125498
|
+
inviteRole: opts.inviteRole,
|
|
125499
|
+
company: opts.company,
|
|
125500
|
+
industry1,
|
|
125501
|
+
industry2,
|
|
125502
|
+
promotionLink: promotionLinkNorm,
|
|
125503
|
+
promotionType: opts.promotionType,
|
|
125504
|
+
autoAllotMailbox: opts.autoAllotMailbox
|
|
125505
|
+
});
|
|
125506
|
+
const adv = base.advertiser_info;
|
|
125507
|
+
adv.name = counts > 1 ? `${opts.accountName}-${i + 1}` : opts.accountName;
|
|
125508
|
+
return base;
|
|
125509
|
+
}),
|
|
125415
125510
|
MediaAccountGroupId: magKey,
|
|
125416
125511
|
IsSaltAdd: false,
|
|
125417
125512
|
ManagerCustomerId: opts.managerCustomerId ?? ""
|
|
@@ -125441,6 +125536,67 @@ async function runOpenAccountGoogle(opts) {
|
|
|
125441
125536
|
process.exit(1);
|
|
125442
125537
|
}
|
|
125443
125538
|
}
|
|
125539
|
+
async function runOpenAccountGoogleIndustries(opts) {
|
|
125540
|
+
const config = loadConfig(opts.token);
|
|
125541
|
+
let rows;
|
|
125542
|
+
try {
|
|
125543
|
+
const raw = await apiFetch2(
|
|
125544
|
+
`${config.apiBaseUrl}/analysisreporting/media-account/industryDirectory`,
|
|
125545
|
+
config,
|
|
125546
|
+
{},
|
|
125547
|
+
opts.verbose
|
|
125548
|
+
);
|
|
125549
|
+
rows = Array.isArray(raw) ? raw : Array.isArray(raw.data) ? raw.data : [];
|
|
125550
|
+
} catch (err) {
|
|
125551
|
+
console.error(
|
|
125552
|
+
`
|
|
125553
|
+
\u274C \u62C9\u53D6 Google \u884C\u4E1A\u5217\u8868\u5931\u8D25\uFF1A${err instanceof Error ? err.message : String(err)}
|
|
125554
|
+
`
|
|
125555
|
+
);
|
|
125556
|
+
process.exit(1);
|
|
125557
|
+
}
|
|
125558
|
+
const kw = (opts.keyword ?? "").trim().toLowerCase();
|
|
125559
|
+
if (kw) {
|
|
125560
|
+
rows = rows.filter(
|
|
125561
|
+
(r) => String(r.industry1 ?? "").toLowerCase().includes(kw) || String(r.industry2 ?? "").toLowerCase().includes(kw)
|
|
125562
|
+
);
|
|
125563
|
+
}
|
|
125564
|
+
const n = rows.length;
|
|
125565
|
+
const payload = wrapListJson({
|
|
125566
|
+
page: 1,
|
|
125567
|
+
pageSize: Math.max(n, 1),
|
|
125568
|
+
total: n,
|
|
125569
|
+
items: rows
|
|
125570
|
+
});
|
|
125571
|
+
if (await emitCliJsonOrSnapshot(opts, {
|
|
125572
|
+
section: "open-account-google-industries",
|
|
125573
|
+
commandLabel: "open-account google-industries",
|
|
125574
|
+
payload
|
|
125575
|
+
})) {
|
|
125576
|
+
return;
|
|
125577
|
+
}
|
|
125578
|
+
console.log(
|
|
125579
|
+
`
|
|
125580
|
+
Google \u5F00\u6237\u884C\u4E1A\uFF08\u7B2C 1 \u9875\uFF0C\u672C\u9875 ${rows.length} \u6761\uFF0C\u5171 ${rows.length} \u6761\uFF1B--industry1/--industry2 \u4F20\u4E2D\u6587\u6587\u6848\uFF09
|
|
125581
|
+
`
|
|
125582
|
+
);
|
|
125583
|
+
if (rows.length === 0) {
|
|
125584
|
+
console.log(" \u65E0\u6570\u636E\u3002\n");
|
|
125585
|
+
return;
|
|
125586
|
+
}
|
|
125587
|
+
const cols = [
|
|
125588
|
+
{ key: "industry1", header: "\u4E00\u7EA7\uFF08--industry1\uFF09" },
|
|
125589
|
+
{ key: "industry2", header: "\u4E8C\u7EA7\uFF08--industry2\uFF09" }
|
|
125590
|
+
];
|
|
125591
|
+
printCliTable(
|
|
125592
|
+
rows.map((r) => ({
|
|
125593
|
+
industry1: String(r.industry1 ?? ""),
|
|
125594
|
+
industry2: String(r.industry2 ?? "")
|
|
125595
|
+
})),
|
|
125596
|
+
cols
|
|
125597
|
+
);
|
|
125598
|
+
console.log();
|
|
125599
|
+
}
|
|
125444
125600
|
|
|
125445
125601
|
// src/commands/open-account/tiktok.ts
|
|
125446
125602
|
init_auth();
|
|
@@ -125981,18 +126137,40 @@ function register25(program2) {
|
|
|
125981
126137
|
});
|
|
125982
126138
|
}
|
|
125983
126139
|
);
|
|
126140
|
+
openAccountCmd.command("google-industries").description(
|
|
126141
|
+
"\u5217\u51FA Google \u5F00\u6237\u884C\u4E1A\uFF08\u4E0E\u7F51\u9875\u884C\u4E1A\u7EA7\u8054\u540C\u6E90\uFF1B--industry1/--industry2 \u4F20\u4E2D\u6587\u6587\u6848\uFF0C\u52FF\u7528\u6570\u5B57 ID\uFF09"
|
|
126142
|
+
).option("-k, --keyword <text>", "\u6309\u4E00\u7EA7/\u4E8C\u7EA7\u884C\u4E1A\u6587\u6848\u8FC7\u6EE4").option(
|
|
126143
|
+
"--json-out <path>",
|
|
126144
|
+
"\u843D\u76D8\uFF08\u76EE\u5F55\u6216 *.json \u6587\u4EF6\u8DEF\u5F84\uFF09\u5E76\u66F4\u65B0 cli-manifest[-<\u67E5\u8BE2id>].json\uFF1B\u76EE\u5F55\u6A21\u5F0F\u6587\u4EF6\u540D\u4E3A `<section>[-<\u67E5\u8BE2id>].json`\uFF1Bstdout \u4E00\u884C\u6458\u8981 JSON\uFF0C\u542B outlineFile\uFF08TS \u5F0F\u7C7B\u578B\u5728 `*.outline.txt`\uFF09",
|
|
126145
|
+
void 0
|
|
126146
|
+
).option("-t, --token <token>", "Auth Token").option("--verbose", "\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(
|
|
126147
|
+
async (opts) => {
|
|
126148
|
+
await runOpenAccountGoogleIndustries({
|
|
126149
|
+
token: opts.token,
|
|
126150
|
+
keyword: opts.keyword,
|
|
126151
|
+
jsonOut: opts.jsonOut,
|
|
126152
|
+
verbose: opts.verbose
|
|
126153
|
+
});
|
|
126154
|
+
}
|
|
126155
|
+
);
|
|
125984
126156
|
openAccountCmd.command("google-wizard").description("\u4EA4\u4E92\u5F0F Google \u5F00\u6237\uFF08\u5BF9\u9F50\u7F51\u9875\u4E94\u6B65\u8BF4\u660E + \u4E24\u6B65\u8868\u5355\uFF1B\u9700\u7EC8\u7AEF TTY\uFF09").option("-t, --token <token>", "Auth Token").option("--verbose", "\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
|
|
125985
126157
|
await runOpenAccountGoogleWizard({ token: opts.token, verbose: opts.verbose });
|
|
125986
126158
|
});
|
|
125987
126159
|
openAccountCmd.command("google").description(
|
|
125988
126160
|
"\u63D0\u4EA4 Google \u5F00\u6237\u7533\u8BF7\uFF08\u4E0E\u7F51\u9875\u8868\u5355\u4E00\u81F4\uFF1A\u6309\u516C\u53F8\u540D\u79F0\u81EA\u52A8\u521B\u5EFA/\u5173\u8054\u5E7F\u544A\u4E3B\u7EC4\uFF0C\u65E0\u9700 magKey\uFF09"
|
|
125989
|
-
).option("--advertiser-id <magKey>", "\u53EF\u9009\uFF1A\u624B\u52A8\u6307\u5B9A\u5E7F\u544A\u4E3B\u7EC4 ID\uFF08\u4E00\u822C\u4E0D\u7528\uFF1B\u8C03\u8BD5\u7528\u6216\u7279\u6B8A\u573A\u666F\uFF09").requiredOption("--account-name <name>", "\u5E7F\u544A\u8D26\u6237\u540D\u79F0\uFF08\u5EFA\u8BAE 22 \u4E2A\u5B57\u7B26\u4EE5\u5185\uFF09").requiredOption("--currency <code>", "\u8D27\u5E01\uFF1AUSD | CNY").
|
|
126161
|
+
).option("--advertiser-id <magKey>", "\u53EF\u9009\uFF1A\u624B\u52A8\u6307\u5B9A\u5E7F\u544A\u4E3B\u7EC4 ID\uFF08\u4E00\u822C\u4E0D\u7528\uFF1B\u8C03\u8BD5\u7528\u6216\u7279\u6B8A\u573A\u666F\uFF09").requiredOption("--account-name <name>", "\u5E7F\u544A\u8D26\u6237\u540D\u79F0\uFF08\u5EFA\u8BAE 22 \u4E2A\u5B57\u7B26\u4EE5\u5185\uFF09").requiredOption("--currency <code>", "\u8D27\u5E01\uFF1AUSD | CNY").option(
|
|
125990
126162
|
"--timezone <tz>",
|
|
125991
|
-
"\u65F6\u533A
|
|
126163
|
+
"\u65F6\u533A Code\uFF08\u53EF\u5148\u67E5 google-timezones\uFF09\uFF1B\u7701\u7565\u5219\u6309\u5E01\u79CD\u9ED8\u8BA4\uFF1AUSD\u2192Asia/Hong_Kong\uFF0CCNY\u2192Asia/Shanghai"
|
|
125992
126164
|
).requiredOption("--invite-email <email>", "\u53D7\u9080\u7528\u6237\u90AE\u7BB1\uFF08\u8D26\u6237\u9080\u8BF7\u5C06\u53D1\u5230\u6B64\u90AE\u7BB1\uFF09").requiredOption("--company <name>", "\u516C\u53F8\u540D\u79F0\uFF08\u7528\u4E8E\u5339\u914D\u6216\u521B\u5EFA\u5E7F\u544A\u4E3B\u7EC4\uFF0C\u4E0E\u7F51\u9875\u7B2C\u4E00\u6B65\u4E00\u81F4\uFF09").requiredOption(
|
|
125993
126165
|
"--promotion-link <url>",
|
|
125994
126166
|
"\u63A8\u5E7F\u94FE\u63A5\uFF08\u516C\u53F8\u5B98\u7F51\u6216\u4EA7\u54C1\u9875\uFF1B\u53EF\u5199\u57DF\u540D\uFF0C\u4F1A\u81EA\u52A8\u8865 https://\uFF09"
|
|
125995
|
-
).requiredOption("--promotion-type <type>", "\u63A8\u5E7F\u7C7B\u578B\uFF1Ab2b | b2c | app").
|
|
126167
|
+
).requiredOption("--promotion-type <type>", "\u63A8\u5E7F\u7C7B\u578B\uFF1Ab2b | b2c | app").requiredOption(
|
|
126168
|
+
"--industry1 <name>",
|
|
126169
|
+
"\u4E00\u7EA7\u884C\u4E1A\u4E2D\u6587\u6587\u6848\uFF08\u4E0E google-industries \u4E00\u81F4\uFF0C\u52FF\u7528\u6570\u5B57 ID\uFF09"
|
|
126170
|
+
).requiredOption(
|
|
126171
|
+
"--industry2 <name>",
|
|
126172
|
+
"\u4E8C\u7EA7\u884C\u4E1A\u4E2D\u6587\u6587\u6848\uFF08\u4E0E google-industries \u4E00\u81F4\uFF0C\u52FF\u7528\u6570\u5B57 ID\uFF09"
|
|
126173
|
+
).option("--invite-role <role>", "\u53D7\u9080\u7528\u6237\u89D2\u8272\uFF1AStandard | Admin\uFF08\u9ED8\u8BA4 Standard\uFF09", "Standard").option("--auto-mailbox", "\u81EA\u52A8\u5206\u914D\u90AE\u7BB1", false).option("--counts <n>", "\u672C\u6B21\u5F00\u6237\u6570\u91CF\uFF081-3\uFF0C\u9ED8\u8BA4 1\uFF09", parseInt).option("-t, --token <token>", "Auth Token").option("--verbose", "\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(
|
|
125996
126174
|
async (opts) => {
|
|
125997
126175
|
await runOpenAccountGoogle({
|
|
125998
126176
|
token: opts.token,
|
|
@@ -126004,6 +126182,8 @@ function register25(program2) {
|
|
|
126004
126182
|
company: opts.company,
|
|
126005
126183
|
promotionLink: opts.promotionLink,
|
|
126006
126184
|
promotionType: opts.promotionType,
|
|
126185
|
+
industry1: opts.industry1,
|
|
126186
|
+
industry2: opts.industry2,
|
|
126007
126187
|
inviteRole: opts.inviteRole,
|
|
126008
126188
|
autoAllotMailbox: opts.autoMailbox,
|
|
126009
126189
|
counts: opts.counts,
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -43,6 +43,7 @@ siluzan-tso -h
|
|
|
43
43
|
- 多户余额用 `balance-scan`(P2),多户消耗用 `accounts-digest`(P3);禁止外层 for-loop 逐户拉数。
|
|
44
44
|
- `stats` 的 `spend` = **区间合计**,不是日消耗。
|
|
45
45
|
- 行业/市场报告禁止纯 WebSearch 当终稿;须 P9 `market-analysis collect`+`render`。
|
|
46
|
+
- **禁止编造平台网址**:给用户 `*.siluzan.com` / `mysiluzan.com` 链接前,**必须**当轮 `config show` 取 `webUrl`,路径**只**用已 Read 文档中的相对路径表拼接;CLI 输出的授权 URL **原样粘贴**;文档未给路径则**不拼链接**。细则见 `agent-conventions.md`。
|
|
46
47
|
|
|
47
48
|
---
|
|
48
49
|
|
package/dist/skill/_meta.json
CHANGED
|
@@ -139,7 +139,13 @@ siluzan-tso config show
|
|
|
139
139
|
|
|
140
140
|
### 引导用户的标准话术
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
当用户需要充值/查看钱包时:
|
|
143
|
+
|
|
144
|
+
1. **必须**先跑 `siluzan-tso config show`,用输出中的 `webUrl`(禁止猜生产/测试域名)。
|
|
145
|
+
2. 再按上表相对路径拼出**完整链接**贴给用户。
|
|
146
|
+
3. **禁止**编造未出现在上表的路径(如 `/recharge`、`/wallet` 等「看起来像」的地址)。
|
|
147
|
+
|
|
148
|
+
用户已指定媒体时,只给对应媒体的单笔充值链接(按需补批量/月结);未指定媒体时,先询问媒体,或列出全部支持媒体的单笔充值链接 + 丝路赞钱包链接,并附 Yandex/Kwai 的说明。
|
|
143
149
|
|
|
144
150
|
---
|
|
145
151
|
|
|
@@ -62,9 +62,11 @@ CLI 参数仅供 Agent **内部**组命令使用(见下表第三列)。用
|
|
|
62
62
|
| 公司名称 | 用于匹配/创建广告主组 | `--company` |
|
|
63
63
|
| 推广链接 | 可只写域名,提交时会自动补 `https://` | `--promotion-link` |
|
|
64
64
|
| 推广类型 | `b2b`(企业对企业)/ `b2c`(企业对消费者)/ `app`(应用) | `--promotion-type` |
|
|
65
|
+
| 一级行业 | **中文文案**(与网页级联一致);不确定先查行业列表 | `--industry1` |
|
|
66
|
+
| 二级行业 | **中文文案**;勿用数字 ID | `--industry2` |
|
|
65
67
|
| 账户名称 | 广告账户显示名,建议 ≤22 字 | `--account-name` |
|
|
66
68
|
| 币种 | `USD`(美元)或 `CNY`(人民币) | `--currency` |
|
|
67
|
-
| 时区 |
|
|
69
|
+
| 时区 | 时区 Code;可省略(USD→香港、CNY→上海);其它先查列表 | `--timezone`(可选) |
|
|
68
70
|
| 邀请邮箱 | 开通后接收账户邀请的邮箱 | `--invite-email` |
|
|
69
71
|
|
|
70
72
|
### TikTok(`open-account tiktok`,需营业执照图片)
|
|
@@ -154,10 +156,15 @@ CLI 参数仅供 Agent **内部**组命令使用(见下表第三列)。用
|
|
|
154
156
|
| `Europe/London` | 伦敦 |
|
|
155
157
|
|
|
156
158
|
```bash
|
|
159
|
+
# 行业文案不确定时先查(传中文,勿用数字 ID)
|
|
160
|
+
siluzan-tso open-account google-industries --keyword 电商
|
|
161
|
+
|
|
157
162
|
siluzan-tso open-account google \
|
|
158
163
|
--company "Brand A Inc." \
|
|
159
164
|
--promotion-link "https://www.brand-a.com" \
|
|
160
165
|
--promotion-type b2c \
|
|
166
|
+
--industry1 "电子商务" \
|
|
167
|
+
--industry2 "综合电商" \
|
|
161
168
|
--account-name "品牌A美国推广账户" \
|
|
162
169
|
--currency USD \
|
|
163
170
|
--timezone "America/New_York" \
|
|
@@ -22,15 +22,17 @@
|
|
|
22
22
|
| 公司名称 | 用于匹配/创建广告主组 | `--company` |
|
|
23
23
|
| 推广网址 | 可只写域名,提交时会自动补协议 | `--promotion-link` |
|
|
24
24
|
| 推广类型 | 企业对企业(b2b)/ 企业对消费者(b2c)/ 应用(app) | `--promotion-type`:`b2b` \| `b2c` \| `app` |
|
|
25
|
-
|
|
|
25
|
+
| 一级 / 二级行业 | **必填**;须为平台行业列表中的中文文案(与网页级联一致) | `--industry1` / `--industry2`;列表:`google-industries` |
|
|
26
26
|
| 账户名称 | 广告账户显示名 | `--account-name` |
|
|
27
27
|
| 币种 | CNY 或 USD | `--currency` |
|
|
28
|
-
| 时区 |
|
|
28
|
+
| 时区 | 时区 Code;可省略走币种默认;勿用展示名 | `--timezone`(可选);列表:`google-timezones` |
|
|
29
29
|
| 开户数量 | 1~3 | `--counts` |
|
|
30
30
|
| 邀请邮箱 | 开通后接收账户邀请的邮箱 | `--invite-email` |
|
|
31
31
|
|
|
32
32
|
**币种默认时区**:CNY → `Asia/Shanghai`;USD(或其它非 CNY)→ `Asia/Hong_Kong`。其它时区从 `google-timezones` 取 **Code** 列。
|
|
33
33
|
|
|
34
|
+
**行业写入(与网页一致,缺则后台详情不齐)**:MAG `industry.level1/level2` + 账户 `customer_info.industry` = `level1-level2`。
|
|
35
|
+
|
|
34
36
|
提交时按公司名称自动查找/创建广告主组并拿 `magKey`,**无需**让用户填 magKey。
|
|
35
37
|
|
|
36
38
|
---
|
|
@@ -40,10 +42,13 @@
|
|
|
40
42
|
### 非交互(Agent / 脚本首选)
|
|
41
43
|
|
|
42
44
|
```bash
|
|
45
|
+
siluzan-tso open-account google-industries --keyword 电商
|
|
43
46
|
siluzan-tso open-account google \
|
|
44
47
|
--company "某某公司" \
|
|
45
48
|
--promotion-link "https://www.example.com" \
|
|
46
49
|
--promotion-type b2c \
|
|
50
|
+
--industry1 "电子商务" \
|
|
51
|
+
--industry2 "综合电商" \
|
|
47
52
|
--account-name "某某公司-美国投放" \
|
|
48
53
|
--currency USD \
|
|
49
54
|
--timezone "America/New_York" \
|
|
@@ -51,7 +56,7 @@ siluzan-tso open-account google \
|
|
|
51
56
|
--counts 1
|
|
52
57
|
```
|
|
53
58
|
|
|
54
|
-
常用时区:`Asia/Shanghai`、`Asia/Hong_Kong`、`America/New_York`、`America/Los_Angeles`、`Europe/London`。完整列表:`open-account google-timezones [--keyword <关键词>]
|
|
59
|
+
常用时区:`Asia/Shanghai`、`Asia/Hong_Kong`、`America/New_York`、`America/Los_Angeles`、`Europe/London`。完整列表:`open-account google-timezones [--keyword <关键词>]`。行业列表:`open-account google-industries`。
|
|
55
60
|
|
|
56
61
|
### 交互向导(需真实 TTY;Agent 不可用)
|
|
57
62
|
|
|
@@ -186,7 +186,7 @@ siluzan-tso report push receive-emails -m Google [--json-out ./snap]
|
|
|
186
186
|
|
|
187
187
|
### 查看报告(引导打开网页)
|
|
188
188
|
|
|
189
|
-
报告生成后,在网页查看。先用 `siluzan-tso config show` 获取 `webUrl
|
|
189
|
+
报告生成后,在网页查看。先用 `siluzan-tso config show` 获取 `webUrl`,再按以下规则拼接链接(**禁止**凭记忆编造查看地址;`entityId` 须来自当次 `report list`):
|
|
190
190
|
|
|
191
191
|
| 媒体 | 报告类型 | URL 模板 |
|
|
192
192
|
| ------ | ---------------- | ----------------------------------------------------------- |
|
|
@@ -133,6 +133,12 @@
|
|
|
133
133
|
- **不猜测账户 ID**:`entityId`(UUID,仅 delink/share/reauth/账单)≠ `mediaCustomerId`(`stats`/`balance`/`accounts-digest`/`ad` 的 `-a`)。两者均来自 `list-accounts` 的 `ma.*`。用户已给出媒体账户号时(Google 数字 CID、**Yandex `porg-…`**、Meta `act_…` 等)→ `-a` **原样使用**,再用 `-k` 核验;**禁止**改成 `entityId` / tokenId / 会话里其它 UUID。**禁止**把 `entityId` 传给 `stats -a` / `balance -a` / `accounts-digest -a`。
|
|
134
134
|
- **媒体类型区分大小写**:`Google`、`TikTok`、`Yandex`、`MetaAd`、`BingV2`、`Kwai`。
|
|
135
135
|
- **CLI 输出忠实**:数值与 ID 须与本次落盘 JSON / stdout 一致,不编造示例 ID;`data` 为空时只说「当前返回无记录」并附 JSON 路径。
|
|
136
|
+
- **禁止编造平台网页地址**(充值/钱包/开户进度/授权/报告查看等):
|
|
137
|
+
1. **禁止**凭记忆、训练数据或「看起来像」写出任何完整 `https://…siluzan.com…` / `mysiluzan.com` 链接(含改域名、改路径、补 query)。
|
|
138
|
+
2. 引导用户打开丝路赞网页时:**必须**当轮执行 `siluzan-tso config show`,用输出中的 **`webUrl`** 作基地址;相对路径**只**能来自当次已 Read 的 reference(如 `finance.md`、`reporting.md`、`setup.md`)中的路径表;拼出后完整链接贴给用户。
|
|
139
|
+
3. CLI stdout / 工具返回的 OAuth、授权、注册等 URL:**原样整段粘贴**,禁止改写、截断后补全、或「根据印象」重写。
|
|
140
|
+
4. 当次文档**没有**对应相对路径 → **禁止拼接**;用业务语言说明须在网页端完成,或请用户到平台自行找入口 / 联系客服(如 Yandex/Kwai 无充值页)。
|
|
141
|
+
5. **`apiBaseUrl` / `googleApiUrl` 禁止**当作浏览器访问地址发给用户;用户官网/落地页仅使用用户提供或当次 CLI/WebFetch 得到的真实 URL,禁止臆造客户站点。
|
|
136
142
|
- **破坏性操作必须确认 + `--commit`**:账户解绑/关闭/取消分享、BC/MCC 解绑、删除预警/报告/广告/关键词、发票申请、广告发布等。
|
|
137
143
|
- **CLI 硬门控**:`account delink` / `unshare` / `reauth` / `mcc-unbind` / `bc-unbind` **缺少 `--i-confirm` 会直接失败**(不会发网关)。`--commit` 只是审计说明,**不能替代**用户确认。
|
|
138
144
|
- **Agent**:先说明风险与将执行的命令 → **等待用户明确同意** → 才附加 `--i-confirm --commit "…"` 执行。用户说「别问我 / 直接做」也**不得**跳过确认;**禁止**未获同意就自行加 `--i-confirm`。
|
|
@@ -258,7 +264,7 @@
|
|
|
258
264
|
## 十一、常见 HTTP 状态码
|
|
259
265
|
|
|
260
266
|
- **400**:参数错误,查看对应 reference 或 `-h`
|
|
261
|
-
- **401 / OAuth 失效**:仅当 `list-accounts` 的 `invalidOAuthToken=true`(或表格「授权状态」为失效)且用户确认后——Siluzan Agent **优先**用平台重新授权工具(如 `present_reauth`);备选 `account reauth -m <媒体> --id <entityId> --i-confirm --commit "…"`(内置 delink→OAuth,见 W9 / `accounts-permissions.md`)。走 CLI
|
|
267
|
+
- **401 / OAuth 失效**:仅当 `list-accounts` 的 `invalidOAuthToken=true`(或表格「授权状态」为失效)且用户确认后——Siluzan Agent **优先**用平台重新授权工具(如 `present_reauth`);备选 `account reauth -m <媒体> --id <entityId> --i-confirm --commit "…"`(内置 delink→OAuth,见 W9 / `accounts-permissions.md`)。走 CLI 时**必须把 stdout 中的完整授权 URL 原样贴给用户**,禁止只说「链接已生成」,也**禁止**自行改写/补全该 URL。解绑后若列表已无该户,恢复用平台授权工具或 `account auth -m <媒体>`。**丝路赞登录凭据失效** → `send-login-code` + `login --phone --code`,见 `references/core/setup.md`
|
|
262
268
|
- **403(拉数空结果)**:`stats`/`balance`/`accounts-digest` 在 `--verbose` 下打出异常被吞的 `HTTP 403` 且无数据时:① **优先核验 `-a` 是否为 `ma.mediaCustomerId`**(勿传 `entityId`/UUID;Yandex 形如 `porg-…`);② Google 再看套餐是否激活(`scopeActivatedSources`),未激活则说明需先激活,**禁止**非 CLI 绕过取数;③ **禁止**在 `invalidOAuthToken=false` 时把 403 当成 OAuth 过期并自行 `reauth`。
|
|
263
269
|
- **500**:服务可能正在部署/升级,建议反馈 Siluzan 相关人员
|
|
264
270
|
|
|
@@ -302,7 +308,7 @@
|
|
|
302
308
|
1. **共情/确认**:一句话接住意图。
|
|
303
309
|
2. **结论先行**:可操作判断(正常 / 有问题 / 原因),勿让用户从表格里猜。
|
|
304
310
|
3. **数据支撑**:引用**当次 CLI/脚本**真实数字;禁止编造、禁止示例 ID。
|
|
305
|
-
4. **行动建议**:1~3
|
|
311
|
+
4. **行动建议**:1~3 条,点名对象并引用数据;若建议含「打开网页 / 去充值 / 去授权」,链接须遵守 §四「禁止编造平台网页地址」,**禁止**随口给一个未经验证的 URL。
|
|
306
312
|
5. **下一步**:一句邀请。客户端 suggestion chips 另展示;**不要**在 skill 各任务文档维护 chips 全文清单。
|
|
307
313
|
|
|
308
314
|
长任务(>30s):中间用进度短句,勿长时间沉默后突然扔大表。
|
|
@@ -139,6 +139,7 @@ siluzan-tso config show
|
|
|
139
139
|
## 使用 webUrl 进行网页操作
|
|
140
140
|
|
|
141
141
|
- 涉及充值、账户激活、首页看板等**必须在网页完成**的操作时,应先通过 `siluzan-tso config show` 获取 `webUrl` 值,再按各业务文档提供的相对路径拼接完整链接,引导用户在浏览器中完成后续步骤。
|
|
142
|
+
- **硬约束**:`webUrl` **必须**来自当轮 `config show` 输出;路径**必须**来自已 Read 的业务文档路径表。**禁止**凭记忆写出完整平台 URL,**禁止**把 `apiBaseUrl` / `googleApiUrl` 当作浏览器地址发给用户。文档未给出相对路径时不要拼接。详见 `agent-conventions.md` §四。
|
|
142
143
|
|
|
143
144
|
## 更新
|
|
144
145
|
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
- **触发**:充值、钱包、账户间转账、转账记录、开票、发票抬头。
|
|
151
151
|
- **必读**:`references/accounts/finance.md`。
|
|
152
152
|
- **步骤**:
|
|
153
|
-
1. 充值/钱包:CLI
|
|
153
|
+
1. 充值/钱包:CLI 不支持;**当轮** `config show` 取 `webUrl`,仅按 `finance.md` 路径表拼接后贴完整链接(**禁止**凭记忆编 URL;Yandex/Kwai 无充值页,引导联系客服)。
|
|
154
154
|
2. 转账:记录 `transfer list -m <媒体>`;同媒体账户间 `transfer create -m <媒体> --out <id> --in <id> --amount <n>`(写操作先确认)。
|
|
155
155
|
3. 开票:`invoice billable -m <媒体> -c <币种> --json-out ./snap` 取订单 `entityId` → 选发票抬头(`invoice-info list`,查重后再 `create`)→ `invoice apply --bill-ids … --invoice-type <PI|VATI|VATSI> …`。CNY 订单仅增值税票、外币仅 PI。
|
|
156
156
|
- **产物**:开票分步引导(先选订单、再选抬头、最后申请);**禁止**不展示 `invoice billable` 就让用户手写 id;保留 CLI 币种校验。
|
|
@@ -9,7 +9,7 @@ $ErrorActionPreference = 'Stop'
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
$PKG_NAME = 'siluzan-tso-cli'
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
$PKG_VERSION = '1.1.42-beta.
|
|
12
|
+
$PKG_VERSION = '1.1.42-beta.5'
|
|
13
13
|
$CLI_BIN = 'siluzan-tso'
|
|
14
14
|
$SKILL_LABEL = 'Siluzan TSO'
|
|
15
15
|
$INSTALL_CMD = 'npm install -g siluzan-tso-cli@beta'
|
|
@@ -9,7 +9,7 @@ set -euo pipefail
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
readonly PKG_NAME="siluzan-tso-cli"
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
readonly PKG_VERSION="1.1.42-beta.
|
|
12
|
+
readonly PKG_VERSION="1.1.42-beta.5"
|
|
13
13
|
readonly CLI_BIN="siluzan-tso"
|
|
14
14
|
readonly SKILL_LABEL="Siluzan TSO"
|
|
15
15
|
readonly INSTALL_CMD="npm install -g siluzan-tso-cli@beta"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"turns": [
|
|
5
5
|
"我们公司要在丝路赞新开一个 Google 美国户,推广 B2C,网址 https://example.com,币种 USD。你告诉我 CLI 要怎么一步步做,我复制粘贴执行。"
|
|
6
6
|
],
|
|
7
|
-
"judgeExpectation": "路径:用户要新开 Google
|
|
7
|
+
"judgeExpectation": "路径:用户要新开 Google 广告户时,应说明需资料(公司、网址、行业一级/二级、币种等);提交用非交互式 `open-account google ...`(含 industry;Agent 环境不可用交互式 google-wizard);后续用 `account-history`、`list-accounts` 跟踪。\n输出:明确 wizard 限制;不要求真实提交开户。",
|
|
8
8
|
"skillMapping": "references/core/workflows.md 流程一;accounts/open-account-by-media.md",
|
|
9
9
|
"judgeReferencePaths": [
|
|
10
10
|
"references/core/workflows.md"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"turns": [
|
|
5
5
|
"我想开一个 Google 广告账户,公司名是「深圳星辰科技有限公司」,推广网站是 https://www.starlighttech.com ,做 B2C 电商,币种选美元。告诉我 CLI 怎么一步步提交,我复制执行。"
|
|
6
6
|
],
|
|
7
|
-
"judgeExpectation": "路径:应给出非交互 `open-account google ...`,说明 invite-email、
|
|
7
|
+
"judgeExpectation": "路径:应给出非交互 `open-account google ...`,说明 invite-email、company、行业一级/二级等必填,时区可按币种默认;Agent 环境不可用 google-wizard;币种 USD、promotion-type b2c 与文档一致。\n输出:步骤可复制;不要求真实提交。",
|
|
8
8
|
"skillMapping": "references/core/workflows.md;accounts/open-account-by-media.md",
|
|
9
9
|
"judgeReferencePaths": [
|
|
10
10
|
"references/core/workflows.md",
|