Skip to content

Commit 7c452fa

Browse files
committed
fix: keep guard credential checks read-only
1 parent d8c282b commit 7c452fa

1 file changed

Lines changed: 21 additions & 19 deletions

File tree

‎Sources/CodexBarCLI/CLIGuardCommand.swift‎

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -95,41 +95,47 @@ extension CodexBarCLI {
9595
let verbose = values.flags.contains("verbose")
9696

9797
guard let window = Self.decodeGuardWindow(from: values) else {
98-
Self.exitGuardArgumentError("--window must be session|weekly.")
98+
Self.exitGuardArgumentError("--window must be session|weekly.", output: output)
9999
}
100100

101101
let minimumRemainingPercent: Double
102102
switch Self.decodeGuardMinimumRemaining(from: values) {
103103
case let .success(value):
104104
minimumRemainingPercent = value
105105
case .failure:
106-
Self.exitGuardArgumentError("--min-remaining must be a finite percent between 0 and 100.")
106+
Self.exitGuardArgumentError(
107+
"--min-remaining must be a finite percent between 0 and 100.",
108+
output: output)
107109
}
108110

109111
let timeout: TimeInterval
110112
switch Self.decodeGuardTimeout(from: values) {
111113
case let .success(value):
112114
timeout = value
113115
case .failure:
114-
Self.exitGuardArgumentError("--timeout must be a finite number of seconds from 0 through 86400.")
116+
Self.exitGuardArgumentError(
117+
"--timeout must be a finite number of seconds from 0 through 86400.",
118+
output: output)
115119
}
116120

117121
let provider: UsageProvider
118122
switch Self.decodeGuardProvider(from: values) {
119123
case let .success(value):
120124
provider = value
121125
case let .failure(error):
122-
Self.exitGuardArgumentError(error.localizedDescription)
126+
Self.exitGuardArgumentError(error.localizedDescription, output: output)
123127
}
124128
let config = Self.loadConfig(output: output)
125129

126130
let outcome = await Self.runGuardFetch(timeout: timeout) {
127-
await Self.guardFetchOutcome(
128-
provider: provider,
129-
window: window,
130-
config: config,
131-
verbose: verbose,
132-
webTimeout: timeout > 0 ? timeout : 60)
131+
await ProviderInteractionContext.$current.withValue(.background) {
132+
await Self.guardFetchOutcome(
133+
provider: provider,
134+
window: window,
135+
config: config,
136+
verbose: verbose,
137+
webTimeout: timeout > 0 ? timeout : 60)
138+
}
133139
}
134140
if case .unavailable(.timeout) = outcome {
135141
TTYCommandRunner.terminateActiveProcessesForAppShutdown()
@@ -152,9 +158,8 @@ extension CodexBarCLI {
152158

153159
// MARK: - Argument decoding
154160

155-
private static func exitGuardArgumentError(_ message: String) -> Never {
156-
writeStderr("Error: \(message)\n")
157-
platformExit(ExitCode.usage.rawValue)
161+
private static func exitGuardArgumentError(_ message: String, output: CLIOutputPreferences) -> Never {
162+
self.exit(code: .usage, message: "Error: \(message)", output: output, kind: .args)
158163
}
159164

160165
static func decodeGuardWindow(from values: ParsedValues) -> GuardWindow? {
@@ -273,13 +278,10 @@ extension CodexBarCLI {
273278
fetcher: tokenContext.fetcher(base: fetcher, provider: provider, env: env),
274279
claudeFetcher: claudeFetcher,
275280
browserDetection: browserDetection,
276-
selectedTokenAccountID: account?.id,
277-
tokenAccountTokenUpdater: tokenContext.tokenUpdater(for: account),
278-
providerManualTokenUpdater: tokenContext.manualTokenUpdater())
281+
// Guard is read-only: omit updater callbacks so refresh-dependent credentials fail unavailable.
282+
selectedTokenAccountID: account?.id)
279283

280-
let outcome = await ProviderInteractionContext.$current.withValue(.background) {
281-
await Self.fetchProviderUsage(provider: provider, context: fetchContext)
282-
}
284+
let outcome = await Self.fetchProviderUsage(provider: provider, context: fetchContext)
283285
if verbose {
284286
Self.printFetchAttempts(provider: provider, attempts: outcome.attempts)
285287
}

0 commit comments

Comments
 (0)