Put the account's balance on the coder's bottom row The status bar carried this session's token counts and nothing about money. `GET /api/v1/credit` now answers with what the account was granted, what its grants metered, what is left, and how many of its calls the deployment could not price, so the row can say whether the next turn is affordable. It is read, never computed. Spend is priced server-side, and a second terminal signed in to the same account spends the same money — a client subtracting what it saw would show one session's usage as an account's balance, and would show a full one to whichever terminal opened second. Three display states, because three things can be true and collapsing them would make the row lie in one of them: - nothing read yet, so the field is absent — not `$0.00` - a read that did not answer: `credit: unavailable`, replacing any figure it had shown, because a number that stopped refreshing looks exactly like a current one - an answer whose spend the server calls incomplete: `credit: 3 unpriced calls`, and no dollar figure at all Only a complete answer prints one. `remaining_microusd` is a ceiling rather than a balance while any lane is unpriced, and the lane this coder runs on is unpriced today: a 12-task benchmark run on 2026-08-26 came back with 0 of 12 calls priced. A row showing `$20.00 left` through that afternoon would not read as "unknown", it would read as "you have spent nothing". `tests/interactive_pty.rs` drives both answered states end to end: the stub deployment serves the two bodies the controller writes, and the assertions read the figure and the unpriced count out of the emulated cells.
Put the account's balance on the coder's bottom row
Deploy story
What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.
- pushed
- by user · WAL seq 267 · 2026-08-26T15:40:28.942879Z
Changed files
-
added
crates/coder-lite/src/credit.rs -
modified
crates/coder-lite/src/interactive.rs -
modified
crates/coder-lite/src/lib.rs -
modified
crates/coder-lite/src/runtime.rs -
modified
crates/coder-lite/src/tui.rs -
modified
crates/coder-lite/tests/interactive_pty.rs
Diff
6 files changed, +501 -18
crates/coder-lite/src/credit.rs added +295
@@ -0,0 +1,295 @@
| 1 |
|
|
| 2 |
|
|
| 3 |
|
|
| 4 |
|
|
| 5 |
|
|
| 6 |
|
|
| 7 |
|
|
| 8 |
|
|
| 9 |
|
|
| 10 |
|
|
| 11 |
|
|
| 12 |
|
|
| 13 |
|
|
| 14 |
|
|
| 15 |
|
|
| 16 |
|
|
| 17 |
|
|
| 18 |
|
|
| 19 |
|
|
| 20 |
|
|
| 21 |
|
|
| 22 |
|
|
| 23 |
|
|
| 24 |
|
|
| 25 |
|
|
| 26 |
|
|
| 27 |
|
|
| 28 |
|
|
| 29 |
|
|
| 30 |
|
|
| 31 |
|
|
| 32 |
|
|
| 33 |
|
|
| 34 |
|
|
| 35 |
|
|
| 36 |
|
|
| 37 |
|
|
| 38 |
|
|
| 39 |
|
|
| 40 |
|
|
| 41 |
|
|
| 42 |
|
|
| 43 |
|
|
| 44 |
|
|
| 45 |
|
|
| 46 |
|
|
| 47 |
|
|
| 48 |
|
|
| 49 |
|
|
| 50 |
|
|
| 51 |
|
|
| 52 |
|
|
| 53 |
|
|
| 54 |
|
|
| 55 |
|
|
| 56 |
|
|
| 57 |
|
|
| 58 |
|
|
| 59 |
|
|
| 60 |
|
|
| 61 |
|
|
| 62 |
|
|
| 63 |
|
|
| 64 |
|
|
| 65 |
|
|
| 66 |
|
|
| 67 |
|
|
| 68 |
|
|
| 69 |
|
|
| 70 |
|
|
| 71 |
|
|
| 72 |
|
|
| 73 |
|
|
| 74 |
|
|
| 75 |
|
|
| 76 |
|
|
| 77 |
|
|
| 78 |
|
|
| 79 |
|
|
| 80 |
|
|
| 81 |
|
|
| 82 |
|
|
| 83 |
|
|
| 84 |
|
|
| 85 |
|
|
| 86 |
|
|
| 87 |
|
|
| 88 |
|
|
| 89 |
|
|
| 90 |
|
|
| 91 |
|
|
| 92 |
|
|
| 93 |
|
|
| 94 |
|
|
| 95 |
|
|
| 96 |
|
|
| 97 |
|
|
| 98 |
|
|
| 99 |
|
|
| 100 |
|
|
| 101 |
|
|
| 102 |
|
|
| 103 |
|
|
| 104 |
|
|
| 105 |
|
|
| 106 |
|
|
| 107 |
|
|
| 108 |
|
|
| 109 |
|
|
| 110 |
|
|
| 111 |
|
|
| 112 |
|
|
| 113 |
|
|
| 114 |
|
|
| 115 |
|
|
| 116 |
|
|
| 117 |
|
|
| 118 |
|
|
| 119 |
|
|
| 120 |
|
|
| 121 |
|
|
| 122 |
|
|
| 123 |
|
|
| 124 |
|
|
| 125 |
|
|
| 126 |
|
|
| 127 |
|
|
| 128 |
|
|
| 129 |
|
|
| 130 |
|
|
| 131 |
|
|
| 132 |
|
|
| 133 |
|
|
| 134 |
|
|
| 135 |
|
|
| 136 |
|
|
| 137 |
|
|
| 138 |
|
|
| 139 |
|
|
| 140 |
|
|
| 141 |
|
|
| 142 |
|
|
| 143 |
|
|
| 144 |
|
|
| 145 |
|
|
| 146 |
|
|
| 147 |
|
|
| 148 |
|
|
| 149 |
|
|
| 150 |
|
|
| 151 |
|
|
| 152 |
|
|
| 153 |
|
|
| 154 |
|
|
| 155 |
|
|
| 156 |
|
|
| 157 |
|
|
| 158 |
|
|
| 159 |
|
|
| 160 |
|
|
| 161 |
|
|
| 162 |
|
|
| 163 |
|
|
| 164 |
|
|
| 165 |
|
|
| 166 |
|
|
| 167 |
|
|
| 168 |
|
|
| 169 |
|
|
| 170 |
|
|
| 171 |
|
|
| 172 |
|
|
| 173 |
|
|
| 174 |
|
|
| 175 |
|
|
| 176 |
|
|
| 177 |
|
|
| 178 |
|
|
| 179 |
|
|
| 180 |
|
|
| 181 |
|
|
| 182 |
|
|
| 183 |
|
|
| 184 |
|
|
| 185 |
|
|
| 186 |
|
|
| 187 |
|
|
| 188 |
|
|
| 189 |
|
|
| 190 |
|
|
| 191 |
|
|
| 192 |
|
|
| 193 |
|
|
| 194 |
|
|
| 195 |
|
|
| 196 |
|
|
| 197 |
|
|
| 198 |
|
|
| 199 |
|
|
| 200 |
|
|
| 201 |
|
|
| 202 |
|
|
| 203 |
|
|
| 204 |
|
|
| 205 |
|
|
| 206 |
|
|
| 207 |
|
|
| 208 |
|
|
| 209 |
|
|
| 210 |
|
|
| 211 |
|
|
| 212 |
|
|
| 213 |
|
|
| 214 |
|
|
| 215 |
|
|
| 216 |
|
|
| 217 |
|
|
| 218 |
|
|
| 219 |
|
|
| 220 |
|
|
| 221 |
|
|
| 222 |
|
|
| 223 |
|
|
| 224 |
|
|
| 225 |
|
|
| 226 |
|
|
| 227 |
|
|
| 228 |
|
|
| 229 |
|
|
| 230 |
|
|
| 231 |
|
|
| 232 |
|
|
| 233 |
|
|
| 234 |
|
|
| 235 |
|
|
| 236 |
|
|
| 237 |
|
|
| 238 |
|
|
| 239 |
|
|
| 240 |
|
|
| 241 |
|
|
| 242 |
|
|
| 243 |
|
|
| 244 |
|
|
| 245 |
|
|
| 246 |
|
|
| 247 |
|
|
| 248 |
|
|
| 249 |
|
|
| 250 |
|
|
| 251 |
|
|
| 252 |
|
|
| 253 |
|
|
| 254 |
|
|
| 255 |
|
|
| 256 |
|
|
| 257 |
|
|
| 258 |
|
|
| 259 |
|
|
| 260 |
|
|
| 261 |
|
|
| 262 |
|
|
| 263 |
|
|
| 264 |
|
|
| 265 |
|
|
| 266 |
|
|
| 267 |
|
|
| 268 |
|
|
| 269 |
|
|
| 270 |
|
|
| 271 |
|
|
| 272 |
|
|
| 273 |
|
|
| 274 |
|
|
| 275 |
|
|
| 276 |
|
|
| 277 |
|
|
| 278 |
|
|
| 279 |
|
|
| 280 |
|
|
| 281 |
|
|
| 282 |
|
|
| 283 |
|
|
| 284 |
|
|
| 285 |
|
|
| 286 |
|
|
| 287 |
|
|
| 288 |
|
|
| 289 |
|
|
| 290 |
|
|
| 291 |
|
|
| 292 |
|
|
| 293 |
|
|
| 294 |
|
|
| 295 |
|
crates/coder-lite/src/interactive.rs modified +42
@@ -145,9 +145,23 @@ pub async fn run_tui(options: SessionOptions) -> Result<(), Box<dyn std::error::
| 145 | 145 |
|
| 146 | 146 |
|
| 147 | 147 |
|
| 148 |
|
|
| 149 |
|
|
| 150 |
|
|
| 151 |
|
|
| 152 |
|
|
| 153 |
|
|
| 154 |
|
|
| 148 | 155 |
|
| 149 | 156 |
|
| 157 |
|
|
| 158 |
|
|
| 159 |
|
|
| 160 |
|
|
| 150 | 161 |
|
| 162 |
|
|
| 163 |
|
|
| 164 |
|
|
| 151 | 165 |
|
| 152 | 166 |
|
| 153 | 167 |
|
@@ -227,6 +241,9 @@ pub async fn run_tui(options: SessionOptions) -> Result<(), Box<dyn std::error::
| 227 | 241 |
|
| 228 | 242 |
|
| 229 | 243 |
|
| 244 |
|
|
| 245 |
|
|
| 246 |
|
|
| 230 | 247 |
|
| 231 | 248 |
|
| 232 | 249 |
|
@@ -281,6 +298,27 @@ pub async fn run_tui(options: SessionOptions) -> Result<(), Box<dyn std::error::
| 281 | 298 |
|
| 282 | 299 |
|
| 283 | 300 |
|
| 301 |
|
|
| 302 |
|
|
| 303 |
|
|
| 304 |
|
|
| 305 |
|
|
| 306 |
|
|
| 307 |
|
|
| 308 |
|
|
| 309 |
|
|
| 310 |
|
|
| 311 |
|
|
| 312 |
|
|
| 313 |
|
|
| 314 |
|
|
| 315 |
|
|
| 316 |
|
|
| 317 |
|
|
| 318 |
|
|
| 319 |
|
|
| 320 |
|
|
| 321 |
|
|
| 284 | 322 |
|
| 285 | 323 |
|
| 286 | 324 |
|
@@ -418,6 +456,10 @@ pub fn apply(ui: &mut CoderUi, control: Control) {
| 418 | 456 |
|
| 419 | 457 |
|
| 420 | 458 |
|
| 459 |
|
|
| 460 |
|
|
| 461 |
|
|
| 462 |
|
|
| 421 | 463 |
|
| 422 | 464 |
|
| 423 | 465 |
|
crates/coder-lite/src/lib.rs modified +1
crates/coder-lite/src/runtime.rs modified +6
@@ -58,6 +58,12 @@ pub enum Control {
| 58 | 58 |
|
| 59 | 59 |
|
| 60 | 60 |
|
| 61 |
|
|
| 62 |
|
|
| 63 |
|
|
| 64 |
|
|
| 65 |
|
|
| 66 |
|
|
| 61 | 67 |
|
| 62 | 68 |
|
| 63 | 69 |
|
crates/coder-lite/src/tui.rs modified +35 -6
@@ -174,6 +174,13 @@ pub struct CoderUi {
| 174 | 174 |
|
| 175 | 175 |
|
| 176 | 176 |
|
| 177 |
|
|
| 178 |
|
|
| 179 |
|
|
| 180 |
|
|
| 181 |
|
|
| 182 |
|
|
| 183 |
|
|
| 177 | 184 |
|
| 178 | 185 |
|
| 179 | 186 |
|
@@ -233,6 +240,7 @@ impl CoderUi {
| 233 | 240 |
|
| 234 | 241 |
|
| 235 | 242 |
|
| 243 |
|
|
| 236 | 244 |
|
| 237 | 245 |
|
| 238 | 246 |
|
@@ -243,6 +251,32 @@ impl CoderUi {
| 243 | 251 |
|
| 244 | 252 |
|
| 245 | 253 |
|
| 254 |
|
|
| 255 |
|
|
| 256 |
|
|
| 257 |
|
|
| 258 |
|
|
| 259 |
|
|
| 260 |
|
|
| 261 |
|
|
| 262 |
|
|
| 263 |
|
|
| 264 |
|
|
| 265 |
|
|
| 266 |
|
|
| 267 |
|
|
| 268 |
|
|
| 269 |
|
|
| 270 |
|
|
| 271 |
|
|
| 272 |
|
|
| 273 |
|
|
| 274 |
|
|
| 275 |
|
|
| 276 |
|
|
| 277 |
|
|
| 278 |
|
|
| 279 |
|
|
| 246 | 280 |
|
| 247 | 281 |
|
| 248 | 282 |
|
@@ -340,12 +374,7 @@ impl CoderUi {
| 340 | 374 |
|
| 341 | 375 |
|
| 342 | 376 |
|
| 343 |
|
|
| 344 |
|
|
| 345 |
|
|
| 346 |
|
|
| 347 |
|
|
| 348 |
|
|
| 377 |
|
|
| 349 | 378 |
|
| 350 | 379 |
|
| 351 | 380 |
|
crates/coder-lite/tests/interactive_pty.rs modified +122 -12
@@ -34,10 +34,11 @@
| 34 | 34 |
|
| 35 | 35 |
|
| 36 | 36 |
|
| 37 |
|
|
| 38 |
|
|
| 39 |
|
|
| 40 |
|
|
| 37 |
|
|
| 38 |
|
|
| 39 |
|
|
| 40 |
|
|
| 41 |
|
|
| 41 | 42 |
|
| 42 | 43 |
|
| 43 | 44 |
|
@@ -75,19 +76,40 @@ mod unix_pty {
| 75 | 76 |
|
| 76 | 77 |
|
| 77 | 78 |
|
| 78 |
|
|
| 79 |
|
|
| 79 | 80 |
|
| 80 | 81 |
|
| 81 |
|
|
| 82 |
|
|
| 82 |
|
|
| 83 |
|
|
| 84 |
|
|
| 85 |
|
|
| 86 |
|
|
| 83 | 87 |
|
| 84 | 88 |
|
| 85 | 89 |
|
| 86 | 90 |
|
| 87 | 91 |
|
| 88 | 92 |
|
| 93 |
|
|
| 94 |
|
|
| 95 |
|
|
| 96 |
|
|
| 97 |
|
|
| 98 |
|
|
| 99 |
|
|
| 100 |
|
|
| 101 |
|
|
| 102 |
|
|
| 103 |
|
|
| 104 |
|
|
| 105 |
|
|
| 106 |
|
|
| 89 | 107 |
|
| 90 | 108 |
|
| 109 |
|
|
| 110 |
|
|
| 111 |
|
|
| 112 |
|
|
| 91 | 113 |
|
| 92 | 114 |
|
| 93 | 115 |
|
@@ -102,15 +124,22 @@ mod unix_pty {
| 102 | 124 |
|
| 103 | 125 |
|
| 104 | 126 |
|
| 105 |
|
|
| 106 |
|
|
| 127 |
|
|
| 128 |
|
|
| 129 |
|
|
| 130 |
|
|
| 131 |
|
|
| 132 |
|
|
| 133 |
|
|
| 134 |
|
|
| 107 | 135 |
|
| 108 | 136 |
|
| 109 | 137 |
|
| 110 | 138 |
|
| 111 | 139 |
|
| 112 | 140 |
|
| 113 |
|
|
| 141 |
|
|
| 142 |
|
|
| 114 | 143 |
|
| 115 | 144 |
|
| 116 | 145 |
|
@@ -266,8 +295,19 @@ mod unix_pty {
| 266 | 295 |
|
| 267 | 296 |
|
| 268 | 297 |
|
| 298 |
|
|
| 299 |
|
|
| 300 |
|
|
| 301 |
|
|
| 302 |
|
|
| 303 |
|
|
| 304 |
|
|
| 269 | 305 |
|
| 270 |
|
|
| 306 |
|
|
| 307 |
|
|
| 308 |
|
|
| 309 |
|
|
| 310 |
|
|
| 271 | 311 |
|
| 272 | 312 |
|
| 273 | 313 |
|
@@ -608,7 +648,7 @@ mod unix_pty {
| 608 | 648 |
|
| 609 | 649 |
|
| 610 | 650 |
|
| 611 |
|
|
| 651 |
|
|
| 612 | 652 |
|
| 613 | 653 |
|
| 614 | 654 |
|
@@ -725,6 +765,76 @@ mod unix_pty {
| 725 | 765 |
|
| 726 | 766 |
|
| 727 | 767 |
|
| 768 |
|
|
| 769 |
|
|
| 770 |
|
|
| 771 |
|
|
| 772 |
|
|
| 773 |
|
|
| 774 |
|
|
| 775 |
|
|
| 776 |
|
|
| 777 |
|
|
| 778 |
|
|
| 779 |
|
|
| 780 |
|
|
| 781 |
|
|
| 782 |
|
|
| 783 |
|
|
| 784 |
|
|
| 785 |
|
|
| 786 |
|
|
| 787 |
|
|
| 788 |
|
|
| 789 |
|
|
| 790 |
|
|
| 791 |
|
|
| 792 |
|
|
| 793 |
|
|
| 794 |
|
|
| 795 |
|
|
| 796 |
|
|
| 797 |
|
|
| 798 |
|
|
| 799 |
|
|
| 800 |
|
|
| 801 |
|
|
| 802 |
|
|
| 803 |
|
|
| 804 |
|
|
| 805 |
|
|
| 806 |
|
|
| 807 |
|
|
| 808 |
|
|
| 809 |
|
|
| 810 |
|
|
| 811 |
|
|
| 812 |
|
|
| 813 |
|
|
| 814 |
|
|
| 815 |
|
|
| 816 |
|
|
| 817 |
|
|
| 818 |
|
|
| 819 |
|
|
| 820 |
|
|
| 821 |
|
|
| 822 |
|
|
| 823 |
|
|
| 824 |
|
|
| 825 |
|
|
| 826 |
|
|
| 827 |
|
|
| 828 |
|
|
| 829 |
|
|
| 830 |
|
|
| 831 |
|
|
| 832 |
|
|
| 833 |
|
|
| 834 |
|
|
| 835 |
|
|
| 836 |
|
|
| 837 |
|
|
| 728 | 838 |
|
| 729 | 839 |
|
| 730 | 840 |
|