makecindy / makecindy/cindy

功能建议:让 agent 能程序化调用「分享为图片」(新增 MCP 工具 + 无头渲染)

Open
#2,932 0 comments 0 reactions 0 assignees View on GitHub
feature
Dominant language
TypeScript
Stars
2.7k
Forks
395
Avg merge
21h 48m
Merged PRs (30d)
776

Description

**提交人**: Praise
**客户端版本**: 0.1.49

---

## 使用场景

自动化 skill(如每周周报汇总)需要把某条聊天消息用 Cindy 自带的「分享为图片」导出成 PNG,再贴到外部文档。整条链路由 agent 自动执行,不能依赖人工点按钮。

## 当前痛点

「分享为图片」目前是纯 UI 功能:没有 MCP 工具,agent 只能靠屏幕自动化(AX 树定位 + 模拟点击)触发。实测一轮下来有三类系统性失败:

1. **窗口漂移**:同一个 Cindy 窗口被其他会话/协同模式占用,截图定位到的内容不是目标会话,点击目标全错。
2. **点击参数不稳定**:AX 元素 token / element_index / 坐标换算 / snapshot 有效期这套体系对 agent 极不友好——坐标按截图像素估算会被换算到窗口外;引用上一帧 snapshot 的元素会因过期被拒。
3. **下载链路是人工流程**:分享面板 → 下载到本地 → 系统保存框 → 手填路径,agent 需要再模拟一串系统对话框。

替代方案只有文生图模型重画表格,但数字保真不可控(渲染中文表格数字常出错),对报表类场景不可接受。

## 诉求

1. **新增 MCP 工具**,如 `share_messages_as_image({ session_id?, message_ids: string[], out? })`:
- 支持多条消息合成一张图(对齐 UI 分享面板的多选能力);
- **同步返回**结果(本地渲染是同机操作,毫秒级,不需要提交/轮询协议);
- 返回 `cindy-media://` 地址 + 本地文件路径,不经过系统保存对话框。
2. **无头渲染**:渲染管线与聊天气泡「分享为图片」共用同一套主题/字体/布局代码,保证与手动导出像素级一致;不要求窗口可见、聚焦或屏幕解锁。
3. **权限边界**:默认只允许导出当前 MCP 会话自己的消息;传入其他 session_id 时弹用户确认卡,避免任意 agent 静默导出其他会话内容。

## 建议方案

渲染层复用现有分享导出实现,主要新增三块:无头调用入口(与按钮 UI 事件解耦)、按 message_id 寻址(替代“当前可见气泡”定位)、MCP 工具注册与权限卡。旧版客户端无此工具时,skill 可降级回现有 AX 点击流程,不构成兼容性负担。
---
**版本区域**: CN
**OS**: darwin arm64 (25.5.0)
**界面语言**: zh-CN

Contributor guide

Open the contributing guide

Research direction

The issue names no files, tests, or entry points. Start by locating the existing “share as image” export implementation and MCP tool registration, then trace how message IDs and session permissions are represented. Done means agents can synchronously export selected messages through the new tool, with headless output matching the UI and confirmation required for another session.

Written by the indexing model from the issue text.

Assessment

Tech stack
electron, typescript
Domain
api, authorization, desktop
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.