支柱三 · Connector(带凭证的边缘)
父级:key-designs
每一次带凭证的对外接触都要经过同一层:connector.Hub + 分类插槽(category slots)。消费方(agent 能力、平台功能、IM 桥;job-loop 至今仍不是消费方)看到的是固定的分类契约(CalendarProxy、MailProxy —— backend/internal/connector/contract/),拿到的是一个调用句柄——凭证永远不会跨过这条边界(通过 cryptobox 以 AES-256-GCM 静态加密)。有两种:openapi(面向单个 SaaS 的 HTTP:spec + JSONata 绑定,凭证表单从 securitySchemes 派生而来)和protocol(SMTP/CalDAV:内置的 Go 实现,protocol_smtp.go / protocol_caldav.go;没有 IMAP)。第三个 protocol 连接器 telegram(分类 im)于 2026-09-04 落地(8c819f26d,protocol_telegram.go):它只保存 bot token —— 没有分类契约、没有 Verifier —— 由独立的 im-bridge 通过 GET /internal/im/config 读取(cmd/server/boot_im.go)。connector.Service(service.go + svc_*.go;旧的 connectorsvc 包已于 2026-07-26 合并进来,1bc9ba8b0)是管理面(creds/connect/oauth/activate/disconnect);retry 为每个调用类别提供策略;egress/SSRF 防护把守出口。能力依赖(Requires:["calendar"])通过 capreg/depresolver.go 解析——依赖未满足 ⟹ 能力被隐藏,fail-closed(失败即关闭)。
现状: 代理层最先落地;可安装(installable)已落地(上传流程可用;红契约存量 = 36789537d 时 66 个 connector-*.spec.ts;fixme 尾巴已清空;TODO-impl 的 mock 基础设施缺口已于 2026-07-03 关闭,059dc5c13 —— 剩 0 处);同步模式(sync-mode)已落地(2026-07-08,d51805372,backend/internal/connector/sync.go)—— connector.NewSyncConnector + SyncIngester 能力把"摄入"变成一等的连接器种类,/obsidian/import 现在经接口委派,而不是内联调 SyncVault(routes/admin/obsidian.go:218;DTO 在边界上 1:1 改名,于是连接器层仍然不依赖 usecase)。36789537d 时 17 个 sync-*.spec.ts / 118 条测试,行为一致。刻意推迟的,到 36789537d 仍然如此(NewSyncConnector 在 sync.go 之外没有调用方):把它注册进 Hub 以获得一张 admin UI 卡片 —— 那需要把 cmd→server 的依赖穿下去,而sync-mode 这层抽象没有它照样承重。(Connector ≠ MCP;action 与 sync 的区别——见 confusables。)
已被取代——everything-is-a-block(eiab),2026-09-13 → 2026-09-18(在上面 36789537d 那次核对之后)这根支柱作为独立模块已经不存在了:
backend/internal/connector/现在是 0 个 Go 文件。 每个 connector 都变成了沙箱 JS block(backend/blocks/{caldav,smtp,google-calendar,telegram}/manifest.yaml+ 一个 JS MCP server);openapi 类型变成通用的 openapi-runtime block,protocol 实现(protocol_smtp.go/protocol_caldav.go)和分类契约(CalendarProxy/MailProxy)都退役了,依赖解析搬到backend/internal/plugin/effect/registry_deps.go。凭证静态加密 + egress/SSRF 围栏在 block 沙箱边界上保留下来。"sync-mode 已落地"这句是双重过时:既没有 connector 模块,vault 同步(SyncVault)也仍是一个 bespoke admin 端点(routes/admin/obsidian.go),从不是一种 connector 种类(roadmap 1e)。下面的"现状"和 mermaid 画的都是 eiab 之前的形状。
Connector 生命周期(状态)
由红色测试钉住:每个分类插槽只能有一个活跃 connector;断开连接会保留凭证;agent 工具的暴露是叠加在 Active 之上、按操作单独开启的选项。
子节点
- connector-diagram-coverage — 双向的类图(注册表一侧 vs 调用方一侧)+ 覆盖率清单。
- connector-plugins — 已落地:种类、契约/绑定/运行时三层、仅 JSONata、红契约存量。
- connector-deps —
Requires:[...]具名 provider、fail-closed 隐藏、MCP↔Connector 的正式接口。 - connector-egress-guard — SSRF/数据外泄防护。
- idempotent-booking — 预订(booking)这个消费方的幂等性纪律。