commits
Increases the maximum number of messages void can post in a single
threaded reply from 4 to 15, allowing for more comprehensive responses
to complex topics.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements a comprehensive queue management tool that allows:
- Viewing queue statistics across all directories (active, errors, no_reply)
- Listing notifications with filtering by handle
- Deleting all notifications from specific handles with dry-run support
- Force deletion option to skip confirmation prompts
Key features:
- Rich console output with formatted tables
- Safety features: dry-run mode and confirmation prompts
- Handles all queue directories (queue/, queue/errors/, queue/no_reply/)
- Proper error handling and validation
- Updated CLAUDE.md with usage examples
This tool helps manage notification queue buildup from bots and spam accounts,
complementing the new ignore_notification tool for proactive filtering.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements a new tool that allows the agent to explicitly ignore notifications
without creating a reply. This is particularly useful for filtering out bot
interactions or spam.
Key features:
- New ignore_notification tool with reason and category tracking
- Conflict detection if agent calls both reply and ignore tools
- Ignored notifications are deleted from queue (not moved to no_reply)
- Proper logging and tracking of ignored notifications
The tool helps the agent make deliberate decisions about which notifications
to engage with, improving interaction quality.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create queue/no_reply/ directory structure
- Modify process_mention to return "no_reply" when no reply is generated
- Update queue processing to move messages to no_reply/ folder
- Mark no_reply messages as processed to prevent reprocessing
- Update function documentation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace deprecated bluesky_reply instruction with add_post_to_bluesky_reply_thread
- Provide clear guidance on atomic threading approach (multiple calls = thread)
- Add testing mode with --test flag to prevent actual posting and queue deletion
- Implement duplicate detection in queue to prevent reprocessing in test mode
- Update tool detection to terminate bot if deprecated bluesky_reply is used
- Add comprehensive testing mode logging with 🧪 indicators
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changed process_mention to return False instead of True when no
add_post_to_bluesky_reply_thread tool calls are found. This ensures
that notifications remain in the queue for retry if the agent doesn't
generate a response, rather than being discarded.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove bluesky_reply tool to eliminate confusion with threading approach
- Add new add_post_to_bluesky_reply_thread tool for building reply threads atomically
- Each call adds a single post to the reply thread queue
- Handler (bsky.py) manages actual thread state and AT Protocol threading
- Better error recovery: individual post failures don't affect entire thread
- Added TOOL_CHANGELOG.md to document changes for agent migration
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add quote removal function to strip double quotes from AI responses before posting to prevent quoted text from appearing in posts. Only removes double quotes to preserve contractions and single quotes.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add user_note_append: Append text to user memory blocks
- Add user_note_replace: Find and replace text in blocks
- Add user_note_set: Completely set block content
- Add user_note_view: View block content
These tools provide fine-grained control over user-specific
memory blocks, allowing the agent to view, append, replace,
or completely rewrite user information as needed.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- user_note_append: Appends text to a user's memory block
- user_note_replace: Replaces specific text within a user's memory block
- user_note_set: Sets the complete content of a user's memory block
All tools handle block creation and attachment automatically.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
When a halt command is received, the bot now properly deletes the queue file
before terminating. This prevents the halt message from being reprocessed
when the bot restarts, which could cause an infinite halt loop.
Changes:
- Added queue_filepath parameter to process_mention()
- Delete queue file and mark notification as processed before exit(0)
- Updated all process_mention() calls to pass the filepath
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Show full reasoning messages without truncation
- Display bluesky_reply messages with content preview and language
- Show archival_memory_search queries clearly
- Display update_block operations with block name and value preview
- Enhanced tool result logging with success/error indicators
- Add specific formatting for known tool types
- Provide meaningful summaries for tool operations
This makes the bot's operation much more transparent and easier to debug.
- Replace loop with first successful candidate selection to avoid sending multiple replies
- Remove iteration logic that was causing duplicate responses when agent had multiple successful tool calls
- Update logging to show when additional candidates are skipped
- Simplify response handling to single attempt instead of retry loop
- Maintain support for both single replies and threaded replies (1-4 messages)
This fixes the issue where agents making multiple successful bluesky_reply tool calls
would send duplicate responses to the same user.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Only process bluesky_reply tool calls with status: "success"
- Skip tool calls with status: "error" to prevent sending failed replies
- Add two-pass processing: collect tool results first, then filter tool calls
- Increase log preview content from 100 to 150 characters for better visibility
- Add clear warning messages when skipping failed or unknown status tool calls
- Prevent sending replies that failed validation (e.g. >300 char limit)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace synchronous agents.messages.create with create_stream
- Add step streaming with max_steps=100 for better responsiveness
- Increase client timeout from 5 to 10 minutes
- Add condensed info-level logging for streaming chunks with emojis
- Add debug-level logging for full chunk details
- Maintain backward compatibility with existing response handling
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Changed order to fetch new notifications from server first
- Then queue new notifications with priority prefixes
- Finally process entire queue (old + new) in priority order
This ensures high-priority notifications (like those from cameron.pfiffer.org)
are discovered and queued immediately rather than waiting behind older messages.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change default log level from DEBUG to INFO for void_bot logger
- Remove redundant startup messages and tool listings
- Reduce main loop cycle noise (only show stats when messages processed)
- Remove excessive notification processing status messages
- Move session-related logs to DEBUG level in bsky_utils.py
- Clean up user block attachment/detachment logs in tools/blocks.py
Keeps queue processing logs and important status messages while
eliminating noise from normal operation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create tools/halt.py with halt_activity function
- Register halt_activity tool in register_tools.py
- Add halt detection in bsky.py process_mention function
- Bot exports agent state and exits when halt tool is called
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented a priority queue system that ensures messages from cameron.pfiffer.org are processed first:
- Modified save_notification_to_queue() to add priority prefix to filenames
- cameron.pfiffer.org messages get "0_" prefix (high priority)
- All other messages get "1_" prefix (normal priority)
- Queue processing sorts by filename, so high priority messages process first
- Added clear logging to indicate when high priority notifications are queued
- Updated function documentation to reflect priority ordering
File naming format:
- High priority: 0_YYYYMMDD_HHMMSS_{reason}_{hash}.json
- Normal priority: 1_YYYYMMDD_HHMMSS_{reason}_{hash}.json
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed NameError: name 'List' is not defined by adding List to the typing imports and removing redundant import inside function.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major changes:
- Updated ReplyArgs schema to accept List[str] messages instead of single message
- Added validation for max 4 messages, each max 300 characters
- Updated bluesky_reply function to handle message lists
- Created reply_with_thread_to_notification function in bsky_utils.py
- Added system failure message posting when thread messages fail
- Updated bot processing logic in bsky.py to handle both single and multi-message replies
- Maintained backward compatibility with old message format
- Updated register_tools.py description
Threading behavior:
- Single message: Works exactly like before
- Multiple messages: Creates a linear thread where each reply is a response to the previous one
- Failure handling: Posts "[SYSTEM FAILURE: COULD NOT POST MESSAGE, PLEASE TRY AGAIN]" if a message in the thread fails
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The get_bluesky_feed tool was commented out and not being attached to agents. Uncommented it so it can be registered with agents.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Collect all bluesky_reply tool calls instead of stopping at first one
- Try each reply candidate until one succeeds or all fail
- Remove fallback to text messages - only use tool calls
- Add detailed logging for debugging which candidate worked/failed
- Improves reliability when Letta API timeouts occur
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
• Created queue_manager.py for browsing and managing notification queue
• Interactive paging through notifications with rich terminal UI
• Toggle deletion flags, view full notifications, batch delete operations
• Moves deleted files to deleted/ folder and updates processed_notifications.json
• Added language support to post tool with optional lang parameter
• Cleaned up blocks.py by removing temporary sync code
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Updated bluesky_reply tool to accept optional lang parameter (defaults to en-US)
- Modified bsky.py to extract language from tool call and pass to reply function
- Updated bsky_utils.py reply functions to accept and use langs parameter
- Posts are now tagged with the specified language code for better filtering
This allows Void to post in different languages by specifying codes like
'es', 'ja', 'th', etc. when using the bluesky_reply tool.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created new reply.py tool module with bluesky_reply function
- Added 300 character validation to match Bluesky's limit
- Registered the tool in register_tools.py
- This simple tool allows the Letta agent to indicate when it wants to send a reply
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed defensive memory tools entirely:
- Deleted tools/defensive_memory.py
- Removed safe_memory_insert and safe_core_memory_replace from register_tools.py
- Removed related imports and argument schemas
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added void-cafe feed (at://did:plc:gfrmhdmjvxn2sjedzboeudef/app.bsky.feed.generator/void-cafe) to the list of available named feeds in the GetBlueskyFeedTool.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Reduced parent_height parameter from 80 to 40 to limit deep thread nesting
- Added debug print/exit to inspect thread prompt structure
- Improved thread preview logging to show meaningful content fields
- This helps identify the token-inefficient YAML representation issue
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add message counters and statistics tracking
- Create separate logger for prompts to reduce noise
- Add numbered cycle tracking and section markers
- Add progress indicators for queue processing
- Track messages per minute and session totals
- Improve logging of agent responses
- Set httpx logging to CRITICAL to remove noise
- Add detailed logging for initialization and main loop flow
Require user confirmation (y/n) before exporting agent state files and running git operations when starting the handler.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove Literal type that gets converted to FeedName.value in sandbox
- Keep workaround to strip 'FeedName.' prefix if present
- Use plain string type with validation in function body
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove feed_uri parameter to prevent agent from using arbitrary URIs
- Add clear error message listing available feed names when invalid name provided
- Update descriptions to explicitly list available feeds for agent guidance
- Simplify function signature and validation logic
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace enum class with inline Literal type annotation
- Simplifies code since enum class won't exist in sandboxed tool
- Provides same validation with cleaner implementation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Move FEED_PRESETS dictionary inside function body
- Tools must be completely self-contained with no external dependencies
- Update Pydantic schema to use hardcoded list instead of dynamic reference
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix agent export to save JSON properly instead of binary
- Add agent_archive/ for timestamped backups (git ignored)
- Update agents/void.af to track current state in git
- Add user block attachment/detachment around agent calls
- Extract handles from nested thread data automatically
- Add named feed presets (discover, ai-for-grownups, atmosphere, home)
- Update feed tool to support feed_name parameter with presets
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Export void agent state to timestamped .af files on startup
- Create agents/ directory with void_latest.af symlink
- Automatically stage agent exports in git
- Export includes all agent configuration, memory blocks, and tools
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Parse mentions (@handle) and resolve to DIDs
- Parse URLs and create link facets
- Use proper atproto models for facets
- Matches functionality in post creation tool
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Rename post_to_bluesky to create_new_bluesky_post for clarity
- Change parameter from single string to List[str] for thread support
- Add thread creation logic with proper AT Protocol reply structure
- Enhance validation to reject empty lists and oversized posts
- Update tool registration and exports across codebase
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add debug logging configuration with separate INFO level for main logger
- Create queue/errors directory for non-retryable failures
- Enhance error handling to distinguish between retryable (524) and non-retryable (413) errors
- Add detailed logging throughout process_mention for better debugging
- Log agent details including tools on initialization
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add specific handling for Cloudflare 524 timeout errors to keep
notifications in the queue for retry instead of removing them.
This prevents losing notifications during temporary service
interruptions.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Document that all errors in tools must be thrown as exceptions
rather than returned as strings. This ensures proper error
propagation and handling by the Letta framework.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Update register_tools.py to import functions and schemas directly
from their respective modules instead of the now-removed functions.py.
This aligns with the new modular tool organization.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Tools are now defined directly in their respective module files
(search.py, post.py, feed.py, blocks.py) rather than being
centralized in functions.py. This improves code organization
and maintainability.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Convert SearchBlueskyTool, PostToBlueskyTool, and GetBlueskyFeedTool
from BaseTool classes to standalone functions. This simplifies the
tool architecture and aligns with the updated tool registration system.
Also update error handling to throw exceptions instead of returning
error strings, following the new coding principles.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove the UpdateUserBlocksArgs import and export as part of removing
the update_user_blocks functionality.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The update_user_blocks function and its associated UpdateUserBlocksArgs
class have been removed as requested.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Renamed AttachUserBlockArgs and DetachUserBlockArgs to AttachUserBlocksArgs and DetachUserBlocksArgs in register_tools.py.
- Updated the TOOL_CONFIGS to reflect the new argument class names.
This change improves clarity and maintains uniformity across the codebase.
- Renamed AttachUserBlockArgs and DetachUserBlockArgs to AttachUserBlocksArgs and DetachUserBlocksArgs for uniformity.
- Updated corresponding tool classes to reflect the new naming conventions.
This change enhances clarity and maintains consistency across the codebase.
Eliminates duplicate tool implementations in favor of modular tools/ directory structure for better maintainability.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add .gitignore for env files, cache, and session files
- Fix void capitalization in README for consistency
- Add 300 character limit validation to posting tool
- Create attach_user_block.py utility for memory management
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements a comprehensive queue management tool that allows:
- Viewing queue statistics across all directories (active, errors, no_reply)
- Listing notifications with filtering by handle
- Deleting all notifications from specific handles with dry-run support
- Force deletion option to skip confirmation prompts
Key features:
- Rich console output with formatted tables
- Safety features: dry-run mode and confirmation prompts
- Handles all queue directories (queue/, queue/errors/, queue/no_reply/)
- Proper error handling and validation
- Updated CLAUDE.md with usage examples
This tool helps manage notification queue buildup from bots and spam accounts,
complementing the new ignore_notification tool for proactive filtering.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements a new tool that allows the agent to explicitly ignore notifications
without creating a reply. This is particularly useful for filtering out bot
interactions or spam.
Key features:
- New ignore_notification tool with reason and category tracking
- Conflict detection if agent calls both reply and ignore tools
- Ignored notifications are deleted from queue (not moved to no_reply)
- Proper logging and tracking of ignored notifications
The tool helps the agent make deliberate decisions about which notifications
to engage with, improving interaction quality.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create queue/no_reply/ directory structure
- Modify process_mention to return "no_reply" when no reply is generated
- Update queue processing to move messages to no_reply/ folder
- Mark no_reply messages as processed to prevent reprocessing
- Update function documentation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace deprecated bluesky_reply instruction with add_post_to_bluesky_reply_thread
- Provide clear guidance on atomic threading approach (multiple calls = thread)
- Add testing mode with --test flag to prevent actual posting and queue deletion
- Implement duplicate detection in queue to prevent reprocessing in test mode
- Update tool detection to terminate bot if deprecated bluesky_reply is used
- Add comprehensive testing mode logging with 🧪 indicators
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changed process_mention to return False instead of True when no
add_post_to_bluesky_reply_thread tool calls are found. This ensures
that notifications remain in the queue for retry if the agent doesn't
generate a response, rather than being discarded.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove bluesky_reply tool to eliminate confusion with threading approach
- Add new add_post_to_bluesky_reply_thread tool for building reply threads atomically
- Each call adds a single post to the reply thread queue
- Handler (bsky.py) manages actual thread state and AT Protocol threading
- Better error recovery: individual post failures don't affect entire thread
- Added TOOL_CHANGELOG.md to document changes for agent migration
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add quote removal function to strip double quotes from AI responses before posting to prevent quoted text from appearing in posts. Only removes double quotes to preserve contractions and single quotes.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add user_note_append: Append text to user memory blocks
- Add user_note_replace: Find and replace text in blocks
- Add user_note_set: Completely set block content
- Add user_note_view: View block content
These tools provide fine-grained control over user-specific
memory blocks, allowing the agent to view, append, replace,
or completely rewrite user information as needed.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- user_note_append: Appends text to a user's memory block
- user_note_replace: Replaces specific text within a user's memory block
- user_note_set: Sets the complete content of a user's memory block
All tools handle block creation and attachment automatically.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
When a halt command is received, the bot now properly deletes the queue file
before terminating. This prevents the halt message from being reprocessed
when the bot restarts, which could cause an infinite halt loop.
Changes:
- Added queue_filepath parameter to process_mention()
- Delete queue file and mark notification as processed before exit(0)
- Updated all process_mention() calls to pass the filepath
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Show full reasoning messages without truncation
- Display bluesky_reply messages with content preview and language
- Show archival_memory_search queries clearly
- Display update_block operations with block name and value preview
- Enhanced tool result logging with success/error indicators
- Add specific formatting for known tool types
- Provide meaningful summaries for tool operations
This makes the bot's operation much more transparent and easier to debug.
- Replace loop with first successful candidate selection to avoid sending multiple replies
- Remove iteration logic that was causing duplicate responses when agent had multiple successful tool calls
- Update logging to show when additional candidates are skipped
- Simplify response handling to single attempt instead of retry loop
- Maintain support for both single replies and threaded replies (1-4 messages)
This fixes the issue where agents making multiple successful bluesky_reply tool calls
would send duplicate responses to the same user.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Only process bluesky_reply tool calls with status: "success"
- Skip tool calls with status: "error" to prevent sending failed replies
- Add two-pass processing: collect tool results first, then filter tool calls
- Increase log preview content from 100 to 150 characters for better visibility
- Add clear warning messages when skipping failed or unknown status tool calls
- Prevent sending replies that failed validation (e.g. >300 char limit)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace synchronous agents.messages.create with create_stream
- Add step streaming with max_steps=100 for better responsiveness
- Increase client timeout from 5 to 10 minutes
- Add condensed info-level logging for streaming chunks with emojis
- Add debug-level logging for full chunk details
- Maintain backward compatibility with existing response handling
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Changed order to fetch new notifications from server first
- Then queue new notifications with priority prefixes
- Finally process entire queue (old + new) in priority order
This ensures high-priority notifications (like those from cameron.pfiffer.org)
are discovered and queued immediately rather than waiting behind older messages.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change default log level from DEBUG to INFO for void_bot logger
- Remove redundant startup messages and tool listings
- Reduce main loop cycle noise (only show stats when messages processed)
- Remove excessive notification processing status messages
- Move session-related logs to DEBUG level in bsky_utils.py
- Clean up user block attachment/detachment logs in tools/blocks.py
Keeps queue processing logs and important status messages while
eliminating noise from normal operation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create tools/halt.py with halt_activity function
- Register halt_activity tool in register_tools.py
- Add halt detection in bsky.py process_mention function
- Bot exports agent state and exits when halt tool is called
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented a priority queue system that ensures messages from cameron.pfiffer.org are processed first:
- Modified save_notification_to_queue() to add priority prefix to filenames
- cameron.pfiffer.org messages get "0_" prefix (high priority)
- All other messages get "1_" prefix (normal priority)
- Queue processing sorts by filename, so high priority messages process first
- Added clear logging to indicate when high priority notifications are queued
- Updated function documentation to reflect priority ordering
File naming format:
- High priority: 0_YYYYMMDD_HHMMSS_{reason}_{hash}.json
- Normal priority: 1_YYYYMMDD_HHMMSS_{reason}_{hash}.json
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major changes:
- Updated ReplyArgs schema to accept List[str] messages instead of single message
- Added validation for max 4 messages, each max 300 characters
- Updated bluesky_reply function to handle message lists
- Created reply_with_thread_to_notification function in bsky_utils.py
- Added system failure message posting when thread messages fail
- Updated bot processing logic in bsky.py to handle both single and multi-message replies
- Maintained backward compatibility with old message format
- Updated register_tools.py description
Threading behavior:
- Single message: Works exactly like before
- Multiple messages: Creates a linear thread where each reply is a response to the previous one
- Failure handling: Posts "[SYSTEM FAILURE: COULD NOT POST MESSAGE, PLEASE TRY AGAIN]" if a message in the thread fails
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Collect all bluesky_reply tool calls instead of stopping at first one
- Try each reply candidate until one succeeds or all fail
- Remove fallback to text messages - only use tool calls
- Add detailed logging for debugging which candidate worked/failed
- Improves reliability when Letta API timeouts occur
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
• Created queue_manager.py for browsing and managing notification queue
• Interactive paging through notifications with rich terminal UI
• Toggle deletion flags, view full notifications, batch delete operations
• Moves deleted files to deleted/ folder and updates processed_notifications.json
• Added language support to post tool with optional lang parameter
• Cleaned up blocks.py by removing temporary sync code
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Updated bluesky_reply tool to accept optional lang parameter (defaults to en-US)
- Modified bsky.py to extract language from tool call and pass to reply function
- Updated bsky_utils.py reply functions to accept and use langs parameter
- Posts are now tagged with the specified language code for better filtering
This allows Void to post in different languages by specifying codes like
'es', 'ja', 'th', etc. when using the bluesky_reply tool.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created new reply.py tool module with bluesky_reply function
- Added 300 character validation to match Bluesky's limit
- Registered the tool in register_tools.py
- This simple tool allows the Letta agent to indicate when it wants to send a reply
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed defensive memory tools entirely:
- Deleted tools/defensive_memory.py
- Removed safe_memory_insert and safe_core_memory_replace from register_tools.py
- Removed related imports and argument schemas
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Reduced parent_height parameter from 80 to 40 to limit deep thread nesting
- Added debug print/exit to inspect thread prompt structure
- Improved thread preview logging to show meaningful content fields
- This helps identify the token-inefficient YAML representation issue
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add message counters and statistics tracking
- Create separate logger for prompts to reduce noise
- Add numbered cycle tracking and section markers
- Add progress indicators for queue processing
- Track messages per minute and session totals
- Improve logging of agent responses
- Set httpx logging to CRITICAL to remove noise
- Add detailed logging for initialization and main loop flow
- Remove feed_uri parameter to prevent agent from using arbitrary URIs
- Add clear error message listing available feed names when invalid name provided
- Update descriptions to explicitly list available feeds for agent guidance
- Simplify function signature and validation logic
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix agent export to save JSON properly instead of binary
- Add agent_archive/ for timestamped backups (git ignored)
- Update agents/void.af to track current state in git
- Add user block attachment/detachment around agent calls
- Extract handles from nested thread data automatically
- Add named feed presets (discover, ai-for-grownups, atmosphere, home)
- Update feed tool to support feed_name parameter with presets
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Rename post_to_bluesky to create_new_bluesky_post for clarity
- Change parameter from single string to List[str] for thread support
- Add thread creation logic with proper AT Protocol reply structure
- Enhance validation to reject empty lists and oversized posts
- Update tool registration and exports across codebase
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add debug logging configuration with separate INFO level for main logger
- Create queue/errors directory for non-retryable failures
- Enhance error handling to distinguish between retryable (524) and non-retryable (413) errors
- Add detailed logging throughout process_mention for better debugging
- Log agent details including tools on initialization
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Tools are now defined directly in their respective module files
(search.py, post.py, feed.py, blocks.py) rather than being
centralized in functions.py. This improves code organization
and maintainability.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Convert SearchBlueskyTool, PostToBlueskyTool, and GetBlueskyFeedTool
from BaseTool classes to standalone functions. This simplifies the
tool architecture and aligns with the updated tool registration system.
Also update error handling to throw exceptions instead of returning
error strings, following the new coding principles.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add .gitignore for env files, cache, and session files
- Fix void capitalization in README for consistency
- Add 300 character limit validation to posting tool
- Create attach_user_block.py utility for memory management
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>