@@ -95,39 +95,50 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
9595
9696 refreshTask? . cancel ( )
9797 refreshTask = Task {
98- do {
99- let usageDataScan = await Task . detached ( priority: . utility) {
100- UsageDataScanner . currentScan ( )
101- } . value
102-
103- let agentsToRefresh = UsageRefreshController . agentsNeedingRefresh (
104- pricingMode: request. pricingMode,
105- currentUsageDataScan: usageDataScan,
106- cachedUsageDataFingerprints: lastUsageDataFingerprints,
107- cachedAgentData: lastSuccessfulAgentData
108- )
109-
110- if !agentsToRefresh. isEmpty {
98+ defer {
99+ refreshTask = nil
100+ }
101+
102+ let usageDataScan = await Task . detached ( priority: . utility) {
103+ UsageDataScanner . currentScan ( )
104+ } . value
105+
106+ let agentsToRefresh = UsageRefreshController . agentsNeedingRefresh (
107+ pricingMode: request. pricingMode,
108+ currentUsageDataScan: usageDataScan,
109+ cachedUsageDataFingerprints: lastUsageDataFingerprints,
110+ cachedAgentData: lastSuccessfulAgentData,
111+ lastErrorByAgent: state. lastErrorByAgent
112+ )
113+
114+ var nextErrorByAgent = state. lastErrorByAgent
115+ for agent in agentsToRefresh {
116+ do {
111117 let snapshot = try await UsageFetcher . fetchUsage (
112118 offline: request. pricingMode == . offline,
113- agents: agentsToRefresh
119+ agents: [ agent ]
114120 )
115121 cache ( snapshot: snapshot, usageDataScan: usageDataScan)
122+ nextErrorByAgent. removeValue ( forKey: agent)
123+ } catch {
124+ guard !Task. isCancelled else {
125+ return
126+ }
127+ nextErrorByAgent [ agent] = error. localizedDescription
128+ NSLog (
129+ " agenttally %@ refresh failed: %@ " ,
130+ agent. displayName,
131+ error. localizedDescription
132+ )
116133 }
117-
118- applyRefreshSuccess (
119- cachedSnapshot ( ) ,
120- pricingMode: request. pricingMode,
121- lastUsageDetectedAtByAgent: usageDataScan. lastUsageDetectedAtByAgent
122- )
123- } catch {
124- guard !Task. isCancelled else {
125- return
126- }
127- applyRefreshFailure ( error)
128134 }
129135
130- refreshTask = nil
136+ applyRefreshSuccess (
137+ cachedSnapshot ( ) ,
138+ pricingMode: request. pricingMode,
139+ lastUsageDetectedAtByAgent: usageDataScan. lastUsageDetectedAtByAgent,
140+ lastErrorByAgent: nextErrorByAgent
141+ )
131142 }
132143 }
133144
@@ -155,12 +166,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
155166 private func applyRefreshSuccess(
156167 _ snapshot: UsageSnapshot ,
157168 pricingMode: PricingRefreshMode ,
158- lastUsageDetectedAtByAgent: [ AgentKind : Date ]
169+ lastUsageDetectedAtByAgent: [ AgentKind : Date ] ,
170+ lastErrorByAgent: [ AgentKind : String ]
159171 ) {
160172 state = UsageRefreshController . applySuccess (
161173 snapshot: snapshot,
162174 pricingMode: pricingMode,
163175 lastUsageDetectedAtByAgent: lastUsageDetectedAtByAgent,
176+ lastErrorByAgent: lastErrorByAgent,
164177 to: state
165178 )
166179 renderTitle ( )
@@ -170,9 +183,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
170183 private func applyRefreshFailure( _ error: Error ) {
171184 state = UsageRefreshController . applyFailure ( error: error, to: state)
172185 renderTitle ( )
173- if let lastError = state. lastError, !lastError. isEmpty {
174- NSLog ( " agenttally refresh failed: %@ " , lastError)
175- }
186+ NSLog ( " agenttally refresh failed: %@ " , error. localizedDescription)
176187 refreshMenuIfNeeded ( )
177188 }
178189
0 commit comments