@whyshu/argent-engine 0.7.6 → 0.7.7

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.
Files changed (43) hide show
  1. package/MANIFEST.json +39 -35
  2. package/engine/VERSION +1 -1
  3. package/engine/core/contracts/argent.contracts.json +12 -4
  4. package/engine/scripts/appointment-create.mjs +10 -2
  5. package/engine/scripts/appointment-worker.mjs +72 -15
  6. package/engine/scripts/appointment_grab.py +132 -21
  7. package/engine/scripts/argent-machine-setup.mjs +118 -0
  8. package/engine/scripts/argent-runner.mjs +63 -10
  9. package/engine/scripts/capability-packs.lock.json +54 -51
  10. package/engine/scripts/ci-run.sh +14 -2
  11. package/engine/scripts/collect-evidence.mjs +1 -1
  12. package/engine/scripts/customer-preflight.py +33 -0
  13. package/engine/scripts/flow-auto-retry.py +3 -0
  14. package/engine/scripts/flow-requirements.json +23 -13
  15. package/engine/scripts/flow-session-retention.mjs +88 -0
  16. package/engine/scripts/flow-trigger-wake.mjs +13 -1
  17. package/engine/scripts/flow-trigger.sh +2 -1
  18. package/engine/scripts/flow_config.py +4 -0
  19. package/engine/scripts/flow_failure.py +9 -4
  20. package/engine/scripts/flow_preflight.py +30 -0
  21. package/engine/scripts/flow_retry.py +22 -7
  22. package/engine/scripts/gen-agent-bundles.mjs +1 -1
  23. package/engine/scripts/gen-preset-rows.mjs +2 -2
  24. package/engine/scripts/invoice_lip_runner.py +30 -2
  25. package/engine/scripts/invoice_stageb.py +101 -0
  26. package/engine/scripts/login-readiness.py +220 -0
  27. package/engine/scripts/ml-oauth-setup.mjs +1 -1
  28. package/engine/scripts/orchestrator.py +416 -30
  29. package/engine/scripts/probe_ml_site.py +103 -0
  30. package/engine/scripts/release-argent.sh +15 -1
  31. package/engine/skills/argent-machine-onboarding/SKILL.md +143 -0
  32. package/engine/skills/internal.json +4 -0
  33. package/engine/skills/ml-full-appointment/SKILL.md +21 -13
  34. package/engine/skills/ml-invoice/SKILL.md +1 -1
  35. package/engine/skills/ml-invoice-xzh/SKILL.md +2 -2
  36. package/engine/version.mjs +1 -1
  37. package/engine/verticals/_engine-words.baseline.txt +42 -23
  38. package/engine/verticals/mercadolibre/flows.json +9 -5
  39. package/engine/verticals/mercadolibre/manifest.json +5 -4
  40. package/engine/verticals/mercadolibre/prompts/daily-report.failure.md +1 -1
  41. package/engine/verticals/mercadolibre/prompts/daily-report.md +7 -10
  42. package/package.json +1 -1
  43. package/engine/scripts/ml-ads.mjs +0 -181
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env python3
2
+ """只读探测某店铺站点(Phase 0)。
3
+
4
+ 用法:
5
+ python3 scripts/probe_ml_site.py --store '巴西-1店' --out /tmp/brazil-probe.json
6
+ 只做导航/读取 DOM/截图,不点击提交、不写任何业务数据。
7
+ """
8
+ import argparse
9
+ import asyncio
10
+ import json
11
+ import os
12
+ import sys
13
+ from datetime import datetime
14
+ from pathlib import Path
15
+ from types import SimpleNamespace
16
+
17
+ ROOT = Path(__file__).resolve().parent
18
+ sys.path.insert(0, str(ROOT))
19
+ import orchestrator as O # noqa: E402
20
+
21
+ CANDIDATES = [
22
+ "https://www.mercadolivre.com.br/",
23
+ "https://vendedores.mercadolivre.com.br/",
24
+ "https://myaccount.mercadolivre.com.br/",
25
+ "https://vendedores.mercadolivre.com.br/shipping/inbounds",
26
+ "https://myaccount.mercadolivre.com.br/shipping/inbounds",
27
+ ]
28
+ PROBE_JS = r"""() => {
29
+ const txt = (document.body ? document.body.innerText : '').replace(/\s+/g, ' ').slice(0, 3000);
30
+ const links = [...document.querySelectorAll('a')].map(a => ({
31
+ text: (a.innerText || '').trim().slice(0, 120),
32
+ href: a.href || ''
33
+ })).filter(x => /shipping|inbound|appointment|envio|venda|reserva/i.test(x.href + ' ' + x.text)).slice(0, 40);
34
+ const buttons = [...document.querySelectorAll('button,[role=button]')].map(b => (b.innerText || '').trim()).filter(Boolean).slice(0, 30);
35
+ return {title: document.title, url: location.href, text: txt, links, buttons};
36
+ }"""
37
+
38
+
39
+ async def main():
40
+ ap = argparse.ArgumentParser()
41
+ ap.add_argument('--store', required=True)
42
+ ap.add_argument('--out', default='')
43
+ ap.add_argument('--shipment', default='')
44
+ args = ap.parse_args()
45
+ out_path = Path(args.out or f"/tmp/ml-site-probe-{args.store}.json")
46
+ result = {'store': args.store, 'probedAt': datetime.now().isoformat(), 'pages': [], 'shots': []}
47
+ cfg = O.load_config(); cfg.store_name = args.store
48
+ sel = O.Selectors()
49
+ orch = O.Orchestrator(cfg, sel, SimpleNamespace(no_lock=True))
50
+ orch.state.store_name = args.store
51
+ try:
52
+ _dl, port = orch._open_store()
53
+ if not port:
54
+ result['error'] = 'CDP 端口未发现'
55
+ return
56
+ orch.browser.cdp_url = f'http://127.0.0.1:{port}'
57
+ await orch._connect_with_port_rediscovery()
58
+ await orch._preflight_store_window(phase='probe-ml-site')
59
+ page = orch.browser.page
60
+ urls = list(CANDIDATES)
61
+ if args.shipment:
62
+ urls = [
63
+ f"https://vendedores.mercadolivre.com.br/shipping/inbounds/{args.shipment}",
64
+ f"https://myaccount.mercadolivre.com.br/shipping/inbounds/{args.shipment}",
65
+ f"https://vendedores.mercadolivre.com.br/shipping/inbounds/{args.shipment}/appointment-v2",
66
+ f"https://myaccount.mercadolivre.com.br/shipping/inbounds/{args.shipment}/appointment-v2",
67
+ ]
68
+ for i, url in enumerate(urls):
69
+ try:
70
+ resp = await page.goto(url, wait_until='domcontentloaded', timeout=45000)
71
+ await asyncio.sleep(3)
72
+ info = await page.evaluate(PROBE_JS)
73
+ info['requested'] = url
74
+ info['httpStatus'] = resp.status if resp else None
75
+ result['pages'].append(info)
76
+ shot = out_path.with_name(out_path.stem + f'-{i}.png')
77
+ try:
78
+ await page.screenshot(path=str(shot), full_page=False)
79
+ result['shots'].append(str(shot))
80
+ except Exception:
81
+ pass
82
+ print(json.dumps({'requested': url, 'final': info.get('url'), 'title': info.get('title')}, ensure_ascii=False), flush=True)
83
+ except Exception as exc:
84
+ result['pages'].append({'requested': url, 'error': f'{type(exc).__name__}: {exc}'})
85
+ print(f'ERR {url}: {type(exc).__name__}: {exc}', file=sys.stderr, flush=True)
86
+ except Exception as exc:
87
+ result['error'] = f'{type(exc).__name__}: {exc}'
88
+ finally:
89
+ try:
90
+ await orch.browser.close()
91
+ except Exception:
92
+ pass
93
+ try:
94
+ orch.release_store_executor_lock()
95
+ except Exception:
96
+ pass
97
+ out_path.parent.mkdir(parents=True, exist_ok=True)
98
+ out_path.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding='utf-8')
99
+ print(f'WROTE {out_path}', flush=True)
100
+
101
+
102
+ if __name__ == '__main__':
103
+ asyncio.run(main())
@@ -60,7 +60,7 @@ DL_URL="https://whyshu.com/dl"
60
60
  # whyshu-svr 在服务器上的**扁平**部署目录(pm2 cwd;能力包清单就部署在这里)
