Skip to content

Zulip

The Zulip adapter implements the current REST API and the official Event Queue protocol (POST /register, followed by long-polling GET /events). It does not open a non-existent Zulip WebSocket endpoint.

Mapping

ZulipOneBots
Channel + topicgroup / channel, scene ID stream_id/topic
Direct messageprivate, one user ID or comma-separated user IDs
Organization userUser, not a fabricated friend
Channel subscribersGroup members
Reactionreaction_added / reaction_removed
Other queue eventscustom, with the complete raw_event

Text uses Zulip-flavored Markdown. Mentions resolve the real member name and ID. Remote media is linked directly; local paths and Base64 payloads are uploaded through /user_uploads. Message fetch, history, edits, deletion, read flags, reactions, channel membership, and file uploads use native endpoints.

The queue is recreated after BAD_EVENT_QUEUE_ID, retries forever with bounded exponential backoff, is cancelled through AbortSignal, and is deleted on shutdown. A consumer listener exception is reported as a structured client error without stopping queue consumption.

The package exports a standalone typed ZulipClient. Existing queue consumers can feed events through await client.ingest(rawEvent); deduplication is committed only after every raw, typed, and canonical listener completes. client.call(path, method, params) provides a constrained escape hatch for official API endpoints under the configured organization.

See Zulip configuration and the package README for the complete native action list.