Wallet that pauses cleanly + real top-up flow
Out-of-balance is no longer a silent failure mode. ONI hard-refuses turns at $0, the chat shows a friendly banner instead of a raw error, and the “Top up balance” button finally opens a modal that actually moves money.
- NewHard balance gate at the v3 turn endpoint — ONI returns 402 BALANCE_EMPTY at < $0.01 instead of running anyway.
- NewStripe Checkout top-up endpoint with dedicated webhook handler that credits the wallet + writes to the account ledger atomically.
- NewOwner-only manual-credit fallback for emergency / pre-Stripe credits, gated by ONNETA_OWNER_EMAIL.
- BetterTyped chat draft survives a 402 — text stays in the textarea, send button auto-disables, and a localStorage save means even a page reload doesn't lose the message.
- BetterFriendly “Wallet is empty — ONI paused this turn” banner replaces the raw error string.