Skip to content

Bump to zeroclawlabs fork (0.6.9 → 0.7.x) with native poll/interactive support#116

Merged
bglusman merged 1 commit intomainfrom
channels/native-interactive
May 3, 2026
Merged

Bump to zeroclawlabs fork (0.6.9 → 0.7.x) with native poll/interactive support#116
bglusman merged 1 commit intomainfrom
channels/native-interactive

Conversation

@bglusman
Copy link
Copy Markdown
Owner

@bglusman bglusman commented May 3, 2026

Why

PR #114 landed the matcher utility for text-fallback choice resolution. To wire native rendering (Signal polls, WhatsApp interactive buttons/lists), upstream zeroclawlabs needs two additive patches that surface inbound events it currently silently drops.

This PR bumps Calciforge to a small fork branch that carries those patches, paired with the major-version structural refactor that upstream did between 0.6.9 and 0.7.x.

What's in the fork

bglusman/zeroclaw:calciforge-interactive (~140 LOC, 2 commits atop upstream master):

  1. Signal poll-vote events — extends dataMessage.pollAnswer deserialization so Channel::listen emits a synthetic ChannelMessage with content [choice]<title> (or [choice-index]N fallback) when a user votes. Adds SignalChannel::send_poll(recipient, question, options, multi) outbound helper that POSTs to signal-cli-rest-api /v2/send with pollDetails.

  2. WhatsApp Cloud interactive replies — extends parse_webhook_payload to recognize type=interactive messages with button_reply / list_reply sub-types, surfacing the option's id as [choice]<id>. Adds WhatsAppChannel::send_interactive_buttons and send_interactive_list helpers.

Both are fully additive — no breaking changes to upstream's public API. Upstream PR planned once verified in production.

What's in this PR (Calciforge side)

The 0.6.9 → 0.7.x bump is structural — upstream split the umbrella crate into subcrates. Mechanical import-path renames:

Before After
zeroclaw::channels::traits::* zeroclaw_api::channel::*
zeroclaw::channels::SignalChannel zeroclaw_channels::signal::SignalChannel
zeroclaw::channels::WhatsAppWebChannel zeroclaw_channels::whatsapp_web::WhatsAppWebChannel
zeroclaw::channels::LinqChannel zeroclaw_channels::linq::LinqChannel
zeroclaw::config::WhatsAppWebMode zeroclaw_config::schema::WhatsAppWebMode
zeroclaw::config::WhatsAppChatPolicy zeroclaw_config::schema::WhatsAppChatPolicy

No semantic changes. Everything Calciforge consumed at the call-site level still has the same shape. Cargo.toml adds three new git deps for the subcrates Calciforge directly uses.

What this PR does NOT do

It bumps the dep + adapts imports. It does not yet wire the native rendering — that's a follow-up PR that updates signal::send_outbound and whatsapp::send_outbound to:

if message.controls.len() == 1 {
    // Native: send_poll for Signal, send_interactive_buttons / list for WhatsApp
} else {
    // Fall back to PR #114's render_text_fallback (numbered + name-or-number)
}

Plus per-channel inbound dispatch for the [choice]<id> sentinel. Splitting it lets this PR ship the dep bump cleanly without compounding two concerns.

Stats

