Skip to content

fix(mobile): open managed Markdown video links - #4219

Merged
MagicLizi merged 3 commits into
makecindy:mainfrom
Dante-dan:fix/4171-mobile-markdown-video-link
Sep 10, 2026
Merged

MagicLizi merged 3 commits into
makecindy:mainfrom
Dante-dan:fix/4171-mobile-markdown-video-link

Conversation

@Dante-dan

@Dante-dan Dante-dan commented Sep 10, 2026 •

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

Mobile now recognizes canonical cindy-media://blobs/<sha256>.(mp4|webm|mov) destinations in explicit Markdown links and opens them through the existing media payload viewer. This lets the viewer use the established device-link fetch, MIME validation, and video player path instead of leaving the Markdown literal or passing a private scheme to the OS.

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:Closes bug: 手机端无法点击 Markdown 中的视频链接 #4171
  • 本 PR 包含:mobile Markdown managed-video link classification, media-viewer tap routing, and parser regression coverage.
  • 明确不包含:bare private-URL autolinking or direct OS handling of private schemes.
  • 用户可见变化:On mobile, tapping a labeled managed-video Markdown link opens the existing video viewer.
  • 是否存在 breaking change:无。

UI 变化

No layout or copy changes. This adds the missing tap behavior to an existing Markdown label and reuses the existing media viewer.

  • 引用的设计规范:docs/design-rules/DESIGN.md §14.5; the label receives link styling only when an onPress handler exists, preserving the existing clickable-signal rule.

怎么验证的

自动验证

pnpm --filter mobile exec vitest run src/__tests__/messageMarkdown.test.ts
结果:115 tests passed

pnpm test:unit:related
结果:apps/mobile related unit gate passed

pnpm --filter mobile run --if-present typecheck
结果:passed

pnpm check:dco
结果:1 commit signed off; 1 merge commit exempt

git diff --check origin/main...HEAD
结果:passed

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:Android and iOS native Markdown text rendering for explicit canonical managed-video links. The parser accepts only the same SHA-256 blob shape and video-extension allowlist as the desktop media store.
  • 回滚 / 降级方式:Revert this PR; affected links return to literal text on mobile. No persisted data or wire protocol changes are involved.

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO)
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档(不需要额外文档;行为由回归测试覆盖)
  • 已确认上述测试结果

Signed-off-by: Dante <duanjl.china@gmail.com>
…own-video-link

Signed-off-by: Dante <duanjl.china@gmail.com>
@Dante-dan
Dante-dan requested a review from a team as a code owner September 10, 2026 06:15
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 10, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-10T08:21:22.465992Z 936f80f New commits
🔒 Security Review ✅ Completed 2026-09-10T08:26:43.880771Z 936f80f New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Sep 10, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 为移动端显式 Markdown 链接增加 canonical cindy-media://blobs/<sha256>.(mp4|webm|mov) 识别,并将点击操作接入现有媒体 payload 查看器。

  • 解析器仅接受 canonical 内容寻址视频 URL,并为链接标记视频媒体类型。
  • 渲染器把已标记链接路由至现有远端取件和视频播放流程。
  • 新增解析器回归测试,覆盖支持的视频格式及非法、非视频地址。
  • 待发送消息气泡尚未正确接通该点击路径,会呈现可点击但无响应的链接。

Confidence Score: 4/5

此 PR 整体可合并,但建议先修正待发送消息中受管视频链接可点击却无响应的问题。

canonical URL 分类和现有媒体取件、播放契约能够正确衔接;唯一发现的问题局限于未传入 payload handler 的乐观待发送气泡,不影响已发送消息的主要查看流程。

Files Needing Attention: apps/mobile/src/session/MessageRenderer.tsx

Important Files Changed

Filename Overview
apps/mobile/src/session/messageMarkdown.ts 增加 canonical 受管视频 Markdown 链接识别;格式约束与桌面 blob store 一致。
apps/mobile/src/session/MessageRenderer.tsx 将受管视频链接接入媒体查看器,但缺少 payload handler 的待发送路径仍会获得无效点击处理器。
apps/mobile/src/tests/messageMarkdown.test.ts 覆盖三种受支持视频扩展以及非视频、非法 SHA 和错误 host/path 的解析行为。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[显式 Markdown 视频链接] --> B{是否匹配 canonical URL}
  B -- 否 --> C[保留为普通文本]
  B -- 是 --> D[标记 managedMediaKind: video]
  D --> E[渲染可点击 SpanText]
  E --> F{是否具有 onOpenPayload}
  F -- 是 --> G[构造 media payload]
  G --> H[device-link 远端取件]
  H --> I[MIME 校验与视频播放器]
  F -- 否:待发送气泡 --> J[当前点击静默返回]
Loading
Prompt To Fix All With AI
### Issue 1
apps/mobile/src/session/MessageRenderer.tsx:5018-5020
**待发送链接点击无效**

待发送气泡创建 `MarkdownBody` 时没有传入 `onOpenPayload`,但 `openMarkdownMedia` 仍作为有效回调传给渲染层,因此受管视频链接会显示可点击样式并获得 `onPress`。用户点击后,该回调会因为缺少 `onOpenPayload` 而直接返回,造成链接看似可点却没有任何响应。建议在缺少 payload handler 时不要传递媒体回调,或为待发送路径接通 payload viewer。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment thread apps/mobile/src/session/MessageRenderer.tsx Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e61fdccd5e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/mobile/src/session/MessageRenderer.tsx Outdated
@MagicLizi MagicLizi added the touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) label Sep 10, 2026
Signed-off-by: Dante <duanjl.china@gmail.com>
@MagicLizi

Copy link
Copy Markdown
Contributor

这个 PR 现在在等维护者确认(产品 / UI):mobile 把规范 cindy-media://blobs/<sha256>.(mp4|webm|mov) Markdown 链接接到现有视频查看器,改变了用户看得见的点击行为。确认前流程不会合并。

请维护者直接在本 PR 上 Approve;需要作者修改则 Request Changes。讨论 issue:#4234

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Sep 10, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/mobile/src/session/MessageRenderer.tsx / apps/mobile/src/session/messageMarkdown.ts)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范。

这是非阻断提醒,不阻止本轮审查与合并。

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #4219 review report

Findings

  • 无 P0/P1。

Rule coverage

  • AGENTS.md / docs/dev-rules/development-workflow.md / .github/PULL_REQUEST_TEMPLATE.md:单一 bugfix,模板三段齐全,DCO trailer 与 author 一致,风险勾选跨平台差异。描述与 diff 吻合,无夹带。
  • docs/dev-rules/mobile-development.md:仅 JS 会话 Markdown 解析/渲染,不改原生配置或 fingerprint。
  • docs/dev-rules/media-storage-and-protocols.md:只识别 cindy-media://blobs/<sha256>.(mp4|webm|mov),与 blobStore 指纹形状及视频后缀白名单一致;不把私有 scheme 交给 Linking.openURL,走既有 buildMediaPayload + payload viewer / device-link 取件。
  • docs/dev-rules/remote-and-mobile-adaptation.md:复用现有 remote media resolver,不新增 IPC/协议。
  • docs/design-rules/DESIGN.md §14.5:onPress 与 clickableInlineStyle 同源;无 onOpenPayload 时 openMarkdownMedia 为 undefined,待发送气泡不加可点样式。文件阅读器 HTML 路径仍只放行 http(s),受管视频链接在该面保持纯文本,符合该面既有规则。
  • docs/product-rules/core-product-principles.md:补齐手机正文入口,不另建播放能力。
  • 讨论 issue #4234:范围是显式规范受管视频 Markdown 链接打开现有查看器;无查看器不加虚假可点信号;不扩大裸私有地址或系统打开。当前 diff 落实这些要求。先前 Greptile/Codex 关于 pending 死链的 thread 已在 936f80f3 修复并 resolve。

Product-gate fallback

命中 UI 路径,但语义是补齐已有媒体查看器对已发送消息 Markdown 标签的缺失点击路径(#4171),无新布局/文案/组件。按 product 语义 fallback 继续审查,已 signoff-release --labels-only 摘掉 awaiting-discussion。

Verification

  • git diff --check origin/main...HEAD:exit 0(verify-pr-4219-diffcheck.log)
  • pnpm --filter mobile exec vitest run src/__tests__/messageMarkdown.test.ts src/__tests__/messageMediaThumbnailWiring.test.ts:125 tests passed,exit 0(verify-pr-4219-vitest.log)
  • pnpm --filter mobile run --if-present typecheck:本审查 worktree 无独立 node_modules,借用主仓依赖后失败于无关的 maker-shared export 漂移(verify-pr-4219-typecheck.log)。不能当作本 PR 失败。GitHub client-ci / pr-design-basis 已对当前 head 全绿。作者声称 typecheck 通过,CI 与之相符。
  • 未执行 Android/iOS 实机点击播放;GitHub CI 覆盖解析与接线单测。UI 证据缺失为非阻断提醒。
  • botSettle 超时放行:copilot-pull-request-reviewer / chatgpt-codex-connector 可能在合并后才到。

Overall

pass — 没有 P0/P1。

@MagicLizi
MagicLizi merged commit 4cbbd9f into makecindy:main Sep 10, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: 手机端无法点击 Markdown 中的视频链接

2 participants