commits
Restored these libraries that also need the parameterized Requests.t type:
- peertubee/peertubee.ml and peertubee.mli
- immich/immich.ml and immich.mli
- typesense-client/typesense_client.ml and typesense_client.mli
- karakeep/karakeep.ml
These libraries all depend on Requests.t being parameterized as:
type ('clock, 'net) t
The merge conflict resolution during rebase incorrectly changed Requests.t
from a parameterized type to a monomorphic type:
- Before: type ('clock, 'net) t
- After (broken): type t
This broke all libraries that depend on requests (river, requests_json_api,
zotero-translation, zulip) as they expect the parameterized type to properly
abstract over Eio's clock and network types.
Restored these files from the original branch (324a64b):
- requests/lib/requests.ml
- requests/lib/requests.mli
- requests_json_api/lib/requests_json_api.ml
- requests_json_api/lib/requests_json_api.mli
- zotero-translation/zotero_translation.ml
- zotero-translation/zotero_translation.mli
- zulip/lib/zulip/lib/client.ml
- zulip/lib/zulip/lib/client.mli
River, requests, zulip, and all dependent libraries now build successfully.
The merge conflict resolution during rebase incorrectly removed:
- user_id and delivery_email optional parameters from User.create
- get_by_id function from Users module
- client accessor function from Bot_storage module
This commit restores the working version from the original branch (324a64b)
that was in place before the rebase started.
The core zulip library now builds successfully.
This commit integrates River feed aggregation into Vicuna, enabling the bot to:
- Fetch RSS/Atom feeds and post new items to Zulip channels
- Match post authors with registered Vicuna users via smart matching
- Provide both message-based and CLI commands for feed management
- Poll feeds automatically every 5 minutes when enabled
## Key Features
### User Registration Enhancement
- Extended user_registration type with last_river_post_date field
- Backward-compatible serialization/deserialization
- Tracks last posted date per user for deduplication
### River Integration (vicuna_bot.ml)
- Feed source management (add/remove/list feeds)
- Configuration storage (channel, polling status)
- Smart user matching: email exact → name exact → name fuzzy
- Post formatting with markdown conversion and author attribution
- Complete sync-and-post workflow
### Bot Message Commands
All users can use these commands:
- `river feeds` - List configured feeds
- `river add-feed <name> <url>` - Add a feed
- `river remove-feed <name>` - Remove a feed
- `river set-channel <channel>` - Set target Zulip channel
- `river start` - Enable automatic polling
- `river stop` - Disable automatic polling
- `river status` - Show integration status
### CLI Commands
- `vicuna river list` - List configured feeds
- `vicuna river add <name> <url>` - Add a feed
- `vicuna river remove <name>` - Remove a feed
- `vicuna river set-channel <channel>` - Configure target channel
- `vicuna river start` - Enable polling
- `vicuna river stop` - Disable polling
### Automatic Polling
- Background fiber polls feeds every 5 minutes
- Only posts items newer than user's last_river_post_date
- Controlled via --enable-river-polling CLI flag or bot commands
- Graceful error handling with logging
### Post Format
- Topic: Post title
- Body: "By @**User**" (if matched) or "By Author Name"
Summary (200 chars) + [Read more](link)
## Implementation Details
- Uses River library for feed fetching and parsing
- Stores feed config in bot_storage as JSON
- Markdown conversion via River's Markdown_converter
- Jsont-based JSON encoding/decoding
- Fully integrated with existing Vicuna bot infrastructure
## Usage
Start bot with River polling:
```
./vicuna --enable-river-polling
```
Add a feed via CLI:
```
./vicuna river add "OCaml Blog" https://ocaml.org/blog/feed.xml
```
Or via bot message:
```
@vicuna river add-feed "OCaml Blog" https://ocaml.org/blog/feed.xml
```
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Restored these libraries that also need the parameterized Requests.t type:
- peertubee/peertubee.ml and peertubee.mli
- immich/immich.ml and immich.mli
- typesense-client/typesense_client.ml and typesense_client.mli
- karakeep/karakeep.ml
These libraries all depend on Requests.t being parameterized as:
type ('clock, 'net) t
The merge conflict resolution during rebase incorrectly changed Requests.t
from a parameterized type to a monomorphic type:
- Before: type ('clock, 'net) t
- After (broken): type t
This broke all libraries that depend on requests (river, requests_json_api,
zotero-translation, zulip) as they expect the parameterized type to properly
abstract over Eio's clock and network types.
Restored these files from the original branch (324a64b):
- requests/lib/requests.ml
- requests/lib/requests.mli
- requests_json_api/lib/requests_json_api.ml
- requests_json_api/lib/requests_json_api.mli
- zotero-translation/zotero_translation.ml
- zotero-translation/zotero_translation.mli
- zulip/lib/zulip/lib/client.ml
- zulip/lib/zulip/lib/client.mli
River, requests, zulip, and all dependent libraries now build successfully.
The merge conflict resolution during rebase incorrectly removed:
- user_id and delivery_email optional parameters from User.create
- get_by_id function from Users module
- client accessor function from Bot_storage module
This commit restores the working version from the original branch (324a64b)
that was in place before the rebase started.
The core zulip library now builds successfully.
This commit integrates River feed aggregation into Vicuna, enabling the bot to:
- Fetch RSS/Atom feeds and post new items to Zulip channels
- Match post authors with registered Vicuna users via smart matching
- Provide both message-based and CLI commands for feed management
- Poll feeds automatically every 5 minutes when enabled
## Key Features
### User Registration Enhancement
- Extended user_registration type with last_river_post_date field
- Backward-compatible serialization/deserialization
- Tracks last posted date per user for deduplication
### River Integration (vicuna_bot.ml)
- Feed source management (add/remove/list feeds)
- Configuration storage (channel, polling status)
- Smart user matching: email exact → name exact → name fuzzy
- Post formatting with markdown conversion and author attribution
- Complete sync-and-post workflow
### Bot Message Commands
All users can use these commands:
- `river feeds` - List configured feeds
- `river add-feed <name> <url>` - Add a feed
- `river remove-feed <name>` - Remove a feed
- `river set-channel <channel>` - Set target Zulip channel
- `river start` - Enable automatic polling
- `river stop` - Disable automatic polling
- `river status` - Show integration status
### CLI Commands
- `vicuna river list` - List configured feeds
- `vicuna river add <name> <url>` - Add a feed
- `vicuna river remove <name>` - Remove a feed
- `vicuna river set-channel <channel>` - Configure target channel
- `vicuna river start` - Enable polling
- `vicuna river stop` - Disable polling
### Automatic Polling
- Background fiber polls feeds every 5 minutes
- Only posts items newer than user's last_river_post_date
- Controlled via --enable-river-polling CLI flag or bot commands
- Graceful error handling with logging
### Post Format
- Topic: Post title
- Body: "By @**User**" (if matched) or "By Author Name"
Summary (200 chars) + [Read more](link)
## Implementation Details
- Uses River library for feed fetching and parsing
- Stores feed config in bot_storage as JSON
- Markdown conversion via River's Markdown_converter
- Jsont-based JSON encoding/decoding
- Fully integrated with existing Vicuna bot infrastructure
## Usage
Start bot with River polling:
```
./vicuna --enable-river-polling
```
Add a feed via CLI:
```
./vicuna river add "OCaml Blog" https://ocaml.org/blog/feed.xml
```
Or via bot message:
```
@vicuna river add-feed "OCaml Blog" https://ocaml.org/blog/feed.xml
```
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>