LOC +489 / -123
Files 7
Tests 647 passing (up from 622 — picks up #114's matcher tests + others merged since); 1 pre-existing failure unrelated to this PR
Clippy / fmt clean

Migration / compat

  • The fork uses git+branch references rather than a published version. Once upstream merges, this flips to a normal version = "..." dep and the fork goes away.
  • Subcrate split is isolated to per-file imports — no public API changes from Calciforge's side.
  • ZeroClawAdapter (Calciforge's HTTP RPC adapter for daemon-mode zeroclaw peers) still works unchanged; it's at the same path on the umbrella crate.

🤖 Generated with Claude Code

Bumps Calciforge to a fork branch of zeroclawlabs that adds two
features upstream silently dropped:

  * Signal: dataMessage.pollAnswer field exposed via ChannelMessage
    content '[choice]<title>' (or '[choice-index]N' fallback) so
    poll-vote events flow back to the dispatcher.
  * WhatsApp Cloud: interactive.button_reply / list_reply parsing
    in webhook payload, surfacing the option's id as '[choice]<id>'.
    Plus outbound send_interactive_buttons / send_interactive_list
    helpers (Meta /v18.0/{phone_number_id}/messages with the
    interactive body shape).

The 0.6.9 → 0.7.x major-version bump is a structural refactor:
upstream split the umbrella crate into per-concern subcrates
(zeroclaw-api, zeroclaw-channels, zeroclaw-config, etc.). Calciforge
adapts via mechanical import-path renames:

  zeroclaw::channels::traits::*    → zeroclaw_api::channel::*
  zeroclaw::channels::SignalChannel → zeroclaw_channels::signal::SignalChannel
  zeroclaw::channels::WhatsAppWebChannel → zeroclaw_channels::whatsapp_web::WhatsAppWebChannel
  zeroclaw::channels::LinqChannel  → zeroclaw_channels::linq::LinqChannel
  zeroclaw::channels::linq::verify_linq_signature
                                   → zeroclaw_channels::linq::verify_linq_signature
  zeroclaw::config::WhatsAppWebMode → zeroclaw_config::schema::WhatsAppWebMode
  zeroclaw::config::WhatsAppChatPolicy → zeroclaw_config::schema::WhatsAppChatPolicy

No semantic changes; everything Calciforge consumed at the call-site
level still has the same shape on master. The umbrella zeroclawlabs
package stays as a dep (its own ZeroClawAdapter + lib name 'zeroclaw'
still exist). Adds three new workspace deps for the subcrates that
host channels, traits, and config types.

Cargo.toml uses git+branch references rather than tag/version because
the fork's calciforge-interactive branch tracks upstream master with
our two patches on top. Once upstream merges the patches, this can
flip back to a published version. The branch is small and easy to
rebase on upstream churn.

The matcher already added in PR #114 will pair with this in a
follow-up PR that wires native poll/interactive rendering on
signal::send_outbound and whatsapp::send_outbound when
OutboundMessage.controls is non-empty.
Copilot AI review requested due to automatic review settings May 3, 2026 02:15
@qodo-code-review
Copy link
Copy Markdown

ⓘ You've reached your Qodo monthly free-tier limit. Reviews pause until next month — upgrade your plan to continue now, or link your paid account if you already have one.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates Calciforge’s embedded zeroclaw integration from the 0.6.9 umbrella crate to a 0.7.x fork that splits the API into subcrates, laying the dependency groundwork for a follow-up PR that will add native Signal polls and WhatsApp interactive controls. In the current codebase, this mainly affects the channel adapters and config types that wrap zeroclaw transports.

Changes:

  • Bumps workspace zeroclaw dependencies from the published 0.6.9 crate to the calciforge-interactive git fork and adds the new split subcrates.
  • Updates Calciforge channel/config imports to use zeroclaw_api, zeroclaw_channels, and zeroclaw_config.
  • Refreshes the lockfile to the forked 0.7.4 dependency graph and its transitive crates.

Reviewed changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
crates/calciforge/src/config.rs Switches WhatsApp config field types to the new zeroclaw_config::schema enums.
crates/calciforge/src/channels/whatsapp.rs Updates WhatsApp channel imports and module docs for the split zeroclaw crates.
crates/calciforge/src/channels/sms.rs Repoints SMS/Linq channel imports and signature verification helper to the new crate paths.
crates/calciforge/src/channels/signal.rs Updates Signal channel imports and top-level docs to the split crate layout.
crates/calciforge/Cargo.toml Adds direct Calciforge dependencies on zeroclaw-api, zeroclaw-channels, and zeroclaw-config.
Cargo.toml Replaces the workspace zeroclaw dependency with git-based forked 0.7.x workspace entries.
Cargo.lock Locks the workspace to the fork commit and records the expanded 0.7.4 transitive dependency set.

Comment thread Cargo.toml
[workspace.dependencies]
# External agent dependencies
zeroclawlabs = "0.6.9"
zeroclawlabs = { package = "zeroclawlabs", git = "https://github.com/bglusman/zeroclaw", branch = "calciforge-interactive" }
/// WhatsApp Web operating mode.
#[serde(default)]
pub whatsapp_mode: zeroclaw::config::WhatsAppWebMode,
pub whatsapp_mode: zeroclaw_config::schema::WhatsAppWebMode,
@bglusman bglusman enabled auto-merge (squash) May 3, 2026 02:21
@bglusman bglusman merged commit 483e7f3 into main May 3, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants