siluzan-tso-cli 1.1.30-beta.7 → 1.1.30-beta.8

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 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.30-beta.7),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
54
+ > **注意**:当前为测试版(1.1.30-beta.8),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
55
 
56
56
  | 助手 | 建议 `--ai` |
57
57
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -105988,6 +105988,7 @@ init_auth();
105988
105988
  init_cli_json_snapshot();
105989
105989
  init_cli_table();
105990
105990
  init_balance();
105991
+ init_media_account_lookup();
105991
105992
  var VALID_MEDIA_TYPES3 = ["Google", "TikTok", "Yandex", "MetaAd", "BingV2", "Kwai"];
105992
105993
  function defaultDateRange2() {
105993
105994
  const end = /* @__PURE__ */ new Date();
@@ -106025,15 +106026,12 @@ async function runStats(opts) {
106025
106026
  }
106026
106027
  const ids = opts.accounts.split(",").map((id) => id.trim()).filter(Boolean);
106027
106028
  const isGoogle = opts.media === "Google";
106028
- const params = isGoogle ? new URLSearchParams({ startDate, endDate, mediaCustomerIds: ids.join("|") }) : (() => {
106029
- const p = new URLSearchParams({ startDate, endDate, period: "true" });
106030
- p.set("mediaCustomerIds", ids.join(","));
106031
- return p;
106032
- })();
106033
- const url = isGoogle ? `${config.apiBaseUrl}/report/media-account/google/account-spend-overview?${params.toString()}` : `${config.apiBaseUrl}/report/media-account/${opts.media}/accountsoverview?${params.toString()}`;
106029
+ const isMetaAd = opts.media === "MetaAd";
106034
106030
  let items;
106035
106031
  try {
106036
106032
  if (isGoogle) {
106033
+ const params = new URLSearchParams({ startDate, endDate, mediaCustomerIds: ids.join("|") });
106034
+ const url = `${config.apiBaseUrl}/report/media-account/google/account-spend-overview?${params.toString()}`;
106037
106035
  const raw = await apiFetch2(url, config, {}, opts.verbose);
106038
106036
  items = parseGoogleAccountSpendOverviewRows(raw).map((row) => ({
106039
106037
  mediaAccountId: row.mediaAccountId,
@@ -106047,7 +106045,30 @@ async function runStats(opts) {
106047
106045
  remainingAccountBudget: row.remainingAccountBudget,
106048
106046
  status: row.status
106049
106047
  }));
106048
+ } else if (isMetaAd) {
106049
+ const accountMediaTypes = await lookupMetaMediaAccountTypes(config, ids, opts.verbose);
106050
+ items = [];
106051
+ for (const [route, routeIds] of groupAccountIdsByOverviewRoute(
106052
+ "MetaAd",
106053
+ ids,
106054
+ accountMediaTypes
106055
+ )) {
106056
+ const map = await fetchOverviewMap(
106057
+ route,
106058
+ routeIds,
106059
+ config,
106060
+ startDate,
106061
+ endDate,
106062
+ opts.verbose
106063
+ );
106064
+ for (const item of map.values()) {
106065
+ items.push(item);
106066
+ }
106067
+ }
106050
106068
  } else {
106069
+ const params = new URLSearchParams({ startDate, endDate, period: "true" });
106070
+ params.set("mediaCustomerIds", ids.join(","));
106071
+ const url = `${config.apiBaseUrl}/report/media-account/${opts.media}/accountsoverview?${params.toString()}`;
106051
106072
  const raw = await apiFetch2(url, config, {}, opts.verbose);
106052
106073
  items = Array.isArray(raw) ? raw : raw.items ?? [];
106053
106074
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.30-beta.7",
4
- "publishedAt": 1782384217103
3
+ "version": "1.1.30-beta.8",
4
+ "publishedAt": 1782442092875
5
5
  }
@@ -31,6 +31,10 @@ siluzan-tso list-accounts [选项]
31
31
  | 列出全部某媒体账户 | `list-accounts -m <媒体> --page-size 999 --json-out <dir>` | `items[]`(`ma.mediaCustomerId`、`ma.mediaCustomerName`、`ma.currencyCode`、`ma.mediaAccountState` 等) |
32
32
  | 有多少个账户 | 同上 | **`total`**(无需翻页;`itemCount < total` 时说明 page-size 不够大) |
33
33
  | 只查某一个户 | `list-accounts -m <媒体> -k <id或名称> --json-out <dir>` | 无需大 page-size |
34
+ | **Meta 全部账户 + 余额/消耗** | **`accounts-digest -m MetaAd --json-out <dir>`**(一步;内部翻页+分批) | `accounts-digest-metaad.json` → `data.items[]`(含 `balance`、`spend`) |
35
+ | Meta 余额续航预警 | `balance-scan -m MetaAd --json-out <dir>` | `balance-scan-metaad.json` |
36
+
37
+ > **MetaAd ID 格式**:OAuth 授权户(`list-accounts` 里 `mediaAccountType=FacebookAds`)的 `mediaCustomerId` **须带 `act_` 前缀**(与列表返回值一致)。**禁止**把 70+ 个 ID 拼成一条 `balance -a …`;全量用 `accounts-digest`。
34
38
 
35
39
  仅当读盘后 `total > itemCount` 且已用 `--page-size 999` 时,再 `--page 2` 等同参数补拉;**禁止**对 stdout 写翻页循环(stdout 摘要无 `total` / `items`,读盘协议见 `references/core/agent-conventions.md` §三)。列账户 / 数个数**不需要** `accounts-digest`、`balance-scan`。
36
40
 
@@ -116,7 +120,7 @@ siluzan-tso account-active-bills -m Google --id 18176820-6204-43c2-9a1f-0d0f5e9e
116
120
  siluzan-tso account-active-bills -m Google --id 18176820-6204-43c2-9a1f-0d0f5e9eb957 --json-out ./snap
117
121
  ```
118
122
 
119
- > **勿在文档或聊天中粘贴真实 JWT。** CI 环境基址为 `https://tso-api-ci.siluzan.com`,生产为 `https://tso-api.siluzan.com`(由 `config` / 构建环境决定)。
123
+ > **勿在文档或聊天中粘贴真实 JWT
120
124
 
121
125
  ---
122
126
 
@@ -14,7 +14,7 @@
14
14
  | `google-analysis --sections campaign-types`(`types-summary`) | **实时** | ✅ 可查当天 | 当天系列类型分布 |
15
15
  | `google-analysis` 其他维度(`campaigns` / `keywords` / `devices` / ...) | 实时(受 Google Ads API 同步延迟影响) | 可查当天,但当天可能尚未结算 | 周期分析、报告 |
16
16
  | `stats -m Google` / `balance-scan -m Google` / `accounts-digest -m Google` / `list-accounts -m Google` 合并消耗(TSO `account-spend-overview`,2026-05 起) | **后端自动分流**:窗口完全在历史 → `database` 模式(含余额/状态/币种/账户名 + 当期消耗);窗口含今天 → `googleCombined` 模式(仅实时消耗,无余额/状态/币种/账户名) | ✅ 可查当天(含今天时切实时聚合) | 历史回溯、巡检、余额续航估算;含今天时也能给出实时消耗 |
17
- | `stats` / `balance-scan` / `accounts-digest` / `list-accounts` 的 **TikTok / Yandex / BingV2 / Kwai** 合并消耗(TSO `accountsoverview`) | **每日同步昨天** | ❌ 查今天会全为 0 | 历史回溯、巡检、余额续航估算(口径为"截至昨天") |
17
+ | `stats` / `balance-scan` / `accounts-digest` / `list-accounts` 的 **TikTok / Yandex / BingV2 / Kwai / MetaAd** 合并消耗(TSO `accountsoverview`;MetaAd OAuth 户走 `FacebookAds` 段) | **每日同步昨天** | ❌ 查今天会全为 0 | 历史回溯、巡检、余额续航估算(口径为"截至昨天") |
18
18
  | `balance`(`GetMediaAccountInfo`) | 实时 | — | 仅当前余额,不反映消耗 |
19
19
 
20
20
  **选用规则**:
@@ -22,7 +22,7 @@
22
22
  - 「今天/当天/今日消耗」「实时消耗排行」 → 优先 `google-analysis(-batch) --sections overview`,`--start` / `--end` 都设为今天;
23
23
  - Google 单账户/批量取数也可直接 `stats -m Google` 把 `--end-date` 设为今天,后端会切到 `googleCombined` 模式给实时消耗(但**不会**返回余额/币种/账户名)。
24
24
  - 「最近 N 天消耗 / 周报 / 月报 / 余额续航」 → `stats` / `balance-scan` / `accounts-digest`,默认窗口截至昨天即可(Google 此时走 `database`,包含完整字段)。
25
- - **禁止**用 TikTok / Yandex / BingV2 / Kwai 的 `accountsoverview` 接口判断当天消耗(仍是每日同步)。
25
+ - **禁止**用 TikTok / Yandex / BingV2 / Kwai / MetaAd 的 `accountsoverview` 接口判断当天消耗(仍是每日同步)。
26
26
  - **禁止**给非 Google 媒体的当天高消耗场景加 `--min-spend`:其预筛选来自非实时 `accountsoverview`,会把今天有消耗的账号当成 0 给筛掉。Google 媒体当 `--end-date` 设为今天时,预筛选走的是 `googleCombined` 实时数据,可以使用 `--min-spend`。
27
27
 
28
28
  ---
@@ -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.30-beta.7'
12
+ $PKG_VERSION = '1.1.30-beta.8'
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.30-beta.7"
12
+ readonly PKG_VERSION="1.1.30-beta.8"
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"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-tso-cli",
3
- "version": "1.1.30-beta.7",
3
+ "version": "1.1.30-beta.8",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",