2026-04-09 09:30:54 +08:00
# Settings Integration Configuration Model
2026-04-19 15:00:34 +08:00
Last Updated: 2026-04-19
2026-04-13 15:28:15 +08:00
2026-04-19 15:00:34 +08:00
本文件记录当前 `Settings -> Integrations` 在主链中的职责边界,以及
2026-04-22 00:49:41 +08:00
`acpBridgeServerModeConfig` 在 settings surface 中的配置仲裁规则。
2026-04-09 09:30:54 +08:00
2026-04-10 15:00:58 +08:00
## Current Rule
2026-04-09 09:30:54 +08:00
2026-04-19 15:00:34 +08:00
- Settings 只管理 Bridge 连接参数、account sync 元数据和本地编辑态
2026-04-22 00:49:41 +08:00
- `AcpBridgeServerModeConfig.effective` 只用于 settings surface 的连接与展示语义
2026-04-19 15:00:34 +08:00
- `selfHosted` 优先级高于 `cloudSynced`
2026-04-22 00:49:41 +08:00
- `cloudSynced` 只在 manual Bridge 未配置时作为 settings metadata 回退来源
2026-04-13 15:28:15 +08:00
- app 不从本地 endpoint preset、旧 module 配置、历史 fallback 恢复 provider catalog
2026-04-19 15:00:34 +08:00
- `xworkmate-bridge` 仍然是 provider catalog、gateway capability、routing resolve 的唯一真源
2026-04-22 00:49:41 +08:00
- `BRIDGE_SERVER_URL` 只属于 `AccountSyncState` 元数据,不参与 assistant runtime endpoint 选择
2026-04-19 19:42:00 +08:00
- `BRIDGE_AUTH_TOKEN` 只进入 secure storage / managed secret
## Canonical State Model
For the detailed state diagram and ownership rules, see:
- [Account Sync, Settings, and Bridge State Model ](/Users/shenlan/workspaces/cloud-neutral-toolkit/xworkmate-app/docs/architecture/account-sync-settings-bridge-state-model.md )
2026-04-09 09:30:54 +08:00
2026-04-13 15:28:15 +08:00
## Bridge-Owned Source Of Truth
2026-04-09 09:30:54 +08:00
```mermaid
flowchart TD
2026-04-13 15:28:15 +08:00
subgraph SETTINGS["Settings surface"]
A["SettingsPage / SettingsAccountPanel"]
B["bridge connection params< br / > account sync metadata< br / > secure refs"]
A --> B
end
subgraph BRIDGE["Bridge contract"]
C["acp.capabilities"]
D["xworkmate.routing.resolve"]
E["xworkmate.gateway.*"]
B --> C
end
subgraph APPSTATE["App-side derived state"]
2026-04-14 20:15:38 +08:00
F["capability refresh hydration"]
2026-04-14 10:05:10 +08:00
G["bridgeAgentProviderCatalogInternal< br / > bridgeGatewayProviderCatalogInternal< br / > bridgeAvailableExecutionTargetsInternal"]
2026-04-14 20:15:38 +08:00
H["GatewayAcpCapabilities"]
I["gateway capability -> mount target merge"]
J["ManagedMountTargetState"]
2026-04-13 15:28:15 +08:00
C --> F --> G
2026-04-14 20:15:38 +08:00
C --> H --> I --> J
2026-04-13 15:28:15 +08:00
end
subgraph UI["Visible affordances"]
2026-04-14 20:15:38 +08:00
M["agent / gateway target switch"]
N["task dialog provider menu"]
2026-04-13 15:28:15 +08:00
O["settings gateway connection affordances"]
G --> M
2026-04-14 20:15:38 +08:00
G --> N
J --> O
2026-04-13 15:28:15 +08:00
end
subgraph EXEC["Execution"]
2026-04-14 20:15:38 +08:00
P["providerCatalogForExecutionTarget()"]
Q["resolveProviderForExecutionTarget()"]
R["setAssistantProvider()"]
S["assistantProviderForSession()"]
T["GoTaskService.executeTask(...)"]
U["resolved provider / unavailable UX"]
N --> P --> Q --> R --> S --> T
T --> D --> U
2026-04-13 15:28:15 +08:00
O --> E
end
2026-04-09 09:30:54 +08:00
```
2026-04-13 15:28:15 +08:00
## What Settings Owns
- bridge host / transport / auth input
- account-linked bridge configuration metadata
2026-04-19 15:00:34 +08:00
- `acpBridgeServerModeConfig.cloudSynced`
- `acpBridgeServerModeConfig.selfHosted`
- `acpBridgeServerModeConfig.effective`
2026-04-13 15:28:15 +08:00
- secure secret references
- gateway connection test / connect / disconnect affordance
## What Settings Does Not Own
- 独立 provider catalog
- 独立 module matrix
- app-side gateway preset backfill
- 旧 `ai_gateway` / `secrets` / `account` 页面壳
2026-04-09 09:30:54 +08:00
## Notes
2026-04-19 15:00:34 +08:00
- `AcpBridgeServerModeConfig` 的实际仲裁顺序是 `selfHosted -> cloudSynced -> default`
- `selfHosted.isConfigured == true` 时,`effective.source == 'bridge'`
- `selfHosted` 未配置且 `accountSyncState` 提供了可用云端桥接信息时,`effective.source == 'cloud'`
- 两者都不可用时,`effective.source == 'default'`
2026-04-14 20:15:38 +08:00
- 当前任务对话框 provider 选择主链固定为 `providerCatalogForExecutionTarget() -> resolveProviderForExecutionTarget() -> setAssistantProvider()`
- `agent` catalog 只对应 bridge 广告的 ACP server bridges
- `gateway` catalog 只对应 bridge 返回的 gateway provider 列表;当前为 `openclaw` ,未来可扩展 `hermes` 等项
2026-04-14 10:05:10 +08:00
- provider picker 的真源只来自 bridge 返回的 target-scoped catalog; 不会因为线程里保存过 `providerId` 就被 app 反向重建
2026-04-13 15:28:15 +08:00
- gateway runtime 可见性来自 bridge capability snapshot 与 `xworkmate.gateway.*` 返回,不来自旧设置页枚举
- bridge 若返回额外 capability flag, 这些 flag 只属于合同元数据,不会自动生成新的 settings tab 或 module page
2026-04-14 20:15:38 +08:00
- bridge 若未返回 catalog, provider 菜单为空或禁用; app 不伪造 `codex / opencode / gemini / openclaw`
2026-04-13 15:28:15 +08:00
- production provider / gateway 选择继续由 bridge 拥有, app 只保留消费与展示
2026-04-14 20:15:38 +08:00
2026-04-19 15:00:34 +08:00
## Effective Config Mermaid
```mermaid
stateDiagram-v2
[*] --> EvaluateEffective
EvaluateEffective --> BridgeEffective: selfHosted.isConfigured == true
EvaluateEffective --> CloudEffective: selfHosted 未配置 且 cloudSynced 可用
EvaluateEffective --> DefaultEffective: 两者都不可用
BridgeEffective --> CloudEffective: 关闭 manual Bridge
CloudEffective --> BridgeEffective: manual Bridge 配置生效
CloudEffective --> DefaultEffective: cloud sync 失效
DefaultEffective --> CloudEffective: cloud sync 恢复
note right of BridgeEffective
2026-04-22 00:49:41 +08:00
source = bridge metadata
used by settings only
2026-04-19 15:00:34 +08:00
end note
note right of CloudEffective
2026-04-22 00:49:41 +08:00
source = cloud metadata
used by settings only
2026-04-19 15:00:34 +08:00
end note
note right of DefaultEffective
2026-04-22 00:49:41 +08:00
source = managed bridge origin
assistant runtime fixed to kManagedBridgeServerUrl
2026-04-19 15:00:34 +08:00
end note
```
2026-04-14 20:15:38 +08:00
## See Also
- [Task Dialog Provider Selection Mainline ](/Users/shenlan/workspaces/cloud-neutral-toolkit/xworkmate-app/docs/architecture/task-dialog-provider-selection-mainline.md )