Skip to content

refactor(acp-nats): typed subjects enforce correct transport at compile time#76

Merged
yordis merged 1 commit intomainfrom
refactor/typed-subjects-poc
Apr 1, 2026
Merged

refactor(acp-nats): typed subjects enforce correct transport at compile time#76
yordis merged 1 commit intomainfrom
refactor/typed-subjects-poc

Conversation

@yordis
Copy link
Copy Markdown
Member

@yordis yordis commented Apr 1, 2026

Summary

  • Introduce RequestSubject, PublishSubject, and JetStreamSubject newtypes that encode the transport at the type level
  • Subject builders return the type matching their transport — initialize() returns RequestSubject, prompt() returns JetStreamSubject, cancel() returns PublishSubject
  • Wrapper functions (nats::request_with_timeout, nats::publish, bridge.session_request) only accept the correct type — misuse is a compile error

@cursor
Copy link
Copy Markdown

cursor bot commented Apr 1, 2026

PR Summary

Medium Risk
Broad refactor of NATS/JetStream subject construction and request/publish APIs; main risk is subtle subject formatting or trait/transport mismatches that could break message routing at runtime. Also changes mutex-poisoning behavior in prompt waiter handling to fail fast with errors instead of panicking.

Overview
Replaces stringly-typed NATS subjects with typed subject structs (e.g. InitializeSubject, PromptSubject, wildcard subjects) and new marker traits (Requestable, Publishable, SessionCommand, etc.) so APIs like nats::request_with_timeout, nats::publish, and Bridge::session_request only accept subjects valid for that transport.