61
61
  SRV_DEPLOY="${SRV_DEPLOY:-/home/whyshu/server}"
62
62
  REPO_DIR="$(cd "$(dirname "$0")/.." && pwd)"
63
- # push 目标 remote:默认仓库第一个 remote(本机为 whyshu);可用 ARGENT_RELEASE_REMOTE 覆盖
63
+ # push 目标 remote:默认仓库第一个 remote(2026-10-20 起 = origin,GitHub 主库);可用 ARGENT_RELEASE_REMOTE 覆盖
64
64
  REMOTE="${ARGENT_RELEASE_REMOTE:-$(git -C "$REPO_DIR" remote | head -1)}"
65
65
 
66
66
  # 核心分发文件(与服务器 dl/ 直接对应)
@@ -498,6 +498,20 @@ else
498
498
  FAIL=1
499
499
  fi
500
500
 
501
+ # 1a2. 契约 argentVersion 与 VERSION 同批(防契约版本停在旧值、发布后才发现漂移;CI 判据 contracts / version-consistency)
502
+ if [[ -f core/contracts/argent.contracts.json ]]; then
503
+ CAV="$(node -e "const fs=require('fs');try{process.stdout.write(String(JSON.parse(fs.readFileSync('core/contracts/argent.contracts.json','utf8')).argentVersion||''))}catch(e){process.stdout.write('(不可解析)')}" 2>/dev/null || true)"
504
+ if [[ "$CAV" != "$VERSION" ]]; then
505
+ echo "✗ 契约 argentVersion(${CAV})≠ VERSION(${VERSION})—— 先把 core/contracts/argent.contracts.json 的 argentVersion 改为 ${VERSION} 并提交(同批抬版纪律)"
506
+ FAIL=1
507
+ else
508
+ echo "✓ 契约 argentVersion = ${VERSION}(一致)"
509
+ fi
510
+ else
511
+ echo "✗ 仓库无 core/contracts/argent.contracts.json"
512
+ FAIL=1
513
+ fi
514
+
501
515
  # 1b. git working tree clean
502
516
  if [[ -n "$(git status --porcelain)" ]]; then
503
517
  echo "✗ git working tree 有未提交改动:"
