* fix(publish): make git operations idempotent
- Check for staged changes before commit
- Check if tag exists before creating
- Check if release exists before creating
* fix(session-recovery): handle empty content from interrupted reasoning
- Add THINKING_TYPES set including 'reasoning' type (OpenCode's thinking)
- Add hasNonEmptyOutput() to detect messages with only thinking/meta parts
- Add findEmptyContentMessage() to scan all messages for empty content
- Handle step-start/step-finish meta parts in empty content detection
- Patch interrupted messages with '(interrupted)' text before falling back to revert