Updates agent/client proxy code (including the acp-nats-agent connection dispatcher) to construct these typed subjects, passing AcpPrefix/AcpSessionId through rather than raw &str, and removes the old nats/subjects.rs string builders in favor of the new modular nats/subjects/* layout with added tests.

Hardens prompt-response waiter handling by propagating mutex-poisoning as a LockPoisonedError and logging error!/early-return instead of unwrapping, reducing crashy behavior when internal state is corrupted.

Written by Cursor Bugbot for commit b493fb1. This will update automatically on new commits. Configure here.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 1, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c3c9eebc-431a-4557-b5be-32de4fa2f5db

📥 Commits

Reviewing files that changed from the base of the PR and between d187733 and b493fb1.

📒 Files selected for processing (70)
  • rsworkspace/crates/acp-nats-agent/src/connection.rs
  • rsworkspace/crates/acp-nats/src/acp_prefix.rs
  • rsworkspace/crates/acp-nats/src/agent/authenticate.rs
  • rsworkspace/crates/acp-nats/src/agent/bridge.rs
  • rsworkspace/crates/acp-nats/src/agent/cancel.rs
  • rsworkspace/crates/acp-nats/src/agent/close_session.rs
  • rsworkspace/crates/acp-nats/src/agent/ext_method.rs
  • rsworkspace/crates/acp-nats/src/agent/ext_notification.rs
  • rsworkspace/crates/acp-nats/src/agent/fork_session.rs
  • rsworkspace/crates/acp-nats/src/agent/initialize.rs
  • rsworkspace/crates/acp-nats/src/agent/list_sessions.rs
  • rsworkspace/crates/acp-nats/src/agent/load_session.rs
  • rsworkspace/crates/acp-nats/src/agent/new_session.rs
  • rsworkspace/crates/acp-nats/src/agent/prompt.rs
  • rsworkspace/crates/acp-nats/src/agent/resume_session.rs
  • rsworkspace/crates/acp-nats/src/agent/set_session_config_option.rs
  • rsworkspace/crates/acp-nats/src/agent/set_session_mode.rs
  • rsworkspace/crates/acp-nats/src/agent/set_session_model.rs
  • rsworkspace/crates/acp-nats/src/client/ext_session_prompt_response.rs
  • rsworkspace/crates/acp-nats/src/client/mod.rs
  • rsworkspace/crates/acp-nats/src/client_proxy.rs
  • rsworkspace/crates/acp-nats/src/config.rs
  • rsworkspace/crates/acp-nats/src/nats/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/fs_read_text_file.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/fs_write_text_file.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/session_request_permission.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/session_update.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/terminal_create.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/terminal_kill.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/terminal_output.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/terminal_release.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/terminal_wait_for_exit.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/cancel.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/close.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/fork.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/load.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/prompt.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/resume.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/set_config_option.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/set_mode.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/commands/set_model.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/authenticate.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/ext.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/ext_notify.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/initialize.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/session_list.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/global/session_new.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/markers.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/responses/cancelled.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/responses/ext_ready.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/responses/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/responses/prompt_response.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/responses/response.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/responses/update.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/all_agent.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/all_agent_ext.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/all_client.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/all_session.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/global_all.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/mod.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/one_agent.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/one_client.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/one_session.rs
  • rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/prompt_wildcard.rs
  • rsworkspace/crates/acp-nats/src/pending_prompt_waiters.rs

Walkthrough

This PR refactors NATS subject construction from string-based helpers to typed Subject structs implementing marker traits. It introduces a new structured subject module hierarchy, adds acp_prefix_ref() to retrieve AcpPrefix references, updates 50+ handler call-sites, and improves error handling for mutex poisoning via LockPoisonedError.

Changes

Cohort / File(s) Summary
Subject Type Infrastructure
rsworkspace/crates/acp-nats/src/nats/subjects/markers.rs, rsworkspace/crates/acp-nats/src/nats/subjects/mod.rs
Adds five new marker traits (Requestable, Publishable, SessionCommand, Subscribable, ClientRequestable) and a comprehensive test suite for the new subject type system. Builds the module hierarchy organizing global, command, response, client-ops, and subscription subjects.
Global Subject Types
rsworkspace/crates/acp-nats/src/nats/subjects/global/*
Introduces six new typed subject structs: AuthenticateSubject, ExtSubject, ExtNotifySubject, InitializeSubject, SessionListSubject, SessionNewSubject. Each implements Display and appropriate marker traits, replacing string-based helper functions.
Command Subject Types
rsworkspace/crates/acp-nats/src/nats/subjects/commands/*
Adds nine *Subject types for session commands (Cancel, Close, Fork, Load, Prompt, Resume, SetConfigOption, SetMode, SetModel), each storing AcpPrefix and AcpSessionId, implementing Display and SessionCommand marker trait.
Response Subject Types
rsworkspace/crates/acp-nats/src/nats/subjects/responses/*
Introduces five response subject types (Cancelled, ExtReady, PromptResponse, Response, Update) for agent-to-bridge messaging, implementing Display and Publishable/Subscribable traits where applicable.
Client Operations Subject Types
rsworkspace/crates/acp-nats/src/nats/subjects/client_ops/*
Adds nine client request subjects for filesystem and terminal operations (FsReadTextFile, FsWriteTextFile, SessionRequestPermission, SessionUpdate, TerminalCreate, TerminalKill, TerminalOutput, TerminalRelease, TerminalWaitForExit), each implementing ClientRequestable.
Subscription Subject Types
rsworkspace/crates/acp-nats/src/nats/subjects/subscriptions/*
Introduces nine wildcard subscription types (GlobalAll, AllAgent, AllAgentExt, AllClient, AllSession, OneAgent, OneClient, OneSession, PromptWildcard), each implementing Display and Subscribable.
NATS Module Updates
rsworkspace/crates/acp-nats/src/nats/mod.rs
Removes direct re-exports of trogon_nats::request_with_timeout and publish; adds typed wrapper functions accepting &impl markers::Requestable / &impl markers::Publishable. Updates re-exports to include markers module.
Config and Prefix Infrastructure
rsworkspace/crates/acp-nats/src/config.rs, rsworkspace/crates/acp-nats/src/acp_prefix.rs
Adds Config::acp_prefix_ref() accessor returning &AcpPrefix; extends AcpPrefix to derive Debug alongside existing Clone.
Old String-Based Subject Helpers Removed
rsworkspace/crates/acp-nats/src/nats/subjects.rs (deleted)
Removes entire module with 30+ string-based subject helper functions (e.g., agent::initialize, session::agent::load, session::wildcards::all_agent) and associated tests.
Global Agent Handlers Updated
rsworkspace/crates/acp-nats/src/agent/{authenticate,initialize,list_sessions,new_session,ext_method,ext_notification}.rs
Updates subject construction calls from string-based helpers (e.g., agent::authenticate(prefix)) to typed constructors (e.g., AuthenticateSubject::new(acp_prefix_ref())); switches to acp_prefix_ref() for reference-based prefix access.
Session Command Handlers Updated
rsworkspace/crates/acp-nats/src/agent/{cancel,close_session,fork_session,load_session,resume_session,set_session_*.rs}
Refactors session-scoped agent handlers to use typed subject builders (CancelSubject::new, LoadSubject::new, etc.); passes &AcpSessionId and &AcpPrefix references instead of string conversions; updates bridge method calls accordingly.
Prompt and Prompt Response
rsworkspace/crates/acp-nats/src/agent/prompt.rs
Carries AcpSessionId and AcpPrefix as strongly typed values throughout control flow; updates subject construction to use PromptSubject::new, UpdateSubject::new, PromptResponseSubject::new, CancelledSubject::new; derives temporary string views for JetStream stream names.
Bridge Session Handling
rsworkspace/crates/acp-nats/src/agent/bridge.rs
Changes publish_session_ready parameter from &str to &AcpPrefix; updates Bridge::session_request to accept &impl SessionCommand instead of &str; refactors subject construction to typed subject builders; adds validation for AcpSessionId::try_from; switches non-JetStream path to trogon_nats::request_with_timeout.
Client Proxy Updates
rsworkspace/crates/acp-nats/src/client_proxy.rs
Updates prefix() and session_id() to return typed references; changes request/notify to accept &impl ClientRequestable and &impl Publishable subjects; replaces all session subject construction calls with typed builders (e.g., SessionRequestPermissionSubject::new).
Client Handler Updates
rsworkspace/crates/acp-nats/src/client/mod.rs, rsworkspace/crates/acp-nats/src/client/ext_session_prompt_response.rs
Updates wildcard subscription from all_client(prefix) to AllClientSubject::new(acp_prefix_ref()); adds explicit tracing::error and poison-error handling for bridge.pending_session_prompt_responses access; wraps locking operations in match-based error propagation.
Lock Error Handling
rsworkspace/crates/acp-nats/src/pending_prompt_waiters.rs
Introduces LockPoisonedError type with Display and Error impls; changes purge_expired_timed_out_waiters, should_suppress_missing_waiter_warning, and resolve_waiter to return Result<..., LockPoisonedError> instead of infallible implementations; adds unit tests for error scenarios.
Connection and Agent Dispatch
rsworkspace/crates/acp-nats-agent/src/connection.rs
Updates serve, serve_js, dispatch_js_message to accept &AcpPrefix instead of &str; replaces wildcard/subject factory calls with typed subject builders (GlobalAllSubject::new, AllAgentSubject::new, etc.); uses acp_prefix_ref() and Rc-clones for spawned tasks; refactors test helpers and adjusts call-sites for JetStream stream/subject construction.

Sequence Diagram(s)

The changes primarily involve refactoring existing APIs and data flow patterns without introducing new multi-component interaction sequences. Subject construction, handler invocation, and NATS messaging patterns remain functionally equivalent, so a sequence diagram would not provide additional clarity beyond the existing code logic.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

A rabbit hops through subjects new,
From strings to types—a clearer view,
With markers guiding every way,
The types now speak what strings once say,
Safe references hop today! 🐰✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/typed-subjects-poc

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 1, 2026

badge

Code Coverage Summary

Details
Filename                                                                      Stmts    Miss  Cover    Missing
--------------------------------------------------------------------------  -------  ------  -------  ---------------------------------------------------------------------------------------------
crates/acp-nats/src/nats/subjects/client_ops/terminal_create.rs                  15       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_output.rs                  15       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_request_permission.rs       15       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_update.rs                   15       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_release.rs                 15       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_wait_for_exit.rs           15       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_read_text_file.rs                15       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_write_text_file.rs               15       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_kill.rs                    15       0  100.00%
crates/acp-nats-ws/src/connection.rs                                            162      35  78.40%   71-78, 83-94, 110, 112-113, 118, 129-131, 138, 142, 146, 149-157, 168, 172, 175, 178-182, 216
crates/acp-nats-ws/src/main.rs                                                  157       2  98.73%   84, 247
crates/acp-nats-ws/src/config.rs                                                 83       0  100.00%
crates/acp-nats-ws/src/upgrade.rs                                                57       2  96.49%   59, 90
crates/trogon-nats/src/auth.rs                                                  114       3  97.37%   45-47
crates/trogon-nats/src/connect.rs                                                96      16  83.33%   22-24, 37, 49, 68-151
crates/trogon-nats/src/messaging.rs                                             528       2  99.62%   132, 142
crates/trogon-nats/src/mocks.rs                                                 304       0  100.00%
crates/trogon-nats/src/client.rs                                                 25      25  0.00%    50-89
crates/trogon-nats/src/jetstream/mocks.rs                                       471       0  100.00%
crates/trogon-nats/src/jetstream/traits.rs                                      103       0  100.00%
crates/acp-nats/src/config.rs                                                   204       0  100.00%
crates/acp-nats/src/session_id.rs                                                88       0  100.00%
crates/acp-nats/src/error.rs                                                     84       0  100.00%
crates/acp-nats/src/in_flight_slot_guard.rs                                      32       0  100.00%
crates/acp-nats/src/jsonrpc.rs                                                    6       0  100.00%
crates/acp-nats/src/pending_prompt_waiters.rs                                   141       0  100.00%
crates/acp-nats/src/lib.rs                                                       73       0  100.00%
crates/acp-nats/src/client_proxy.rs                                             200       0  100.00%
crates/acp-nats/src/acp_prefix.rs                                                63       0  100.00%
crates/acp-nats/src/ext_method_name.rs                                           85       0  100.00%
crates/trogon-std/src/fs/system.rs                                               29      12  58.62%   17-19, 31-45
crates/trogon-std/src/fs/mem.rs                                                 220      10  95.45%   61-63, 77-79, 133-135, 158
crates/acp-nats-agent/src/connection.rs                                        1389       9  99.35%   473, 675-677, 684, 1864-1865, 1878-1879
crates/acp-nats-stdio/src/config.rs                                              72       0  100.00%
crates/acp-nats-stdio/src/main.rs                                               113      11  90.27%   58, 106-113, 119-121, 138
crates/acp-nats/src/nats/subjects/responses/ext_ready.rs                         15       0  100.00%
crates/acp-nats/src/nats/subjects/responses/response.rs                          20       0  100.00%
crates/acp-nats/src/nats/subjects/responses/cancelled.rs                         18       0  100.00%
crates/acp-nats/src/nats/subjects/responses/update.rs                            20       0  100.00%
crates/acp-nats/src/nats/subjects/responses/prompt_response.rs                   20       0  100.00%
crates/acp-nats/src/client/terminal_release.rs                                  357       0  100.00%
crates/acp-nats/src/client/ext_session_prompt_response.rs                       156       0  100.00%
crates/acp-nats/src/client/ext.rs                                               365       8  97.81%   193-204, 229-240
crates/acp-nats/src/client/session_update.rs                                     55       0  100.00%
crates/acp-nats/src/client/fs_write_text_file.rs                                451       0  100.00%
crates/acp-nats/src/client/terminal_create.rs                                   294       0  100.00%
crates/acp-nats/src/client/request_permission.rs                                338       0  100.00%
crates/acp-nats/src/client/fs_read_text_file.rs                                 384       0  100.00%
crates/acp-nats/src/client/mod.rs                                              2982       0  100.00%
crates/acp-nats/src/client/terminal_kill.rs                                     309       0  100.00%
crates/acp-nats/src/client/rpc_reply.rs                                          71       0  100.00%
crates/acp-nats/src/client/terminal_output.rs                                   223       0  100.00%
crates/acp-nats/src/client/terminal_wait_for_exit.rs                            396       0  100.00%
crates/acp-nats/src/nats/subjects/commands/prompt.rs                             18       0  100.00%
crates/acp-nats/src/nats/subjects/commands/resume.rs                             18       0  100.00%
crates/acp-nats/src/nats/subjects/commands/cancel.rs                             18       0  100.00%
crates/acp-nats/src/nats/subjects/commands/load.rs                               18       0  100.00%
crates/acp-nats/src/nats/subjects/commands/close.rs                              18       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_model.rs                          18       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_config_option.rs                  18       0  100.00%
crates/acp-nats/src/nats/subjects/commands/fork.rs                               18       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_mode.rs                           18       0  100.00%
crates/trogon-std/src/dirs/fixed.rs                                              84       0  100.00%
crates/trogon-std/src/dirs/system.rs                                             98      11  88.78%   57, 65, 67, 75, 77, 85, 87, 96, 98, 109, 154
crates/trogon-std/src/time/mock.rs                                              123       0  100.00%
crates/trogon-std/src/time/system.rs                                             24       0  100.00%
crates/trogon-std/src/json.rs                                                    30       0  100.00%
crates/trogon-std/src/args.rs                                                    10       0  100.00%
crates/acp-telemetry/src/lib.rs                                                 153      22  85.62%   39-46, 81, 86, 91, 105-120
crates/acp-telemetry/src/trace.rs                                                32       4  87.50%   23-24, 31-32
crates/acp-telemetry/src/metric.rs                                               35       4  88.57%   30-31, 38-39
crates/acp-telemetry/src/log.rs                                                  70       2  97.14%   39-40
crates/acp-telemetry/src/service_name.rs                                         16       0  100.00%
crates/acp-telemetry/src/signal.rs                                                3       3  0.00%    4-43
crates/trogon-std/src/env/in_memory.rs                                           81       0  100.00%
crates/trogon-std/src/env/system.rs                                              17       0  100.00%
crates/acp-nats/src/nats/subjects/global/initialize.rs                            8       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext.rs                                   9       0  100.00%
crates/acp-nats/src/nats/subjects/global/session_list.rs                          8       0  100.00%
crates/acp-nats/src/nats/subjects/global/authenticate.rs                          8       0  100.00%
crates/acp-nats/src/nats/subjects/global/session_new.rs                           8       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext_notify.rs                            9       0  100.00%
crates/acp-nats/src/nats/extensions.rs                                            3       0  100.00%
crates/acp-nats/src/nats/mod.rs                                                  23       0  100.00%
crates/acp-nats/src/nats/parsing.rs                                             280       1  99.64%   151
crates/acp-nats/src/nats/token.rs                                                 8       0  100.00%
crates/acp-nats/src/telemetry/metrics.rs                                         65       0  100.00%
crates/acp-nats/src/nats/subjects/mod.rs                                        320       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent.rs                     11       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent_ext.rs                 11       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_session.rs                   18       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_client.rs                    18       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_client.rs                    11       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_agent.rs                     18       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/prompt_wildcard.rs               11       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_session.rs                   11       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/global_all.rs                    11       0  100.00%
crates/acp-nats/src/agent/set_session_config_option.rs                           76       0  100.00%
crates/acp-nats/src/agent/authenticate.rs                                        52       0  100.00%
crates/acp-nats/src/agent/initialize.rs                                          82       0  100.00%
crates/acp-nats/src/agent/js_request.rs                                         298       0  100.00%
crates/acp-nats/src/agent/new_session.rs                                         91       0  100.00%
crates/acp-nats/src/agent/resume_session.rs                                     113       0  100.00%
crates/acp-nats/src/agent/fork_session.rs                                       117       0  100.00%
crates/acp-nats/src/agent/cancel.rs                                             104       0  100.00%
crates/acp-nats/src/agent/load_session.rs                                       114       0  100.00%
crates/acp-nats/src/agent/set_session_mode.rs                                    79       0  100.00%
crates/acp-nats/src/agent/prompt.rs                                            1134       1  99.91%   147
crates/acp-nats/src/agent/set_session_model.rs                                   76       0  100.00%
crates/acp-nats/src/agent/test_support.rs                                       264       0  100.00%
crates/acp-nats/src/agent/close_session.rs                                       72       0  100.00%
crates/acp-nats/src/agent/bridge.rs                                             149      17  88.59%   130-133, 180-192
crates/acp-nats/src/agent/mod.rs                                                 61       0  100.00%
crates/acp-nats/src/agent/ext_notification.rs                                    88       0  100.00%
crates/acp-nats/src/agent/ext_method.rs                                          92       0  100.00%
crates/acp-nats/src/agent/list_sessions.rs                                       50       0  100.00%
crates/acp-nats/src/jetstream/streams.rs                                        252       0  100.00%
crates/acp-nats/src/jetstream/provision.rs                                       58       0  100.00%
crates/acp-nats/src/jetstream/consumers.rs                                       76       0  100.00%
crates/acp-nats/src/jetstream/ext_policy.rs                                      26       0  100.00%
TOTAL                                                                         16839     200  98.81%

Diff against main

Filename                                                                      Stmts    Miss  Cover
--------------------------------------------------------------------------  -------  ------  --------
crates/acp-nats/src/nats/subjects/client_ops/terminal_create.rs                 +15       0  +100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_output.rs                 +15       0  +100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_request_permission.rs      +15       0  +100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_update.rs                  +15       0  +100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_release.rs                +15       0  +100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_wait_for_exit.rs          +15       0  +100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_read_text_file.rs               +15       0  +100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_write_text_file.rs              +15       0  +100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_kill.rs                   +15       0  +100.00%
crates/acp-nats/src/config.rs                                                    +3       0  +100.00%
crates/acp-nats/src/pending_prompt_waiters.rs                                   +29       0  +100.00%
crates/acp-nats/src/client_proxy.rs                                              +4       0  +100.00%
crates/acp-nats-agent/src/connection.rs                                         +29       0  +0.01%
crates/acp-nats/src/nats/subjects/responses/ext_ready.rs                        +15       0  +100.00%
crates/acp-nats/src/nats/subjects/responses/response.rs                         +20       0  +100.00%
crates/acp-nats/src/nats/subjects/responses/cancelled.rs                        +18       0  +100.00%
crates/acp-nats/src/nats/subjects/responses/update.rs                           +20       0  +100.00%
crates/acp-nats/src/nats/subjects/responses/prompt_response.rs                  +20       0  +100.00%
crates/acp-nats/src/client/ext_session_prompt_response.rs                        +6       0  +100.00%
crates/acp-nats/src/client/mod.rs                                                +1       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/prompt.rs                            +18       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/resume.rs                            +18       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/cancel.rs                            +18       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/load.rs                              +18       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/close.rs                             +18       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/set_model.rs                         +18       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/set_config_option.rs                 +18       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/fork.rs                              +18       0  +100.00%
crates/acp-nats/src/nats/subjects/commands/set_mode.rs                          +18       0  +100.00%
crates/acp-nats/src/nats/subjects/global/initialize.rs                           +8       0  +100.00%
crates/acp-nats/src/nats/subjects/global/ext.rs                                  +9       0  +100.00%
crates/acp-nats/src/nats/subjects/global/session_list.rs                         +8       0  +100.00%
crates/acp-nats/src/nats/subjects/global/authenticate.rs                         +8       0  +100.00%
crates/acp-nats/src/nats/subjects/global/session_new.rs                          +8       0  +100.00%
crates/acp-nats/src/nats/subjects/global/ext_notify.rs                           +9       0  +100.00%
crates/acp-nats/src/nats/mod.rs                                                 +23       0  +100.00%
crates/acp-nats/src/nats/subjects/mod.rs                                       +320       0  +100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent.rs                    +11       0  +100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent_ext.rs                +11       0  +100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_session.rs                  +18       0  +100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_client.rs                   +18       0  +100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_client.rs                   +11       0  +100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_agent.rs                    +18       0  +100.00%
crates/acp-nats/src/nats/subjects/subscriptions/prompt_wildcard.rs              +11       0  +100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_session.rs                  +11       0  +100.00%
crates/acp-nats/src/nats/subjects/subscriptions/global_all.rs                   +11       0  +100.00%
crates/acp-nats/src/agent/prompt.rs                                              +6      -1  +0.09%
crates/acp-nats/src/agent/bridge.rs                                              +7      +4  -2.25%
TOTAL                                                                          +988      +3  +0.03%

Results for commit: b493fb1

Minimum allowed coverage is 95%

♻️ This comment has been updated with latest results

@yordis yordis force-pushed the refactor/typed-subjects-poc branch 2 times, most recently from 4f5a90e to c0eeef1 Compare April 1, 2026 14:17
@yordis yordis force-pushed the refactor/typed-subjects-poc branch 4 times, most recently from 4bc1d90 to 12a58bb Compare April 1, 2026 15:39
@yordis yordis force-pushed the refactor/typed-subjects-poc branch 2 times, most recently from f446336 to dfdba45 Compare April 1, 2026 15:52
@yordis yordis force-pushed the refactor/typed-subjects-poc branch 4 times, most recently from c98326c to 156ea8b Compare April 1, 2026 16:30
Copy link
Copy Markdown

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 2 total unresolved issues (including 1 from previous review).

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

@yordis yordis force-pushed the refactor/typed-subjects-poc branch 3 times, most recently from 9b35a1e to 2225087 Compare April 1, 2026 16:55
Each NATS subject is its own struct with typed parameters (AcpPrefix,
AcpSessionId). Marker traits (Requestable, Publishable, SessionCommand,
Subscribable, ClientRequestable) enforce correct transport at compile
time — passing a CancelSubject to request_with_timeout is a compile
error, not a runtime bug.

Also removes all production .unwrap() calls:
- publish_session_ready: gracefully handles invalid session IDs
- PendingSessionPromptResponseWaiters: returns Result for poison errors

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@yordis yordis force-pushed the refactor/typed-subjects-poc branch from 2225087 to b493fb1 Compare April 1, 2026 17:41
@yordis yordis marked this pull request as ready for review April 1, 2026 17:57
@yordis yordis merged commit ec91507 into main Apr 1, 2026
5 of 6 checks passed
@yordis yordis deleted the refactor/typed-subjects-poc branch April 1, 2026 17:57
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.

1 participant