@@ -0,0 +1,143 @@
1
+ ---
2
+ name: argent-machine-onboarding
3
+ description: 指导用户把本机接入 ERP 机器执行面:在 ERP「机器管理」登记机器并签发 machine token,用剪贴板安全交给本机脚本写入 agent-report.json,校验后由用户手动重启 dsh。用于用户说“接入这台机器 / 签发机器 token / 机器管理 / 配置 agent-report / 让本机领任务”等场景。
4
+ ---
5
+
6
+ # Argent 本机接入 ERP 执行面
7
+
8
+ 本技能的目标:让用户**只做 ERP 页面上的点击**,token 不经过聊天、不进入命令行历史,由本机脚本完成校验和配置。
9
+
10
+ ## 前置判断
11
+
12
+ 1. 确认当前是本机 dsh 会话,且用户要接入的是**这台机器**。
13
+ 2. 读配置(不要打印 token):
14
+
15
+ ```bash
16
+ python3 - <<'PY'
17
+ import json, os
18
+ p = os.path.expanduser('~/.dsh/argent/agent-report.json')
19
+ d = json.load(open(p))
20
+ print({k: ('***' if k in ('machineToken','runnerToken') else v) for k, v in d.items()})
21
+ PY
22
+ ```
23
+
24
+ 记录 `machineId`、`tenantAppId`、`serverUrl`,后续不需要用户重复填。
25
+
26
+ 3. 确认用户是租户管理员。签发 token 需要 `admin` 角色。
27
+
28
+ > **一台机器只绑定一个租户**:同一物理机不要在两个租户各登记一次;若确实需要给两家企业用,请使用两个不同的 machineId + 两套独立 Argent 配置/实例,绝不共用一个 machineId 或 token。
29
+
30
+ ## 用户操作步骤(由 Agent 逐条引导)
31
+
32
+ 告诉用户打开:
33
+
34
+ ```text
35
+ https://whyshu.com/admin/argent/
36
+ ```
37
+
38
+ 然后:
39
+
40
+ 1. 进入「办公室现场」;
41
+ 2. 点击「机器管理」;
42
+ 3. 确认当前机器已登记(未登记则先登记,machineId 用配置里的值);
43
+ 4. 点击该机器的「签发 token」;
44
+ 5. 确认轮换提示;
45
+ 6. 点击「复制 token」;
46
+ 7. 回到这里回复:**已复制**。
47
+
48
+ ⚠️ 不要让用户把 token 粘贴到聊天里。
49
+ ⚠️ 不要替用户登录 ERP、不要抓取浏览器 cookie 或 token。
50
+
51
+ ## Agent 收到“已复制”后
52
+
53
+ 运行(会从系统剪贴板读取,不打印 token):
54
+
55
+ ```bash
56
+ # 已安装的 Argent runtime 自带此脚本;开发机仓库再兜底。
57
+ SETUP="$HOME/.argent-dsh/scripts/argent-machine-setup.mjs"
58
+ [ -f "$SETUP" ] || SETUP="/Users/chester/Code/argent-dsh/scripts/argent-machine-setup.mjs"
59
+ node "$SETUP" --from-clipboard
60
+ ```
61
+
62
+ 脚本会:
63
+
64
+ - 校验 JWT 的 `scope=machine`、`appId`、`machineId`、过期时间;
65
+ - 调 ERP `/machines/:machineId/commands` 实测 token;
66
+ - 备份旧配置;
67
+ - 写入 `~/.dsh/argent/agent-report.json`;
68
+ - 移除旧 `runnerToken`,写入 `machineToken`;
69
+ - 设置 `enabled=true`、`chatEnabled=true`、文件权限 600;
70
+ - 不输出 token。
71
+
72
+ 如果校验失败:
73
+
74
+ - `token 已过期` → 回 ERP 重新签发;
75
+ - `machineId 不一致` → 确认配置里的 machineId 与 ERP 机器列表一致;
76
+ - `403` → 机器被吊销或 token 已轮换;
77
+ - 剪贴板为空 → 让用户重新点「复制 token」。
78
+
79
+ ## 配置完成后
80
+
81
+ 必须让用户**手动重启本机 dsh**:
82
+
83
+ ```bash
84
+ # 已安装 runtime 自带重启脚本;开发机仓库再兜底。
85
+ RESTART="$HOME/.argent-dsh/scripts/dsh-restart.sh"
86
+ [ -f "$RESTART" ] || RESTART="/Users/chester/Code/argent-dsh/scripts/dsh-restart.sh"
87
+ bash "$RESTART"
88
+ ```
89
+
90
+ ⛔ Agent 不执行重启命令;这会杀掉当前会话所在服务。
91
+
92
+ 重启后验证:
93
+
94
+ ```bash
95
+ curl -s http://127.0.0.1:3080/api/argent-office/status | python3 -m json.tool
96
+ ```
97
+
98
+ 重点:
99
+
100
+ ```text
101
+ enabled: true
102
+ machineId: <配置里的值>
103
+ lastOkAt: 有值
104
+ chat.enabled: true
105
+ chat.started: true
106
+ ```
107
+
108
+ 然后让用户在 ERP「机器管理」刷新,确认:
109
+
110
+ ```text
111
+ 在线
112
+ machine token
113
+ ```
114
+
115
+ ## 第一条任务建议
116
+
117
+ 在 ERP 办公室现场 → 「+ 派发任务」:
118
+
119
+ ```text
120
+ WorkItem ID:smoke-001
121
+ AgentNode ID:agent.local.smoke
122
+ Preset:argent-dev
123
+ 标题:只读冒烟检查
124
+ 仓库:argent-dsh
125
+ 基准分支:main
126
+ 验收:不修改文件;返回 git status 摘要
127
+ 动作:repo.read
128
+ ```
129
+
130
+ 状态应为:
131
+
132
+ ```text
133
+ queued → claimed → done
134
+ ```
135
+
136
+ ## 安全红线
137
+
138
+ - token 只落 `~/.dsh/argent/agent-report.json`,权限 600;
139
+ - token 不写进仓库、日志、卡片、聊天;
140
+ - 如果用户已经粘贴 token 到聊天:不要复述,完成接入后建议重新签发一次 token;
141
+ - 不使用 `--token` 参数(会进入 shell 历史);
142
+ - 不让 Agent 自行重启 dsh;
143
+ - 不使用 SSH / EasyTier 操作客户机;本技能只适用于用户本机。
@@ -32,6 +32,10 @@
32
32
  "lktopapp-dev": {
33
33
  "reason": "LKTOP APP(uni-app / 微信小游戏)开发知识 —— 另一个客户线的内部角色流程",
34
34
  "since": "2026-09-11"
35
+ },
36
+ "argent-machine-onboarding": {
37
+ "reason": "本机接入 ERP 执行面:用剪贴板把 machine token 写入本机配置并引导重启 dsh —— 我方运维/接入流程,不发给客户",
38
+ "since": "2026-10-23"
35
39
  }
36
40
  }
37
41
  }
