commits
When publish_blip() automatically refreshes expired tokens, the updated
session was only stored in memory. This caused subsequent publishes to
fail with the same expired token error. Now the session is persisted to
disk after each successful publish.
Also add CLAUDE.md documentation for codebase architecture.
Enhanced error handling to catch more authentication error types including
ExpiredToken errors, ensuring more reliable automatic token refresh.
- Add refresh_session method to AtProtoClient using /xrpc/com.atproto.server.refreshSession
- Implement automatic 401 retry logic in publish_blip with token refresh
- Add session persistence to CredentialStore (saves access/refresh tokens)
- Update authentication flow to reuse stored sessions and validate on startup
- Add comprehensive error handling with timeouts and session cleanup
- Handle expired tokens transparently during long-running sessions
馃 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace List widget with Paragraph for better text handling and wrapping
- Fix scrolling direction to match intuitive expectations (up/down arrows)
- Add proper line-based scrolling with saturation to prevent overflow
- Enable text wrapping for long messages
- Update frame.size() to frame.area() for newer ratatui API
- Rename main binary from 'think' to 'thought'
- Add 'thought stream' subcommand (replaces 'thought interactive --tui')
- Update all references and help text to use 'thought'
- Remove separate thought.rs binary in favor of single unified CLI
- Update README to reflect new command structure
馃 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Terminal UI for real-time blip streaming via ATProto jetstream
- Interactive posting and viewing with TUI interface
- Secure credential storage for Bluesky authentication
- Dual entry points: 'think' CLI and 'thought stream' TUI
- Handle resolution and duplicate message filtering
- Built with Rust, ratatui, and tokio-tungstenite
When publish_blip() automatically refreshes expired tokens, the updated
session was only stored in memory. This caused subsequent publishes to
fail with the same expired token error. Now the session is persisted to
disk after each successful publish.
Also add CLAUDE.md documentation for codebase architecture.
- Add refresh_session method to AtProtoClient using /xrpc/com.atproto.server.refreshSession
- Implement automatic 401 retry logic in publish_blip with token refresh
- Add session persistence to CredentialStore (saves access/refresh tokens)
- Update authentication flow to reuse stored sessions and validate on startup
- Add comprehensive error handling with timeouts and session cleanup
- Handle expired tokens transparently during long-running sessions
馃 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace List widget with Paragraph for better text handling and wrapping
- Fix scrolling direction to match intuitive expectations (up/down arrows)
- Add proper line-based scrolling with saturation to prevent overflow
- Enable text wrapping for long messages
- Update frame.size() to frame.area() for newer ratatui API
- Rename main binary from 'think' to 'thought'
- Add 'thought stream' subcommand (replaces 'thought interactive --tui')
- Update all references and help text to use 'thought'
- Remove separate thought.rs binary in favor of single unified CLI
- Update README to reflect new command structure
馃 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Terminal UI for real-time blip streaming via ATProto jetstream
- Interactive posting and viewing with TUI interface
- Secure credential storage for Bluesky authentication
- Dual entry points: 'think' CLI and 'thought stream' TUI
- Handle resolution and duplicate message filtering
- Built with Rust, ratatui, and tokio-tungstenite