Commit Graph
714 Commits
Author SHA1 Message Date
QiuSWandClaude Opus 5.5 07800cf41e merge: client API key agent release upload and activate (#384)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 18:08:56 +08:00
QiuSWandClaude Sonnet 5.5 6107c235cf feat(web): 客户端密钥页新增 Agent 版本上传与设为当前动作 (#384)
actionLabels 增加 release_upload、release_activate;勾选设为当前时提示
「设为当前后,所有设备会提示更新」。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 18:07:57 +08:00
QiuSWandClaude Sonnet 5.5 19484f0a68 feat(clientapi): 客户端密钥可上传 Agent APK 并单独授权设为当前 (#384)
devices 模块新增 release_upload(列表/上传)与 release_activate(设为当前)两个显式动作,
不挂在 read/write 上;不开放下载。Upload 创建人统一取操作人(客户端取 AuthorizedBy,
Admin 仍取 JWT 用户)。网关请求体上限仅对 APK 上传端点放宽到 MaxAPKBytes+1MB,其余仍为 16MB。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 18:06:37 +08:00
QiuSWandClaude Opus 5.5 3495de96a2 chore(android): bump Agent to 0.9.70 (83) and drop debug suffix (#370 #379 #375 #380)
The merged #370/#379/#375/#380 builds still reported 0.9.69-373-fix1 (82),
so devices and the in-app updater could not tell them from the old build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:56:17 +08:00
QiuSWandClaude Opus 5.5 ac112b59b5 docs: mirror wiki for #381 #382 #383 and #378 release
Business-Rules-and-Glossary@c8aa5a4, Architecture-and-Code-Map@72fa776,
Deployment-and-Operations@4103d9b.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:41:01 +08:00
QiuSWandClaude Opus 5.5 15bab9c989 merge: collection task device filter (#383)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:23:15 +08:00
QiuSWandClaude Opus 5.5 0893b55efc merge: purchase creator and device filters (#382)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:23:15 +08:00
QiuSWandClaude Opus 5.5 c5709a0f3a merge: block cancelled SYB orders from PDD flows (#381)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:23:15 +08:00
QiuSWandClaude Sonnet 5.5 0745b2d894 feat(web): 采集任务页新增设备筛选 (#383)
筛选区在「来源」后新增「设备」下拉(可清空、可搜索,含已停用设备),
查询传 deviceId,重置清空;设备列表加载失败时下拉为空且不影响列表。
批量取消接口不支持设备维度,选择设备筛选时禁用该按钮,避免取消范围超出当前列表。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:20:34 +08:00
QiuSWandClaude Sonnet 5.5 9e54263ee6 feat(web): 采购管理增加设备/创建人筛选与创建人展示 (#382)
- 筛选区新增「设备」「创建人」可清空可搜索下拉,选项来自 filter-options,含未分派/Agent 发起/未记录;参与查询、重置与导出
- 表格在设备列后新增「创建人」列,详情新增创建人与创建来源

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:17:08 +08:00
QiuSWandClaude Sonnet 5.5 ac7f81141c feat(purchase): 记录采购任务创建人与来源,列表增加设备/创建人筛选 (#382)
- 新建时写入一次创建人与来源:Admin/备货/批量创建=admin,客户端密钥=client_api(授权人),Agent 重试=agent(无创建人);幂等重放不改写
- AdminList 新增 deviceId(含 unassigned)与 createdBy(含 agent/unrecorded)筛选,非法值返回 CodeInvalidRequest
- 列表与详情返回 createdBy/createdByName/createdSource
- 新增 GET /purchase-tasks/filter-options 返回实际出现过的设备与创建人

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:14:51 +08:00
QiuSWandClaude Sonnet 5.5 6cc3bb98d0 feat(db): purchase_task 新增 created_by/created_source 迁移 (#382)
只新增可空 created_by(索引)与非空默认空串的 created_source,不回填历史行;
迁移按列/索引存在性守卫,可重复执行。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:14:50 +08:00
QiuSWandClaude Sonnet 5.5 cc4a55cf60 feat(web): SYB 商品页新增处理阶段「已取消」 (#381)
阶段筛选与标签新增 syb_cancelled;选择后采购类型自动切到全部;图搜入口排除已取消行。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:05:43 +08:00
QiuSWandClaude Sonnet 5.5 7897d9925b feat(purchase): SYB 已取消订单不进入 PDD 采购/采集/AI 匹配/退货匹配 (#381)
- 新增 sybCancelled 判断与错误码 PURCHASE_SYB_CANCELLED
- 创建采购、批量预览、AI 匹配资格、采集资格、图搜批量创建拦截已取消明细
- 新增处理阶段 syb_cancelled(已取消),优先级在已有任务和退货匹配之后、无需采购之前
- 不加入退货匹配参与阶段;NULL/false 不拦截;不改已有采购任务

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 17:03:03 +08:00
QiuSWandClaude Opus 5.5 16e3d35b8f docs: mirror wiki for color grid, spec conflict and open-in-PDD (#370 #379 #375)
Business-Rules-and-Glossary@0113260, Android-Agent-API-Contract@c05446a,
Troubleshooting@50f5923.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 16:34:50 +08:00
QiuSWandClaude Opus 5.5 82ed6664b7 merge: open product in PDD from task details (#375)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 16:09:17 +08:00
QiuSWandClaude Opus 5.5 f334c1dcb0 merge: device connection card on status tab (#380)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 16:09:17 +08:00
QiuSWandClaude Opus 5.5 4039fdae2b merge: keep conflicted spec values and merge badge captions (#379)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 16:09:16 +08:00
QiuSWandClaude Opus 5.5 26562fc763 merge: horizontal color grid traversal (#370)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 16:09:16 +08:00
QiuSWandClaude Sonnet 5.5 d3d3837014 feat(android): 采集与采购详情页新增在拼多多中打开按钮 (#375)
- 编号为纯数字时显示描边按钮,忙时置灰并显示原因,随忙状态广播实时更新
- 点击经服务执行,结果 toast 不含链接与异常消息

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 15:53:47 +08:00
QiuSWandClaude Sonnet 5.5 a0d2416c49 feat(android): 服务端手动打开拼多多商品与统一忙状态 (#375)
- 新增 DeviceBusyPolicy:服务与界面共用的设备忙判断与原因文案,repurchaseLocalIdle 复用(行为不变,冷却期不算忙)
- 新增 PddManualOpenCoordinator:先判忙,再作废交接凭证,再打开;复用 PddLaunchFallback 事件生成提示
- AgentForegroundService:新增打开动作、结果广播,每 2 秒发布只读忙状态;只打开商品链接,不点击 PDD 内控件

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 15:53:47 +08:00
QiuSWandClaude Sonnet 5.5 ff8c5361cb feat(android): 状态页新增设备连接卡片 (#380)
显示当前 Wi-Fi IPv4 与无线调试开关状态(adb_wifi_enabled),读取失败显示无法读取;
端口仅给出固定查看提示。读数到文案/颜色为纯函数策略,不持久化、不上报、不写日志。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 15:27:26 +08:00
QiuSWandClaude Sonnet 5.5 d45a9b9a24 feat(android): add sanitized spec-normalize trace (#379)
规格规范化冲突或作废时输出一条脱敏 trace(每维每类最多一条,仅 Log.i 过程日志):
spec-normalize dim outcome reason path pass sameFrame onlyTrailingPriceDiff
rawVariants candidates badgeCaptionMerged。只含计数与枚举值,不输出节点原文。
ParsedPddScreen 新增 badgeCaptionMerged 计数(合并的价格加徽标说明卡片数)。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 14:53:16 +08:00
QiuSWandClaude Sonnet 5.5 b86f858cb7 fix(android): merge truncated color caption with trailing price and badge (#379)
采购1 上 PDD 说明文字形如「名称...⏎ ¥11.8 零差评」,价格后带徽标,末尾价格
规范化去不掉,导致卡片未合并、说明值含 ¥ 而整维清空颜色。

isTruncatedDisplayCard 仅在说明文字规范化后仍含货币符号时,尝试严格后缀
「空白* ¥金额 空白+ 徽标$」(徽标 1-8 个不含货币符号、数字、空白的字符),
取价格前部分并去掉末尾省略号后再做前缀比较;要求金额等于外层全名的末尾价格,
外层无价格或金额不等则不合并。#362 的结构条件全部保留,不改公共语法。

测试:按采购1 结构合成快照(3 色、无重复、无 invalid),覆盖金额不等、徽标含 ¥、
徽标超长或含空白、外层无价格、前缀不符、卡片内第二个可点文字、无徽标截断回归。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 14:45:58 +08:00
QiuSWandClaude Sonnet 5.5 e966d0f702 fix(android): keep spec dimension on normalized-name conflict (#379)
规格值规范化后同名但原文不同时,不再整维清空,而是保留一个值并在
missing 写入 spec_dimension_conflict:size|color(任务为 completed_partial);
规范化后为空或仍含货币符号仍整维拒绝(spec_dimension_invalid)。

尺码续页路径与正常路径一致做末尾价格规范化(rawText 保留原标签),
并在按 text 去重之前由 Tracker 观察每个候选,避免冲突被 groupBy 吞掉。

测试:更新 #160 的重复尺码/颜色用例为保留并标记冲突,补充跨帧、
续页、残留货币与空值整维拒绝用例。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 14:43:12 +08:00
QiuSWandClaude Opus 5.5 2ae3e8115f perf(android): fixed settle wait and separate reset budget for color grid (#370)
- Replace the polling settle (up to 4 extra parses) after each horizontal
  swipe with one fixed 1200ms wait; no extra parse, clicks unchanged.
- moveColorsToStart gets its own budget (2x specHorizontalSwipes); anchor
  retries no longer consume swipes (max 2 consecutive, 6 total).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-12 03:15:30 +08:00
QiuSWandClaude Opus 5.5 9619c38ae3 fix(android): wait for color grid to settle after horizontal swipe (#370)
After each successful horizontal swipe in color discovery, re-read the
color rows until two adjacent reads agree on text and bounds (at most four
extra reads, 200ms apart) before collecting. No extra clicks, never fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 17:44:49 +08:00
QiuSWandClaude Opus 5.5 037459391a fix(android): only skip snake sweep from a confirmed left edge (#370)
moveColorsToStart now reports whether the left edge was confirmed by
stable signatures and retries anchor failures with another color node
(within the horizontal swipe budget). The reverse-sweep skip is allowed
only for row 0 of the first vertical pass when the sweep began at a
confirmed left edge; otherwise the full snake sweep is kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 17:37:54 +08:00
QiuSWandClaude Opus 5.5 74b71e2b5a fix(android): skip redundant snake sweep for shared color grids (#370)
Decouple the shared-container skip from the diagnostic uncertainty flag so
click-induced layout changes no longer force a reverse sweep, and add
color-row / color-row-end / color-click-miss trace logs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 17:06:30 +08:00
QiuSWandClaude Opus 5.5 2f24b4b5b4 fix(android): detect shared color grid movement by position (#370)
Shared-container detection compared visible color text sets, so a short
last row whose options only shifted (partly visible) looked unmoved and
triggered a reverse sweep. Compare text+bounds position signatures instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 16:19:01 +08:00
QiuSWandClaude Opus 5.5 d8b4f3a9d5 fix(android): track horizontal color rows frame to frame (#370)
Follow each horizontal color row by overlap with its previous frame (with a
position fallback for whole-page moves on multi-row grids), skip reverse
sweeps when rows share one container, and keep the earliest abnormal
COLOR_DISCOVERY reason.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 15:04:06 +08:00
QiuSWandClaude Opus 5.5 23dafcf73f docs: record #372 v3 web release (#372)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 11:58:24 +08:00
QiuSWandClaude Opus 5.5 3d5e9646f6 merge: shop column in SYB product export (#372)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 11:52:01 +08:00
QiuSWandClaude Sonnet 5.5 e351a69912 feat(web): add shop column to SYB product export (#372)
Insert a text "店铺" column (row.shopName) right after SYB订单 and move
the 0.00 number format to the shifted price column. Sync the wiki mirror.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 11:50:18 +08:00
QiuSW db64a49e69 merge: heartbeat history and Android sync diagnostics (#378) 2026-10-10 11:15:38 +08:00
QiuSW b79e281b97 docs: complete Android heartbeat diagnostic contracts (#378) 2026-10-10 11:12:07 +08:00
QiuSW dbe7e98365 fix(android): record handled purchase recovery failures in sync diagnostics (#378) 2026-10-10 11:02:46 +08:00
QiuSW 9f489fdf62 test: validate Android heartbeat reports through Server handler (#378) 2026-10-10 10:58:35 +08:00
QiuSW a28b869701 feat(android): persist bounded sync diagnostics and negotiate heartbeat reports (#378) 2026-10-10 10:57:33 +08:00
QiuSW c18bf78e0e docs: record Server heartbeat diagnostics and contention boundaries (#378) 2026-10-10 10:26:58 +08:00
QiuSW f5edd889f7 test(server): clarify heartbeat concurrency evidence (#378) 2026-10-10 10:24:00 +08:00
QiuSW d84728dde9 fix(server): isolate offline scan contention per device (#378) 2026-10-10 10:19:44 +08:00
QiuSWandClaude Opus 5.5 575d5f34cc docs: record #372 v2 web release (#372)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 09:54:04 +08:00
QiuSWandClaude Opus 5.5 4ad59bd231 merge: SYB price column and numeric amounts in exports (#372)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 09:48:42 +08:00
QiuSWandClaude Sonnet 5.5 d528c74c57 docs: mirror #372 v2 export rules (#372)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 09:47:57 +08:00
QiuSWandClaude Sonnet 5.5 d8d9ab9edd feat(web): add SYB price column and numeric amount cells to exports (#372)
SYB product export gets "SYB售价(TWD)" after "虾皮商品ID" (unitPriceCent / 100,
same source as the page price column). Purchase price and SYB price are written
as numeric cells; an optional numberFormatCols option on export_json_to_excel
shows them as 0.00 without changing other pages' exports.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 09:40:02 +08:00
QiuSW 010e9b90ae feat: record bounded heartbeat and device transition diagnostics (#378) 2026-10-10 09:26:45 +08:00
QiuSWandClaude Opus 5.5 919744ec05 docs: record #372 release (#372)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 09:19:12 +08:00
QiuSW 72a15f8d9f merge: list export for purchase tasks and SYB products (#372)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F

# Conflicts:
#	docs/03-business-rules-and-glossary.md
2026-10-10 09:10:23 +08:00
QiuSWandClaude Sonnet 5.5 b311885ea8 docs: sync Wiki mirror for list export (#372)
Business-Rules-and-Glossary@1c57a86, Architecture-and-Code-Map@08da88a.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 09:01:11 +08:00