@@ -26,13 +26,17 @@ description: 美客多 FULL 抢预约对话与 ERP 任务创建(BOT/gateway
26
26
 
27
27
  - **店铺**(必填;SKU 可能跨店)
28
28
  - **SKU 或货件号**(二选一;货件号优先续传)
29
- - **日期窗口**:用户本次给的具体要求,两种模式:
30
- - 用户说 `最近5天/最近5个可用日` ⇒ `dateMode=available_days`, `availableDays=5`(跳过 disabled,取最近 5 个可选日,不是日历固定 5 天);
31
- - 用户给绝对范围 `2026-10-20 ~ 2026-10-25` ⇒ `dateMode=range`, `dateFrom/dateTo`;
29
+ - **三个预约条件(必须逐项确认,缺一不可)**:
30
+ 1. **日期范围**:用户本次给的绝对日期,例如 `2026-10-22 ~ 2026-10-24`;
31
+ 或 `最近 N 个可选日` ⇒ `dateMode=available_days`, `availableDays=N`(跳过 disabled,取最近 N 个可选日);
32
+ 2. **星期范围**:ISO 周几数组,`1=周一 … 7=周日`,例如周一到周六 = `[1,2,3,4,5,6]`;
33
+ 3. **时间范围**:`HH:mm` 起止,例如 `07:00` ~ `21:00`;**只在这个时间范围内的时段可提交预约**。
34
+ - 用户只说了其中一项/两项时,必须追问缺失项,不得自行补默认值;三项都确认后才进入二次确认。
35
+ - `range` 模式同时保存 `dateFrom/dateTo`;`available_days` 模式保存 `availableDays`,但仍必须保存 `weekdays/timeFrom/timeTo`。
32
36
  - 若只给 SKU:**不读取 lip 表**,必须通过对话补齐 FULL 建单所需字段:店铺、SKU、数量 `quantity`、箱数 `boxCount`(产品名可选);缺什么问什么;
33
37
  - 若给货件号:校验该货件存在,店铺/记录一致,当前进度允许预约;
34
38
  - 所有参数以任务形式传给 ERP,worker 只使用任务参数;
35
- - 轮询间隔默认 60 秒(后台参数,不需用户每次提供)。
39
+ - **检测间隔默认 30 秒**;创建前必须问运营:“默认每 30 秒检测一次;是否改成 45 秒或其他(允许 30-600 秒)?”;运营确认后按确认值传 `--poll-interval`。未确认间隔不得创建任务。
36
40
 
37
41
  不要把 7/14 天写成固定变量;**每个任务保存用户本次的 dateFrom/dateTo**。
38
42
 
@@ -40,7 +44,7 @@ description: 美客多 FULL 抢预约对话与 ERP 任务创建(BOT/gateway
40
44
 
41
45
  创建任务前回显一段摘要,例如:
42
46
 
43
- > 确认信息:店铺 墨西哥-1店-子账号;SKU HW-MX-168;预约日期 2026-10-20 ~ 2026-10-25;只抢预约,不继续箱唛/发票。回复「开始」才执行。
47
+ > 确认信息:店铺 墨西哥-1店-子账号;货件 76623409;日期 2026-10-22 ~ 2026-10-24;星期 周一至周六;时间 07:00-21:00;检测间隔默认 30 秒(可改 45 秒);只抢预约,不继续箱唛/发票。回复「开始」才执行。
44
48
 
45
49
  用户明确说「开始」/「确认」后才创建 ERP 任务;未确认不得创建。
46
50
 
@@ -49,12 +53,12 @@ description: 美客多 FULL 抢预约对话与 ERP 任务创建(BOT/gateway
49
53
  BOT/gateway 通过确定性 CLI 创建任务(不在会话里轮询):
50
54
 
51
55
  ```bash
52
- node ~/.argent-dsh/scripts/appointment-create.mjs --json '<任务 JSON>'
56
+ node ~/.argent-dsh/scripts/appointment-create.mjs --json '<任务 JSON>' --poll-interval <30|45|...>
53
57
 
54
58
  脚本会自动读取本角色已确认的通知群(`gateway.json`);首次使用未配置群会返回 `missing_notify_group`。
55
59
  ```
56
60
 
57
- 返回 `{ ok, id, status }` 后,BOT 回复“已创建任务 #id”。
61
+ 返回 `{ ok, id, status }` 后,BOT 回复“已创建任务 #id”;worker 会在飞书发一张「抢预约进行中」卡片,同一张卡片每轮更新当前轮次/日期状态,成功或停止时更新为最终结果。
58
62
 
59
63
  尽量传 `--chat-id`/`--open-id`,worker 完成/停止时服务端会用 FULL BOT 通知发起人并附逐日结果。
60
64
 
@@ -69,17 +73,20 @@ POST /api/argent/v1/tenants/<tenantAppId>/appointments
69
73
  "quantity": 100, // SKU-only 必填
70
74
  "boxCount": 10, // SKU-only 必填
71
75
  "productName": "", // 可选
72
- "dateMode": "available_days",
73
- "availableDays": 5,
74
- // range 模式才填 dateFrom/dateTo
75
- "windowText": "10/20-10/25",
76
- "pollIntervalSec": 60
76
+ "dateMode": "range",
77
+ "dateFrom": "2026-10-22",
78
+ "dateTo": "2026-10-24",
79
+ "weekdays": [1, 2, 3, 4, 5, 6],
80
+ "timeFrom": "07:00",
81
+ "timeTo": "21:00",
82
+ "windowText": "22-24号 周一至周六7:00-21:00",
83
+ "pollIntervalSec": 30
77
84
  }
78
85
  ```
79
86
 
80
87
  返回任务 `queued` 后,BOT 回复:
81
88
 
82
- > 已创建抢预约任务 #<id>,worker 会按 60 秒一轮执行;回复「停止」可终止。
89
+ > 已创建抢预约任务 #<id>,worker 会按 <确认的间隔> 秒一轮执行;回复「停止」可终止。
83
90
 
84
91
  ## 用户停止
85
92
 
@@ -96,6 +103,7 @@ node ~/.argent-dsh/scripts/appointment-stop.mjs <AppointmentTask id>
96
103
  - ⛔ 不在 BOT/gateway 会话里执行浏览器操作或循环轮询;
97
104
  - ⛔ 不跑 FULL 步骤 5–8(箱唛/标签/发票/完成态);
98
105
  - ⛔ 不把 7/14 天硬编码;不替用户改日期范围;
106
+ - ⛔ 不从历史任务/上次任务继承星期或时间;每次必须重新确认三个条件;
99
107
  - ⛔ 未二次确认不创建任务;
100
108
  - ⛔ 同一店铺预约仍走 ERP/编排器的同店步骤4互斥锁,避免与 FULL 任务串预约。
101
109
 
@@ -176,7 +176,7 @@ python3 scripts/wenyao_run.py --shipment <货件号> --english-name "..." \
176
176
 
177
177
  - **本机(chester Mac)= 开发/测试机**:`PAUSE_POLL` + `PAUSE_INVOICE` 已置位,**不抢生产行**。手工试跑要单独执行 runner。
178
178
  - **生产 = Huangwei 客户机 Mac**:真实 FULL + 发票流程跑在那里。
179
- - 本机对本仓库的改动要 **commit + `git push whyshu main`**(远端名是 `whyshu`,不是 `origin`),再在安装克隆 `~/.argent-dsh` `git pull`,技能同步到 `~/.dsh/skills/`。
179
+ - 本机对本仓库的改动要 **commit + `git push`**(`origin` = GitHub 主库;自建 git 是只读镜像,直推会被拒),再在安装克隆 `~/.argent-dsh` `git pull`(镜像只读路径仍可用),技能同步到 `~/.dsh/skills/`。
180
180
 
181
181
  ## 2. 数据在哪
182
182
 
@@ -111,7 +111,7 @@ description: "鑫中航货代发票流程技能(Argent on DSH)——与文
111
111
  收口 —— 它把「结论 + 动作」**同一串**写进表「发票错误信息」与台账(⛔ 不许只写台账、
112
112
  不许手写 `--error-message`);成功走完用 `--outcome success` 清空该列。详见 `ml-invoice` §6.2.1。
113
113
 
114
- **红线(定时/自动轮)**:只读影子;**禁止**门户写操作、禁止写表;真跑由用户批准的人工轮执行。
114
+ **执行口径(2026-10-22 用户确认)**:字段齐备后**默认真实执行**:生成 → 登录门户上传 → 下载大货标签 → 回写状态;门户访问为常设授权。只有登录失败/滑块/账号异常/缺字段等 needs_human 才停下交人。
115
115
 
116
116
  ## 7. 待客户机核对(真跑前必须落实,不猜)
117
117
 
@@ -129,5 +129,5 @@ description: "鑫中航货代发票流程技能(Argent on DSH)——与文
129
129
 
130
130
  - [ ] `python3 ~/.argent-dsh/scripts/flow_config.py --list` 里 `xzh-invoice` 源解析成功(表 id 来自 invoice-mapping.json)
131
131
  - [ ] `flow_triage.py --flow xzh-invoice` 能列出候选(或明确为空)
132
- - [ ] 影子跑不写任何字段、不碰门户
132
+ - [ ] 生成前核对字段;真实执行走完整链(生成 → 门户上传 → 标签 → 回写)
133
133
  - [ ] 真写前:写前备份 + 写后读回 + 审计三件套就位(§7.2 落实后)
@@ -1 +1 @@
1
- export const VERSION = "0.7.6"
1
+ export const VERSION = "0.7.7"
@@ -3,6 +3,9 @@ plugins/argent-core/src/index.js ziniao 28
3
3
  plugins/argent-core/src/index.js 紫鸟 6
4
4
  plugins/argent-core/src/index.js 美客多 1
5
5
  plugins/argent-core/src/index.js 鑫中航 1
6
+ plugins/argent-dsh/dist/client.js ziniao 6
7
+ plugins/argent-dsh/dist/client.js 紫鸟 5
8
+ plugins/argent-dsh/dist/client.js 美客多 11
6
9
  plugins/argent-flow/package.json 文鳐 1
7
10
  plugins/argent-flow/src/index.js wenyao 2
8
11
  plugins/argent-flow/src/index.js 文鳐 1
@@ -16,37 +19,38 @@ plugins/argent-ml/package.json 美客多 1
16
19
  plugins/argent-ml/src/index.js 紫鸟 4
17
20
  plugins/argent-ml/src/index.js 美客多 2
18
21
  plugins/argent-presets/package.json lktop 2
22
+ plugins/argent-presets/presets.json lip_ 1
19
23
  plugins/argent-presets/presets.json lktop 3
20
24
  plugins/argent-presets/presets.json wenyao 1
21
25
  plugins/argent-presets/presets.json xzh- 1
22
26
  plugins/argent-presets/presets.json 云宠 3
23
27
  plugins/argent-presets/presets.json 文鳐 2
24
- plugins/argent-presets/presets.json 美客多 8
28
+ plugins/argent-presets/presets.json 美客多 6
25
29
  plugins/argent-presets/presets.json 鑫中航 3
26
- plugins/argent-presets/presets/argent-lktop-pm.patch.yml lktop 9
30
+ plugins/argent-presets/presets/argent-lktop-pm.patch.yml lktop 8
27
31
  plugins/argent-presets/presets/argent-lktopapp-dev.patch.yml lktop 9
28
32
  plugins/argent-presets/presets/argent-ml-daily.patch.yml 紫鸟 1
29
- plugins/argent-presets/presets/argent-ml-daily.patch.yml 美客多 13
30
- plugins/argent-presets/presets/argent-ml-dev.patch.yml 紫鸟 2
31
- plugins/argent-presets/presets/argent-ml-dev.patch.yml 美客多 6
33
+ plugins/argent-presets/presets/argent-ml-daily.patch.yml 美客多 9
34
+ plugins/argent-presets/presets/argent-ml-dev.patch.yml 美客多 4
32
35
  plugins/argent-presets/presets/argent-ml-fulfillment.patch.yml 紫鸟 1
33
36
  plugins/argent-presets/presets/argent-ml-fulfillment.patch.yml 美客多 10
34
37
  plugins/argent-presets/presets/argent-ml-invoice-wy.patch.yml wenyao 5
35
38
  plugins/argent-presets/presets/argent-ml-invoice-wy.patch.yml 文鳐 5
36
39
  plugins/argent-presets/presets/argent-ml-invoice-wy.patch.yml 美客多 1
37
40
  plugins/argent-presets/presets/argent-ml-invoice-wy.patch.yml 鑫中航 1
41
+ plugins/argent-presets/presets/argent-ml-invoice-xzh.patch.yml lip_ 2
38
42
  plugins/argent-presets/presets/argent-ml-invoice-xzh.patch.yml xzh- 3
39
43
  plugins/argent-presets/presets/argent-ml-invoice-xzh.patch.yml 美客多 1
40
- plugins/argent-presets/presets/argent-ml-invoice-xzh.patch.yml 鑫中航 5
44
+ plugins/argent-presets/presets/argent-ml-invoice-xzh.patch.yml 鑫中航 6
41
45
  plugins/argent-presets/presets/argent-pet-dev.patch.yml 云宠 8
42
46
  plugins/argent-presets/presets/argent-whyshu-pm.patch.yml 云宠 2
43
47
  plugins/argent-presets/src/index.js lktop 2
44
- plugins/argent-skin/dist/client.js lktop 9
45
48
  plugins/argent-skin/dist/client.js ziniao 6
46
- plugins/argent-skin/dist/client.js 云宠 1
47
- plugins/argent-skin/dist/client.js 文鳐 1
48
49
  plugins/argent-skin/dist/client.js 紫鸟 5
49
50
  plugins/argent-skin/dist/client.js 美客多 11
51
+ scripts/appointment_grab.py lip_ 3
52
+ scripts/appointment_grab.py mercadolibre 2
53
+ scripts/appointment_grab.py 紫鸟 1
50
54
  scripts/archive/feishu-bridge.js lktop 6
51
55
  scripts/archive/feishu-bridge.js 云宠 2
52
56
  scripts/archive/feishu-bridge.js 美客多 3
@@ -56,8 +60,9 @@ scripts/customer-config-migrate.mjs lip-customer 1
56
60
  scripts/customer-config-migrate.mjs lktop 1
57
61
  scripts/customer-preflight.py wenyao 1
58
62
  scripts/customer-preflight.py xzh- 1
59
- scripts/customer-preflight.py 文鳐 1
60
- scripts/customer-preflight.py 鑫中航 2
63
+ scripts/customer-preflight.py 文鳐 3
64
+ scripts/customer-preflight.py 紫鸟 1
65
+ scripts/customer-preflight.py 鑫中航 4
61
66
  scripts/daily-report-inbox.py 美客多 1
62
67
  scripts/daily-report.mjs mercadolibre 1
63
68
  scripts/daily-report.mjs 美客多 9
@@ -81,7 +86,7 @@ scripts/flow-requirements.json 鑫中航 2
81
86
  scripts/flow-scaffold.py xzh- 1
82
87
  scripts/flow-timers.sh wenyao 2
83
88
  scripts/flow-timers.sh xzh- 1
84
- scripts/flow-trigger-wake.mjs wenyao 2
89
+ scripts/flow-trigger-wake.mjs wenyao 1
85
90
  scripts/flow-trigger-wake.mjs 美客多 1
86
91
  scripts/flow-trigger.sh wenyao 4
87
92
  scripts/flow-trigger.sh xzh- 2
@@ -103,7 +108,11 @@ scripts/flow_failure.py 美客多 1
103
108
  scripts/flow_ledger.py wenyao 3
104
109
  scripts/flow_ledger.py 文鳐 1
105
110
  scripts/flow_ledger.py 鑫中航 1
106
- scripts/flow_preflight.py wenyao 1
111
+ scripts/flow_preflight.py wenyao 2
112
+ scripts/flow_preflight.py xzh- 1
113
+ scripts/flow_preflight.py 文鳐 2
114
+ scripts/flow_preflight.py 紫鸟 2
115
+ scripts/flow_preflight.py 鑫中航 2
107
116
  scripts/flow_retry.py wenyao 1
108
117
  scripts/flow_retry.py 美客多 1
109
118
  scripts/flow_return_to_ops.py wenyao 4
@@ -127,10 +136,9 @@ scripts/init-ml.sh mercadolibre 1
127
136
  scripts/init-ml.sh ziniao 85
128
137
  scripts/init-ml.sh 紫鸟 65
129
138
  scripts/init-ml.sh 美客多 7
130
- scripts/install-internal-role.sh 云宠 1
131
139
  scripts/integration_contract.py wenyao 2
132
140
  scripts/integration_contract.py 文鳐 1
133
- scripts/integrations/wenyao/adapter.py wenyao 12
141
+ scripts/integrations/wenyao/adapter.py wenyao 11
134
142
  scripts/integrations/wenyao/adapter.py 文鳐 4
135
143
  scripts/integrations/xzh/adapter.py lip_ 4
136
144
  scripts/integrations/xzh/adapter.py wenyao 1
@@ -144,7 +152,7 @@ scripts/invoice-table.sh 鑫中航 1
144
152
  scripts/invoice_carrier_notice.py lip_ 4
145
153
  scripts/invoice_carrier_notice.py 文鳐 1
146
154
  scripts/invoice_carrier_notice.py 鑫中航 1
147
- scripts/invoice_lip_runner.py lip_ 40
155
+ scripts/invoice_lip_runner.py lip_ 43
148
156
  scripts/invoice_lip_runner.py xzh- 3
149
157
  scripts/invoice_lip_runner.py 紫鸟 5
150
158
  scripts/invoice_lip_runner.py 鑫中航 19
@@ -154,7 +162,7 @@ scripts/invoice_ready_audit.py 鑫中航 1
154
162
  scripts/invoice_runner.py xzh- 2
155
163
  scripts/invoice_runner.py 文鳐 1
156
164
  scripts/invoice_runner.py 鑫中航 17
157
- scripts/invoice_stageb.py 鑫中航 5
165
+ scripts/invoice_stageb.py 鑫中航 7
158
166
  scripts/lib/customer-env.mjs lip-customer 1
159
167
  scripts/lib/preset-sync.mjs lktop 1
160
168
  scripts/lip_backlog.py lip_ 2
@@ -163,6 +171,12 @@ scripts/lip_backlog.py xzh- 1
163
171
  scripts/lip_table.py lip-customer 1
164
172
  scripts/lip_table.py lip_ 6
165
173
  scripts/lip_table.py wenyao 7
174
+ scripts/login-readiness.py wenyao 15
175
+ scripts/login-readiness.py xzh- 7
176
+ scripts/login-readiness.py ziniao 16
177
+ scripts/login-readiness.py 文鳐 12
178
+ scripts/login-readiness.py 紫鸟 8
179
+ scripts/login-readiness.py 鑫中航 9
166
180
  scripts/migrate-skills.sh mercadolibre 2
167
181
  scripts/migrate-skills.sh 美客多 1
168
182
  scripts/ml-oauth-setup.mjs mercadolibre 13
@@ -177,11 +191,12 @@ scripts/ml_schema_check.py wenyao 2
177
191
  scripts/ml_store_ids.py 紫鸟 2
178
192
  scripts/ml_store_ids.py 美客多 1
179
193
  scripts/ml_store_ids.py 鑫中航 1
180
- scripts/orchestrator.py lip_ 24
194
+ scripts/orchestrator.py lip_ 25
181
195
  scripts/orchestrator.py mercadolibre 4
182
- scripts/orchestrator.py ziniao 97
183
- scripts/orchestrator.py 紫鸟 108
196
+ scripts/orchestrator.py ziniao 95
197
+ scripts/orchestrator.py 紫鸟 101
184
198
  scripts/orchestrator.py 美客多 3
199
+ scripts/p2-report-run.mjs 美客多 1
185
200
  scripts/poll-fulfillment.sh ziniao 7
186
201
  scripts/poll-fulfillment.sh 紫鸟 5
187
202
  scripts/poll-invoice.sh 鑫中航 2
@@ -213,7 +228,7 @@ scripts/wenyao_fill_template.py 紫鸟 1
213
228
  scripts/wenyao_fill_template.py 鑫中航 1
214
229
  scripts/wenyao_login.py wenyao 11
215
230
  scripts/wenyao_login.py 文鳐 2
216
- scripts/wenyao_portal.py wenyao 7
231
+ scripts/wenyao_portal.py wenyao 6
217
232
  scripts/wenyao_portal.py 文鳐 1
218
233
  scripts/wenyao_recon.py wenyao 6
219
234
  scripts/wenyao_recon.py 文鳐 2
@@ -227,11 +242,15 @@ scripts/wenyao_skill_contract.py wenyao 7
227
242
  scripts/wenyao_skill_contract.py 文鳐 1
228
243
  scripts/wenyao_template_fetch.py wenyao 4
229
244
  scripts/wenyao_template_fetch.py 文鳐 1
245
+ scripts/xzh-browser.sh xzh- 3
246
+ scripts/xzh-browser.sh 鑫中航 1
247
+ scripts/xzh_browser.py xzh- 1
248
+ scripts/xzh_browser.py 鑫中航 2
230
249
  scripts/ziniao-auth-probe.sh ziniao 27
231
250
  scripts/ziniao-auth-probe.sh 紫鸟 8
232
251
  scripts/ziniao-keepalive.sh ziniao 30
233
252
  scripts/ziniao-keepalive.sh 紫鸟 8
234
- scripts/ziniao-post-upgrade-check.sh ziniao 15
253
+ scripts/ziniao-post-upgrade-check.sh ziniao 14
235
254
  scripts/ziniao-post-upgrade-check.sh 紫鸟 3
236
- scripts/ziniao-windows.sh ziniao 7
255
+ scripts/ziniao-windows.sh ziniao 5
237
256
  scripts/ziniao-windows.sh 紫鸟 1
@@ -139,7 +139,8 @@
139
139
  "pauseSwitchLegacy": "PAUSE_POLL",
140
140
  "promptTemplate": "verticals/mercadolibre/prompts/full.md",
141
141
  "dispatch": {
142
- "sessionIdFile": "verticals/mercadolibre/flow-dispatch-full.json"
142
+ "sessionIdFile": "verticals/mercadolibre/flow-dispatch-full.json",
143
+ "freshSession": true
143
144
  }
144
145
  },
145
146
  "concurrency": {
@@ -305,7 +306,8 @@
305
306
  "dispatch": {
306
307
  "preset": "argent-ml-invoice-wy",
307
308
  "cwd": "~/Code",
308
- "sessionIdFile": "verticals/mercadolibre/flow-dispatch-wenyao-invoice.json"
309
+ "sessionIdFile": "verticals/mercadolibre/flow-dispatch-wenyao-invoice.json",
310
+ "freshSession": true
309
311
  },
310
312
  "_note": "2026-09-18 用户口径:两个发票流程在旧脚本时期都已成功跑通 ⇒ 定时轮**真实执行**(原\"只跑影子、真跑须人工批准\"的红线撤销)。守卫不变:字段/记录白名单、写前备份、写后读回、审计、终态需 --force;HS 等报关敏感字段仍由运营人工维护。",
311
313
  "_pauseSwitchNote": "历史兼容名(PAUSE_FLOW_TRIGGER):客户机/文档/运维手册都按此名操作,**不要改名**。新流程不写 pauseSwitch 时,`_derive` 会派生 `PAUSE_FLOW_<ID>`(大写、-→_)。",
@@ -554,7 +556,8 @@
554
556
  "_pauseSwitchNote": "历史兼容名(PAUSE_INVOICE):客户机/文档/运维手册都按此名操作,**不要改名**。新流程不写 pauseSwitch 时,`_derive` 会派生 `PAUSE_FLOW_<ID>`(大写、-→_)。",
555
557
  "pauseSwitchLegacy": "PAUSE_INVOICE",
556
558
  "dispatch": {
557
- "sessionIdFile": "verticals/mercadolibre/flow-dispatch-xzh-invoice.json"
559
+ "sessionIdFile": "verticals/mercadolibre/flow-dispatch-xzh-invoice.json",
560
+ "freshSession": true
558
561
  }
559
562
  },
560
563
  "concurrency": {
@@ -673,7 +676,8 @@
673
676
  "_note": "2026-09-18 用户口径:日报要**到点自动推送**(北京 14:05 = 站点本地 00:05)。intervalSec 300 保证在推送点后 ~5 分钟内触发;\"未到点不产出单元\"由 daily-report-inbox.py 的门控保证(未到点零唤醒、零模型成本)。",
674
677
  "pauseSwitchLegacy": "PAUSE_DAILY_REPORT",
675
678
  "dispatch": {
676
- "sessionIdFile": "verticals/mercadolibre/flow-dispatch-daily-report.json"
679
+ "sessionIdFile": "verticals/mercadolibre/flow-dispatch-daily-report.json",
680
+ "freshSession": true
677
681
  },
678
682
  "_scheduleNote": "P1-A(2026-10-12,**只对日报试点**):把触发从「每 5 分钟轮询 ≈288 次/天」改成「宿主原生 daily 排程(每天 1 次准点)」。**沿用 trigger 段**(⛔ 不另起顶层字段 ⇒ 不开第二份真源):`schedule` 只描述「排程器怎么叫醒」,周期与暂停开关仍只在 trigger 里。⛔ 本批**不切投递**:宿主排程的 prompt 创建时固定 ⇒ 语义退化为「到点叫醒 + 角色自己调 L1 认领」,而「只认领不唤醒」的 L1 入口(`flow-trigger.sh --no-wake`)**尚不存在**(实测只认 --flow/--max/--dry-run)⇒ 声明先落、防线先建,投递切换留 P1-B。⛔ `intervalSec` **保持 300 不动**:本批 launchd 那条路径照旧(先起后排,绝不双跑)。",
679
683
  "schedule": {
@@ -735,4 +739,4 @@
735
739
  "units": {}
736
740
  },
737
741
  "_aliasNote": "旧 id(full / wenyao-invoice / xzh-invoice / daily-report)→ 规范 id;迁移期兜底,P2b/P5 随调用点改完后删除。"
738
- }
742
+ }
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "id": "mercadolibre",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "title": "美客多(MercadoLibre)业务线",
5
5
  "_note": "P2a 落位:flows/prompts/暂停开关/日志/会话文件已命名空间化;角色/preset/技能仍是旧名(legacyNaming,P2b/P5 在有重启窗口时改名);能力与计费单位仍在 base(随重装窗口改 SKU id);适配器仍在 scripts/integrations(P4 端口化时搬)。",
6
- "_versionNote": "0.1.1(2026-10-06):`requires.argent` 由 `>=0.2 <0.3` 抬到 `>=0.3 <0.4`(平台现役 VERSION=0.3.0)—— 修前「Argent 能力 → 概览」把这唯一的业务线标成 `⚠️ 版本不满足`,而它实际能跑(口径与事实相反)。同批 `version` +1(P0-5,见 docs/Argent-工作台口径审计-2026-10-06.md)。|0.1.2(2026-10-09):**平台抬到 0.4.0** ⇒ `requires.argent` 同步抬到 `>=0.4 <0.5`(不改则会重演 P0-5:兼容区间把现役平台挡在门外)。判据已固化为门禁 `node scripts/check-version-consistency.mjs`(**平台版本必须落在每条业务线声明的兼容区间内**),不再靠人记得复核。⚠️ `verifiedOn.argent` **刻意维持 `0.3.0`**:该字段记的是\"**真装真跑过**\",本批只抬版本号、内核无行为改动,未在 0.4.0 上跑过生产 ⇒ 落地后补登,⛔ 不预填。",
6
+ "_versionNote": "0.1.1(2026-10-06):`requires.argent` 由 `>=0.2 <0.3` 抬到 `>=0.3 <0.4`(平台现役 VERSION=0.3.0)—— 修前「Argent 能力 → 概览」把这唯一的业务线标成 `⚠️ 版本不满足`,而它实际能跑(口径与事实相反)。同批 `version` +1(P0-5,见 docs/Argent-工作台口径审计-2026-10-06.md)。|0.1.2(2026-10-09):**平台抬到 0.4.0** ⇒ `requires.argent` 同步抬到 `>=0.4 <0.5`(不改则会重演 P0-5:兼容区间把现役平台挡在门外)。判据已固化为门禁 `node scripts/check-version-consistency.mjs`(**平台版本必须落在每条业务线声明的兼容区间内**),不再靠人记得复核。⚠️ `verifiedOn.argent` **刻意维持 `0.3.0`**:该字段记的是\"**真装真跑过**\",本批只抬版本号、内核无行为改动,未在 0.4.0 上跑过生产 ⇒ 落地后补登,⛔ 不预填。|0.1.3(2026-10-21):平台版本线已到 0.7.6 ⇒ `requires.argent` 由 `>=0.4 <0.5` 抬到 `>=0.7 <0.8`(原区间把现役平台挡在门外;`check-version-consistency` R1-LOCKSTEP 实测报红)。",
7
7
  "requires": {
8
- "argent": ">=0.4 <0.5",
8
+ "argent": ">=0.7 <0.8",
9
9
  "dsh": ">=0.1.5 <0.2"
10
10
  },
11
11
  "verifiedOn": {
@@ -50,7 +50,8 @@
50
50
  "ml-invoice",
51
51
  "ml-invoice-xzh",
52
52
  "ml-store-daily-report",
53
- "ml-config-guide"
53
+ "ml-config-guide",
54
+ "ml-full-appointment"
54
55
  ],
55
56
  "flows": [
56
57
  "mercadolibre.full",