From 185af91b4d525db6c192a050b53615772fb5fe11 Mon Sep 17 00:00:00 2001 From: Igor Soarez Date: Mon, 26 Oct 2026 16:32:18 +0200 Subject: importance: mark an agent high, normal, or low within a status, more important agents are listed first, and so jumped to first; status stays first. a high agent shows a bold ! before its name, a low agent's name is lightly dimmed with "low" on its second line, and it makes no sound (it still notifies and waits in line). in pi, /importance high|normal|low (completes the levels; none once one is typed out, so Enter runs it). the extension saves it in the session as a custom entry (dingger-importance), so /reload, restarts, /resume and restore bring it back; /new starts at normal. it shows a level other than normal in pi's footer, emits dingger:importance { level } for other extensions, and sends it with every report. for other agents, `dingger importance [level] [--pane]`; it refuses a pi that reports itself, whose saved level would win. the daemon stays the one writer of pane state: it writes @dingger_importance (unset for normal), which goes with the agent and survives a daemon restart. `dingger status` marks high and low. tests: e2e step 21 (order, the option, no sound for low, the menu bar, the command, the extension through a harness that now matches pi's extension API), a DINGGER_SOUND seam so sounds are observable, and a status-line check that read the counts once (flaky) now polls. pi-live: /importance in real pi 1.4, its footer and session entry, and the level after a restore; every pi there now uses the test's agent directory (a restored pi read the user's). negative controls fail each part. --- menubar/main.swift | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'menubar/main.swift') diff --git a/menubar/main.swift b/menubar/main.swift index 17b9fcc..c37386e 100644 --- a/menubar/main.swift +++ b/menubar/main.swift @@ -397,6 +397,21 @@ if arguments.contains("--selftest") { since: $0.2, path: "~") }.sorted(by: listedBefore).map(\.name) let expected = ["blocked", "done old", "done new", "working new", "working old", "idle new", "idle old", "idle unknown"] if listed != expected { failures.append("order: waiting oldest first, the rest most recent first: \(listed)") } + let byImportance: [(String, Status, Importance, Int)] = [ + ("done old", .done, .normal, 10), ("done new high", .done, .high, 90), ("done older low", .done, .low, 5), + ("blocked low", .blocked, .low, 99), ("working high", .working, .high, 1), ("working new", .working, .normal, 80), + ] + let importanceListed = byImportance.map { Row(paneId: $0.0, agent: "pi", name: $0.0, status: $0.1, session: "s", + window: "w", since: $0.3, path: "~", importance: $0.2) } + .sorted(by: listedBefore).map(\.name) + let importanceExpected = ["blocked low", "done new high", "done old", "done older low", "working high", "working new"] + if importanceListed != importanceExpected { + failures.append("order: status first, then importance, then time: \(importanceListed)") + } + let high = Row(paneId: "%1", agent: "pi", name: "Fix it", status: .done, session: "s", window: "w", since: 1, importance: .high) + if rowTitle(high).string != "✓ ! Fix it" || rowTitlePrefix(high) != "✓ ! " { + failures.append("title: a high agent is marked: \(rowTitle(high).string)") + } failures.forEach { print("FAIL \($0)") } print(failures.isEmpty ? "selftest ok" : "selftest: \(failures.count) failed") exit(failures.isEmpty ? 0 : 1) @@ -405,7 +420,7 @@ if arguments.contains("--print") { let rows = fetchRows() print("title: \(plainTitle(for: rows))") for row in rows { - print("\(row.status.symbol) \(row.status.rawValue)\t\(row.label)\t\(row.subtitle)") + print("\(row.status.symbol) \(row.status.rawValue)\t\(row.markedLabel)\t\(row.subtitle)") } exit(0) } -- cgit v1.2.3