All notable changes to codex-sync will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Updated GitHub repository URL to
github.com/waynesutton/codex-sync-plugin - Updated Opensync Ecosystem table with all 5 plugins including droid-sync
- Updated Links and Related Plugins sections with GitHub and npm links
- Fixed ArgumentValidationError for "developer" role
- Codex CLI sends "developer" role which wasn't in OpenSync's allowed roles
- Added
mapRole()helper to convert all roles to valid backend values developer->system(semantically similar to system instructions)tool,function, and other unknown roles ->unknown
- Made
ParsedMessage.roletype more flexible to handle any Codex CLI role
- Fixed token counts showing as 0 in OpenSync dashboard
- Session data now sends
promptTokensandcompletionTokens(notinputTokens/outputTokens) - Field names now match OpenSync backend schema exactly
- Session data now sends
- Fixed message content appearing empty
- Added flexible content extraction to handle different Codex CLI formats
- Now handles
OutputText,output_text,textcontent types - Case-insensitive type matching for better compatibility
- Added
provideranddurationMsfields to session data
SyncSessionDatafields renamed to match backend:inputTokens->promptTokensoutputTokens->completionTokens- Removed
totalTokens(backend calculates from prompt + completion) - Removed
startedAt/endedAt(replaced withdurationMs)
- Fixed messages not syncing to OpenSync database
- Message data now matches backend
messages:upsertmutation schema - Added required
externalIdfield to all messages (was causing ArgumentValidationError) - Changed
sessionIdtosessionExternalIdto match backend - Changed
contenttotextContentto match backend
- Message data now matches backend
- Fixed sessions showing as "Untitled"
- Added
titlefield extracted from first user message
- Added
- Fixed CLI version always showing 1.0.0
- Version now reads from package.json dynamically
- User-Agent header also uses dynamic version
SyncMessageDatatype updated to match OpenSync backend schemaSyncSessionDatanow includes optionaltitlefield
- Fixed project names showing as full paths
- Now extracts folder name from cwd path (e.g.,
/Users/.../todo6becomestodo6) - Matches opencode-sync-plugin behavior
- Now extracts folder name from cwd path (e.g.,
- Fixed 0 tokens showing in synced sessions
- Token counts are cumulative in Codex CLI - now extracts the highest/last value
- Early token_count events with
info: nullare properly skipped
- Fixed model extraction to use
turn_contextevents- Model field (e.g.,
gpt-5.2-codex) not in session_meta but in turn_context - Parser now correctly extracts model from turn_context payload
- Model field (e.g.,
- Fixed "Cannot read properties of null (reading 'total_token_usage')" error
- Added null checks for token usage parsing in sessions without token data
- Sessions with missing token info now sync without crashing
- Fixed HTTP 404 connection errors by normalizing Convex URLs
- Users enter
.convex.cloudbut HTTP endpoints are on.convex.site - Added
normalizeConvexUrl()helper to automatically convert URLs
- Users enter
- Added Upgrading section to README
- Minor documentation updates
- Initial release
- CLI commands: login, logout, setup, verify, synctest, sync, status, config, set
- Codex CLI notify hook integration
- JSONL session file parser
- OpenSync API client
- Token usage extraction and cost calculation
- Support for gpt-5-codex, gpt-5, gpt-5-pro, gpt-4.1 models
- Environment variable configuration
- Debug mode for troubleshooting
- Comprehensive documentation
- Automatic sync on agent-turn-complete events
- Manual sync with --all and --limit options
- Session metadata extraction (model, tokens, timestamps)
- Message parsing (user, assistant, tool)
- Tool call and result tracking
- Cost estimation based on model pricing