2026-09-23·by Sijie Wang#standmeet#architecture#design

connector-deps

连接器依赖——Requires,fail-closed 解析

父节点:connector

这是 capabilities 支柱与 connector 支柱之间的正式接口——设计上就是 fail-closed 且不关心消费者身份的。插件清单声明 Requires: ["calendar", "smtp"]——这些是应用内依赖提供方的名字,每一个都由某个连接器类别背书。capreg/depresolver.go 就是这个注册表;解析发生在装配阶段:只要有一个所需依赖不处于 Connected 状态,该能力就会在全局范围内被隐藏(fail-closed)——这是发现层面的降级,不是运行时报错。提供方只对外暴露两样东西:一个 Connected 谓词和一个调用句柄——绝不暴露凭证(这是 connector-plugins 划出的边界)。

不关心消费者身份这个设计决定,让整套机制变得通用且双向:同一套按名字解析依赖的逻辑,同时服务于 agent、平台自身功能,以及未来的消费者(IM 网关、job-loop),并且在两个方向上都成立(主动执行动作和被动同步)。

类视图

精确说明:DepProvider 只回答 Connected——它是一个谓词,不是调用句柄。消费者实际使用的句柄是类别代理(connector-plugins 里的 CalendarProxy/MailProxy),是另外单独装配的;依赖机制只负责决定这个能力是否会被暴露出来AllConnected 为 false → 隐藏,fail-closed)。

自 2026-08-20 起(a9c446937)在此之上又多了一个谓词:OpProvider.CanPerform(ctx, ownerID, op)depresolver.go:151),由 NamedOpProvider 构造。一个能力可以要求一个操作calendar:events.insert),而不只是一个连接,于是只读授权会藏起"预订会议"却不藏"空闲时段"。到 36789537d 为止,组合根把 calendar 注册为 NamedOpProvider(背后是 ConnectorSlots.CanPerform),把 smtp 注册为普通的 NamedProvidercmd/server/axisconn/register.go:207-214)——这两个名字就是全部的 provider 表。

about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →