commits
Sync opam package metadata including x-maintenance-intent
and external dependency specifications.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Restructure the changelog output into three sections: cross-verse fork
activity (grouped by source/target user), functionality changes (with
expanded descriptions), and metadata (project names only). Detect fork
relationships by scanning verse users' sources.toml for upstream fields.
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
Zulip puts flags like "mentioned" on the event envelope, not the
message object. Previously the handler had no access to these flags,
causing mention detection to fail for display-name mentions like
@**Poe**. Thread the flags as a string list through the handler type
so handlers can check them directly.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The status command now displays information about active sessions:
- Lists all active sessions (channel topics and DMs)
- Shows number of turns in each session
- Shows how long each session has been active
- Shows last update time for each session
Example output:
- Active sessions (2):
- **channel foo > topic bar**: 5 turns, last updated 30s ago (active for 1.5h)
- **DM with user@example.com**: 3 turns, last updated 2m ago (active for 45m)
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
This change enables Poe to maintain parallel sessions across channels/DMs
and accumulate conversation context from all participants:
**Session Activation:**
- Sessions activate on first @mention in a channel or DM
- Once active, ALL messages (except from the bot) are accumulated into
the session context, even without @mention
- Bot only responds when explicitly @mentioned, but has full context
- Sessions reset on bot restart (requires new @mention to reactivate)
- Sessions only clear via explicit `clear` command (no timeout expiry)
**zulip_bot Library Changes:**
- Added `?process_all_messages:bool` parameter to `Bot.run`
- When true, handler receives all messages (not just mentions/DMs)
- Handler can return `Response.Silent` to not respond
- Breaking change: `Bot.run` now requires `()` at the end
**Poe Handler Changes:**
- In-memory `Active_sessions` module tracks activated scopes
- `accumulate_message_silently` adds messages to context without Claude
- Messages from other users annotated with sender name for context
- `clear` command now also deactivates the in-memory session
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
When Claude uses tools (Read, Glob, Grep, Edit, Write, Bash) or has
thinking/error events during a conversation, these are now posted to
the originating Zulip channel or DM with pretty-printed Zulip richtext
formatting:
- Tool uses shown with :gear: emoji and relevant parameters
- Thinking blocks shown with :thought_balloon: emoji (truncated)
- Errors shown with :warning: emoji
The agent activity is posted as a separate message before the final
response, giving users visibility into what Claude is doing.
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
Poe now maintains independent conversation sessions for each Zulip channel
topic and DM thread. This enables natural multi-turn conversations with
Claude where context is preserved within each scope.
Key changes:
- New Session module for managing conversation history in Zulip bot storage
- Sessions track up to 20 turns and expire after 1 hour of inactivity
- Added 'clear'/'new'/'reset' commands to start fresh conversations
- Updated handler to include session context in Claude prompts
- Updated help text to explain session behavior
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
- Add explicit unix library dependency to dune files (html5rw, tomlt)
- Fix odoc heading levels ({0 -> {1) in imap subject.mli and thread.mli
- Fix code block indentation in subject.mli and h2_stream.mli
- Change unresolved module references to plain text (Bytesrw_unix,
Bytesrw_eio, Webfinger.Jrd.t)
- Fix @raise tags to use Error instead of Error.t
- Escape @mention/@mentions text in poe docs to avoid unknown tag warnings
- Remove unreachable flag_perm rule and redundant list_mailbox production
from IMAP grammar
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Instead of linking packages to the opam overlay (opamrepo_url/packages/name),
scan the local opam repo to extract the dev-repo field from each package's
opam file and link to the actual project repository.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changelog now uses JSON output from Claude with jsont decoding
- Each changelog item links to the project in the opam repo
- Output includes header with date of most recent commit
- Add verse multi-user support for tracking multiple monorepos
- Per-user git HEAD tracking for incremental broadcasts
- Status command shows tracked verse users with repo links
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Log the exact command and working directory for all git operations when
running with -vv verbosity. Also log the resolved monorepo path at startup
to help diagnose configuration issues like "not a git repository" errors.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updated changelog format to use bullet points with:
- Project name in bold at the start
- One or two sentence description
- Change type in italics at the end (new feature, bug fix, enhancement, etc.)
Example output:
- **ocaml-zulip**: Fixed encoding bug in channel lookups. *bug fix*
- **poe**: Updated to use Opus 4.5 model. *enhancement*
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed changelog generation to output natural sentences instead of
bullet points with emojis. Each change now includes its sub-project
in parentheses, making it clear which part of the monorepo was affected.
Related commits are grouped into single sentences for readability.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enhanced changelog generation to:
- Extract affected sub-projects from commit file paths
- Categorize changes with emojis (✨ New Feature, 🐛 Bug Fix, 🔧 Enhancement, etc.)
- Include file change information in the Claude prompt for better context
- Group related commits under single bullet points
- Output structured format with Sub-projects and Changes sections
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update ocaml-claudeio bindings with new Opus model variants from the
Python SDK: Opus_4_5 (claude-opus-4-5) and Opus_4_1 (claude-opus-4-1).
Switch poe bot to use Opus 4.5 for both message handling and changelog
generation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Changelog module for Claude-based changelog generation
- Generate narrative prose (2-4 sentences) instead of bullet points
- Auto-detect channel members and use @**Name** Zulip mentions
- Focus on user-visible features and API changes
- Remove monopam dependency from poe library
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The loop command now responds to DMs and mentions while sleeping
between broadcast intervals, using Eio.Fiber.both to run both
loops concurrently.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds a new command (refresh/pull/sync/update) that can be triggered via
DM to the bot. The command:
1. Pulls latest changes from remote (git pull --ff-only)
2. Regenerates changelog (monopam changes --daily --aggregate)
3. Broadcasts new changes to the configured channel
This allows manual triggering of the same flow that runs in the polling
loop, useful for immediate updates without waiting for the next interval.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Consolidate the separate monopam_changes library into the main monopam
library as submodules (Changes.Aggregated, Changes.Daily, Changes.Query).
This simplifies the dependency graph and provides a cleaner interface.
Update poe to use the new Monopam.Changes interface and add:
- Git pull before checking for changes in the polling loop
- Detailed logging of git pull results (up-to-date vs new changes)
- --requests-verbose flag to control HTTP request logging (off by default)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
monopam:
- Make --aggregate the default for daily changes (add --no-aggregate to skip)
- Skip past days entirely if per-day file exists to avoid redundant Claude calls
- For today, still check if entry exists before regenerating
- Simplify Zulip format headers ("Updates for..." instead of "## Changes for...")
poe:
- Fix admin verification to use delivery_email from Zulip API
- Fallback to sender_email if API call fails
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit implements a comprehensive changes broadcast system:
**monopam_changes library** (new package):
- Aggregated module: Types and JSON codecs for daily changes format
- Query module: Functions to load changes since timestamp, format for Zulip
- Supports .changes/YYYYMMDD.json aggregated format
**monopam enhancements**:
- Added --aggregate flag to `monopam changes --daily` command
- Generates structured JSON files for broadcast system
- Added generate_aggregated function to Changes module
- Added rev_parse to Git module
**poe bot refactoring**:
- Commands module: Deterministic command parsing (help, status, broadcast, admin)
- Admin module: Storage management for broadcast state (last_time, git_head)
- Broadcast module: Smart broadcasting that only sends NEW changes
- Loop module: Hourly polling loop for automated change detection
- Config: Added admin_emails and changes_dir fields
- Handler: Updated to use command parser, delegate to modules
New poe commands:
- `poe loop --interval SECONDS` - Automated polling and broadcasting
- Admin commands: last-broadcast, reset-broadcast, storage keys/get/delete
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add xdg_app parameter to zulip-bot Config to allow custom XDG paths.
Poe now stores all configuration under ~/.config/poe/ including:
- config.toml (poe settings)
- zulip.config (zulip credentials)
Also renamed config file from "config" to "zulip.config" for clarity.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Restructure the changelog output into three sections: cross-verse fork
activity (grouped by source/target user), functionality changes (with
expanded descriptions), and metadata (project names only). Detect fork
relationships by scanning verse users' sources.toml for upstream fields.
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
Zulip puts flags like "mentioned" on the event envelope, not the
message object. Previously the handler had no access to these flags,
causing mention detection to fail for display-name mentions like
@**Poe**. Thread the flags as a string list through the handler type
so handlers can check them directly.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The status command now displays information about active sessions:
- Lists all active sessions (channel topics and DMs)
- Shows number of turns in each session
- Shows how long each session has been active
- Shows last update time for each session
Example output:
- Active sessions (2):
- **channel foo > topic bar**: 5 turns, last updated 30s ago (active for 1.5h)
- **DM with user@example.com**: 3 turns, last updated 2m ago (active for 45m)
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
This change enables Poe to maintain parallel sessions across channels/DMs
and accumulate conversation context from all participants:
**Session Activation:**
- Sessions activate on first @mention in a channel or DM
- Once active, ALL messages (except from the bot) are accumulated into
the session context, even without @mention
- Bot only responds when explicitly @mentioned, but has full context
- Sessions reset on bot restart (requires new @mention to reactivate)
- Sessions only clear via explicit `clear` command (no timeout expiry)
**zulip_bot Library Changes:**
- Added `?process_all_messages:bool` parameter to `Bot.run`
- When true, handler receives all messages (not just mentions/DMs)
- Handler can return `Response.Silent` to not respond
- Breaking change: `Bot.run` now requires `()` at the end
**Poe Handler Changes:**
- In-memory `Active_sessions` module tracks activated scopes
- `accumulate_message_silently` adds messages to context without Claude
- Messages from other users annotated with sender name for context
- `clear` command now also deactivates the in-memory session
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
When Claude uses tools (Read, Glob, Grep, Edit, Write, Bash) or has
thinking/error events during a conversation, these are now posted to
the originating Zulip channel or DM with pretty-printed Zulip richtext
formatting:
- Tool uses shown with :gear: emoji and relevant parameters
- Thinking blocks shown with :thought_balloon: emoji (truncated)
- Errors shown with :warning: emoji
The agent activity is posted as a separate message before the final
response, giving users visibility into what Claude is doing.
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
Poe now maintains independent conversation sessions for each Zulip channel
topic and DM thread. This enables natural multi-turn conversations with
Claude where context is preserved within each scope.
Key changes:
- New Session module for managing conversation history in Zulip bot storage
- Sessions track up to 20 turns and expire after 1 hour of inactivity
- Added 'clear'/'new'/'reset' commands to start fresh conversations
- Updated handler to include session context in Claude prompts
- Updated help text to explain session behavior
Co-Authored-By: Claude (claude-opus-4-5) <noreply@anthropic.com>
- Add explicit unix library dependency to dune files (html5rw, tomlt)
- Fix odoc heading levels ({0 -> {1) in imap subject.mli and thread.mli
- Fix code block indentation in subject.mli and h2_stream.mli
- Change unresolved module references to plain text (Bytesrw_unix,
Bytesrw_eio, Webfinger.Jrd.t)
- Fix @raise tags to use Error instead of Error.t
- Escape @mention/@mentions text in poe docs to avoid unknown tag warnings
- Remove unreachable flag_perm rule and redundant list_mailbox production
from IMAP grammar
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changelog now uses JSON output from Claude with jsont decoding
- Each changelog item links to the project in the opam repo
- Output includes header with date of most recent commit
- Add verse multi-user support for tracking multiple monorepos
- Per-user git HEAD tracking for incremental broadcasts
- Status command shows tracked verse users with repo links
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updated changelog format to use bullet points with:
- Project name in bold at the start
- One or two sentence description
- Change type in italics at the end (new feature, bug fix, enhancement, etc.)
Example output:
- **ocaml-zulip**: Fixed encoding bug in channel lookups. *bug fix*
- **poe**: Updated to use Opus 4.5 model. *enhancement*
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed changelog generation to output natural sentences instead of
bullet points with emojis. Each change now includes its sub-project
in parentheses, making it clear which part of the monorepo was affected.
Related commits are grouped into single sentences for readability.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enhanced changelog generation to:
- Extract affected sub-projects from commit file paths
- Categorize changes with emojis (✨ New Feature, 🐛 Bug Fix, 🔧 Enhancement, etc.)
- Include file change information in the Claude prompt for better context
- Group related commits under single bullet points
- Output structured format with Sub-projects and Changes sections
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Changelog module for Claude-based changelog generation
- Generate narrative prose (2-4 sentences) instead of bullet points
- Auto-detect channel members and use @**Name** Zulip mentions
- Focus on user-visible features and API changes
- Remove monopam dependency from poe library
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds a new command (refresh/pull/sync/update) that can be triggered via
DM to the bot. The command:
1. Pulls latest changes from remote (git pull --ff-only)
2. Regenerates changelog (monopam changes --daily --aggregate)
3. Broadcasts new changes to the configured channel
This allows manual triggering of the same flow that runs in the polling
loop, useful for immediate updates without waiting for the next interval.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Consolidate the separate monopam_changes library into the main monopam
library as submodules (Changes.Aggregated, Changes.Daily, Changes.Query).
This simplifies the dependency graph and provides a cleaner interface.
Update poe to use the new Monopam.Changes interface and add:
- Git pull before checking for changes in the polling loop
- Detailed logging of git pull results (up-to-date vs new changes)
- --requests-verbose flag to control HTTP request logging (off by default)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
monopam:
- Make --aggregate the default for daily changes (add --no-aggregate to skip)
- Skip past days entirely if per-day file exists to avoid redundant Claude calls
- For today, still check if entry exists before regenerating
- Simplify Zulip format headers ("Updates for..." instead of "## Changes for...")
poe:
- Fix admin verification to use delivery_email from Zulip API
- Fallback to sender_email if API call fails
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit implements a comprehensive changes broadcast system:
**monopam_changes library** (new package):
- Aggregated module: Types and JSON codecs for daily changes format
- Query module: Functions to load changes since timestamp, format for Zulip
- Supports .changes/YYYYMMDD.json aggregated format
**monopam enhancements**:
- Added --aggregate flag to `monopam changes --daily` command
- Generates structured JSON files for broadcast system
- Added generate_aggregated function to Changes module
- Added rev_parse to Git module
**poe bot refactoring**:
- Commands module: Deterministic command parsing (help, status, broadcast, admin)
- Admin module: Storage management for broadcast state (last_time, git_head)
- Broadcast module: Smart broadcasting that only sends NEW changes
- Loop module: Hourly polling loop for automated change detection
- Config: Added admin_emails and changes_dir fields
- Handler: Updated to use command parser, delegate to modules
New poe commands:
- `poe loop --interval SECONDS` - Automated polling and broadcasting
- Admin commands: last-broadcast, reset-broadcast, storage keys/get/delete
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add xdg_app parameter to zulip-bot Config to allow custom XDG paths.
Poe now stores all configuration under ~/.config/poe/ including:
- config.toml (poe settings)
- zulip.config (zulip credentials)
Also renamed config file from "config" to "zulip.config" for clarity.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>