调研与设计快照:2026-07-26
状态:方案锁定,S0 host foundation 已开始落地
关联:PLAN_SENSE_v1.0.md、PLAN_SENSE_S2_v1.0.md、PLAN_FOUNDATIONS_v1.0.md
在 LISA 的 Sense 产品入口增加“Connected media”能力,让用户连接自己的社交账号,并通过对话准备、预览和发布文字、图片、视频与链接。
实现上采用三层:
- Connector:MCP server,负责 OAuth、账号枚举、平台预检、媒体上传、发布与状态查询。
- Skill:描述平台写作规则、最佳实践和工具调用顺序;不保存 token,不自行绕过 host。
- LISA Host:负责跨平台草稿、能力协商、不可变确认、幂等、审计和 UI。
“连接账号”只授予能力,不代表允许自动发布。v1 每一次外部发布都必须由用户对最终快照进行明确确认。确认后如正文、目标账号、可见性、媒体或定时发生任何变化,确认立即失效。
虽然入口位于 Sense,但发布不是 SenseSource:
SenseSource是 consent-gated 的环境输入,输出SenseEvent。- 社交发布是会影响外部世界的 action,应落在独立的
src/sense/social/domain service。 - Sense UI/CLI 只作为“已连接能力、草稿、发布状态、撤销入口”的统一表面。
首发顺序建议:
- Bluesky + Mastodon:开放、实现成本低,适合验证 host contract。
- Threads + LinkedIn:覆盖文本/图片/视频/链接,账号和媒体流程更接近商业平台。
- X:技术可行,但必须显式展示按量计费/余额失败。
- Instagram:仅专业账号,媒体容器和公开 URL/上传流程更复杂。
- TikTok + YouTube:视频链路长,且未审计应用存在私密发布限制;在异步任务、平台合规 UI 完成后再上。
- Facebook Pages:只支持用户管理的 Page,不承诺向个人主页自动发帖。
不建议首发“一个万能 connector 直接适配所有平台”,也不建议 browser automation 代替官方 API。
- “把我的 Bluesky 和 LinkedIn 连上。”
- “帮我写一条介绍 LISA 0.22 的帖子,配这两张图,先给我预览。”
- “LinkedIn 更专业一点,Bluesky 更短;链接都用这个。”
- “发布。”→ LISA 展示最终平台化预览、目标账号、可见性和成本/限制 → 用户确认 → 执行。
- “YouTube 上传这个视频,先设为不公开。”→ 用户确认必填的 title、description、privacy、儿童内容/合成媒体声明等平台字段后上传。
- “刚才发得怎么样?”→ 查询异步处理结果与最终 URL;部分成功时明确列出每个平台状态。
- 连接/断开用户自己的账号。
- 枚举账号与运行时能力。
- 单平台及多平台草稿。
- 文字、HTTPS 链接、图片、视频。
- 平台化变体,而不是强行使用完全相同的正文。
- 媒体格式/大小/数量/alt text 预检。
- 显式发布确认、幂等执行、异步状态、部分成功报告。
- 本地审计,不持久化媒体原始字节。
- v1 不做无人值守自动发布、批量营销、自动评论/私信、删帖或改帖。
- 不用网页登录态、Cookie 或密码做 browser automation。
- 不承诺个人 Facebook 主页、普通 Instagram 消费者账号等官方 API 不允许的目标。
- 不把 connector 的 token、refresh token 或 client secret 注入 LLM 上下文、
SKILL.md、~/.lisa/mcp.json的明文 env。 - 不在 LISA host 重新实现每个平台 OAuth 和上传协议;这些属于 connector。
- 不把“定时”伪装成 host 睡眠后再发。平台原生 scheduling 不可用时,应使用可恢复队列,并在 UI 明确是“由 LISA 后台定时执行”。
| 层 | 已有能力 | 可复用点 | 缺口 |
|---|---|---|---|
| Sense | SenseSource、SenseService、事件日志、lisa sense |
统一产品入口与状态可见性 | 只有输入信号,没有外部 action domain |
| Consent | 默认全关、逐信号 grant/revoke、fail-closed | 环境采集继续沿用 | 社交发布不应误用 ambient consent;需要 account grant + per-publish approval |
| Skills | Markdown procedural skill;可选 tool.js,按 SHA 人工批准 |
平台写作与流程知识 | tool.js 同进程执行,权限过大,不适合作为首选社交 connector |
| Plugins | skills + .mcp.json + hooks |
打包一个平台 connector 与 skill | 没有 social connector manifest/capability contract |
| MCP | stdio server、工具自动进入 LISA toolset | 外部集成天然边界 | 当前只映射 name/description/schema,丢失 MCP tool annotations 和 structured media |
| Approval | CLI ask-mutating、managed-agent UI approval |
可复用交互模式 | 普通 Web chat 没有通用 tool approval;默认 CLI auto 也不能成为发布安全边界 |
| Multi-tenant | lisaHome()/homeScope |
草稿与审计可按用户隔离 | 全局插件与用户账号授权必须严格分离 |
结论:不能只“写一个 Skill 调 API”。必须先补 host-level contract 和确认状态机。
以下为 2026-07-26 的官方文档快照。平台版本、配额、审核与定价会变化,所以 connector 必须在运行时返回 capability,而不是把限制永久写死在 LISA。
| 平台 | 可发布内容 | 账号/权限与关键约束 | 媒体流程 | v1 建议 |
|---|---|---|---|---|
| Bluesky | 文本、最多 4 张图片、链接卡、视频 | AT Protocol 账号;图片需 alt text,官方教程写明单图 2 MB;应上传前移除图片 metadata | 图片 uploadBlob 后写 app.bsky.feed.post;视频可 uploadBlob,官方推荐 video service 预处理后再发 |
Wave 1 |
| Mastodon | 文本、链接、图片、视频、音频、CW、可见性 | 每个实例限制可能不同,必须读 instance configuration;OAuth write:media/write:statuses |
POST /api/v2/media,大媒体异步 202,再 POST /api/v1/statuses |
Wave 1 |
| Threads | 文本、链接、图片、视频、carousel | OAuth threads_basic + threads_content_publish;回复控制等字段需按账号能力展示 |
先创建 container,再 /threads_publish;图片/视频 URL 必须可被 Meta 拉取 |
Wave 2 |
| organic 文本、图片、视频、文档、文章、multi-image、poll | 个人 w_member_social;组织需 w_organization_social 且用户有 Page role;API 必须带 Linkedin-Version |
图片/视频先上传取得 URN,再 POST /rest/posts |
Wave 2 | |
| X | 文本、链接、图片、GIF、视频、poll 等 | 用户 OAuth;当前 API 按量计费,带 URL 的创建费用与普通创建不同,必须让用户可见 | /2/media/upload 后把 media id 传给 /2/tweets |
Wave 3 |
| 图片、Reels、carousel;Stories 仅部分专业账号 | 仅 Professional(Business/Creator);Instagram Login 使用 instagram_business_content_publish;Facebook Login 流程使用 instagram_content_publish 等权限 |
media container → 查询处理 → media_publish;部分流程需公开可访问媒体 URL |
Wave 4 | |
| TikTok | 视频、photo post;也可仅上传到 TikTok 草稿 | video.publish;未审计 client 的 Direct Post 只能 SELF_ONLY,还有活跃 creator/posting cap;必须让用户选择隐私和互动设置 |
视频可本地分块上传或 verified URL 拉取;图片使用 verified HTTPS URL;发布异步查询 | Wave 5 |
| YouTube | 视频上传与 metadata;本方案不承诺 Community post | 最小 scope youtube.upload;未审计 API project 上传的视频被限制为 private;用户必须选择 public/private/unlisted |
videos.insert 支持 resumable upload,处理状态异步;必须暴露 title/description/privacy 等必填 UI |
Wave 5 |
| Page 的文字、链接、图片、视频/Reels | 只承诺用户管理的 Page,需 Page access token 与 pages_manage_posts 等权限;不承诺个人主页 |
feed/photos/video 等不同端点,视频可恢复上传 | Wave 6 |
-
平台能力不能只按 platform 判断
TikTok 是否能公开、LinkedIn 能否发组织、Instagram 是否能发 Story、Mastodon 的媒体限制都与 app 审核、账号和实例有关。必须getCapabilities(accountId)。 -
链接不是一个简单字符串
X 当前带 URL 的写调用计费不同;Threads 可有 link attachment;Bluesky 需要客户端抓取并构造卡片;Instagram 的 feed content 通常不是“纯链接贴”。统一 draft 保存 canonical URL,但 adapter 决定呈现。 -
上传不是发布
多数平台是“上传/创建 container → 处理 → 发布”。LISA 必须区分staging、processing、publishing、published,并清理未使用的临时媒体。 -
多平台不能做分布式原子事务
A 成功、B 失败是正常状态。系统不能声称“全部回滚”;应输出 partial success,并支持只重试失败 target,沿用同一 idempotency key/target key。 -
用户必须看到平台特有字段
YouTube privacy、made-for-kids、synthetic media;TikTok privacy/comment/duet/stitch/commercial content;Mastodon visibility/CW;LinkedIn personal vs organization,不能被“通用发布按钮”隐藏。
Sense → Connected media → Add connector
- 选择已安装 connector plugin,或从可信目录安装。
- LISA 展示 connector 的 publisher、版本、所需 scope、支持的平台和隐私说明。
- 在系统浏览器完成 OAuth Authorization Code + PKCE。
- Connector 返回账号句柄、显示名、头像(可选)、scope、token 过期状态;不返回 token 给模型。
- 用户选择哪些账号在 LISA 中启用。
- LISA 调用
getCapabilities,展示“能发什么、当前只能私密还是可公开、是否已通过平台审核”。
不支持 OAuth 的去中心化平台可采用平台颁发的 app password/token,但录入 UI 必须直接送入 connector secret store,不经过 chat。
sequenceDiagram
participant U as "用户"
participant L as "LISA"
participant H as "Social Host"
participant C as "Connector"
participant P as "平台"
U->>L: "帮我发到 Bluesky 和 LinkedIn"
L->>H: 创建/更新 canonical draft
H->>C: getCapabilities + validateDraft
C-->>H: 每账号限制与 platform variants
H-->>U: 最终预览、账号、可见性、媒体、警告
U->>H: 显式确认 digest
H->>H: 锁定不可变 snapshot + idempotency keys
H->>C: publish(snapshot, targetKey)
C->>P: 上传/发布
P-->>C: post id / processing id
C-->>H: per-target status
H-->>U: published / partial / failed + URLs
- 每个目标的 connector、平台、账号 display name/handle。
- 最终平台化正文,不只显示 canonical draft。
- 图片缩略图、视频名/大小/时长、每个媒体的 alt text。
- 链接最终 host(punycode/重定向风险提示)。
- 可见性、定时时间与时区。
- 平台特有声明与限制。
- 预计费用(若 connector 能提供)或“此平台按量计费”。
- “发布后无法由 LISA 原子撤回”的明确提示。
- 内容 digest 的短指纹。
“确认”绑定以下全部字段:
targets + account ids + platform variants + visibility + schedule +
media sha256 + alt text + link + platform-specific declarations
任何字段变化 → revision +1 → 旧确认作废 → 重新预检与确认。
flowchart LR
Chat["Chat / Web / CLI"] --> Composer["Social Composer"]
Composer --> Drafts["Draft Store"]
Composer --> Policy["Capability + Policy Engine"]
Policy --> Approval["Immutable Approval Ledger"]
Approval --> Runner["Publish Runner"]
Runner --> Bridge["Trusted Connector Bridge"]
Bridge --> MCP["Platform MCP Connector"]
MCP --> OAuth["Connector Secret Store / OAuth"]
MCP --> API["Official Platform API"]
Runner --> Audit["Audit + Per-target Status"]
Audit --> SenseUI["Sense Connected Media UI"]
src/sense/social/
types.ts # canonical draft、target、status、capability
manifest.ts # trusted plugin social-connector.json 解析/发现
drafts.ts # revisioned draft + immutable approval snapshot
policy.ts # target capability intersection + required fields
media.ts # MIME sniff、sha256、metadata strip、staging policy
runner.ts # per-target state machine、retry/idempotency
audit.ts # append-only structural audit
tool.ts # 模型只可 compose/validate/request-confirmation
~/.lisa/plugins/<connector>/
.lisa-plugin/plugin.json
.mcp.json
social-connector.json
skills/<platform>-publisher/SKILL.md
SKILL.md 只描述:
- 平台文风与字段含义。
- 何时调用 account/capability/validate 工具。
- 如何把 connector 的错误解释给用户。
- 必须先预览、等待 host confirmation。
它不得包含 token、client secret、refresh token,不得要求用 bash/curl 绕过 connector,不得把“用户说发布”当作跳过确认状态机的许可。
{
"schemaVersion": 1,
"id": "bluesky-official",
"displayName": "Bluesky",
"platform": "bluesky",
"mcpServer": "bluesky",
"skill": "bluesky-publisher",
"tools": {
"listAccounts": "social_accounts_list",
"getCapabilities": "social_capabilities",
"validateDraft": "social_draft_validate",
"publish": "social_publish",
"getPublishStatus": "social_publish_status",
"disconnectAccount": "social_account_disconnect"
}
}本地 manifest 是 host 的绑定 contract;MCP annotations 是辅助信息,不是授权依据。原因是 MCP 规范明确说 annotations 只是 hint,非可信 server 可以撒谎。
只返回结构化账号句柄:
type SocialAccount = {
id: string;
platform: string;
handle: string;
displayName?: string;
scopes: string[];
authState: "connected" | "expired" | "revoked" | "needs-review";
};能力按 account 实时返回:
type SocialCapabilities = {
content: {
text: boolean;
links: "none" | "inline" | "card";
images: { supported: boolean; maxCount?: number };
video: { supported: boolean; maxCount?: number };
};
visibilities: string[];
scheduling: "none" | "native" | "host";
publication: "public-capable" | "private-only" | "draft-only";
requiredFields: string[];
warnings: Array<{ code: string; message: string; blocking: boolean }>;
observedAt: string;
};- 只做预检,不发布。
- 返回每个字段的 blocking/warning。
- 返回 normalized preview 和可能的费用提示。
- 不允许借“预检”偷偷上传到用户公开账号。
- 如果平台只有在上传后才能最终校验,必须把该步骤标为
stagingSideEffect,放到确认之后。
输入必须含:
- 已锁定 snapshot;
- host 生成的
approvalDigest; - 每个 target 唯一
idempotencyKey; - connector/platform/account;
- 结构化 media handle,不能是任意文件系统路径;
- 明确 visibility 与声明。
返回:
type PublishReceipt = {
idempotencyKey: string;
state: "processing" | "published" | "failed";
remoteId?: string;
url?: string;
retryable?: boolean;
error?: { code: string; message: string };
};MCP annotations 最低要求:
| Tool | readOnlyHint |
destructiveHint |
idempotentHint |
openWorldHint |
|---|---|---|---|---|
| listAccounts/getCapabilities/validateDraft | true |
false |
true |
true |
| publish | false |
false(additive) |
true* |
true |
| disconnect/delete | false |
true |
true |
true |
* 只有 connector 真的使用 host idempotency key 去重时才能标 true。
type SocialDraft = {
id: string;
revision: number;
state:
| "draft"
| "awaiting-approval"
| "approved"
| "publishing"
| "partial"
| "published"
| "failed"
| "cancelled"
| "expired";
targets: SocialTarget[];
canonical: {
text?: string;
link?: string;
media: SocialMediaRef[];
title?: string;
description?: string;
};
variants: Record<string, PlatformVariant>;
approval?: {
digest: string;
approvedAt: string;
expiresAt: string;
};
};媒体只保存:
- 用户选择范围内的 host media id;
- MIME sniff 结果、bytes、sha256、尺寸/时长;
- alt text;
- connector staging receipt(短期)。
不把原始字节放进 draft JSON、Sense log、session history 或模型工具结果。
draft
→ validating
→ ready
→ awaiting-approval
→ approved
→ staging
→ publishing
→ processing
→ published
↘ failed-retryable
↘ failed-final
多目标草稿的整体状态由 per-target 派生:
- 全部 published →
published - 至少一个 published 且仍有失败 →
partial - 全部失败 →
failed - 不能把
partial报告为成功,也不能自动重发已成功 target。
idempotencyKey = sha256(draftId + revision + connectorId + accountId)
- Host 在发布前持久化 key。
- 重启后先查 receipt/status,再决定是否重试。
- Connector 必须在本地 ledger 去重;平台支持原生 idempotency 时再向下透传。
- 网络超时且远端结果未知时标
unknown,禁止盲重发。
| 授权 | 含义 | 是否足以发布 |
|---|---|---|
| OAuth/account grant | connector 可代表用户访问指定账号和 scope | 否 |
| Per-publish approval | 用户确认某一不可变内容快照、账号、可见性和时间 | 是,仅该 revision |
Sense consent 继续管理屏幕/麦克风等采集;社交 action 使用 account grant + per-action confirmation,避免语义混淆。
- OAuth Authorization Code + PKCE,验证
state、issuer、redirect URI。 - macOS 优先 Keychain;其他平台使用 OS credential store;无可用 secret store 时才使用
0600加密文件,并明确提示降级。 - access/refresh token 永不进入 prompt、日志、审计、SSE、MCP tool result、crash report。
- scope 最小化;发布 connector 不申请读取私信、联系人等无关权限。
- disconnect 应先调用 provider revoke(若支持),再删除本地凭据。
- 用户/tenant 凭据不能放全局 plugin 目录。
- 连接器返回的主页简介、链接预览、远端错误文本都是不可信数据。
SKILL.md是过程知识,不是授权令牌。- 模型只能调用 compose/validate/request-confirmation,不能直接拿 publish capability。
- 真正的 publish runner 只接受 host approval ledger 中未过期、digest 匹配的 snapshot。
- 来自 Telegram/Discord/Slack/webhook 等 remote-origin channel 的消息,v1 只能生成草稿;不能确认发布。
- autonomous/heartbeat/idle/Reve 工具集永久移除 social publish。
- MIME 以 magic bytes/解码结果为准,不能只信扩展名。
- 图片默认移除 EXIF/GPS;向用户说明此处理。
- 视频用受限
ffprobe获取结构,不执行媒体内指令。 - connector 不接受任意本地路径;只能接受 host media store 里由用户显式选择的 handle。
- 公开 URL 拉取需防 SSRF:HTTPS、DNS/IP 校验、禁止 loopback/link-local/private ranges、限制重定向和响应大小、下载后重新校验目标。
- Meta/TikTok 需要平台拉取 URL 时,使用短时 signed staging URL;默认单次/短 TTL,发布结束删除。
仅保存结构化信息:
- 谁(本地用户/tenant);
- 何时;
- connector/platform/account handle;
- draft id/revision/digest;
- 用户确认时间;
- idempotency key;
- remote id/URL;
- 结果与错误码。
默认不在 audit 重复保存正文或媒体。若用户打开“保留发布历史”,只保存最终正文与缩略信息,并提供删除与保留期。
| 类别 | 例子 | 行为 |
|---|---|---|
| Auth | token expired/scope revoked | 停止,要求重连;不自动扩大 scope |
| Validation | 文本过长、缺 alt、视频格式错误 | 回到 draft,定位字段 |
| Policy | TikTok 未审计只能 private、Instagram 非专业账号 | 阻断不可能目标,解释替代方案 |
| Rate/quota | 429、YouTube quota、creator cap | 使用 provider retry-after;确认不过期则排队,否则重新确认 |
| Cost | X credits insufficient | 发布前警告;失败不盲目重试 |
| Processing | 视频仍转码 | 持久化 receipt,后台轮询并推送最终结果 |
| Unknown outcome | POST 后连接中断 | 先 status lookup/ledger reconciliation,禁止直接重发 |
- v1.0 首先只做“立即发布”。
- v1.1 再做定时:记录用户时区、DST 行为、connector capability 与任务 lease。
- 执行前如 token/scopes/capability 改变,任务暂停并要求重新确认。
- 定时内容确认过期时间应覆盖执行时点;不能沿用短期 10 分钟 interactive approval。
- 用户必须可在 Sense UI 一键取消未执行任务。
- Connector 的 runtime capability 可返回
estimatedCost与 currency。 - 对 X 等按量计费平台,确认卡至少显示“按量计费”和当前 connector 能确认的估计。
- LISA 不硬编码价格;文档/adapter tests 固定的是“必须显示费用提示”,不是某个数值。
- 上传失败、重试和状态轮询也可能消耗配额,审计应记录 request count。
建议只暴露一个 host tool social_compose:
accountsnew_draftupdate_draftpreviewvalidaterequest_confirmationstatuscancel
不暴露 publish action 给模型。 用户在 UI/CLI 的确认动作直接进入 host runner。
GET /api/sense/social/connectors
POST /api/sense/social/connectors/:id/connect
GET /api/sense/social/accounts
DELETE /api/sense/social/accounts/:id
POST /api/sense/social/drafts
PATCH /api/sense/social/drafts/:id
POST /api/sense/social/drafts/:id/validate
POST /api/sense/social/drafts/:id/request-approval
POST /api/sense/social/drafts/:id/approve
POST /api/sense/social/drafts/:id/cancel
GET /api/sense/social/drafts/:id/status
要求:
- account connect/approve/disconnect 仅 local/presence-authenticated surface。
- approve body 必须带当前 digest,服务端用 constant-time compare。
- 所有 mutation 做 CSRF/origin/auth 检查。
- 任何 endpoint 都不返回 token。
lisa sense social
lisa sense social connectors
lisa sense social accounts
lisa sense social drafts
lisa sense social preview <draft-id>
lisa sense social approve <draft-id> --digest <short-or-full>
lisa sense social cancel <draft-id>
CLI 连接流程打开系统浏览器;approve 前在 TTY 打印最终 snapshot,并要求输入一次性短码,而不是简单的默认 [y/N]。
Sense 卡增加:
- Connected media(connector health、账号、scope、重连/撤销)。
- Drafts & scheduled。
- Processing。
- Recent publications(结构化、可选 retention)。
- 全局 Pause publishing kill switch:阻止新执行,不撤销已发内容。
论点 A:这是 LISA 从“回答”走向“代表用户完成表达”的关键闭环。
Sense 已理解用户正在做什么;连接发布能力后,用户可以从上下文直接形成内容,不需要在多个平台复制、改写和上传。
论点 B:Connector + Skill 非常适合平台碎片化。
OAuth/API/上传由 connector 封装,文风/流程由 skill 维护,host 专注于安全与一致性。平台变更时可更新单个 plugin,不必把所有平台 SDK 塞进 LISA core。
论点 C:平台化变体比传统“一键群发”更有价值。
同一意图可以生成 LinkedIn 的专业长文、Bluesky 的短帖、TikTok 的 caption 和 YouTube metadata,同时保留用户最终控制。
论点 D:本地优先带来可信差异。
媒体 hash、草稿、确认与审计由 LISA 本地管理;connector secret 不进模型。相较纯 SaaS social scheduler,账号凭据和未发布内容暴露面更小。
论点 E:开放 connector contract 能形成生态。
首方只需覆盖几个平台,社区可提供小众平台/自托管 Mastodon connector;host contract 保持统一 UX。
论点 A:错误成本极高且不可逆。
一次错账号、错可见性、错链接或半成品视频,比普通 agent 工具误操作更具公开性;删除也不能消除截图、转发和声誉影响。
论点 B:平台合规与审核会吞噬产品资源。
Instagram 专业账号、TikTok/YouTube audit、LinkedIn versioning、X 费用和政策变化都不是一次性开发。真正成本是持续运营,不是 API call。
论点 C:跨平台统一模型容易制造虚假承诺。
“文字、图片、视频、链接都能发”在每个平台的含义不同。为了统一而隐藏平台字段,会直接违反 YouTube/TikTok 的 UX/合规要求。
论点 D:Connector/Skill 生态扩大供应链和 prompt-injection 风险。
第三方 MCP server 能看到发布内容和账号能力;annotations 可以撒谎;恶意 skill 可诱导扩大权限或把私有内容发到公开平台。
论点 E:它与 Sense 的隐私叙事可能冲突。
Sense 的核心是默认关闭、最小采集。把公共发布放在同一品牌入口,用户可能误解“LISA 感知到什么就会自动发什么”。
论点 F:普通 Web chat 当前还缺通用 approval。
如果没有 host-enforced 两阶段确认,直接接 MCP publish 工具会把已有安全缺口放大。
- 不把
publish暴露给模型;确认卡直达 deterministic runner,可显著降低误发。 - v1 不做自动发布,remote channel 与 autonomous run 只能起草。
- runtime capability + platform-specific preview 明确承认差异,不做最低公分母。
- 先做 Bluesky/Mastodon 验证 contract,再逐个平台通过审核,避免“大爆炸”。
- Sense 中明确分区为“Observed”与“Connected actions”,并用不同图标/状态词。
- 两阶段确认只能降低风险,不能解决用户快速点确认、connector 恶意或远端 API 语义改变。
- 小平台验证成功不代表 Meta/TikTok/YouTube 的审核与媒体链路可平移。
- 每个平台的长期维护仍是固定成本,必须有 adapter contract tests、版本监控和 kill switch。
有条件支持推进。
必须满足以下门槛:
publish不进入 LLM toolset。- 不可变 snapshot + digest confirmation 由 host 强制执行。
- remote-origin/autonomous surface 只能 draft。
- token 不进入模型或通用 config env。
- connector manifest 是可信绑定;MCP annotations 只用于 UX/附加防御。
- 先交付 Bluesky/Mastodon,完成故障注入与误发演练后再接商业平台。
- 每个平台都有 owner、version/audit 状态、contract tests 和随时禁用的 feature flag。
如果无法做到第 1–4 条,应只发布“生成草稿 + 复制到平台”,不发布 API 直发。
| 方案 | 优点 | 缺点 | 结论 |
|---|---|---|---|
| 每个平台内建 SDK | 可控、调试直接 | core 膨胀、凭据/审核耦合、更新慢 | 否 |
仅 executable tool.js skill |
快 | 同进程高权限、难做 OAuth/UI/异步、审批粒度错误 | 否 |
| 浏览器自动化 | 不等 API 审核 | 脆弱、Cookie 风险、可能违反条款、难幂等 | 否 |
| 第三方聚合 SaaS connector | 上线快、统一 API | 内容与 token 经过第三方、费用/锁定、能力滞后 | 可选 connector,不做唯一方案 |
| 官方 API MCP connector + Skill + Host | 边界清晰、可扩展、可本地优先 | host contract 与 connector 生态需要前期投入 | 选定 |
| 只生成草稿/复制 | 最安全、立即可用 | 不形成完整闭环 | 作为 capability 不足时的永久 fallback |
- 方案与平台调研。
- 定义
social-connector.jsonv1 类型、严格解析与 plugin discovery。 - 定义 revisioned draft、不可变 digest approval 和 one-shot claim 的本地 store。
-
lisa sense social可查看 connector manifest 与草稿状态。 - MCP annotations 保真映射与 tests(仅保留 metadata,不把 hint 当授权)。
验收:
- manifest 缺少 publish/validate 工具、字段非法或 tool 重名时 fail closed。
- 草稿变更后旧 digest 无法 approve/claim。
- approval 过期后不能 publish。
- 同一 approval 只能 claim 一次。
- store 为
0600,不存 token 或媒体字节。
social_composehost tool:accounts/new/update/preview/validate/request-confirmation/status。- Web Sense Connected media 与 draft preview。
- media intake:显式用户附件 → host media handle、MIME sniff、sha256、EXIF strip。
- 任何平台都可退化为“复制正文/导出媒体”。
验收:
- Web/CLI/remote channel 都只能起草,不存在模型可调用的 publish tool。
- planted-secret 测试:token/媒体 bytes/本地任意路径不进 prompt/SSE/audit。
- 两个首方 connector plugin。
- OAuth/app-password secret store。
- per-target publish runner、idempotency ledger、异步 media status。
- explicit UI approval → runner,不经过模型。
验收:
- 文字、链接、图片与视频 happy path。
- 超时、429、token revoke、partial success、进程重启恢复。
- 100 次故障注入中不产生重复公开帖。
- media container/URN 流程。
- personal vs organization target。
- 公开短时 media staging service(signed URL + SSRF/egress policy)。
- connector API version contract tests。
- X 费用/credits 提示。
- Instagram Professional account eligibility、Instagram Login/Facebook Login 路径。
- image/Reels/carousel 处理。
- resumable/chunked upload、processing jobs。
- audit/private-only product gates。
- 平台 required-minimum-functionality UI。
- 可恢复 host scheduler,时区/DST/取消/重连。
- connector signing/trust tiers。
- compatibility test kit。
- marketplace install/revoke UX。
- version/audit expiry monitor 与 per-connector emergency kill switch。
- manifest parser property/fuzz tests。
- canonical JSON/digest 稳定性。
- revision invalidates approval。
- expired/consumed/changed snapshot fail closed。
- tenant isolation 与 file mode。
- per-target idempotency、partial state derivation、unknown outcome reconciliation。
每个平台 connector 必须跑同一套 contract suite:
- token 不出 tool result/log。
validateDraft没有公开 side effect。publish没有 approval envelope 时拒绝。- 重复 idempotency key 返回同 receipt,不新发。
- capability 与实际接受的 payload 一致。
- 401/403/409/429/5xx/timeout 映射为稳定错误码。
- 上传中断可恢复或安全失败。
- 恶意 link preview 指令不能触发发布。
- MCP server 谎报
readOnlyHint不能跳过 host confirmation。 - symlink/path traversal/任意本地文件不能变成媒体。
- SSRF:localhost、RFC1918、link-local、DNS rebinding、redirect chain。
- OAuth mix-up、state mismatch、PKCE mismatch、callback replay。
- remote channel“发布它”只能产生 draft。
- heartbeat/idle/Reve 无 publish runner capability。
- 错账号、同名账号、多个组织 Page。
- 链接 host 同形字/短链。
- UTC 与本地时区。
- 用户确认后修改一个空格/alt text/visibility。
- 屏幕阅读器能读出媒体 alt 和确认卡。
指标不记录正文:
- connect success/failure by platform/error code。
- validate blocking/warning counts。
- approval requested/approved/cancelled/expired。
- publish success/partial/failed/unknown。
- processing latency。
- duplicate-prevented count。
- reconnect/token-expired count。
上线门禁:
- 0 个已知 token leak。
- 0 个“无 host approval 也能调用 publish”的路径。
- 0 个 remote/autonomous publish capability。
- adapter contract suite 全绿。
- 每个平台审核/版本/owner/kill switch 已登记。
- runbook 覆盖撤销 connector、平台事故、错误发布和数据删除。
- 首发 connector 是否确定为 Bluesky + Mastodon。
- macOS Keychain 之外的 secret store 最低支持标准。
- 发布历史默认只存 receipt,还是允许默认保存最终文案。
- 是否允许 connector 使用第三方聚合 SaaS;建议允许但标“内容/凭据经第三方”。
- v1 是否完全不做定时;建议是。
- 用户能否在 chat 文字里完成第二次确认;建议否,必须点击 UI 或 TTY 一次性短码。
- Codex manual:connected sources、plugins 与 side-effect approvals
- MCP Tool Annotations schema
- MCP Authorization
- RFC 9700:OAuth 2.0 Security BCP
- RFC 8252:OAuth 2.0 for Native Apps
- OWASP SSRF Prevention
- Bluesky:Creating a post
- Bluesky:Uploading video
- Mastodon:media methods
- Mastodon:statuses methods
- Threads API 官方 Postman collection
- LinkedIn Posts API
- LinkedIn API access /
w_member_social - X:Create Post
- X:Upload media
- X:Pricing
- Instagram API 官方 Postman collection
- Instagram Content Publishing
- Facebook Pages posts
- TikTok Content Posting API
- TikTok Direct Post getting started
- TikTok Content Sharing Guidelines
- YouTube
videos.insert - YouTube Required Minimum Functionality
- YouTube Developer Policies
让 LISA 帮用户表达,而不是替用户擅自发声:Connector 管连接,Skill 管方法,Host 管不可绕过的最终确认。
- PR #324:connector manifest、canonical draft、revision、snapshot digest 与 MCP annotations 保真。
- PR #325:模型可见的
social_compose、可信 UI/session 审批、Sense 完整快照、cancel;不存在 HTTP publish route。 - PR #326:Bluesky 与 Mastodon 首方 connector plugin + Skill;CLI 安装/连接;隐藏 runner;文字、链接、图片、视频、幂等、逐目标 receipt、结构化 audit、pause kill switch。
- 媒体进入 host store 前做 magic-byte MIME sniff、SHA-256、JPEG/PNG 隐私元数据剥离;不把文件路径或媒体 bytes 放进草稿。
social_publish与 disconnect operation 根据受信 manifest 绑定,从模型、remote channel、autonomous run 和 task tool closure 中排除。
commercial.ts 登记 Threads、Instagram、LinkedIn、X、TikTok、YouTube、Facebook Pages 的:
- OAuth scope、账号类型、平台审核/业务验证/付费门槛。
- 版本固定策略,禁止 silent floating。
- 媒体交付类型:公网拉取、直接上传、分片/可恢复上传。
- 平台专有必填字段与 fail-closed validation。
- 从上传初始化到 publish/status reconciliation 的请求步骤。
draft-only、private-test-only、ready三态 readiness;没有凭据或审核时绝不显示 ready。
可用 lisa sense social readiness 查看门槛。该命令不读取或打印 secret。
| 平台 | 外部门槛 | 未满足时的产品行为 |
|---|---|---|
| Threads | Meta app review;图片/视频必须由 Meta 可拉取的公网 URL | 仅草稿 |
| Meta review/Business Verification;专业账号;公网 media URL | 仅草稿 | |
| product access;member/org scope;组织角色;月版本轮换 | 仅草稿 | |
| X | 付费 project、write scope 与运行配额 | 仅草稿,并显示费用提示 |
| TikTok | Content Posting 产品批准;Direct Post audit;creator-info UX;URL prefix verification | 未 audit 只允许 private test |
| YouTube | Google OAuth verification;YouTube API audit | 未 audit 上传强制 private |
| Meta review/Business Verification;Page token/role;不能发个人 profile | 仅草稿 |
因此,“代码已实现 adapter contract”不等于“平台已授权生产直发”。要把某一平台从 draft-only 提升为 ready,必须由平台 app owner 提供 client 配置、完成 review/audit,并用真实测试账号通过 connector contract suite。任何绕过这些门槛的浏览器自动化或 Cookie 注入仍明确不采用。
- 全量测试:1466 passed、1 skipped。
- 包含真实 MCP stdio initialize/list-tools/close,而非只测 mock。
- failure injection 覆盖 stale digest、approval expiry、one-shot claim、pause-before-claim、partial outcome、MIME mismatch、媒体 hash 与远端审批拒绝。
- live platform smoke test 需要用户账号与 app 审核;本轮没有使用或伪造任何生产凭据,也没有向真实社交账号发布测试内容。