/** * ConnectorConnection — connector 包对外的 thin wrapper。 * * 主体协议循环(WS / 心跳 / 任务 / 自升级)已抽到 @cutie-crypto/connector-core * 的 ConnectorConnection。本 wrapper 只负责: * 1. 把 ConnectorConfig 转换成 core 的 CoreConnectionConfig * 2. 给 adapter 注入 config 引用(attachConfig) * 3. 启动 / 关闭 personality_sync 定时器(personality_sync 是 connector * 包独有的功能,不属于 core) * 4. 启动 / 关闭回测配置热重载(文件轮询)与 provider 周期重探测(网络健康 * 检查)两个定时器,让运行中的 connector 感知外部配置变更与 provider * 自身状态漂移,无需重启进程 */ import { type ConnectorConfig } from './config'; export declare class ConnectorConnection { private core; private config; private adapter; private syncTimer; private backtestReloadTimer; private configMtimeMs; private providerReprobeTimer; /** 探测耗时 > 周期时的重入守卫,避免 provider 慢响应堆积并发 health/catalog 请求 */ private providerReprobeInFlight; constructor(config: ConnectorConfig); /** * 约束 2 / config 分层:从 frozenConfig 中挑出当前平台需要的窄字段, * 构造 adapter-specific config 对象注入。adapter 编译期看不到其他平台的字段。 * * switch + assertNever 让 PlatformId 扩展(未来加 zylos)时编译期强制补齐 * 这里的 config 注入分支(PR #3b codex Q4 修复)。 * * 构造时调用一次;回测配置热更新时(startBacktestConfigReload)会用更新后的 * frozen 视图再次调用——adapter.attachConfig 是幂等的引用替换。 */ private attachPlatformConfig; start(): void; stop(): void; /** * 回测配置热生效:周期性检查 config.json mtime,变化时只重读回测三字段 * (backtest_provider / backtest_tools / backtest_provider_sources)并重新 * attach adapter config,下一个心跳即上报新的 capabilities + 工具目录。 * * 背景:`backtest-tool add/refresh` 等 CLI 写完 config 后,旧实现要求重启 * connector 才生效,而安装脚本的重启是 best-effort(systemctl --user, * 非 systemd 启动形态下静默失败),导致"装好了但平台永远不知道"。 * * 只热更新回测字段——server_url / token / gateway 等连接性字段仍按 frozen * 语义处理(改这些本来就该重启),把热更新的影响面限制在能力上报。 */ private startBacktestConfigReload; private statConfigMtime; private reloadBacktestConfigIfChanged; /** * Provider 周期重探测:解决 provider 单独重启换 revision 后运行中 connector * 永远不感知的 P3 缺口。心跳上报的 provider_revision / process_fingerprint * 读的是 config.backtest_tools 缓存(platforms/cutie.ts augmentHeartbeat), * catalog 只在 CLI `start`/`backtest-tool refresh` 手动路径或本 timer 里更新。 * * 每次 tick 用当前(可能已被 reloadBacktestConfigIfChanged 热更新过的) * backtest_provider_sources 判断是否有需要探测的 source——不在 startBacktestConfigReload * 已有的 30s 文件轮询上叠加职责,两个 timer 各管一段:文件轮询只感知外部写盘, * 本 timer 只感知 provider 自身状态漂移,互不依赖。 * * 复用 refreshBacktestProviderSources 的既有失败语义:source 不可达/health 未就绪 * 时函数内部把既有 tool 标 health:'unavailable' 而不是丢弃,因此这里拿到的 * refresh.tools 已经是"失败时不抖动"的结果,直接整体替换即可。 */ private startBacktestProviderReprobe; private reprobeBacktestProviders; private startPersonalitySync; }