@seasonkoh/webaz 0.1.20 → 0.1.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.
@@ -521,7 +521,7 @@ Actions:
521
521
  - view (default) — balance + staked + in-escrow + earnings + reputation tier
522
522
  - deposits — last 10 on-chain (tx_hash / amount / block)
523
523
  - withdrawals — last 10 (status / tx_hash)
524
- - income — breakdown: referral L1/L2/L3 + binary PV matching + sales net`,
524
+ - income — breakdown: referral L1/L2/L3 + points-matching + sales net`,
525
525
  inputSchema: {
526
526
  type: 'object',
527
527
  properties: {
@@ -798,7 +798,7 @@ Safer than \`webaz_revoke_key\` — atomic swap, no access gap.`,
798
798
  },
799
799
  {
800
800
  name: 'webaz_referral',
801
- description: `View your referral status: 3-tier commission (推土机) team + earnings + invite links + binary PV matching (原子能) tree + tier progress + L1 share permission gate + **rewards_status (RFC-002 §3.5 opt-in state + pending escrow)**.
801
+ description: `View your referral status: 3-tier commission team + earnings + invite links + points-matching tier progress + L1 share permission gate + **rewards_status (RFC-002 §3.5 opt-in state + pending escrow)**.
802
802
 
803
803
  ⚠️ **Opt-in required (RFC-002)**: rewards default = off. \`rewards_status\` field returns 4-state {opted_in | never_activated | auto_downgraded | deactivated} + pending_escrow tally. Opted-out users still see attribution + tree, but commission held in escrow until activation via PWA #me.
804
804
 
@@ -813,7 +813,7 @@ Safer than \`webaz_revoke_key\` — atomic swap, no access gap.`,
813
813
  },
814
814
  {
815
815
  name: 'webaz_share_link',
816
- description: `Generate product share link with your referral attached. Open in any social platform (TikTok/WeChat/Telegram). Clicker registers/buys → counts toward your 3-tier commission (if verified buyer) + PV tree.
816
+ description: `Generate product share link with your referral attached. Open in any social platform (TikTok/WeChat/Telegram). Clicker registers/buys → counts toward your 3-tier commission (if verified buyer) + points-matching.
817
817
 
818
818
  ⚠️ **Opt-in required (RFC-002 §3.5)**: this is a valuation-layer action. Caller must have \`rewards_opted_in=1\` (builder-identity opt-in). Opted-out users get \`{error: 'rewards_opt_in_required', missing_requirements, next_steps}\` — direct user to PWA #me to apply.
819
819
 
@@ -3171,8 +3171,8 @@ function handleReferral(args) {
3171
3171
  };
3172
3172
  })(),
3173
3173
  tip: canL1
3174
- ? 'Use webaz_share_link(product_id) to generate a product share link. Both 3-tier commission and PV tree will apply (only when rewards_opted_in=1).'
3175
- : 'Complete 1 purchase first, then your share link will earn 3-tier commission. Until then, your share builds PV tree only.',
3174
+ ? 'Use webaz_share_link(product_id) to generate a product share link. Both 3-tier commission and points-matching will apply (only when rewards_opted_in=1).'
3175
+ : 'Complete 1 purchase first, then your share link will earn 3-tier commission. Until then, your share builds points-matching only.',
3176
3176
  };
3177
3177
  }
3178
3178
  function handleShareLink(args) {
@@ -3254,7 +3254,7 @@ function handleShareLink(args) {
3254
3254
  binary_explanation: `New user via this link → placed in your ${side === 'left' ? '🔵 left' : '🟢 right'} subtree (tail anchor)`,
3255
3255
  commission_eligibility: canL1
3256
3256
  ? `You will earn 3-tier commission: L1=${(rate * 0.70 * 100).toFixed(1)}% L2=${(rate * 0.20 * 100).toFixed(1)}% L3=${(rate * 0.10 * 100).toFixed(1)}% of sale price`
3257
- : 'You are NOT verified yet (need 1 completed purchase). 3-tier commission will be skipped, but PV tree still builds.',
3257
+ : 'You are NOT verified yet (need 1 completed purchase). 3-tier commission will be skipped, but points-matching still builds.',
3258
3258
  next_steps: 'Share on TikTok / WeChat / Telegram. New user clicks → 30-day attribution window starts.',
3259
3259
  };
3260
3260
  }
@@ -4380,7 +4380,7 @@ export async function startMCPServer() {
4380
4380
  role: 'user',
4381
4381
  content: {
4382
4382
  type: 'text',
4383
- text: `webaz 的跨境双轨架构:\n\n` +
4383
+ text: `webaz 的跨境架构:\n\n` +
4384
4384
  `**境内业务**:走 webaz 自有协议(中文 + 监管友好 + 独立)。所有交易在 webaz state machine 内完成。\n\n` +
4385
4385
  `**跨境业务**:同一商品同时通过两条路径暴露:\n` +
4386
4386
  `1. webaz 自有协议(给 webaz 内部 agent / PWA 用户)\n` +
@@ -3256,7 +3256,7 @@ async function renderAdminDashboard(app) {
3256
3256
  ])
3257
3257
  const kpiTokenomics2 = kpiGrid([
3258
3258
  { label: t('累计分享分润'),value: Number(tk.commission_total || 0).toFixed(2), unit: 'WAZ' },
3259
- { label: t('累计对碰发放'),value: Number(tk.binary_waz_total || 0).toFixed(2), unit: 'WAZ' },
3259
+ { label: t('累计匹配发放'),value: Number(tk.binary_waz_total || 0).toFixed(2), unit: 'WAZ' },
3260
3260
  { label: t('PV 待处理'), value: tk.ledger_pending ?? 0 },
3261
3261
  ])
3262
3262
  // 异常告警 banner — 多条件聚合
@@ -3298,7 +3298,7 @@ async function renderAdminDashboard(app) {
3298
3298
  </div>
3299
3299
  <div style="font-size:13px;color:#6b7280;margin:16px 0 8px">⚛ ${t('Tokenomics')}</div>
3300
3300
  <div style="display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-bottom:16px">
3301
- ${quickAction('#admin/tokenomics', '⚛', t('双轨基金 / Tier 配置 / 高额榜'))}
3301
+ ${quickAction('#admin/tokenomics', '⚛', t('积分基金 / Tier 配置 / 高额榜'))}
3302
3302
  </div>`
3303
3303
 
3304
3304
  // A5 重设:渐变标题 + 分区标题 + 颜色块分组
@@ -4352,7 +4352,7 @@ async function renderApplyRewards(app) {
4352
4352
  <div class="card" style="margin-bottom:16px;background:#fef2f2;border-color:#fca5a5">
4353
4353
  <div style="font-weight:600;color:#991b1b;margin-bottom:6px;font-size:14px">⚠️ ${t('本流程与购物无关')}</div>
4354
4354
  <div style="font-size:12px;color:#7f1d1d;line-height:1.6">
4355
- ${t('你可以随时退出,不影响任何已下单或未来订单。本流程涉及经济关系登记(三级佣金 + 双轨配对),请仔细阅读全部条款。')}<br>
4355
+ ${t('你可以随时退出,不影响任何已下单或未来订单。本流程涉及经济关系登记(三级佣金 + 积分配对),请仔细阅读全部条款。')}<br>
4356
4356
  <span style="opacity:0.85">This flow is not part of shopping. You can leave anytime without affecting any orders. This is an economic-relationship registration — please read all terms.</span>
4357
4357
  </div>
4358
4358
  </div>
@@ -5536,7 +5536,7 @@ async function renderAdminTokenomics(app) {
5536
5536
  <h2 style="font-size:15px;font-weight:600;margin:16px 0 8px">🎁 ${t('管理津贴池')}</h2>
5537
5537
  <div class="card" style="margin-bottom:12px">
5538
5538
  <div style="font-size:18px;font-weight:700">${Number(mb.balance ?? 0).toFixed(2)} WAZ</div>
5539
- <div style="font-size:11px;color:#9ca3af;margin-top:4px">${t('来自协议费 50%,用于大博主对碰团队 10/5/2% 补贴')}</div>
5539
+ <div style="font-size:11px;color:#9ca3af;margin-top:4px">${t('来自协议费 50%,用于大博主匹配团队 10/5/2% 补贴')}</div>
5540
5540
  <div id="mgmt-bonus-control" style="margin-top:12px;padding:10px;background:#fef9c3;border:1px solid #fde047;border-radius:6px">
5541
5541
  <div style="font-size:12px;font-weight:600;margin-bottom:6px">⚠️ ${t('津贴门控')}</div>
5542
5542
  <div id="mgmt-bonus-status" style="font-size:11px;color:#92400e;margin-bottom:8px">${t('加载中...')}</div>
@@ -5560,7 +5560,7 @@ async function renderAdminTokenomics(app) {
5560
5560
  <div class="card" style="margin-bottom:12px">
5561
5561
  <div style="display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px">
5562
5562
  <button class="btn btn-outline btn-sm" style="font-size:11px" onclick="doTkProcess()">${t('处理 PV 流水')}</button>
5563
- <button class="btn btn-outline btn-sm" style="font-size:11px" onclick="doTkSettle()">${t('触发对碰结算')}</button>
5563
+ <button class="btn btn-outline btn-sm" style="font-size:11px" onclick="doTkSettle()">${t('触发匹配结算')}</button>
5564
5564
  <button class="btn btn-outline btn-sm" style="font-size:11px;color:#dc2626;border-color:#dc2626" onclick="if(confirm('${t('确认分发 WAZ?这将清空池子按 N 比例分配')}'))doTkDistribute()">${t('分发 WAZ(清池)')}</button>
5565
5565
  </div>
5566
5566
  <div style="font-size:12px;color:#6b7280">${t('PV 待处理流水')}: ${data.pv_ledger?.pending ?? 0} ${t('条')} · ${t('待累积 PV')}: ${Number(data.pv_ledger?.pending_pv ?? 0).toLocaleString()}</div>
@@ -5580,10 +5580,10 @@ async function renderAdminTokenomics(app) {
5580
5580
  <div style="padding:8px 12px;font-size:11px;color:#6b7280">${t('调整:POST /api/admin/tokenomics/tier with body {tier, pv_threshold, score_per_hit, active}')}</div>
5581
5581
  </div>
5582
5582
 
5583
- <h2 style="font-size:15px;font-weight:600;margin:16px 0 8px">🏆 ${t('Top 推土机佣金')} (Top 10)</h2>
5583
+ <h2 style="font-size:15px;font-weight:600;margin:16px 0 8px">🏆 ${t('Top 三级佣金')} (Top 10)</h2>
5584
5584
  <div class="card" style="padding:0;margin-bottom:12px">${commRows}</div>
5585
5585
 
5586
- <h2 style="font-size:15px;font-weight:600;margin:16px 0 8px">🏆 ${t('Top 对碰收益')} (Top 10)</h2>
5586
+ <h2 style="font-size:15px;font-weight:600;margin:16px 0 8px">🏆 ${t('Top 匹配收益')} (Top 10)</h2>
5587
5587
  <div class="card" style="padding:0;margin-bottom:12px">${binaryRows}</div>
5588
5588
  `, 'admin')
5589
5589
  setTimeout(loadRequireRefStatus, 100)
@@ -5643,7 +5643,7 @@ window.doTkProcess = async () => {
5643
5643
  window.doTkSettle = async () => {
5644
5644
  const res = await POST('/admin/atomic/run-settlement', {})
5645
5645
  const msg = document.getElementById('tk-msg')
5646
- if (msg) msg.innerHTML = res.error ? alert$('error', res.error) : alert$('success', `${t('已触发对碰')}: ${res.settled}`)
5646
+ if (msg) msg.innerHTML = res.error ? alert$('error', res.error) : alert$('success', `${t('已触发匹配')}: ${res.settled}`)
5647
5647
  setTimeout(() => renderAdminTokenomics(document.getElementById('app')), 800)
5648
5648
  }
5649
5649
 
@@ -6716,10 +6716,10 @@ async function renderPromoter(app) {
6716
6716
  const _kpiRestricted = _mlmMax <= 1
6717
6717
  // 两个语义独立的 gate(三级奖励 ≠ PV 双轨系统)—— 2026-06-04 已解耦:
6718
6718
  // - _kpiRestricted (max ≤ 1):紧张地区 — KPI 改时间线 / team 隐 WAZ
6719
- // - _pvAllowed:PV 双轨/对碰系统是否开启,读 region_pv_enabled(独立旋钮,不再绑 max≥3)
6719
+ // - _pvAllowed:PV 双轨/匹配系统是否开启,读 region_pv_enabled(独立旋钮,不再绑 max≥3)
6720
6720
  // commission 层级(max_levels) 与 PV 系统(pv_enabled) 分离:可单独开某辖区到 L2/L3 而 PV 仍关。
6721
6721
  const _pvAllowed = Number(state.user?.region_pv_enabled ?? 0) === 1
6722
- // 紧张地区:拼装最近奖励时间线(commission + 对碰 binary 混合,按时间倒序取 5 条)
6722
+ // 紧张地区:拼装最近奖励时间线(commission + 匹配 binary 混合,按时间倒序取 5 条)
6723
6723
  let kpiBar = ''
6724
6724
  if (_kpiRestricted) {
6725
6725
  const _cm = (data.recent || []).slice(0, 10).map(r => ({
@@ -7051,13 +7051,13 @@ async function renderPromoter(app) {
7051
7051
 
7052
7052
  // ─── ⑥ WebAZ 发展奖(默认折叠;紧张 PV 地区精简版)───
7053
7053
  // 合规:max_levels ≤ 1 的地区(GCC/越南/印尼/菲律宾 + 未审计地区)
7054
- // 只显示"累计推广 N 人"客观数字,全部金钱/tier/对碰话术隐藏
7054
+ // 只显示"累计推广 N 人"客观数字,全部金钱/tier/匹配话术隐藏
7055
7055
  // 复用顶部 _kpiRestricted(同一含义,避免重复定义)
7056
7056
  const _totalRecruits = Number(data.team?.l1 || 0) + Number(data.team?.l2 || 0) + Number(data.team?.l3 || 0)
7057
7057
  // 最右侧地区显示(所有模式都加)
7058
7058
  const _userRegion = state.user?.region || 'global'
7059
7059
  const _regionChip = `<span style="font-size:11px;color:#6b7280;white-space:nowrap;font-weight:400">${regionLabel(_userRegion)}</span>`
7060
- // PV 双轨系统:只在 _pvAllowed(region_pv_enabled=1,2026-06-04 解耦,独立于 max_levels)才显示完整 tier/对碰/弱腿;
7060
+ // PV 双轨系统:只在 _pvAllowed(region_pv_enabled=1,2026-06-04 解耦,独立于 max_levels)才显示完整 tier/匹配/弱侧;
7061
7061
  // 未开启 PV 的地区 → 走精简卡(分数仍后台计算累积,待 pv_enabled 开启/迁移后兑现)
7062
7062
  const atomicSection = atomic.left_invite_url
7063
7063
  ? (!_pvAllowed
@@ -7080,7 +7080,7 @@ async function renderPromoter(app) {
7080
7080
  <span>
7081
7081
  🌟 ${t('WebAZ 发展奖')}
7082
7082
  <span style="font-weight:400;font-size:12px;color:#6b7280;margin-left:6px">
7083
- ${t('弱腿')} ${weak.toLocaleString()} PV · ${t('累计')} ${(atomic.score?.settled_waz || 0).toFixed(2)} WAZ
7083
+ ${t('弱侧')} ${weak.toLocaleString()} PV · ${t('累计')} ${(atomic.score?.settled_waz || 0).toFixed(2)} WAZ
7084
7084
  </span>
7085
7085
  </span>
7086
7086
  ${_regionChip}
@@ -7266,7 +7266,7 @@ window.setBoughtKw = (kw) => {
7266
7266
  }, 200)
7267
7267
  }
7268
7268
 
7269
- // 双轨对碰内部内容(折叠展开后渲染,从 renderAtomicSection 简化抽出)
7269
+ // 积分匹配内部内容(折叠展开后渲染,从 renderAtomicSection 简化抽出)
7270
7270
  function renderAtomicInner(a, leftPv, rightPv, weak, nextTier, nextProgress) {
7271
7271
  const tiers = a.tier_config || []
7272
7272
  const tierTable = tiers.map(x => `
@@ -7276,7 +7276,7 @@ function renderAtomicInner(a, leftPv, rightPv, weak, nextTier, nextProgress) {
7276
7276
  <td style="padding:5px 8px;font-size:12px;text-align:right;font-weight:600">${x.score_per_hit}</td>
7277
7277
  </tr>`).join('')
7278
7278
 
7279
- // 本月对碰次数 + WAZ
7279
+ // 本月匹配次数 + WAZ
7280
7280
  const now = new Date()
7281
7281
  const monthStart = new Date(now.getFullYear(), now.getMonth(), 1).toISOString().slice(0, 10)
7282
7282
  const monthBinary = (a.recent_binary || []).filter(r => (r.created_at || '').slice(0, 10) >= monthStart)
@@ -7293,7 +7293,7 @@ function renderAtomicInner(a, leftPv, rightPv, weak, nextTier, nextProgress) {
7293
7293
  <div>tier ${r.tier} · Score <strong>${r.score}</strong> · ${r.settled_at ? `<span style="color:#16a34a">${t('已结')} ${Number(r.waz_amount).toFixed(2)}</span>` : `<span style="color:#d97706">${t('待分配')}</span>`}</div>
7294
7294
  <div style="color:#9ca3af">${fmtTime(r.created_at)}</div>
7295
7295
  </div>`).join('')
7296
- : `<div style="text-align:center;color:#9ca3af;padding:10px;font-size:12px">${t('暂无对碰记录')}</div>`
7296
+ : `<div style="text-align:center;color:#9ca3af;padding:10px;font-size:12px">${t('暂无匹配记录')}</div>`
7297
7297
 
7298
7298
  return `
7299
7299
  <!-- 我的位置 -->
@@ -7302,7 +7302,7 @@ function renderAtomicInner(a, leftPv, rightPv, weak, nextTier, nextProgress) {
7302
7302
  📍 ${t('我挂位置')}: <strong>${escHtml(a.my_placement.name)}</strong> 的 ${a.my_placement.side === 'left' ? '🔵 左侧' : '🟢 右侧'}
7303
7303
  </div>` : `
7304
7304
  <div style="background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;padding:8px 10px;font-size:12px;color:#9ca3af;margin-bottom:10px">
7305
- ${t('你还没加入任何上级的双轨树(独立根节点)')}
7305
+ ${t('你还没加入任何上级的积分树(独立根节点)')}
7306
7306
  </div>`}
7307
7307
 
7308
7308
  <!-- 左/右 PV -->
@@ -7319,25 +7319,25 @@ function renderAtomicInner(a, leftPv, rightPv, weak, nextTier, nextProgress) {
7319
7319
  </div>
7320
7320
  </div>
7321
7321
 
7322
- <!-- 本月对碰统计 + 总对碰 -->
7322
+ <!-- 本月匹配统计 + 总匹配 -->
7323
7323
  <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;margin-bottom:10px">
7324
7324
  <div style="text-align:center;background:#fef3c7;border-radius:6px;padding:8px 4px">
7325
- <div style="font-size:10px;color:#92400e">${t('本月对碰次数')}</div>
7325
+ <div style="font-size:10px;color:#92400e">${t('本月匹配次数')}</div>
7326
7326
  <div style="font-size:14px;font-weight:700;color:#78350f">${monthHits}</div>
7327
7327
  </div>
7328
7328
  <div style="text-align:center;background:#dcfce7;border-radius:6px;padding:8px 4px">
7329
- <div style="font-size:10px;color:#166534">${t('本月对碰 WAZ')}</div>
7329
+ <div style="font-size:10px;color:#166534">${t('本月匹配 WAZ')}</div>
7330
7330
  <div style="font-size:14px;font-weight:700;color:#14532d">${monthWaz.toFixed(2)}</div>
7331
7331
  </div>
7332
7332
  <div style="text-align:center;background:#eef2ff;border-radius:6px;padding:8px 4px">
7333
- <div style="font-size:10px;color:#4338ca">${t('累计对碰次数')}</div>
7333
+ <div style="font-size:10px;color:#4338ca">${t('累计匹配次数')}</div>
7334
7334
  <div style="font-size:14px;font-weight:700;color:#3730a3">${totalHits}</div>
7335
7335
  </div>
7336
7336
  </div>
7337
7337
 
7338
7338
  ${renderBinaryTree(a.binary_tree)}
7339
7339
 
7340
- <div style="font-size:12px;color:#6b7280;margin-bottom:6px">${t('弱腿对碰量')}: <strong>${weak.toLocaleString()}</strong> PV</div>
7340
+ <div style="font-size:12px;color:#6b7280;margin-bottom:6px">${t('弱侧匹配量')}: <strong>${weak.toLocaleString()}</strong> PV</div>
7341
7341
  ${nextTier ? `
7342
7342
  <div style="font-size:11px;color:#6b7280;margin-bottom:4px">${t('距离 tier')} ${nextTier.tier} ${t('门槛')} ${Number(nextTier.pv_threshold).toLocaleString()} PV (+${nextTier.score_per_hit} Score)</div>
7343
7343
  <div style="background:#f3f4f6;height:6px;border-radius:3px;overflow:hidden;margin-bottom:10px">
@@ -7345,7 +7345,7 @@ function renderAtomicInner(a, leftPv, rightPv, weak, nextTier, nextProgress) {
7345
7345
  </div>` : ''}
7346
7346
 
7347
7347
  <details style="margin-bottom:10px">
7348
- <summary style="font-size:12px;color:#6366f1;cursor:pointer">${t('对碰档位表')}</summary>
7348
+ <summary style="font-size:12px;color:#6366f1;cursor:pointer">${t('匹配档位表')}</summary>
7349
7349
  <table style="width:100%;margin-top:6px;border-collapse:collapse">
7350
7350
  <tr style="background:#f9fafb;font-size:11px;color:#6b7280">
7351
7351
  <th style="padding:5px 8px;text-align:left">Tier</th>
@@ -7355,7 +7355,7 @@ function renderAtomicInner(a, leftPv, rightPv, weak, nextTier, nextProgress) {
7355
7355
  ${tierTable}
7356
7356
  </table>
7357
7357
  </details>
7358
- <h4 style="font-size:12px;font-weight:600;margin:6px 0">📊 ${t('最近对碰')}</h4>
7358
+ <h4 style="font-size:12px;font-weight:600;margin:6px 0">📊 ${t('最近匹配')}</h4>
7359
7359
  ${recentRows}`
7360
7360
  }
7361
7361
 
@@ -7510,10 +7510,10 @@ function renderAtomicSection(a) {
7510
7510
  <div>tier ${r.tier} · Score <strong>${r.score}</strong> · ${r.settled_at ? `<span style="color:#16a34a">已结 ${Number(r.waz_amount).toFixed(2)} WAZ</span>` : `<span style="color:#d97706">待分配</span>`}</div>
7511
7511
  <div style="color:#9ca3af">${fmtTime(r.created_at)}</div>
7512
7512
  </div>`).join('')
7513
- : `<div style="text-align:center;color:#9ca3af;padding:16px;font-size:12px">${t('暂无对碰记录')}</div>`
7513
+ : `<div style="text-align:center;color:#9ca3af;padding:16px;font-size:12px">${t('暂无匹配记录')}</div>`
7514
7514
 
7515
7515
  return `
7516
- <h2 style="font-size:15px;font-weight:600;margin:24px 0 8px">⚛ ${t('原子能双轨对碰')}</h2>
7516
+ <h2 style="font-size:15px;font-weight:600;margin:24px 0 8px">⚛ ${t('积分积分匹配')}</h2>
7517
7517
 
7518
7518
  <div class="card" style="margin-bottom:12px;background:linear-gradient(135deg,#dbeafe,#f0fdf4)">
7519
7519
  <div style="font-size:13px;color:#6b7280;margin-bottom:6px">🔗 ${t('左右码(完全对称 / 末端垂直挂靠)')}</div>
@@ -7568,7 +7568,7 @@ function renderAtomicSection(a) {
7568
7568
  ${renderBinaryTree(a.binary_tree)}
7569
7569
 
7570
7570
  <div class="card" style="margin-bottom:12px">
7571
- <div style="font-size:13px;color:#6b7280;margin-bottom:6px">${t('弱腿对碰量')}: <strong>${pair.toLocaleString()}</strong> PV</div>
7571
+ <div style="font-size:13px;color:#6b7280;margin-bottom:6px">${t('弱侧匹配量')}: <strong>${pair.toLocaleString()}</strong> PV</div>
7572
7572
  ${nextTier ? `
7573
7573
  <div style="font-size:11px;color:#6b7280;margin-bottom:4px">${t('距离 tier')} ${nextTier.tier} ${t('门槛')} ${Number(nextTier.pv_threshold).toLocaleString()} PV (${nextTier.score_per_hit} Score)</div>
7574
7574
  <div style="background:#f3f4f6;height:6px;border-radius:3px;overflow:hidden">
@@ -7588,7 +7588,7 @@ function renderAtomicSection(a) {
7588
7588
  </div>
7589
7589
 
7590
7590
  <details style="margin-bottom:12px">
7591
- <summary style="font-size:12px;color:#6366f1;cursor:pointer">${t('对碰档位表')}</summary>
7591
+ <summary style="font-size:12px;color:#6366f1;cursor:pointer">${t('匹配档位表')}</summary>
7592
7592
  <table style="width:100%;margin-top:8px;border-collapse:collapse">
7593
7593
  <tr style="background:#f9fafb;font-size:11px;color:#6b7280">
7594
7594
  <th style="padding:6px 8px;text-align:left">Tier</th>
@@ -7599,13 +7599,13 @@ function renderAtomicSection(a) {
7599
7599
  </table>
7600
7600
  </details>
7601
7601
 
7602
- <h3 style="font-size:13px;font-weight:600;margin:8px 0">📊 ${t('最近对碰')}</h3>
7602
+ <h3 style="font-size:13px;font-weight:600;margin:8px 0">📊 ${t('最近匹配')}</h3>
7603
7603
  <div class="card" style="padding:0">
7604
7604
  ${recentRows}
7605
7605
  </div>`
7606
7606
  }
7607
7607
 
7608
- // P12: 三层双轨树(你 + 左右 + 各自左右)
7608
+ // P12: 三层积分树(你 + 左右 + 各自左右)
7609
7609
  function renderBinaryTree(tree) {
7610
7610
  if (!tree || !tree.me) return ''
7611
7611
  const node = (n, bg, fg, label) => n
@@ -7617,7 +7617,7 @@ function renderBinaryTree(tree) {
7617
7617
 
7618
7618
  return `
7619
7619
  <details style="margin-bottom:12px" open>
7620
- <summary style="font-size:12px;color:#6366f1;cursor:pointer;margin-bottom:6px">🌳 ${t('双轨组织图(3 层)')} <span style="color:#9ca3af;font-size:10px">${t('点击节点查看 PV')}</span></summary>
7620
+ <summary style="font-size:12px;color:#6366f1;cursor:pointer;margin-bottom:6px">🌳 ${t('团队组织图(3 层)')} <span style="color:#9ca3af;font-size:10px">${t('点击节点查看 PV')}</span></summary>
7621
7621
  <div style="padding:8px;background:#fff;border:1px solid #e5e7eb;border-radius:8px">
7622
7622
  <!-- L0: 你 -->
7623
7623
  <div style="margin-bottom:6px">
@@ -7693,8 +7693,8 @@ window.showNodePvModal = async (userId) => {
7693
7693
  </div>
7694
7694
 
7695
7695
  <div style="background:#f9fafb;border-radius:6px;padding:8px 10px;font-size:11px;color:#6b7280;line-height:1.7;margin-bottom:10px">
7696
- ${t('弱腿对碰量')}: <strong style="color:#374151">${weak.toLocaleString()}</strong> PV · ${t('双腿均衡')} ${ratio}%<br>
7697
- ${t('累计对碰')}: <strong style="color:#374151">${data.total_hits || 0}</strong> ${t('次')} · ${t('累计获 WAZ')}: <strong style="color:#16a34a">${Number(data.settled_waz || 0).toFixed(2)}</strong><br>
7696
+ ${t('弱侧匹配量')}: <strong style="color:#374151">${weak.toLocaleString()}</strong> PV · ${t('双腿均衡')} ${ratio}%<br>
7697
+ ${t('累计匹配')}: <strong style="color:#374151">${data.total_hits || 0}</strong> ${t('次')} · ${t('累计获 WAZ')}: <strong style="color:#16a34a">${Number(data.settled_waz || 0).toFixed(2)}</strong><br>
7698
7698
  ${t('待结 Score')}: <strong style="color:#d97706">${Number(data.pending_score || 0).toFixed(1)}</strong>
7699
7699
  </div>
7700
7700
 
@@ -7829,11 +7829,11 @@ async function maybePromptPlacementBind() {
7829
7829
  const st = await GET('/profile/placement-status')
7830
7830
  if (!st.can_bind) return // 已有 placement 或 有下线 → 不弹
7831
7831
  setTimeout(() => {
7832
- const ok = confirm(`📍 ${t('系统检测到邀请链接')}\n\n${t('inviter')}: ${inviter}\n\n${t('是否加入对方的双轨 PV 树?')}\n${t('系统将按推荐人偏好自动选择左/右区。一旦加入永久不变。')}`)
7832
+ const ok = confirm(`📍 ${t('系统检测到邀请链接')}\n\n${t('inviter')}: ${inviter}\n\n${t('是否加入对方的积分配对?')}\n${t('系统将按推荐人偏好自动选择左/右区。一旦加入永久不变。')}`)
7833
7833
  if (ok) {
7834
7834
  POST('/profile/bind-placement', { inviter_id: inviter, side: hint.placement_side || undefined }).then(res => {
7835
7835
  if (res.error) alert(`✗ ${res.error}`)
7836
- else alert(`✓ ${t('已加入双轨树')}\n${t('侧')}: ${res.side}\n${t('深度')}: ${res.depth}`)
7836
+ else alert(`✓ ${t('已加入积分树')}\n${t('侧')}: ${res.side}\n${t('深度')}: ${res.depth}`)
7837
7837
  })
7838
7838
  }
7839
7839
  localStorage.setItem(askedKey, Date.now().toString())
@@ -10209,7 +10209,7 @@ async function renderMyAgents(app) {
10209
10209
  <summary style="cursor:pointer;color:#6366f1;padding:4px 0">📊 ${t('为什么是')} ${lvlLabel} ${t('级?')}</summary>
10210
10210
  <div style="background:#f9fafb;border-radius:6px;padding:8px 10px;margin-top:4px;font-family:monospace;line-height:1.6">
10211
10211
  <div>${t('加分')}:${t('账号年龄')} +${rep.signals.age_pts} · ${t('订单数')} +${rep.signals.order_pts} · ${t('分享转化')} +${rep.signals.share_pts} · ${t('调用多样性')} +${rep.signals.diversity_pts}</div>
10212
- ${(rep.signals.dispute_penalty + rep.signals.sybil_penalty + rep.signals.cross_penalty + rep.signals.ratelimit_penalty) < 0 ? `<div style="color:#dc2626">${t('扣分')}:${t('争议败诉')} ${rep.signals.dispute_penalty} · ${t('同 IP 异户')} ${rep.signals.sybil_penalty} · ${t('双轨命中')} ${rep.signals.cross_penalty} · ${t('限速命中')} ${rep.signals.ratelimit_penalty}</div>` : ''}
10212
+ ${(rep.signals.dispute_penalty + rep.signals.sybil_penalty + rep.signals.cross_penalty + rep.signals.ratelimit_penalty) < 0 ? `<div style="color:#dc2626">${t('扣分')}:${t('争议败诉')} ${rep.signals.dispute_penalty} · ${t('同 IP 异户')} ${rep.signals.sybil_penalty} · ${t('匹配命中')} ${rep.signals.cross_penalty} · ${t('限速命中')} ${rep.signals.ratelimit_penalty}</div>` : ''}
10213
10213
  <div style="color:#9ca3af;margin-top:4px">${t('阈值')}:new&lt;20 · trusted≥20 · quality≥50 · legend≥80</div>
10214
10214
  </div>
10215
10215
  </details>
@@ -11688,8 +11688,8 @@ window.doLoginByPassword = async () => {
11688
11688
 
11689
11689
 
11690
11690
  // 从 URL 解析分享 hint(30 天 cookie 持久化)
11691
- // ?ref=usr_xxx → 仅推土机 sponsor
11692
- // ?placement=usr_xxx&side=left|right → 仅原子能挂靠
11691
+ // ?ref=usr_xxx → 仅三级佣金 sponsor
11692
+ // ?placement=usr_xxx&side=left|right → 仅积分挂靠
11693
11693
  // ?ref=xxx&side=left|right → 两轨道(ref 同时作 placement)
11694
11694
  // ?ref=xxx&placement=xxx&side=... → 显式两轨道
11695
11695
  function readShareHint() {
@@ -12059,10 +12059,10 @@ function showRegisterSuccessModal(res) {
12059
12059
  const targetBtn = (intended && intended !== '#' && intended !== '')
12060
12060
  ? `<button class="btn btn-primary" style="width:100%;margin-bottom:10px" onclick="window._closeRegModal(true)">🎯 ${t('回到原页')} ${tgt?.title ? '— ' + escHtml(tgt.title) : ''} →</button>`
12061
12061
  : ''
12062
- // P1 (QA 轮 14.a): 区分"邀请人"(referral sponsor) 与"双轨树挂靠"(binary placement)
12062
+ // P1 (QA 轮 14.a): 区分"邀请人"(referral sponsor) 与"积分树挂靠"(binary placement)
12063
12063
  // 旧版挤一行 "已绑定邀请人 X · 左区 depth N" → 用户误以为 depth 是相对邀请人
12064
12064
  const placementLine = res.placement
12065
- ? `<div style="font-size:11px;color:#9ca3af;margin-bottom:14px">${t('双轨树挂靠')}: ${res.placement.side === 'left' ? '🔵 ' + t('左区') : '🟢 ' + t('右区')} · ${t('深度')} ${res.placement.depth}<br><span style="font-size:10px">${t('(挂靠位置由系统按弱区自动决定,与邀请人不一定相邻)')}</span></div>`
12065
+ ? `<div style="font-size:11px;color:#9ca3af;margin-bottom:14px">${t('积分树挂靠')}: ${res.placement.side === 'left' ? '🔵 ' + t('左区') : '🟢 ' + t('右区')} · ${t('深度')} ${res.placement.depth}<br><span style="font-size:10px">${t('(挂靠位置由系统按弱区自动决定,与邀请人不一定相邻)')}</span></div>`
12066
12066
  : ''
12067
12067
  _openModal(`
12068
12068
  <h2 style="font-size:18px;font-weight:600;margin-bottom:8px;color:#16a34a">🎉 ${t('注册成功!')}</h2>
@@ -13570,7 +13570,7 @@ async function renderUserProfile(app, userId) {
13570
13570
  <input type="checkbox" id="feed-visible-tg" style="width:16px;height:16px" ${data.feed_visible ? 'checked' : ''} onchange="toggleFeedVisible(this.checked)">
13571
13571
  <label for="feed-visible-tg" style="font-size:13px;cursor:pointer">${t('在公开动态流显示我的活动')}</label>
13572
13572
  </div>
13573
- <p style="font-size:11px;color:#9ca3af;margin-top:4px;margin-left:26px">${t('关闭后,你的购买/对碰/分润事件不会出现在 发现好物 > 动态')}</p>
13573
+ <p style="font-size:11px;color:#9ca3af;margin-top:4px;margin-left:26px">${t('关闭后,你的购买/匹配/分润事件不会出现在 发现好物 > 动态')}</p>
13574
13574
 
13575
13575
  <div id="social-msg" style="margin-top:10px"></div>
13576
13576
 
@@ -21736,13 +21736,13 @@ async function renderSeller(app) {
21736
21736
  )}
21737
21737
  ${featureCard(
21738
21738
  '🎯',
21739
- t('买家 Agent 意图对碰'),
21739
+ t('买家 Agent 意图匹配'),
21740
21740
  t('零推广费'),
21741
21741
  t('全网买家 Agent 携精准需求(Alias)全天候巡航,与商品语义刚需匹配,订单全自动闭合成交。')
21742
21742
  )}
21743
21743
  ${featureCard(
21744
21744
  '🌊',
21745
- t('智能体裂变分润'),
21745
+ t('智能体扩散分润'),
21746
21746
  t('秒级自动分账'),
21747
21747
  t('商品由其他节点或达人 Agent 智能分享成交,下游分润通过智能合约去中心化自动清算,即刻到账。')
21748
21748
  )}
@@ -24733,7 +24733,7 @@ function renderTrustCard(trust) {
24733
24733
  const neg = []
24734
24734
  if (s.dispute_penalty < 0) neg.push(`${t('仲裁败诉')} ${s.dispute_penalty}`)
24735
24735
  if (s.sybil_penalty < 0) neg.push(`${t('同 IP 多号')} ${s.sybil_penalty}`)
24736
- if (s.cross_penalty < 0) neg.push(`${t('双轨同支')} ${s.cross_penalty}`)
24736
+ if (s.cross_penalty < 0) neg.push(`${t('同支')} ${s.cross_penalty}`)
24737
24737
  if (s.ratelimit_penalty < 0) neg.push(`${t('限速命中')} ${s.ratelimit_penalty}`)
24738
24738
 
24739
24739
  const nextHint = trust.trust_score < trust.raw_mode_min_trust
@@ -24912,7 +24912,7 @@ async function renderWallet(app) {
24912
24912
  </div>
24913
24913
  </div>
24914
24914
 
24915
- <!-- 卖家收入分类速览(仅 seller 显示)- 2026-05-24 对碰列只在 PV 允许地区显示 -->
24915
+ <!-- 卖家收入分类速览(仅 seller 显示)- 2026-05-24 匹配列只在 PV 允许地区显示 -->
24916
24916
  ${state.user?.role === 'seller' ? (() => {
24917
24917
  const _pvOK = Number(state.user?.region_pv_enabled ?? 0) === 1 // 2026-06-04 解耦:PV 列读 pv_enabled,不再绑 max≥3
24918
24918
  const cols = _pvOK ? 4 : 3
@@ -24931,7 +24931,7 @@ async function renderWallet(app) {
24931
24931
  <div style="font-size:9px;color:#9ca3af">${((inc.commissions?.l1?.count||0)+(inc.commissions?.l2?.count||0)+(inc.commissions?.l3?.count||0))} ${t('单')}</div>
24932
24932
  </div>
24933
24933
  ${_pvOK ? `<div style="background:#fefce8;border-radius:6px;padding:8px">
24934
- <div style="font-size:9px;color:#854d0e">⚛ ${t('对碰已结')}</div>
24934
+ <div style="font-size:9px;color:#854d0e">⚛ ${t('匹配已结')}</div>
24935
24935
  <div style="font-size:14px;font-weight:700;color:#a16207;margin-top:2px">${(inc.binary?.settled_waz||0).toFixed(2)}</div>
24936
24936
  <div style="font-size:9px;color:#9ca3af">${inc.binary?.settled_count||0} ${t('次')}</div>
24937
24937
  </div>` : ''}
@@ -24967,7 +24967,7 @@ async function renderWallet(app) {
24967
24967
  })()}
24968
24968
  ${getMaxLevels() >= 3 ? `
24969
24969
  <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:10px">
24970
- <div style="background:#fefce8;border-radius:6px;padding:10px"><div style="font-size:10px;color:#854d0e">⚛ ${t('双轨已结算')}</div><div style="font-size:15px;font-weight:700;color:#a16207">${inc.binary.settled_waz.toFixed(2)} WAZ</div><div style="font-size:9px;color:#9ca3af">${inc.binary.settled_count} ${t('次')}</div></div>
24970
+ <div style="background:#fefce8;border-radius:6px;padding:10px"><div style="font-size:10px;color:#854d0e">⚛ ${t('积分已结算')}</div><div style="font-size:15px;font-weight:700;color:#a16207">${inc.binary.settled_waz.toFixed(2)} WAZ</div><div style="font-size:9px;color:#9ca3af">${inc.binary.settled_count} ${t('次')}</div></div>
24971
24971
  <div style="background:#fef3c7;border-radius:6px;padding:10px"><div style="font-size:10px;color:#92400e">⏳ ${t('待结 Score')}</div><div style="font-size:15px;font-weight:700;color:#d97706">${inc.binary.pending_score.toFixed(1)}</div><div style="font-size:9px;color:#9ca3af">${t('每月结算')}</div></div>
24972
24972
  </div>` : ''}
24973
24973
  ${inc.sales.count > 0 ? `
@@ -334,7 +334,7 @@ const _EN = {
334
334
  '该范围内还没有 ≥ 3 人买过同一商品': 'No product bought by ≥ 3 people in this range yet',
335
335
  '当前关键词无匹配': 'No match for current keyword',
336
336
  '单': '',
337
- '双轨树挂靠': 'Binary tree placement',
337
+ '积分树挂靠': 'team tree placement',
338
338
  '(挂靠位置由系统按弱区自动决定,与邀请人不一定相邻)': '(placement auto-assigned to the weaker leg by the system; not necessarily adjacent to your sponsor)',
339
339
  '我的邀请链接(第一触点锁定 30 天)': 'My referral link (first-touch, 30-day cookie)',
340
340
  '你的邀请人': 'Your sponsor',
@@ -350,33 +350,33 @@ const _EN = {
350
350
  '1%-50%,分享佣金 70/20/10 自动拆分': '1%-50%, auto-split 70/20/10 across tiers',
351
351
  '结算后不可冲正,请审慎设定': 'Cannot be clawed back after settlement, set carefully',
352
352
  '佣金比例需在 1%-50% 之间': 'Commission rate must be 1%-50%',
353
- '原子能双轨对碰': 'Binary PV matching (原子能)',
353
+ '积分积分匹配': 'points-matching (积分)',
354
354
  '左右码(完全对称 / 末端垂直挂靠)': 'Left/Right codes (symmetric / tail-anchored)',
355
355
  '左码': 'Left',
356
356
  '右码': 'Right',
357
357
  '我挂靠位置': 'My placement',
358
358
  '直挂': 'Direct',
359
- '弱腿对碰量': 'Pairing volume',
359
+ '弱侧匹配量': 'Matching volume',
360
360
  '距离 tier': 'Toward tier',
361
361
  '门槛': 'threshold',
362
- '对碰档位表': 'Tier table',
362
+ '匹配档位表': 'Tier table',
363
363
  '门槛 PV': 'Threshold PV',
364
364
  'Score / 次': 'Score per hit',
365
- '最近对碰': 'Recent matches',
366
- '暂无对碰记录': 'No matches yet',
367
- 'Tokenomics — 两轨基金': 'Tokenomics — Twin pools',
365
+ '最近匹配': 'Recent matches',
366
+ '暂无匹配记录': 'No matches yet',
367
+ 'Tokenomics — 两轨基金': 'Tokenomics — Pooled funds',
368
368
  'Tokenomics': 'Tokenomics',
369
- '双轨基金 / Tier 配置 / 高额榜': 'Twin pools / Tier config / Leaderboard',
369
+ '积分基金 / Tier 配置 / 高额榜': 'Pooled funds / Tier config / Leaderboard',
370
370
  '累计分享分润': 'Total 3-tier commission',
371
- '累计对碰发放': 'Total binary distributed',
371
+ '累计匹配发放': 'Total distributed',
372
372
  'PV 待处理': 'PV pending',
373
373
  '池子余额': 'Pool balance',
374
374
  '上次 N': 'Last N',
375
375
  '上次结算': 'Last settled',
376
- '来自协议费 50%,用于大博主对碰团队 10/5/2% 补贴': 'From 50% protocol fee, for top promoter 10/5/2% bonus',
376
+ '来自协议费 50%,用于大博主匹配团队 10/5/2% 补贴': 'From 50% protocol fee, for top promoter 10/5/2% bonus',
377
377
  'Cron 控制 + 紧急操作': 'Cron controls + emergency',
378
378
  '处理 PV 流水': 'Process PV ledger',
379
- '触发对碰结算': 'Run binary settlement',
379
+ '触发匹配结算': 'Run settlement',
380
380
  '分发 WAZ(清池)': 'Distribute WAZ (drain pool)',
381
381
  '确认分发 WAZ?这将清空池子按 N 比例分配': 'Confirm distribute? This drains the pool by N ratio',
382
382
  'PV 待处理流水': 'Pending PV ledger',
@@ -384,10 +384,10 @@ const _EN = {
384
384
  'Tier 配置': 'Tier config',
385
385
  '(admin 可调)': '(admin adjustable)',
386
386
  '调整:POST /api/admin/tokenomics/tier with body {tier, pv_threshold, score_per_hit, active}': 'Adjust via POST /api/admin/tokenomics/tier',
387
- 'Top 推土机佣金': 'Top commission earners',
388
- 'Top 对碰收益': 'Top binary earners',
387
+ 'Top 三级佣金': 'Top commission earners',
388
+ 'Top 匹配收益': 'Top matching earners',
389
389
  '已处理流水': 'Processed',
390
- '已触发对碰': 'Settled',
390
+ '已触发匹配': 'Settled',
391
391
  '已分发 WAZ': 'Distributed',
392
392
  '推广佣金': 'Promo commission',
393
393
  '推广此商品 · 分享赚佣金': 'Promote this · share to earn',
@@ -402,8 +402,8 @@ const _EN = {
402
402
  '新人挂靠到你的': 'New user placed in your',
403
403
  '商品分享链接(在商品页点「推广此商品」自动生成,含两轨绑定)': 'Product share links (auto-generated via product page Promote button, dual-track)',
404
404
  '平台分享 · 仅 PV 条线': 'Platform share · PV only',
405
- '双轨链接': 'Dual-track link',
406
- '平台分享:仅建 PV 条线 · 双轨链接:同时绑推土机分享 + 原子能 PV': 'Platform share = PV line only · Dual-track = bind both 3-tier + PV',
405
+ '双区链接': 'Dual-zone link',
406
+ '平台分享:仅建 PV 条线 · 双区链接:同时绑三级佣金分享 + 积分 PV': 'Platform share = PV line only · Dual-zone = bind both 3-tier + PV',
407
407
  '津贴门控': 'Bonus gating',
408
408
  '查看资格用户 + 切换开关': 'View eligible users + toggle',
409
409
  '全局开关': 'Global switch',
@@ -423,7 +423,7 @@ const _EN = {
423
423
  '分享奖励待解锁': 'Share rewards locked',
424
424
  'Admin 强制授予': 'Admin grant override',
425
425
  '笔订单 — 可拿分享佣金': 'orders — can earn 3-tier commission',
426
- '完成至少 1 笔购买订单后,分享商品可拿分享佣金。当前可分享 PV 条线扩展双轨树': 'Complete ≥1 purchase to unlock 3-tier. PV-line sharing still works.',
426
+ '完成至少 1 笔购买订单后,分享商品可拿分享佣金。当前可分享 PV 条线扩展积分树': 'Complete ≥1 purchase to unlock 3-tier. PV-line sharing still works.',
427
427
  'L1 分享权限': 'L1 share permission',
428
428
  '可拿分享佣金': 'can earn 3-tier',
429
429
  '不可': 'no',
@@ -452,9 +452,9 @@ const _EN = {
452
452
  '偏好已保存': 'Preference saved',
453
453
  '系统检测到邀请链接': 'Invitation link detected',
454
454
  'inviter': 'Inviter',
455
- '是否加入对方的双轨 PV 树?': 'Join their binary PV tree?',
455
+ '是否加入对方的积分配对?': 'Join their points-matching group?',
456
456
  '系统将按推荐人偏好自动选择左/右区。一旦加入永久不变。': "Side picked by inviter's preference. Permanent once joined.",
457
- '已加入双轨树': 'Joined binary tree',
457
+ '已加入积分树': 'Joined team tree',
458
458
  '侧': 'Side',
459
459
  '注册门控': 'Registration gating',
460
460
  '开启后:无邀请码不能注册(admin/物流/仲裁/审核员 与 region=china 豁免)': 'When ON: no invite code → cannot register (admin/logistics/arbitrator/verifier + china region exempted)',
@@ -1109,7 +1109,7 @@ const _EN = {
1109
1109
  '拿到第一笔分享佣金': 'Earn first share commission',
1110
1110
  '创作首个原生内容': 'Create first native content',
1111
1111
  '团队达到 5 人': 'Team reaches 5',
1112
- '弱腿对碰 tier 1': 'Weak-leg tier 1 match',
1112
+ '弱侧匹配 tier 1': 'weak-side tier 1 match',
1113
1113
  '月度收益 100 WAZ': 'Monthly income 100 WAZ',
1114
1114
  '激活动态推荐': 'Activate dynamic L1',
1115
1115
  '团队达到 50 人': 'Team reaches 50',
@@ -1134,13 +1134,12 @@ const _EN = {
1134
1134
  '我的邀请链接': 'My referral link',
1135
1135
  '第一触点锁定 30 天': 'First-touch locked 30d',
1136
1136
  '指定左/右轨': 'Pin to LEFT/RIGHT',
1137
- '双轨左右区设置': 'Twin-rail L/R Settings',
1138
1137
  '左区码': 'LEFT code',
1139
1138
  '右区码': 'RIGHT code',
1140
1139
  '挂靠': 'Placed at',
1141
1140
  '团队分享': 'Team Sharing',
1142
- '双轨对碰': 'Binary Match',
1143
- '弱腿': 'Weak leg',
1141
+ '积分匹配': 'Matching',
1142
+ '弱侧': 'Weak side',
1144
1143
  '累计': 'Total',
1145
1144
  '近 7 日': 'Last 7d',
1146
1145
  '笔': 'records',
@@ -1184,7 +1183,7 @@ const _EN = {
1184
1183
  '例如:思翔教育007': 'e.g. SeasonEducation007',
1185
1184
  '在 TikTok / 小红书 口播这个口令,粉丝在 WebAZ 搜它就能找到你': 'Mention this anchor on TikTok/Xiaohongshu — fans can search it on WebAZ to find you',
1186
1185
  '在公开动态流显示我的活动': 'Show my activity in public feed',
1187
- '关闭后,你的购买/对碰/分润事件不会出现在 发现好物 > 动态': 'When off, your buy/match/commission events won\'t appear in Discover > Feed',
1186
+ '关闭后,你的购买/匹配/分润事件不会出现在 发现好物 > 动态': 'When off, your buy/match/commission events won\'t appear in Discover > Feed',
1188
1187
  '预览我的主页': 'Preview my profile',
1189
1188
  '我的关注/粉丝': 'My follows / fans',
1190
1189
  '被拉黑的用户的商品和动态对你不可见': 'Blocked users\' products and activity will be hidden from you',
@@ -1237,7 +1236,7 @@ const _EN = {
1237
1236
  // Promoter / Growth
1238
1237
  '左区推荐码': 'LEFT referral code',
1239
1238
  '右区推荐码': 'RIGHT referral code',
1240
- '双轨组织图(3 层)': 'Binary tree (3 levels)',
1239
+ '团队组织图(3 层)': 'team tree (3 levels)',
1241
1240
  '空左': 'Empty left',
1242
1241
  '空右': 'Empty right',
1243
1242
  '每节点显示 L=左累计 PV / R=右累计 PV': 'Each node shows L=left PV / R=right PV',
@@ -1300,7 +1299,7 @@ const _EN = {
1300
1299
  '暂无新品': 'No new items',
1301
1300
  '等待第一位买家': 'Waiting for first buyer',
1302
1301
  '← 发现好物': '← Discover',
1303
- '卖家最新上架、尚无成交 — 成为第一位发现者,触发推土机 + 原子能裂变奖励': 'Just listed, no sales yet — be the first discoverer and trigger 3-tier commission + binary PV rewards',
1302
+ '卖家最新上架、尚无成交 — 成为第一位发现者,触发三级佣金 + 积分配对奖励': 'Just listed, no sales yet — be the first discoverer and trigger 3-tier commission + points-matching rewards',
1304
1303
  '卖家最新上架、尚无成交 — 成为第一位发现者和传播者': 'Just listed, no sales yet — be the first discoverer and sharer',
1305
1304
 
1306
1305
  // Cart / orders
@@ -1537,7 +1536,7 @@ const _EN = {
1537
1536
  '详细 / 充提': 'Details / Top-up',
1538
1537
  '累计赚取': 'Total earned',
1539
1538
  '待结算点数': 'Pending points',
1540
- '原子能资产看板': 'Binary PV assets dashboard (原子能)',
1539
+ '积分资产看板': 'points-matching assets dashboard (积分)',
1541
1540
  '(设置一句话简介让人记住你)': '(Set a one-line bio to be memorable)',
1542
1541
 
1543
1542
  // Password / Auth
@@ -1636,7 +1635,7 @@ const _EN = {
1636
1635
  '永久分享推荐码': 'Permanent share code',
1637
1636
  '总资产': 'Total assets',
1638
1637
  '收入构成': 'Income breakdown',
1639
- '双轨已结算': 'Binary settled',
1638
+ '积分已结算': 'Settled',
1640
1639
  '销售收入': 'Sales income',
1641
1640
  '最近充值': 'Recent deposits',
1642
1641
  '最近提现': 'Recent withdrawals',
@@ -2084,14 +2083,14 @@ const _EN = {
2084
2083
  '商品推荐': 'Product promo',
2085
2084
  '打开': 'Open',
2086
2085
 
2087
- // Binary tree enhancements
2086
+ // team tree enhancements
2088
2087
  '我挂位置': 'My position',
2089
2088
  '左侧': 'left',
2090
2089
  '右侧': 'right',
2091
- '你还没加入任何上级的双轨树(独立根节点)': 'Not yet placed in any upline\'s binary tree (independent root)',
2092
- '本月对碰次数': 'Month hits',
2093
- '本月对碰 WAZ': 'Month WAZ',
2094
- '累计对碰次数': 'Total hits',
2090
+ '你还没加入任何上级的积分树(独立根节点)': 'Not yet placed in any upline\'s team tree (independent root)',
2091
+ '本月匹配次数': 'Month hits',
2092
+ '本月匹配 WAZ': 'Month WAZ',
2093
+ '累计匹配次数': 'Total hits',
2095
2094
  '点击节点查看 PV': 'click node for PV',
2096
2095
  '每节点显示 L=左累计 PV / R=右累计 PV · 点击节点看详情': 'L=left PV / R=right PV · click node for details',
2097
2096
  '点击查看 PV KPI': 'Click for PV KPI',
@@ -2100,7 +2099,7 @@ const _EN = {
2100
2099
  '深度': 'depth',
2101
2100
  '独立根节点(无上级)': 'Independent root (no upline)',
2102
2101
  '双腿均衡': 'Leg balance',
2103
- '累计对碰': 'Total hits',
2102
+ '累计匹配': 'Total hits',
2104
2103
  '累计获 WAZ': 'Total earned WAZ',
2105
2104
  '待结 Score': 'Pending Score',
2106
2105
  '查看 TA 的主页': 'View their profile',
@@ -2119,7 +2118,7 @@ const _EN = {
2119
2118
  '调用多样': 'API diversity',
2120
2119
  '仲裁败诉': 'Dispute loss',
2121
2120
  '同 IP 多号': 'Same IP cluster',
2122
- '双轨同支': 'Sponsor cross',
2121
+ '同支': 'Same-branch',
2123
2122
  '限速命中': 'Rate limit hits',
2124
2123
  '再 +': '+',
2125
2124
  '分解锁 raw mode': 'pts to unlock raw mode',
@@ -2213,7 +2212,7 @@ const _EN = {
2213
2212
  '这件商品还没在 WebAZ 上架。把它带进来 — 让买家在精准搜索时也能找到你。': 'This SKU is not on WebAZ yet. Bring it in — let buyers find you on precise search.',
2214
2213
  '为什么上架到 WebAZ': 'Why list on WebAZ',
2215
2214
  '· 协议费仅 2%(vs 淘宝 5%+ 抽佣 + 竞价推广)': '· Protocol fee 2% only (vs Taobao 5%+ commission + bid promotion)',
2216
- '· 分享成交拿 commission(推土机 70/20/10)': '· Earn share commission (3-tier 70/20/10)',
2215
+ '· 分享成交拿 commission(三级佣金 70/20/10)': '· Earn share commission (3-tier 70/20/10)',
2217
2216
  '· 链上稳定币直达,无平台资金截留': '· On-chain stablecoin settlement, no platform float',
2218
2217
  '· Agent 自动比价推荐 + alias 精准命中': '· Agent auto-compares + precise alias matching',
2219
2218
  '上架只需 3 步': 'List in 3 steps',
@@ -2412,11 +2411,11 @@ const _EN = {
2412
2411
  '零上架成本': 'Zero listing cost',
2413
2412
  'AI 店长自主上架、自动生成多语种商品矩阵。首单成交仅锁定 15% 作买家保护(Trusted 卖家免除)。':
2414
2413
  'AI shopkeeper lists products and generates multilingual catalogs autonomously. Only the first sale locks 15% as buyer protection (Trusted sellers exempt).',
2415
- '买家 Agent 意图对碰': 'Buyer Agent intent matching',
2414
+ '买家 Agent 意图匹配': 'Buyer Agent intent matching',
2416
2415
  '零推广费': 'Zero promotion fees',
2417
2416
  '全网买家 Agent 携精准需求(Alias)全天候巡航,与商品语义刚需匹配,订单全自动闭合成交。':
2418
2417
  'Buyer Agents across the network roam 24/7 with precise needs (Aliases), matching products by semantic intent and closing orders autonomously.',
2419
- '智能体裂变分润': 'Agent-driven viral revenue share',
2418
+ '智能体扩散分润': 'Agent-driven viral revenue share',
2420
2419
  '秒级自动分账': 'Instant on-chain settlement',
2421
2420
  '商品由其他节点或达人 Agent 智能分享成交,下游分润通过智能合约去中心化自动清算,即刻到账。':
2422
2421
  'Products surface via other nodes or influencer Agents; downstream revenue share is auto-settled on-chain — instantly credited.',
@@ -3161,7 +3160,7 @@ const _EN = {
3161
3160
  '卖家收入速览': 'Seller Income Summary',
3162
3161
  '商品销售': 'Product Sales',
3163
3162
  '推荐分润': 'Referral Comm.',
3164
- '对碰已结': 'Binary Settled',
3163
+ '匹配已结': 'Settled',
3165
3164
  '待结算': 'Pending',
3166
3165
  'escrow 中': 'in escrow',
3167
3166
 
@@ -4579,7 +4578,7 @@ const _EN = {
4579
4578
  '已是共建身份': 'Already opted in',
4580
4579
  '你已 opted-in。如需查看状态或退出,前往 ': 'You are opted in. To view status or opt out, go to ',
4581
4580
  '本流程与购物无关': 'This flow is not part of shopping',
4582
- '你可以随时退出,不影响任何已下单或未来订单。本流程涉及经济关系登记(三级佣金 + 双轨配对),请仔细阅读全部条款。': 'You can leave anytime without affecting any past or future orders. This is an economic-relationship registration (3-tier commission + binary PV matching) — please read all terms carefully.',
4581
+ '你可以随时退出,不影响任何已下单或未来订单。本流程涉及经济关系登记(三级佣金 + 积分配对),请仔细阅读全部条款。': 'You can leave anytime without affecting any past or future orders. This is an economic-relationship registration (3-tier commission + points-matching) — please read all terms carefully.',
4583
4582
  '门槛(全部通过才能申请)': 'Eligibility (all must pass to apply)',
4584
4583
  '已完成订单': 'Completed orders',
4585
4584
  'Passkey 已注册': 'Passkey registered',
@@ -5569,7 +5568,7 @@ const _EN = {
5569
5568
  '调用多样性': 'Endpoint diversity',
5570
5569
  '争议败诉': 'Dispute losses',
5571
5570
  '同 IP 异户': 'Same-IP users',
5572
- '双轨命中': 'Cross-rail hits',
5571
+ '匹配命中': 'Matching hits',
5573
5572
  '限速命中': 'Rate-limit hits',
5574
5573
  '阈值': 'Thresholds',
5575
5574
 
@@ -10198,8 +10198,8 @@ db.exec(`
10198
10198
  const existing = db.prepare("SELECT version FROM rewards_consent_texts WHERE version = '1.0'").get();
10199
10199
  if (existing)
10200
10200
  return;
10201
- const textZh = 'WebAZ 共建身份(rewards opt-in)v1.0 — 由 RFC-002 §3.3 / §3.10 定义。本同意涉及经济关系登记 + Passkey 真人签名 + 三级佣金 + 二元配对树参与。详见 RFC-002 全文。本流程与购物无关,可随时退出,不影响订单。';
10202
- const textEn = 'WebAZ Builder Identity (rewards opt-in) v1.0 — defined by RFC-002 §3.3 / §3.10. This consent records an economic relationship with Passkey-signed proof of personhood + participation in 3-tier commission + binary PV matching tree. See full RFC-002. This flow is not part of shopping; you may leave anytime without affecting orders.';
10201
+ const textZh = 'WebAZ 共建身份(rewards opt-in)v1.0 — 由 RFC-002 §3.3 / §3.10 定义。本同意涉及经济关系登记 + Passkey 真人签名 + 三级佣金 + 积分配对参与。详见 RFC-002 全文。本流程与购物无关,可随时退出,不影响订单。';
10202
+ const textEn = 'WebAZ Builder Identity (rewards opt-in) v1.0 — defined by RFC-002 §3.3 / §3.10. This consent records an economic relationship with Passkey-signed proof of personhood + participation in 3-tier commission + points-matching. See full RFC-002. This flow is not part of shopping; you may leave anytime without affecting orders.';
10203
10203
  const hash = createHash('sha256').update(textZh + '\n---\n' + textEn).digest('hex');
10204
10204
  db.prepare(`INSERT INTO rewards_consent_texts (version, hash, change_class, effective_at, text_zh, text_en, changelog)
10205
10205
  VALUES (?, ?, 'major', ?, ?, ?, ?)`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seasonkoh/webaz",
3
- "version": "0.1.20",
3
+ "version": "0.1.21",
4
4
  "description": "[PRE-LAUNCH] Agent-native decentralized commerce protocol. Humans and AI agents trade on the same protocol via MCP tools. ⚠️ Repository currently private until W8 public launch — GitHub links may return 404. See https://webaz.xyz for status.",
5
5
  "main": "dist/mcp.js",
6
6
  "bin": {