From 9689fe65c122a273da0d079b72d94ad0182ee4cd Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 23 Apr 2026 11:36:10 +0200 Subject: [PATCH] fix decisions/tickets views to use proper IPC verbs Both views were calling pql.exec (not registered). Switched to pql.decisions.list and pql.tickets.list which are registered IPC handlers. Response parsing updated to read structured data instead of parsing JSON from stdout. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/builtin/decisions/src/decisions_view.dart | 20 +++++++------------ lib/builtin/tickets/src/tickets_view.dart | 19 ++++++------------ 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/lib/builtin/decisions/src/decisions_view.dart b/lib/builtin/decisions/src/decisions_view.dart index b32549fb..473c29f6 100644 --- a/lib/builtin/decisions/src/decisions_view.dart +++ b/lib/builtin/decisions/src/decisions_view.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'package:clide/kernel/kernel.dart'; import 'package:clide/widgets/widgets.dart'; @@ -27,9 +26,8 @@ class _DecisionsViewState extends State { Future _load() async { final kernel = ClideKernel.of(context); - final resp = await kernel.ipc.request('pql.exec', args: { - 'argv': ['decisions', 'list', '--type', 'confirmed'], - }); + await kernel.ipc.request('pql.decisions.sync'); + final resp = await kernel.ipc.request('pql.decisions.list'); if (!mounted) return; if (!resp.ok) { setState(() { @@ -38,18 +36,14 @@ class _DecisionsViewState extends State { }); return; } - final raw = resp.data['stdout'] as String? ?? '[]'; - try { - final list = (jsonDecode(raw) as List).cast>(); + final raw = resp.data['decisions']; + if (raw is List) { setState(() { - _decisions = list.map(_DecisionEntry.fromJson).toList(); - _loading = false; - }); - } catch (e) { - setState(() { - _error = 'parse error: $e'; + _decisions = [for (final e in raw) _DecisionEntry.fromJson((e as Map).cast())]; _loading = false; }); + } else { + setState(() => _loading = false); } } diff --git a/lib/builtin/tickets/src/tickets_view.dart b/lib/builtin/tickets/src/tickets_view.dart index ad3fdfb1..094db870 100644 --- a/lib/builtin/tickets/src/tickets_view.dart +++ b/lib/builtin/tickets/src/tickets_view.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'package:clide/kernel/kernel.dart'; import 'package:clide/widgets/widgets.dart'; @@ -27,9 +26,7 @@ class _TicketsViewState extends State { Future _load() async { final kernel = ClideKernel.of(context); - final resp = await kernel.ipc.request('pql.exec', args: { - 'argv': ['ticket', 'list'], - }); + final resp = await kernel.ipc.request('pql.tickets.list'); if (!mounted) return; if (!resp.ok) { setState(() { @@ -38,18 +35,14 @@ class _TicketsViewState extends State { }); return; } - final raw = resp.data['stdout'] as String? ?? '[]'; - try { - final list = (jsonDecode(raw) as List).cast>(); + final raw = resp.data['tickets']; + if (raw is List) { setState(() { - _tickets = list.map(_TicketEntry.fromJson).toList(); - _loading = false; - }); - } catch (e) { - setState(() { - _error = 'parse error: $e'; + _tickets = [for (final e in raw) _TicketEntry.fromJson((e as Map).cast())]; _loading = false; }); + } else { + setState(() => _loading = false); } }