Repository navigation
feat: epic 7964 — TinyChannels v2 unified channel API - #157
Conversation
The test support module has been refactored to use a dedicated test file instead of being conditionally compiled alongside debug assertions. This cleans up the module structure for better test isolation. Auto-committed-on: dragonfly
Adds new tests to verify that typed sending correctly uses scoped conversations on active connections and rejects invalid address formats before connection. This ensures robust handling of message routing and input validation for IRC. Auto-committed-on: dragonfly
…4-14-provider-files
The condition for including test support modules has been updated to use `any(test, debug_assertions)` instead of just `test`. This allows test support code to be compiled during debug builds as well as dedicated test runs. Auto-committed-on: dragonfly
Adds tests to cover specific edge cases for the split_message function, such as when the byte limit is zero or when the limit is shorter than a single character in unicode strings. Auto-committed-on: dragonfly
This change reorganizes the provider modules and their associated tests by moving them into dedicated subdirectories. This improves the overall structure and organization of the provider implementations. Auto-committed-on: dragonfly
This change renames several test files and updates module paths across various providers to follow a more consistent structure. This streamlines the organization of tests and native implementations within each provider module. Auto-committed-on: dragonfly
…tests This adds a timeout mechanism to the test that verifies the listener recovers from poll errors. It ensures the test waits until the expected update offset is reached before concluding the listener has stopped. Auto-committed-on: dragonfly
Adds a test case to verify that stopping an IRC channel recovers from a poisoned listener lock. Additionally, several older, specific tests related to message splitting have been removed as they are now covered by more general tests. Auto-committed-on: dragonfly
This removes a previously defined test case in the IRC module tests as it was no longer relevant to the current functionality. Auto-committed-on: dragonfly
This change introduces comprehensive support for typed inbound email processing by adding logic to handle IMAP connections, message fetching, and content parsing. It includes sender allowlisting, HTML stripping, and a robust IDLE loop for real-time message notification. Auto-committed-on: dragonfly
Removed placeholder trait implementations from DingTalk and QQ providers as they were not being used. This cleans up the module structure without changing external behavior. Auto-committed-on: dragonfly
This introduces the attachment http client field to both DingTalk and QQ channel structs. This allows for standardized handling of attachments across different provider integrations. Auto-committed-on: dragonfly
This change removes the implementations for DingTalk, EmailChannel, Lark, Mattermost, and QQ providers. This was done to clean up the codebase by removing providers that are no longer in use or supported. Auto-committed-on: dragonfly
This change refactors the email channel implementation by moving related logic into dedicated modules like `config` and `outbound`. This improves the organization and separation of concerns within the provider. Auto-committed-on: dragonfly
Introduces logic to check if an incoming email sender is allowed based on configured rules, and adds helper functions to strip HTML and extract sender/text content from parsed emails. This improves email filtering and content extraction capabilities. Auto-committed-on: dragonfly
Implements typed and untyped health checking for the email channel using IMAP probing. This allows for more robust status reporting across different adapter paths. Auto-committed-on: dragonfly
This change refactors the structure of the DingTalk, Lark, Mattermost, and QQ providers by moving configuration, inbound, and capabilities logic into dedicated modules. This improves organization and separation of concerns across the provider implementations. Auto-committed-on: dragonfly
…essing The `async_trait` macro was removed from the inbound processing logic in mattermost as it is no longer necessary for the current implementation structure. Auto-committed-on: dragonfly
Add a test asserting that an invalid Gateway lookup response fails startup with an unknown, retryable error prefixed by the listener failure message, and that listener ownership is released so a retry can proceed. Auto-committed-on: dragonfly
…4-14-five-provider-layout
…rement refactor(runtime): retire legacy Channel trait
fix(telegram): normalize legacy topic and reply addresses
….com/senamakel/tinychannels into tc14-provider-layout
The test now opens the output handle through an explicit OpenOutput command and feeds it with a matching turn id instead of relying on the open helper and a null turn. This keeps the handle and turn consistent so the cancellation assertion exercises the intended sequenced-final path. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
End a module-sequenced handle after its final message
Voice messages now persist through a module-provided VoiceMediaStore instead of relying on the host, and the transcriber fills in the configured instance and provider identity on the scope so a provider that only knows the conversation and turn still yields a scope the host accepts. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Inbound voice notes: wire the host voice store, scope the transcriber, transcribe at Telegram ingress
BuiltChannel now carries an optional ChannelTyping port alongside the existing output, edit, draft, and reaction ports, with a with_typing_port builder and a typing accessor. Every adapter constructed in build_channels is wired through it so the module can start and stop typing indicators without downcasting the erased channel type. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
…ing dispatch Typing refresh handling is pulled out of the interaction dispatcher into dedicated helpers, and factory-built adapters now route typing operations through their typing port. This keeps the dispatch path uniform and lets both channel kinds share the same refresh lifecycle. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Route incoming typing interactions through the channel's typing port before falling back to the native webhook dispatcher, so typing events are handled by the adapter that owns them. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
The host builder now wires a synthesizer, voice codec, and voice media store into the channel host, and the resulting SpokenReply is retained on Hooks and Running so module-delivered replies can reach the outbound voice pipeline. Inbound voice media requests are also recorded for tracking. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
The running module now captures the spoken reply hook from its hooks and stores it alongside the channel, so voice replies can be forwarded through the provider listener. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a new module that handles voice reply generation for the tinychannels crate. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
The adapter output target now holds an optional spoken reply so voice synthesis can be attached to progressive replies, and the voice_reply module is registered in the crate. Removed a dead-code type alias that only existed to keep an unused import reachable. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Adapter-backed replies now carry the provider's spoken reply into the worker so a synthesized voice part can be added alongside the final text message. Text-only delivery remains the fallback whenever the voice stage is unavailable. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
The adapter sender's typing method now forwards to the adapter's typing port when one is available, instead of always returning success. Adapters without a typing port keep the previous no-op behaviour. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
…plies Add tests asserting that a channel's typing indicator is started before the final reply is delivered, and that an adapter without a typing port still receives the reply. Also cover that spoken context without a voice pipeline leaves the final message unchanged. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
The lost send worker reply test constructs a channel value that now requires a spoken field, so the fixture is updated to keep the test compiling. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a counting ChannelTyping stub and a paused-clock test that drives the adapter typing port through start, refresh and stop interactions, asserting that refreshes re-issue typing and that the refresh registry is emptied on stop. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Reformatted long type aliases, chained method calls, and nested match expressions to satisfy rustfmt, and reindented the factory wiring so the provider construction reads consistently. No behaviour changes. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Co-authored-by: Medulla <medulla@tinyhumans.ai>
SpokenReply now holds trait objects for the reply policy, synthesizer, codec, and media store instead of concrete module types, with a new ReplyPolicy trait wrapping the host's voice reply policy lookup. This lets the pipeline be constructed and tested against the host interfaces rather than the module's own implementations. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add ModuleSynthesizer and ModuleVoiceCodec implementations that bind the host voice scope and transcode through the loaded codec module, plus a reply policy lookup on host channels. Tests cover scope identity binding, codec format handling, and the spoken reply path that now attaches a voice part alongside the final text. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a debug print of the underlying error in feed_adapter_output before it is converted into an Error, so adapter output failures are visible when diagnosing dispatch problems. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Print the full error with eprintln before downcasting so the underlying cause is visible when a send fails to match a known error type. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Implement read_voice on ModuleVoiceMediaStore so stored voice media can be retrieved and returned as base64 alongside its content type and file name. The voice size limit is hoisted to a module constant so both the write and read paths share it, and leftover debug logging in the adapter output and Telegram send error paths was removed. Auto-committed-on: cuttlefish Co-authored-by: Medulla <medulla@tinyhumans.ai>
Co-authored-by: Medulla <medulla@tinyhumans.ai>
feat(module): outbound voice replies and adapter typing for module channels
Tiny Sweeper review
|
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Important Review skippedToo many files! This PR contains 432 files, which is 332 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files.
|
TinyChannels v2: typed content model, per-instance ChannelCapabilities, conversation events (typing/receipts/reactions/edits), one streaming projection, WebChannelEvent wire contract, contract purity, media + voice-note pipeline (inbound STT, outbound native voice replies, typing), every provider on ChannelAdapter v2 with a conformance kit, web adapter, and docs.
Rolled-up work
97 fork PRs merged into
senamakel/tinychannels:epic/7964-channel-v2: https://github.com/senamakel/tinychannels/pulls?q=is%3Apr+is%3Amerged+base%3Aepic%2F7964-channel-v2The branch already contains the current upstream default branch (merge commit, no rebase), so it merges cleanly.
Gates
Per-PR hosted CI on the fork passed (or the bypassed check is named on the fork PR). Local gates run: build,
clippy -D warnings, focused tests, fmt. Cross-repo integration evidence: senamakel/openhuman#678 anddocs/handoffs/7964/upstream-merge-receipts.md.Part of tinyhumansai/openhuman#7964