QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude 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
QiuSW and Claude Sonnet 5.5
a4a793f449
feat(web): export all filtered pages to Excel for purchase tasks and SYB products ( #372 )
...
- Web: shared list-export util (5000-row cap, progress, no partial file,
filters frozen at click time) and Export buttons on the purchase
management and SYB products pages; return matches are read per batch
of product ids and only matched/confirmed ones are used.
- Server: purchase list gains inclusive orderSubmittedFrom/To day filter
(UTC+8, same as SYB createdFrom/To, INVALID_REQUEST on bad dates);
return-matches list items gain read-only yeekeQuantity from the
existing join. No migration, no new endpoint or permission.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-10-10 08:58:28 +08:00