siluzan-tso-cli 1.1.40-beta.4 → 1.1.40-beta.6
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 +81 -73
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/accounts/accounts-balance-stats.md +1 -1
- package/dist/skill/references/accounts/accounts-list.md +1 -1
- package/dist/skill/references/analytics/account-analytics.md +3 -3
- package/dist/skill/scripts/install.ps1 +1 -1
- package/dist/skill/scripts/install.sh +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.40-beta.
|
|
54
|
+
> **注意**:当前为测试版(1.1.40-beta.6),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
55
55
|
|
|
56
56
|
| 助手 | 建议 `--ai` |
|
|
57
57
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -2296,16 +2296,13 @@ function buildSiluzanClientIdentityHeaders() {
|
|
|
2296
2296
|
const client = getSiluzanClientProduct();
|
|
2297
2297
|
const runtime = resolveSiluzanClientRuntime();
|
|
2298
2298
|
const version = getSiluzanSkillVersion();
|
|
2299
|
-
|
|
2299
|
+
return {
|
|
2300
2300
|
"X-Siluzan-Client": client,
|
|
2301
2301
|
"X-Siluzan-Runtime": runtime,
|
|
2302
2302
|
"X-Siluzan-Skill-Version": version,
|
|
2303
|
+
"X-Company-Source-Type": SILUZAN_AGENT_COMPANY_SOURCE_TYPE,
|
|
2303
2304
|
"User-Agent": `${client}/${version}`
|
|
2304
2305
|
};
|
|
2305
|
-
if (runtime === "siluzan_agent") {
|
|
2306
|
-
headers["X-Company-Source-Type"] = SILUZAN_AGENT_COMPANY_SOURCE_TYPE;
|
|
2307
|
-
}
|
|
2308
|
-
return headers;
|
|
2309
2306
|
}
|
|
2310
2307
|
function isPerfEnabled() {
|
|
2311
2308
|
const v = process.env.SILUZAN_HTTP_PERF;
|
|
@@ -2332,6 +2329,19 @@ function rawRequest(url, options) {
|
|
|
2332
2329
|
...buildSiluzanClientIdentityHeaders(),
|
|
2333
2330
|
...options.headers
|
|
2334
2331
|
};
|
|
2332
|
+
if (process.env.SILUZAN_DEBUG_HEADERS === "1" || process.env.SILUZAN_DEBUG_HEADERS === "true") {
|
|
2333
|
+
try {
|
|
2334
|
+
process.stderr.write(
|
|
2335
|
+
`[SILUZAN_DEBUG_HEADERS] ${method} ${url}
|
|
2336
|
+
X-Company-Source-Type=${headers["X-Company-Source-Type"] ?? "(missing)"}
|
|
2337
|
+
X-Siluzan-Runtime=${headers["X-Siluzan-Runtime"] ?? "(missing)"}
|
|
2338
|
+
X-Siluzan-Client=${headers["X-Siluzan-Client"] ?? "(missing)"}
|
|
2339
|
+
X-Siluzan-Skill-Version=${headers["X-Siluzan-Skill-Version"] ?? "(missing)"}
|
|
2340
|
+
`
|
|
2341
|
+
);
|
|
2342
|
+
} catch {
|
|
2343
|
+
}
|
|
2344
|
+
}
|
|
2335
2345
|
const reqOpts = {
|
|
2336
2346
|
hostname: parsed.hostname,
|
|
2337
2347
|
port: parsed.port || (isHttps ? 443 : 80),
|
|
@@ -4474,56 +4484,6 @@ var init_currency_display = __esm({
|
|
|
4474
4484
|
}
|
|
4475
4485
|
});
|
|
4476
4486
|
|
|
4477
|
-
// src/utils/media-customer-id.ts
|
|
4478
|
-
function stripMediaCustomerIdDecorators(raw) {
|
|
4479
|
-
return raw.trim().replace(/[\s-]+/g, "");
|
|
4480
|
-
}
|
|
4481
|
-
function looksLikeNumericMediaCustomerId(raw) {
|
|
4482
|
-
return /^\d+$/.test(stripMediaCustomerIdDecorators(raw));
|
|
4483
|
-
}
|
|
4484
|
-
function normalizeNumericMediaCustomerId(raw) {
|
|
4485
|
-
if (!looksLikeNumericMediaCustomerId(raw)) return null;
|
|
4486
|
-
return stripMediaCustomerIdDecorators(raw);
|
|
4487
|
-
}
|
|
4488
|
-
function looksLikeEntityIdUuid(raw) {
|
|
4489
|
-
return ENTITY_ID_UUID_RE.test(raw.trim());
|
|
4490
|
-
}
|
|
4491
|
-
function warnIfAccountIdsLookLikeEntityId(ids, command) {
|
|
4492
|
-
const bad = ids.map((id) => id.trim()).filter((id) => id && looksLikeEntityIdUuid(id));
|
|
4493
|
-
if (bad.length === 0) return;
|
|
4494
|
-
console.error(
|
|
4495
|
-
`
|
|
4496
|
-
\u26A0\uFE0F ${command} \u7684 -a/--accounts \u6536\u5230\u7591\u4F3C entityId/UUID\uFF1A${bad.join(", ")}
|
|
4497
|
-
\u672C\u547D\u4EE4\u9700\u8981 mediaCustomerId\uFF08list-accounts \u7684 ma.mediaCustomerId\uFF1BYandex \u5F62\u5982 porg-\u2026\uFF09\u3002
|
|
4498
|
-
\u8BF7\u5148 list-accounts -m <\u5A92\u4F53> -k <\u5A92\u4F53\u8D26\u6237\u53F7> \u6838\u5BF9\u540E\u518D\u91CD\u8BD5\uFF1B\u52FF\u636E\u6B64\u76F4\u63A5 reauth\u3002
|
|
4499
|
-
`
|
|
4500
|
-
);
|
|
4501
|
-
}
|
|
4502
|
-
function parseNumericMediaCustomerIds(input) {
|
|
4503
|
-
if (!input || !input.trim()) return [];
|
|
4504
|
-
const seen = /* @__PURE__ */ new Set();
|
|
4505
|
-
const out = [];
|
|
4506
|
-
for (const raw of input.split(",")) {
|
|
4507
|
-
const piece = raw.trim();
|
|
4508
|
-
if (!piece) continue;
|
|
4509
|
-
const id = normalizeNumericMediaCustomerId(piece);
|
|
4510
|
-
if (!id) {
|
|
4511
|
-
throw new Error(`mediaCustomerId \u5FC5\u987B\u4E3A\u7EAF\u6570\u5B57\uFF08\u53EF\u542B\u8FDE\u5B57\u7B26\uFF09\uFF1A${piece}`);
|
|
4512
|
-
}
|
|
4513
|
-
if (seen.has(id)) continue;
|
|
4514
|
-
seen.add(id);
|
|
4515
|
-
out.push(id);
|
|
4516
|
-
}
|
|
4517
|
-
return out;
|
|
4518
|
-
}
|
|
4519
|
-
var ENTITY_ID_UUID_RE;
|
|
4520
|
-
var init_media_customer_id = __esm({
|
|
4521
|
-
"src/utils/media-customer-id.ts"() {
|
|
4522
|
-
"use strict";
|
|
4523
|
-
ENTITY_ID_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
4524
|
-
}
|
|
4525
|
-
});
|
|
4526
|
-
|
|
4527
4487
|
// src/utils/balance.ts
|
|
4528
4488
|
function fmt(d) {
|
|
4529
4489
|
return d.toISOString().slice(0, 10);
|
|
@@ -4830,6 +4790,56 @@ var init_balance = __esm({
|
|
|
4830
4790
|
}
|
|
4831
4791
|
});
|
|
4832
4792
|
|
|
4793
|
+
// src/utils/media-customer-id.ts
|
|
4794
|
+
function stripMediaCustomerIdDecorators(raw) {
|
|
4795
|
+
return raw.trim().replace(/[\s-]+/g, "");
|
|
4796
|
+
}
|
|
4797
|
+
function looksLikeNumericMediaCustomerId(raw) {
|
|
4798
|
+
return /^\d+$/.test(stripMediaCustomerIdDecorators(raw));
|
|
4799
|
+
}
|
|
4800
|
+
function normalizeNumericMediaCustomerId(raw) {
|
|
4801
|
+
if (!looksLikeNumericMediaCustomerId(raw)) return null;
|
|
4802
|
+
return stripMediaCustomerIdDecorators(raw);
|
|
4803
|
+
}
|
|
4804
|
+
function looksLikeEntityIdUuid(raw) {
|
|
4805
|
+
return ENTITY_ID_UUID_RE.test(raw.trim());
|
|
4806
|
+
}
|
|
4807
|
+
function warnIfAccountIdsLookLikeEntityId(ids, command) {
|
|
4808
|
+
const bad = ids.map((id) => id.trim()).filter((id) => id && looksLikeEntityIdUuid(id));
|
|
4809
|
+
if (bad.length === 0) return;
|
|
4810
|
+
console.error(
|
|
4811
|
+
`
|
|
4812
|
+
\u26A0\uFE0F ${command} \u7684 -a/--accounts \u6536\u5230\u7591\u4F3C entityId/UUID\uFF1A${bad.join(", ")}
|
|
4813
|
+
\u672C\u547D\u4EE4\u9700\u8981 mediaCustomerId\uFF08list-accounts \u7684 ma.mediaCustomerId\uFF1BYandex \u5F62\u5982 porg-\u2026\uFF09\u3002
|
|
4814
|
+
\u8BF7\u5148 list-accounts -m <\u5A92\u4F53> -k <\u5A92\u4F53\u8D26\u6237\u53F7> \u6838\u5BF9\u540E\u518D\u91CD\u8BD5\uFF1B\u52FF\u636E\u6B64\u76F4\u63A5 reauth\u3002
|
|
4815
|
+
`
|
|
4816
|
+
);
|
|
4817
|
+
}
|
|
4818
|
+
function parseNumericMediaCustomerIds(input) {
|
|
4819
|
+
if (!input || !input.trim()) return [];
|
|
4820
|
+
const seen = /* @__PURE__ */ new Set();
|
|
4821
|
+
const out = [];
|
|
4822
|
+
for (const raw of input.split(",")) {
|
|
4823
|
+
const piece = raw.trim();
|
|
4824
|
+
if (!piece) continue;
|
|
4825
|
+
const id = normalizeNumericMediaCustomerId(piece);
|
|
4826
|
+
if (!id) {
|
|
4827
|
+
throw new Error(`mediaCustomerId \u5FC5\u987B\u4E3A\u7EAF\u6570\u5B57\uFF08\u53EF\u542B\u8FDE\u5B57\u7B26\uFF09\uFF1A${piece}`);
|
|
4828
|
+
}
|
|
4829
|
+
if (seen.has(id)) continue;
|
|
4830
|
+
seen.add(id);
|
|
4831
|
+
out.push(id);
|
|
4832
|
+
}
|
|
4833
|
+
return out;
|
|
4834
|
+
}
|
|
4835
|
+
var ENTITY_ID_UUID_RE;
|
|
4836
|
+
var init_media_customer_id = __esm({
|
|
4837
|
+
"src/utils/media-customer-id.ts"() {
|
|
4838
|
+
"use strict";
|
|
4839
|
+
ENTITY_ID_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
4840
|
+
}
|
|
4841
|
+
});
|
|
4842
|
+
|
|
4833
4843
|
// src/utils/media-account-batch.ts
|
|
4834
4844
|
function mediaAccountDataBatchSize(media) {
|
|
4835
4845
|
switch (media) {
|
|
@@ -5508,12 +5518,14 @@ function resolveDailyMetricsQueryTimes(startDate, endDate, now = /* @__PURE__ */
|
|
|
5508
5518
|
const endInstant = endOfDay.getTime() > now.getTime() ? formatChinaOffsetDateTime(now) : formatChinaOffsetDateTime(endOfDay);
|
|
5509
5519
|
return { startInstant, endInstant };
|
|
5510
5520
|
}
|
|
5511
|
-
|
|
5521
|
+
function resolveChinaQueryTimes(startDate, endDate, _now = /* @__PURE__ */ new Date()) {
|
|
5522
|
+
return { startInstant: startDate, endInstant: endDate };
|
|
5523
|
+
}
|
|
5524
|
+
var CHINA_OFFSET_MS;
|
|
5512
5525
|
var init_daily_metrics_range = __esm({
|
|
5513
5526
|
"src/commands/google-analysis/daily-metrics-range.ts"() {
|
|
5514
5527
|
"use strict";
|
|
5515
5528
|
CHINA_OFFSET_MS = 8 * 36e5;
|
|
5516
|
-
resolveChinaQueryTimes = resolveDailyMetricsQueryTimes;
|
|
5517
5529
|
}
|
|
5518
5530
|
});
|
|
5519
5531
|
|
|
@@ -6025,7 +6037,7 @@ var init_sections = __esm({
|
|
|
6025
6037
|
name: "daily-metrics",
|
|
6026
6038
|
description: "\u6309\u65E5\u6307\u6807\uFF08\u4E3B\u5E73\u53F0 /report/media-account/google/account-daily-reports\uFF0C\u542B\u641C\u7D22\u4EFD\u989D\u7B49\uFF09",
|
|
6027
6039
|
dateMode: "range",
|
|
6028
|
-
/** 仅用于 manifest endpointHint;实际请求走 fetchSectionPayload 专用分支(apiBaseUrl +
|
|
6040
|
+
/** 仅用于 manifest endpointHint;实际请求走 fetchSectionPayload 专用分支(apiBaseUrl + YYYY-MM-DD) */
|
|
6029
6041
|
path: () => "/report/media-account/google/account-daily-reports"
|
|
6030
6042
|
},
|
|
6031
6043
|
{
|
|
@@ -102120,7 +102132,7 @@ async function fetchSectionPayload(def, opts, config, id, http2) {
|
|
|
102120
102132
|
}
|
|
102121
102133
|
if (def.name === "daily-metrics") {
|
|
102122
102134
|
const { startDate, endDate } = resolveDateRange(opts.start, opts.end);
|
|
102123
|
-
const { startInstant, endInstant } =
|
|
102135
|
+
const { startInstant, endInstant } = resolveChinaQueryTimes(startDate, endDate);
|
|
102124
102136
|
const params = new URLSearchParams({
|
|
102125
102137
|
mediaCustomerIds: id,
|
|
102126
102138
|
startDate: startInstant,
|
|
@@ -104078,10 +104090,10 @@ function registerRunCommand() {
|
|
|
104078
104090
|
"\u7ED3\u679C\u843D\u76D8\u76EE\u5F55\uFF1B\u6BCF\u7EF4\u5EA6\u4E00\u4E2A <section>-<accountId>.json\uFF0C\u4E0E manifest-<accountId>.json \u540C\u7EA7"
|
|
104079
104091
|
).option("-t, --token <token>", "Auth Token").option(
|
|
104080
104092
|
"--start <date>",
|
|
104081
|
-
"\u5F00\u59CB\u65E5\u671F YYYY-MM-DD\
|
|
104093
|
+
"\u5F00\u59CB\u65E5\u671F YYYY-MM-DD\uFF08google-analysis \u53EA\u4F20\u5E74\u6708\u65E5\uFF1B\u7701\u7565=\u8FD1 7 \u5929\u622A\u81F3\u6628\u5929\uFF0C\u9ED8\u8BA4\u6309 UTC+8 \u65E5\u5386\uFF1B\u4E0E --end \u540C\u4F20\u6216\u540C\u7701\uFF09"
|
|
104082
104094
|
).option(
|
|
104083
104095
|
"--end <date>",
|
|
104084
|
-
"\u7ED3\u675F\u65E5\u671F YYYY-MM-DD\uFF08\
|
|
104096
|
+
"\u7ED3\u675F\u65E5\u671F YYYY-MM-DD\uFF08\u53EA\u4F20\u5E74\u6708\u65E5\uFF1B\u7701\u7565=\u6628\u5929\uFF09"
|
|
104085
104097
|
).option("--start-date <date>", "\u540C --start\uFF08\u6587\u6863/Playbook \u517C\u5BB9\u522B\u540D\uFF09").option("--end-date <date>", "\u540C --end\uFF08\u6587\u6863/Playbook \u517C\u5BB9\u522B\u540D\uFF09").option(
|
|
104086
104098
|
"--sections <list>",
|
|
104087
104099
|
"\u4EC5\u6267\u884C\u6307\u5B9A\u7EF4\u5EA6\uFF08\u9017\u53F7\u5206\u9694\uFF09\uFF0C\u5982 overview,keywords,ads\uFF1B\u7701\u7565=\u5168\u90E8 25 \u4E2A"
|
|
@@ -105703,6 +105715,12 @@ var VALID_MEDIA_TYPES = [
|
|
|
105703
105715
|
"BingV2",
|
|
105704
105716
|
"Kwai"
|
|
105705
105717
|
];
|
|
105718
|
+
function applyListAccountsSearchKeyword(params, keyword) {
|
|
105719
|
+
const kw = (keyword ?? "").trim();
|
|
105720
|
+
if (kw) {
|
|
105721
|
+
params.set("keyword", kw);
|
|
105722
|
+
}
|
|
105723
|
+
}
|
|
105706
105724
|
var PLATFORM_CONFIG = {
|
|
105707
105725
|
Google: {
|
|
105708
105726
|
path: "/query/media-account/",
|
|
@@ -106161,7 +106179,6 @@ function wrapListJson(params) {
|
|
|
106161
106179
|
}
|
|
106162
106180
|
|
|
106163
106181
|
// src/commands/list-accounts/main.ts
|
|
106164
|
-
init_media_customer_id();
|
|
106165
106182
|
async function runListAccounts(opts) {
|
|
106166
106183
|
let config = loadConfig(opts.token);
|
|
106167
106184
|
if (opts.refreshDp) {
|
|
@@ -106191,14 +106208,7 @@ async function runListAccounts(opts) {
|
|
|
106191
106208
|
if (platformCfg.responseType === "array" && opts.status && opts.status !== "all") {
|
|
106192
106209
|
params.set("status", opts.status);
|
|
106193
106210
|
}
|
|
106194
|
-
|
|
106195
|
-
const numericId = normalizeNumericMediaCustomerId(opts.keyword);
|
|
106196
|
-
if (numericId) {
|
|
106197
|
-
params.set(platformCfg.idSearchParam, numericId);
|
|
106198
|
-
} else {
|
|
106199
|
-
params.set("mediaCustomerName", opts.keyword.trim());
|
|
106200
|
-
}
|
|
106201
|
-
}
|
|
106211
|
+
applyListAccountsSearchKeyword(params, opts.keyword);
|
|
106202
106212
|
const url = `${config.apiBaseUrl}${platformCfg.path}?${params}`;
|
|
106203
106213
|
if (platformCfg.responseType === "array") {
|
|
106204
106214
|
try {
|
|
@@ -106232,9 +106242,7 @@ async function runListAccounts(opts) {
|
|
|
106232
106242
|
}
|
|
106233
106243
|
} else {
|
|
106234
106244
|
const params = new URLSearchParams();
|
|
106235
|
-
|
|
106236
|
-
params.set("keyword", normalizeNumericMediaCustomerId(opts.keyword) ?? opts.keyword.trim());
|
|
106237
|
-
}
|
|
106245
|
+
applyListAccountsSearchKeyword(params, opts.keyword);
|
|
106238
106246
|
if (opts.status && opts.status !== "all") params.set("status", opts.status);
|
|
106239
106247
|
params.set("pageNo", String(page));
|
|
106240
106248
|
params.set("pageSize", String(pageSize));
|
package/dist/skill/_meta.json
CHANGED
|
@@ -152,7 +152,7 @@ siluzan-tso accounts-digest -m Google --start 2026-07-20 --end 2026-07-20 \
|
|
|
152
152
|
## stats — 查询投放消耗数据
|
|
153
153
|
|
|
154
154
|
> **数据时效性**:
|
|
155
|
-
> - **Google**:走 `account-spend-overview`;`--start` / `--end` 日历日按 **UTC+8** 转为 `YYYY-MM-DDTHH:mm:ss+08:00` 再请求(起 00:00:00、止 23:59:59,含今天时 end
|
|
155
|
+
> - **Google**:走 `account-spend-overview`;`--start` / `--end` 日历日按 **UTC+8** 转为 `YYYY-MM-DDTHH:mm:ss+08:00` 再请求(起 00:00:00、止 23:59:59,含今天时 end 截到当前时刻)。与 `google-analysis`(只传年月日)口径不同。
|
|
156
156
|
> - 窗口完全在历史 → `database` 模式;窗口含今天 → `googleCombined` 模式(仅实时消耗,无余额/状态/币种/账户名)。
|
|
157
157
|
> - **TikTok / Yandex / BingV2 / Kwai**:走旧版 `accountsoverview`,每日凌晨同步昨天数据,**不能查今天**。判断这几家的「今天/当天/今日消耗」仍需走 `google-analysis(-batch) --sections overview`(仅 Google)。
|
|
158
158
|
> - 完整时效性表见 `references/analytics/account-analytics.md` 顶部。
|
|
@@ -17,7 +17,7 @@ siluzan-tso list-accounts [选项]
|
|
|
17
17
|
| 选项 | 说明 |
|
|
18
18
|
| ----------------------- | -------------------------------------------------------------------------------- | ---------------------- |
|
|
19
19
|
| `-m, --media <type>` | 媒体类型(留空查全部):`Google \| TikTok \| Yandex \| MetaAd \| BingV2 \| Kwai` |
|
|
20
|
-
| `-k, --keyword <text>` |
|
|
20
|
+
| `-k, --keyword <text>` | 统一模糊搜索:账户名称 **或** ID(含 Google CID 带横杠);透传 Sammamish `keyword` |
|
|
21
21
|
| `-s, --status <status>` | 账户状态:`normal \| invalid \| all`(默认 all) |
|
|
22
22
|
| `-p, --page <n>` | 页码(默认 1) |
|
|
23
23
|
| `--page-size <n>` | 每页数量(默认 20) |
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
|
|
24
24
|
| 命令 / 接口 | 时效性 | 能否查"今天" | 典型用途 |
|
|
25
25
|
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ------------------------------------------------------ |
|
|
26
|
-
| `google-analysis --sections overview`(Google 网关 `OverviewSectionData`) |
|
|
26
|
+
| `google-analysis --sections overview`(Google 网关 `OverviewSectionData`) | **实时**;请求起止为 **YYYY-MM-DD**(不附加时区) | ✅ 可查当天 | 当天/今日消耗、当天高消耗账号排行 |
|
|
27
27
|
| `google-analysis --sections campaign-types`(`types-summary`) | **实时** | ✅ 可查当天 | 当天系列类型分布 |
|
|
28
|
-
| `google-analysis` 其他 range 维度(`campaigns` / `keywords` / `devices` / `geographic` / `daily-metrics` / …) | 实时(受 Google Ads API
|
|
28
|
+
| `google-analysis` 其他 range 维度(`campaigns` / `keywords` / `devices` / `geographic` / `daily-metrics` / …) | 实时(受 Google Ads API 同步延迟影响);**一律 YYYY-MM-DD**(不附加时区;与 `stats` 的 UTC+8 不同) | 可查当天,但当天可能尚未结算 | 周期分析、报告 |
|
|
29
29
|
| `stats -m Google` / `balance-scan -m Google` / `accounts-digest -m Google` / `list-accounts -m Google` 合并消耗(TSO `account-spend-overview`,2026-05 起) | **后端自动分流**:窗口完全在历史 → `database`;含今天 → `googleCombined`。**`stats` 请求起止按 UTC+8 墙钟**(`…T00:00:00+08:00` ~ `…T23:59:59+08:00`) | ✅ 可查当天(含今天时切实时聚合) | 历史回溯、巡检、周报 KPI、余额续航估算 |
|
|
30
30
|
| `stats` / `balance-scan` / `accounts-digest` / `list-accounts` 的 **TikTok / Yandex / BingV2 / Kwai / MetaAd** 合并消耗(TSO `accountsoverview`;MetaAd OAuth 户走 `FacebookAds` 段) | **每日同步昨天** | ❌ 查今天会全为 0 | 历史回溯、巡检、余额续航估算(口径为"截至昨天") |
|
|
31
31
|
| `balance`(`GetMediaAccountInfo`) | 实时 | — | 仅当前余额,不反映消耗 |
|
|
@@ -102,7 +102,7 @@ siluzan-tso google-analysis -a <id> --exclude materials,gold-account --json-out
|
|
|
102
102
|
| `--json-out <dir>` | 必填;每维一个 `<section>-<accountId>.json` + `manifest-<accountId>.json` |
|
|
103
103
|
| `--sections <list>` | 仅执行指定维度(逗号分隔);省略=全部 25 个 |
|
|
104
104
|
| `--exclude <list>` | 排除指定维度;与 `--sections` 可叠加 |
|
|
105
|
-
| `--start` / `--end` | 统计区间(YYYY-MM-DD
|
|
105
|
+
| `--start` / `--end` | 统计区间(YYYY-MM-DD,**只传年月日**;默认区间按 UTC+8 日历)。与 `stats -m Google`(会加成 `+08:00`)不同;省略=近 7 天截至昨天;`final-urls`/`campaign-types` 自动忽略 |
|
|
106
106
|
| `--concurrency <n>` | 并发数,默认 5,上限 16 |
|
|
107
107
|
| `--limit <n>` | 透传给 `keywords`/`search-terms`(默认 **0**=不封顶;`orderByCost=true`) |
|
|
108
108
|
| `--level <lvl>` | 透传给 `extensions`(Account/Campaign/Ad Group) |
|
|
@@ -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.40-beta.
|
|
12
|
+
$PKG_VERSION = '1.1.40-beta.6'
|
|
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.40-beta.
|
|
12
|
+
readonly PKG_VERSION="1.1.40-beta.6"
|
|
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"
|