import 'package:clide/clide.dart' show clideVersion; import 'package:clide/src/ipc/envelope.dart'; import 'package:clide/src/ipc/schema_v1.dart'; typedef CommandHandler = Future Function(IpcRequest req); class DaemonDispatcher { DaemonDispatcher() { register('ping', _ping); register('version', _version); } final Map _handlers = {}; void register(String cmd, CommandHandler handler) { _handlers[cmd] = handler; } /// Remove all registered handlers except ping/version. void clear() { _handlers.removeWhere((k, _) => k != 'ping' && k != 'version'); } bool get isEmpty => _handlers.length <= 2; // only ping + version Future dispatch(IpcRequest req) async { final h = _handlers[req.cmd]; if (h == null) { return IpcResponse.err( id: req.id, error: IpcError( code: IpcExitCode.notFound, kind: IpcErrorKind.notFound, message: 'unknown command: ${req.cmd}', hint: 'run `clide --help` for the surface.', ), ); } return h(req); } Future _ping(IpcRequest req) async => IpcResponse.ok( id: req.id, data: { 'pong': true, 'ts': DateTime.now().toUtc().toIso8601String(), 'version': clideVersion, }, ); Future _version(IpcRequest req) async => IpcResponse.ok( id: req.id, data: {'version': clideVersion}, ); }