siluzan-tso-cli 1.1.29-beta.19 → 1.1.29-beta.21

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.29-beta.19),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
54
+ > **注意**:当前为测试版(1.1.29-beta.21),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
55
 
56
56
  | 助手 | 建议 `--ai` |
57
57
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -104421,7 +104421,15 @@ function stripListAccountsEnrichmentFields(item) {
104421
104421
  delete item.ma.platformStatus;
104422
104422
  delete item.ma.aritScore;
104423
104423
  const maExt = item.ma;
104424
- for (const key of ["spend", "impressions", "clicks", "conversions", "costPerClick"]) {
104424
+ for (const key of [
104425
+ "balance",
104426
+ "status",
104427
+ "spend",
104428
+ "impressions",
104429
+ "clicks",
104430
+ "conversions",
104431
+ "costPerClick"
104432
+ ]) {
104425
104433
  delete maExt[key];
104426
104434
  }
104427
104435
  }
@@ -104473,7 +104481,6 @@ var COL_SPEND_METRICS = [
104473
104481
  { key: "conversions", header: "\u8F6C\u5316\u6B21\u6570" },
104474
104482
  { key: "clicks", header: "\u70B9\u51FB\u6B21\u6570" },
104475
104483
  { key: "cpc", header: "\u70B9\u51FB\u5747\u4EF7" },
104476
- { key: "balance", header: "\u4F59\u989D" },
104477
104484
  { key: "authStatus", header: "\u6388\u6743\u72B6\u6001" },
104478
104485
  { key: "createdAt", header: "\u6388\u6743/\u5F00\u6237\u65F6\u95F4" },
104479
104486
  { key: "shared", header: "\u5206\u4EAB\u8D26\u6237" }
@@ -104488,7 +104495,6 @@ var COL_YANDEX = [
104488
104495
  { key: "conversions", header: "\u8F6C\u5316\u6B21\u6570" },
104489
104496
  { key: "clicks", header: "\u70B9\u51FB\u6B21\u6570" },
104490
104497
  { key: "cpc", header: "\u70B9\u51FB\u5747\u4EF7" },
104491
- { key: "balance", header: "\u4F59\u989D" },
104492
104498
  { key: "authStatus", header: "\u6388\u6743\u72B6\u6001" },
104493
104499
  { key: "createdAt", header: "\u6388\u6743/\u5F00\u6237\u65F6\u95F4" },
104494
104500
  { key: "shared", header: "\u5206\u4EAB\u8D26\u6237" }
@@ -104503,7 +104509,6 @@ var COL_TIKTOK = [
104503
104509
  { key: "conversions", header: "\u8F6C\u5316\u6B21\u6570" },
104504
104510
  { key: "clicks", header: "\u70B9\u51FB\u6B21\u6570" },
104505
104511
  { key: "cpc", header: "\u70B9\u51FB\u5747\u4EF7" },
104506
- { key: "balance", header: "\u4F59\u989D" },
104507
104512
  { key: "bc", header: "BC" },
104508
104513
  { key: "authStatus", header: "\u6388\u6743\u72B6\u6001" },
104509
104514
  { key: "auditStatus", header: "\u5BA1\u6838\u72B6\u6001" },
@@ -104520,7 +104525,6 @@ var COL_GOOGLE = [
104520
104525
  { key: "conversions", header: "\u8F6C\u5316" },
104521
104526
  { key: "clicks", header: "\u70B9\u51FB" },
104522
104527
  { key: "cpc", header: "\u70B9\u51FB\u5747\u4EF7" },
104523
- { key: "balance", header: "\u4F59\u989D" },
104524
104528
  { key: "arit", header: "Arit" },
104525
104529
  { key: "platformStatus", header: "\u8D26\u6237\u72B6\u6001" },
104526
104530
  { key: "authStatus", header: "\u6388\u6743\u72B6\u6001" },
@@ -104621,7 +104625,6 @@ function printSpendMetricsAccountTable(items, tableOpts) {
104621
104625
  const rows = items.map((item) => {
104622
104626
  const ma = item.ma;
104623
104627
  const authStatus = ma.invalidOAuthToken ? "\u26A0\uFE0F \u5931\u6548" : "\u2705 \u6B63\u5E38";
104624
- const balance = ma.remainingAccountBudget != null ? formatMoneyDisplay(ma.remainingAccountBudget, ma.currencyCode) : "-";
104625
104628
  const sharedCount = Array.isArray(ma.accountIds) ? String(Math.max(0, ma.accountIds.length - 1)) : "-";
104626
104629
  return {
104627
104630
  company: item.mag?.advertiserName ?? "-",
@@ -104633,7 +104636,6 @@ function printSpendMetricsAccountTable(items, tableOpts) {
104633
104636
  conversions: fmtNum(ma["conversions"], 0),
104634
104637
  clicks: fmtNum(ma["clicks"], 0),
104635
104638
  cpc: fmtNum(ma["costPerClick"]),
104636
- balance,
104637
104639
  authStatus,
104638
104640
  createdAt: fmtDate(ma.createdDateTime),
104639
104641
  shared: sharedCount
@@ -104645,7 +104647,6 @@ function printYandexTable(items, tableOpts) {
104645
104647
  const rows = items.map((item) => {
104646
104648
  const ma = item.ma;
104647
104649
  const authStatus = ma.invalidOAuthToken ? "\u26A0\uFE0F \u5931\u6548" : "\u2705 \u6B63\u5E38";
104648
- const balance = ma.remainingAccountBudget != null ? formatMoneyDisplay(ma.remainingAccountBudget, ma.currencyCode) : "-";
104649
104650
  const sharedCount = Array.isArray(ma.accountIds) ? String(Math.max(0, ma.accountIds.length - 1)) : "-";
104650
104651
  const pwd = ma.mediaPassword != null && String(ma.mediaPassword).trim() !== "" ? String(ma.mediaPassword) : "-";
104651
104652
  return {
@@ -104658,7 +104659,6 @@ function printYandexTable(items, tableOpts) {
104658
104659
  conversions: fmtNum(ma["conversions"], 0),
104659
104660
  clicks: fmtNum(ma["clicks"], 0),
104660
104661
  cpc: fmtNum(ma["costPerClick"]),
104661
- balance,
104662
104662
  authStatus,
104663
104663
  createdAt: fmtDate(ma.createdDateTime),
104664
104664
  shared: sharedCount
@@ -104670,7 +104670,6 @@ function printTikTokTable(items, tableOpts) {
104670
104670
  const rows = items.map((item) => {
104671
104671
  const ma = item.ma;
104672
104672
  const authStatus = ma.invalidOAuthToken ? "\u26A0\uFE0F \u5931\u6548" : "\u2705 \u6B63\u5E38";
104673
- const balance = ma.remainingAccountBudget != null ? formatMoneyDisplay(ma.remainingAccountBudget, ma.currencyCode) : "-";
104674
104673
  const sharedCount = Array.isArray(ma.accountIds) ? String(Math.max(0, ma.accountIds.length - 1)) : "-";
104675
104674
  return {
104676
104675
  company: item.mag?.advertiserName ?? "-",
@@ -104682,7 +104681,6 @@ function printTikTokTable(items, tableOpts) {
104682
104681
  conversions: fmtNum(ma["conversions"], 0),
104683
104682
  clicks: fmtNum(ma["clicks"], 0),
104684
104683
  cpc: fmtNum(ma["costPerClick"]),
104685
- balance,
104686
104684
  bc: formatTikTokBcColumn(ma),
104687
104685
  authStatus,
104688
104686
  auditStatus: formatTikTokAuditStatus(ma),
@@ -104697,7 +104695,6 @@ function printGoogleTable(items, tableOpts) {
104697
104695
  const ma = item.ma;
104698
104696
  const authStatus = ma.invalidOAuthToken ? "\u26A0\uFE0F \u5931\u6548" : "\u2705 \u6B63\u5E38";
104699
104697
  const platformStatus = ma.platformStatus ?? "-";
104700
- const balance = ma.remainingAccountBudget != null ? formatMoneyDisplay(ma.remainingAccountBudget, ma.currencyCode) : "-";
104701
104698
  const sharedCount = Array.isArray(ma.accountIds) ? String(Math.max(0, ma.accountIds.length - 1)) : "-";
104702
104699
  return {
104703
104700
  company: item.mag?.advertiserName ?? "-",
@@ -104709,7 +104706,6 @@ function printGoogleTable(items, tableOpts) {
104709
104706
  conversions: fmtNum(ma["conversions"], 0),
104710
104707
  clicks: fmtNum(ma["clicks"], 0),
104711
104708
  cpc: fmtNum(ma["costPerClick"]),
104712
- balance,
104713
104709
  arit: String(ma.aritScore ?? "-"),
104714
104710
  platformStatus,
104715
104711
  authStatus,
@@ -104725,7 +104721,6 @@ var COL_DEFAULT_WITH_MEDIA = [
104725
104721
  { key: "advertiserName", header: "\u5E7F\u544A\u4E3B" },
104726
104722
  { key: "mediaCustomerName", header: "\u8D26\u6237\u540D\u79F0" },
104727
104723
  COL_CURRENCY,
104728
- { key: "balance", header: "\u4F59\u989D" },
104729
104724
  { key: "status", header: "\u8D26\u6237\u72B6\u6001" }
104730
104725
  ];
104731
104726
  var COL_DEFAULT_SINGLE = COL_DEFAULT_WITH_MEDIA.filter(
@@ -104744,14 +104739,12 @@ function printDefaultTable(items, media, tableOpts) {
104744
104739
  } else {
104745
104740
  statusLabel = "\u2705 \u6B63\u5E38";
104746
104741
  }
104747
- const balance = ma.remainingAccountBudget != null ? formatMoneyDisplay(ma.remainingAccountBudget, ma.currencyCode) : "-";
104748
104742
  return {
104749
104743
  mediaType: ma.mediaAccountType ?? "",
104750
104744
  mediaCustomerId: String(ma.mediaCustomerId ?? "(\u672A\u5F00\u901A)"),
104751
104745
  advertiserName: item.mag?.advertiserName ?? "",
104752
104746
  mediaCustomerName: ma.mediaCustomerName ?? "",
104753
104747
  currency: formatCurrencyCodeLabel(ma.currencyCode),
104754
- balance,
104755
104748
  status: statusLabel
104756
104749
  };
104757
104750
  });
@@ -104776,7 +104769,6 @@ function wrapListJson(params) {
104776
104769
  }
104777
104770
 
104778
104771
  // src/commands/list-accounts/main.ts
104779
- init_balance();
104780
104772
  async function runListAccounts(opts) {
104781
104773
  let config = loadConfig(opts.token);
104782
104774
  if (opts.refreshDp) {
@@ -104864,81 +104856,7 @@ async function runListAccounts(opts) {
104864
104856
  process.exit(1);
104865
104857
  }
104866
104858
  }
104867
- if (items.length > 0 && opts.detail) {
104868
- const groups = /* @__PURE__ */ new Map();
104869
- for (const item of items) {
104870
- const id = item.ma.mediaCustomerId;
104871
- const mediaType = item.ma.mediaAccountType ?? opts.media ?? "";
104872
- if (id && mediaType) {
104873
- if (!groups.has(mediaType)) groups.set(mediaType, []);
104874
- groups.get(mediaType).push(id);
104875
- }
104876
- }
104877
- const diagnoseIdToItem = /* @__PURE__ */ new Map();
104878
- const aritDiagnoseIds = [];
104879
- for (const item of items) {
104880
- for (const report of item.ma.diagnoseReports ?? []) {
104881
- if (report.reportSource === "ARIT") {
104882
- diagnoseIdToItem.set(report.websiteDiagnoseId, item);
104883
- aritDiagnoseIds.push(report.websiteDiagnoseId);
104884
- }
104885
- }
104886
- }
104887
- const [balanceMaps, overviewMaps, aritReports] = await Promise.all([
104888
- // 各媒体类型余额
104889
- Promise.all(
104890
- Array.from(groups.entries()).map(
104891
- ([mediaType, ids]) => fetchBalanceMap(mediaType, ids, config, void 0, void 0, opts.verbose)
104892
- )
104893
- ),
104894
- // 各媒体类型消耗数据(MetaAd 不支持,fetchOverviewMap 内部会跳过)
104895
- Promise.all(
104896
- Array.from(groups.entries()).map(
104897
- ([mediaType, ids]) => fetchOverviewMap(mediaType, ids, config, void 0, void 0, opts.verbose)
104898
- )
104899
- ),
104900
- // ARIT 得分
104901
- aritDiagnoseIds.length > 0 ? apiFetch2(
104902
- `${config.apiBaseUrl}/query/WebsiteDiagnoseReport/search?ids=${aritDiagnoseIds.join(",")}`,
104903
- config,
104904
- {},
104905
- opts.verbose
104906
- ).catch(() => []) : Promise.resolve([])
104907
- ]);
104908
- const globalBalance = /* @__PURE__ */ new Map();
104909
- for (const m of balanceMaps) {
104910
- for (const [id, info] of m) globalBalance.set(id, info);
104911
- }
104912
- const globalOverview = /* @__PURE__ */ new Map();
104913
- for (const m of overviewMaps) {
104914
- for (const [id, info] of m) globalOverview.set(id, info);
104915
- }
104916
- for (const item of items) {
104917
- const id = item.ma.mediaCustomerId;
104918
- if (!id) continue;
104919
- const balanceInfo = globalBalance.get(id);
104920
- if (balanceInfo) {
104921
- item.ma.remainingAccountBudget = balanceInfo.remainingAccountBudget;
104922
- item.ma.platformStatus = balanceInfo.status ?? balanceInfo.accountStatus;
104923
- }
104924
- const overviewInfo = globalOverview.get(id);
104925
- if (overviewInfo) {
104926
- const maExt = item.ma;
104927
- maExt["spend"] = overviewInfo.spend;
104928
- maExt["impressions"] = overviewInfo.impressions;
104929
- maExt["clicks"] = overviewInfo.clicks;
104930
- maExt["conversions"] = overviewInfo.conversions;
104931
- const clicks = Number(overviewInfo.clicks ?? 0);
104932
- maExt["costPerClick"] = clicks > 0 ? Number(overviewInfo.spend ?? 0) / clicks : null;
104933
- }
104934
- }
104935
- for (const report of Array.isArray(aritReports) ? aritReports : []) {
104936
- const targetItem = diagnoseIdToItem.get(report.websiteDiagnoseId);
104937
- if (targetItem) {
104938
- targetItem.ma.aritScore = report.summaryScore ?? "-";
104939
- }
104940
- }
104941
- } else if (items.length > 0) {
104859
+ if (items.length > 0) {
104942
104860
  for (const item of items) {
104943
104861
  stripListAccountsEnrichmentFields(item);
104944
104862
  }
@@ -104967,13 +104885,9 @@ async function runListAccounts(opts) {
104967
104885
  return;
104968
104886
  }
104969
104887
  const totalInfo = total !== void 0 ? `\uFF0C\u5171 ${total} \u6761` : "";
104970
- let listHeader = `
104971
- \u5E7F\u544A\u8D26\u6237\u5217\u8868\uFF08\u7B2C ${page} \u9875\uFF0C\u672C\u9875 ${items.length} \u6761${totalInfo}\uFF09`;
104972
- if (!opts.detail) {
104973
- listHeader += "\n \uFF08\u9ED8\u8BA4\u5217\u8868\uFF1A\u672A\u5408\u5E76\u4F59\u989D\u4E0E\u6D88\u8017\uFF0CJSON \u4E0D\u542B\u76F8\u5173\u5B57\u6BB5\uFF1B\u52A0 --detail \u53EF\u62C9\u53D6\u771F\u5B9E\u6570\u503C\uFF0C\u54CD\u5E94\u8F83\u6162\u3002TikTok/Meta \u4ECD\u5408\u5E76\u5217\u8868\u63A5\u53E3\u540C\u5305\u5185\u7684 adList\u3002\uFF09";
104974
- }
104975
- listHeader += "\n";
104976
- console.log(listHeader);
104888
+ console.log(`
104889
+ \u5E7F\u544A\u8D26\u6237\u5217\u8868\uFF08\u7B2C ${page} \u9875\uFF0C\u672C\u9875 ${items.length} \u6761${totalInfo}\uFF09
104890
+ `);
104977
104891
  if (items.length === 0) {
104978
104892
  console.log("\u6682\u65E0\u5E7F\u544A\u8D26\u6237\u6570\u636E\u3002\n");
104979
104893
  return;
@@ -105032,10 +104946,6 @@ function register6(program2) {
105032
104946
  "--json-out <path>",
105033
104947
  "\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",
105034
104948
  void 0
105035
- ).option(
105036
- "--detail",
105037
- "\u5408\u5E76\u4F59\u989D\u4E0E\u8FD1\u671F\u6D88\u8017\uFF08\u53CA\u5C55\u793A/\u70B9\u51FB/\u8F6C\u5316/CPC\u3001Arit \u5F97\u5206\uFF09\uFF1B\u672A\u4F20\u65F6 JSON \u4E0D\u542B\u8FD9\u4E9B\u5B57\u6BB5\uFF0C\u5217\u8868\u66F4\u5FEB",
105038
- false
105039
104949
  ).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08cli-table3\uFF09\uFF1B\u9ED8\u8BA4 ASCII +-|", false).option("--plain", "\u5DF2\u9ED8\u8BA4 ASCII \u7EBF\u6846\uFF0C\u65E0\u9700\u518D\u4F20\uFF1B\u4FDD\u7559\u517C\u5BB9\u65E7\u811A\u672C", false).option(
105040
104950
  "--refresh-dp",
105041
104951
  "\u5F3A\u5236\u91CD\u62C9 Datapermission \u540E\u518D\u8BF7\u6C42\u5217\u8868\uFF08\u7528\u4E8E\u300C\u7B2C\u4E8C\u6B21\u62C9\u53D6\u5168\u90E8\u5931\u6548\u300D\u7C7B\u4F1A\u8BDD\u5F02\u5E38\u7684\u4E00\u952E\u6392\u67E5\uFF09",
@@ -105050,7 +104960,6 @@ function register6(program2) {
105050
104960
  page: opts.page,
105051
104961
  pageSize: opts.pageSize,
105052
104962
  jsonOut: opts.jsonOut,
105053
- detail: opts.detail,
105054
104963
  unicode: opts.unicode,
105055
104964
  refreshDp: opts.refreshDp,
105056
104965
  verbose: opts.verbose
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.29-beta.19",
4
- "publishedAt": 1781752298576
3
+ "version": "1.1.29-beta.21",
4
+ "publishedAt": 1781769678495
5
5
  }
@@ -16,12 +16,11 @@ siluzan-tso list-accounts [选项]
16
16
  | `-p, --page <n>` | 页码(默认 1) |
17
17
  | `--page-size <n>` | 每页数量(默认 20) |
18
18
  | `--json-out` | 输出原始 JSON |
19
- | `--detail` | **合并余额与近期消耗**(及展示/点击/转化/CPC、Arit 得分);**未传时 JSON 不含这些字段**,列表更快。**仅适合少量账号**:每户额外并行请求,账号多时明显变慢;全量余额/消耗汇总改用 `balance-scan` / `accounts-digest` |
20
19
  | `--unicode` | 表格使用 Unicode 线框;**默认**为 ASCII `+- | ` 线框(兼容各类终端) |
21
20
  | `--plain` | 已默认 ASCII,无需再传;保留兼容旧脚本 |
22
21
  | `--refresh-dp` | 强制重拉 Datapermission(排查「本页全部 OAuth 失效」类会话异常) |
23
22
 
24
- **命令定位**:`list-accounts` 主打**精准查询账号信息**(列表、计数、按名称/ID 找户、`entityId` / `mediaCustomerId` / 币种 / 状态等元数据),**不是余额/消耗汇总工具**。默认(无 `--detail`)JSON **不含**余额/消耗字段,对应表格列为「-」,**禁止**臆造数值;`--detail` 每户额外并行请求、明显变慢,**仅限少量账号**(单户 / 数个 `-k` 命中)顺带看余额/消耗,**禁止**全量扫描拼汇总——全量余额预警用 `balance-scan`(P2)、多户消耗画像用 `accounts-digest`(本文下方)、单户精确值用 `balance` / `stats`。
23
+ **命令定位**:`list-accounts` 主打**精准查询账号信息**(列表、计数、按名称/ID 找户、`entityId` / `mediaCustomerId` / 币种 / 状态等元数据),**不是余额/消耗汇总工具**。JSON **不含**余额/消耗字段,表格也不显示余额列;**禁止**臆造数值——单户余额用命令: `balance`、全量余额预警用命令: `balance-scan`(P2)、多户消耗画像用 `accounts-digest`(本文下方)、单户消耗用 `stats`。
25
24
 
26
25
  ### Agent 意图速查(**必读 · 避免多次试探**)
27
26
 
@@ -57,10 +56,6 @@ siluzan-tso list-accounts -m Google -k "品牌A" --json-out ./snap
57
56
  # 只看正常状态
58
57
  siluzan-tso list-accounts -m TikTok -s normal --page-size 999 --json-out ./snap
59
58
 
60
- # 列表同时带出真实余额与近期消耗(较慢,仅少量账号且用户要余额/消耗时)
61
- # 注意:全部账号的余额/消耗汇总请改用 balance-scan / accounts-digest,勿用 --detail 全量扫描
62
- siluzan-tso list-accounts -m Google -k "品牌A" --detail --json-out ./snap
63
-
64
59
  # 极少数账户超过 999 条时才翻页(先确认读盘 total > itemCount)
65
60
  siluzan-tso list-accounts -m Google --page 2 --page-size 999 --json-out ./snap-p2
66
61
  ```
@@ -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.29-beta.19'
12
+ $PKG_VERSION = '1.1.29-beta.21'
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.29-beta.19"
12
+ readonly PKG_VERSION="1.1.29-beta.21"
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.29-beta.19",
3
+ "version": "1.1.29-beta.21",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",