import type { CorePlatformAdapter } from '@cutie-crypto/connector-core'; import type { BacktestProviderConfig, BacktestProviderSource, BacktestToolConfig } from '../backtest'; export type PlatformId = 'openclaw' | 'hermes' | 'cutie_platform'; export interface PlatformSetupResult { workspaceCreated: boolean; agentAdded: boolean; sessionConfigured: boolean; responsesEndpointOk: boolean; /** 实际生效的 gateway 连接信息,通用 setup 写进 connector config */ gatewayEndpoint: { url: string; secret: string; }; warnings: string[]; } /** * OpenClaw adapter 看到的窄 config 子集(约束 2 / config 分层)。 * * adapter 编译期只能访问以下字段,hermes_profile 等 Hermes-only 字段在 OpenClaw * 里看不到。ConnectorConnection wrapper 在 attachConfig 时按平台从 * ConnectorConfig 中挑出窄对象。 */ export interface OpenClawAdapterConfig { server_url: string; connector_token: string; gateway_url: string; gateway_secret: string; agent_model: string; backtest_provider?: BacktestProviderConfig; backtest_tools?: BacktestToolConfig[]; /** W3.9 §11.1: 用于查 source.max_timeout_ms 作为调用 provider 的 timeout cap */ backtest_provider_sources?: BacktestProviderSource[]; } /** * Hermes adapter 看到的窄 config 子集(约束 2 / config 分层)。 * * 包含 hermes_profile,以及用于 isLegacyHermesConfig 检测的 platform & gateway_url。 */ export interface HermesAdapterConfig { platform: 'hermes'; server_url: string; connector_token: string; gateway_url: string; gateway_secret: string; agent_model: string; backtest_provider?: BacktestProviderConfig; backtest_tools?: BacktestToolConfig[]; /** W3.9 §11.1: 用于查 source.max_timeout_ms 作为调用 provider 的 timeout cap */ backtest_provider_sources?: BacktestProviderSource[]; hermes_profile?: string; } /** * cutie_platform adapter 看到的窄 config 子集(约束 2 / config 分层)。 * * SPEC §1.1:`cutie_platform` 是内部复核节点专属平台(AgentDash 供给的 * `backtest_validation` runtime),仅承载 backtest_run 一种任务,没有本地 AI * gateway(无 gateway_url/gateway_secret/agent_model/hermes_profile 概念)。 * 照抄 hermes 的窄 config 模式,只保留 server_url/connector_token/backtest 三类字段。 */ export interface CutiePlatformAdapterConfig { server_url: string; connector_token: string; backtest_provider?: BacktestProviderConfig; backtest_tools?: BacktestToolConfig[]; /** W3.9 §11.1: 用于查 source.max_timeout_ms 作为调用 provider 的 timeout cap */ backtest_provider_sources?: BacktestProviderSource[]; } /** * Adapter 接口分层(PR #3a / #3b): * - core 知道的 6 件事(CorePlatformAdapter):attachConfig / callAgent / * selfUpgrade / augmentHeartbeat / getCapabilities / applySafetyTemplates + readonly id * - connector 包额外的 setup-specific 方法(getDataDir / isInstalled / * readGatewaySecret / getDefaultGatewayPort / getDefaultAgentModel / * getCutieWorkspaceDir / addCutieAgent / enableResponsesEndpoint / * configureSessionMaintenance / getRestartCommand / derivePersonalitySync / * coerceAgentModel / runPlatformSetup) * * Generic `C` 让 OpenClaw 编译期看 OpenClawAdapterConfig,Hermes 看 * HermesAdapterConfig,互相不串(约束 2)。 */ export interface PlatformAdapter extends CorePlatformAdapter { readonly id: PlatformId; /** 数据目录,例如 ~/.openclaw 或 ~/.hermes */ getDataDir(): string; /** 平台是否已安装(数据目录 + 主配置文件存在) */ isInstalled(): boolean; /** 读取 gateway bearer secret;如果尚未配置则返回 null */ readGatewaySecret(): string | null; /** 默认本地 HTTP 端口(OpenClaw 18789 / Hermes 8643) */ getDefaultGatewayPort(): number; /** 默认 agent model 名(OpenClaw "openclaw:cutie" / Hermes "cutie") */ getDefaultAgentModel(): string; /** Cutie workspace 物理位置(personality_sync 写入目标) */ getCutieWorkspaceDir(): string; /** 添加 cutie agent / profile(OpenClaw 走 CLI;Hermes v2 创建独立 cutie profile) */ addCutieAgent(agentModel: string): boolean; /** 启用本地 HTTP /v1/responses 端点(已启用则 no-op) */ enableResponsesEndpoint(): boolean; /** 配置 session 维护策略(仅 OpenClaw 有;Hermes no-op) */ configureSessionMaintenance(): boolean; /** Restart gateway 命令(用于在 setup 末尾提示用户) */ getRestartCommand(): string; /** 自动推导 personality_sync(OpenClaw 从 main/cutie agents;Hermes 从 profile 路径) */ derivePersonalitySync(): { main_workspace: string; cutie_workspace: string; } | null; /** * 把服务端下发的 `task.payload.agent_model` 映射为本地 HTTP API 接受的 model 字段值。 * - OpenClaw:透传(server 发 `openclaw:cutie` / `openclaw:main` 做 agent 路由) * - Hermes:服务端发 `cutie`,本地 Hermes API server 使用 profile 名作为 model ID */ coerceAgentModel(serverModel: string | undefined, configModel: string): string; /** * 平台内部的完整 setup 流程(顺序由各 adapter 自行决定)。 * 返回实际生效的 gatewayEndpoint,让通用 setup 写进 connector config。 * Hermes: agent → responses(分配端口)→ workspace → waitForGatewayReady * OpenClaw: workspace → agent → session → responses */ runPlatformSetup(ctx: { agentsMd?: string; soulMd?: string; agentModel: string; }): Promise; /** * 该平台是否需要本地 AI gateway(agent/responses 端点/gateway secret)。 * 缺省 true;cutie_platform 复核节点没有本地 AI,setup 的 gateway 完整性 * 门槛按此跳过(否则极简 adapter 必然 exit(1),AgentDash 供给失败—— * 2026-07-15 Pre validation-node 事故)。 */ requiresLocalGateway?(): boolean; }