1+ /// Bridge → agent via Core NATS request/reply. Expects a response.
2+ #[ derive( Debug ) ]
3+ #[ repr( transparent) ]
4+ pub struct RequestSubject ( pub ( crate ) String ) ;
5+
6+ /// Bridge → agent via Core NATS publish. Fire-and-forget, no response.
7+ #[ derive( Debug ) ]
8+ #[ repr( transparent) ]
9+ pub struct PublishSubject ( pub ( crate ) String ) ;
10+
11+ /// Bridge → agent via JetStream. Captured by a stream, consumed by agent.
12+ #[ derive( Debug ) ]
13+ #[ repr( transparent) ]
14+ pub struct JetStreamSubject ( pub ( crate ) String ) ;
15+
16+ impl std:: fmt:: Display for RequestSubject {
17+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
18+ self . 0 . fmt ( f)
19+ }
20+ }
21+
22+ impl std:: fmt:: Display for PublishSubject {
23+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
24+ self . 0 . fmt ( f)
25+ }
26+ }
27+
28+ impl std:: fmt:: Display for JetStreamSubject {
29+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
30+ self . 0 . fmt ( f)
31+ }
32+ }
33+
34+ impl PartialEq < & str > for RequestSubject {
35+ fn eq ( & self , other : & & str ) -> bool {
36+ self . 0 == * other
37+ }
38+ }
39+
40+ impl PartialEq < & str > for PublishSubject {
41+ fn eq ( & self , other : & & str ) -> bool {
42+ self . 0 == * other
43+ }
44+ }
45+
46+ impl PartialEq < & str > for JetStreamSubject {
47+ fn eq ( & self , other : & & str ) -> bool {
48+ self . 0 == * other
49+ }
50+ }
51+
52+ #[ cfg( test) ]
53+ impl RequestSubject {
54+ pub fn starts_with ( & self , prefix : & str ) -> bool {
55+ self . 0 . starts_with ( prefix)
56+ }
57+ }
58+
59+ #[ cfg( test) ]
60+ impl PublishSubject {
61+ pub fn starts_with ( & self , prefix : & str ) -> bool {
62+ self . 0 . starts_with ( prefix)
63+ }
64+ }
65+
66+ #[ cfg( test) ]
67+ impl JetStreamSubject {
68+ pub fn starts_with ( & self , prefix : & str ) -> bool {
69+ self . 0 . starts_with ( prefix)
70+ }
71+ }
72+
173pub mod agent {
2- pub fn initialize ( prefix : & str ) -> String {
3- format ! ( "{}.agent.initialize" , prefix)
74+ use super :: { PublishSubject , RequestSubject } ;
75+
76+ /// Core NATS request/reply. Stream: GLOBAL (observability).
77+ pub fn initialize ( prefix : & str ) -> RequestSubject {
78+ RequestSubject ( format ! ( "{}.agent.initialize" , prefix) )
479 }
580
6- pub fn authenticate ( prefix : & str ) -> String {
7- format ! ( "{}.agent.authenticate" , prefix)
81+ /// Core NATS request/reply. Stream: GLOBAL (observability).
82+ pub fn authenticate ( prefix : & str ) -> RequestSubject {
83+ RequestSubject ( format ! ( "{}.agent.authenticate" , prefix) )
884 }
985
10- pub fn session_new ( prefix : & str ) -> String {
11- format ! ( "{}.agent.session.new" , prefix)
86+ /// Core NATS request/reply. Stream: GLOBAL (observability).
87+ pub fn session_new ( prefix : & str ) -> RequestSubject {
88+ RequestSubject ( format ! ( "{}.agent.session.new" , prefix) )
1289 }
1390
14- pub fn session_list ( prefix : & str ) -> String {
15- format ! ( "{}.agent.session.list" , prefix)
91+ /// Core NATS request/reply. No stream.
92+ pub fn session_list ( prefix : & str ) -> RequestSubject {
93+ RequestSubject ( format ! ( "{}.agent.session.list" , prefix) )
1694 }
1795
18- pub fn ext ( prefix : & str , method : & str ) -> String {
19- format ! ( "{}.agent.ext.{}" , prefix, method)
96+ /// Core NATS request/reply. Stream: GLOBAL_EXT (observability).
97+ pub fn ext ( prefix : & str , method : & str ) -> RequestSubject {
98+ RequestSubject ( format ! ( "{}.agent.ext.{}" , prefix, method) )
99+ }
100+
101+ /// Core NATS publish (fire-and-forget notification). Stream: GLOBAL_EXT (observability).
102+ pub fn ext_notify ( prefix : & str , method : & str ) -> PublishSubject {
103+ PublishSubject ( format ! ( "{}.agent.ext.{}" , prefix, method) )
20104 }
21105
22106 pub mod wildcards {
@@ -28,65 +112,84 @@ pub mod agent {
28112
29113pub mod session {
30114 pub mod agent {
31- pub fn load ( prefix : & str , session_id : & str ) -> String {
32- format ! ( "{}.session.{}.agent.load" , prefix, session_id)
115+ use super :: super :: { JetStreamSubject , PublishSubject } ;
116+
117+ /// Bridge: JetStream publish. Stream: COMMANDS.
118+ pub fn load ( prefix : & str , session_id : & str ) -> JetStreamSubject {
119+ JetStreamSubject ( format ! ( "{}.session.{}.agent.load" , prefix, session_id) )
33120 }
34121
35- pub fn prompt ( prefix : & str , session_id : & str ) -> String {
36- format ! ( "{}.session.{}.agent.prompt" , prefix, session_id)
122+ /// Bridge: JetStream publish. Stream: COMMANDS.
123+ pub fn prompt ( prefix : & str , session_id : & str ) -> JetStreamSubject {
124+ JetStreamSubject ( format ! ( "{}.session.{}.agent.prompt" , prefix, session_id) )
37125 }
38126
39127 pub fn prompt_wildcard ( prefix : & str ) -> String {
40128 format ! ( "{}.session.*.agent.prompt" , prefix)
41129 }
42130
43- pub fn cancel ( prefix : & str , session_id : & str ) -> String {
44- format ! ( "{}.session.{}.agent.cancel" , prefix, session_id)
131+ /// Bridge: Core NATS publish (fire-and-forget). Stream: COMMANDS.
132+ pub fn cancel ( prefix : & str , session_id : & str ) -> PublishSubject {
133+ PublishSubject ( format ! ( "{}.session.{}.agent.cancel" , prefix, session_id) )
45134 }
46135
47- pub fn cancelled ( prefix : & str , session_id : & str ) -> String {
48- format ! ( "{}.session.{}.agent.cancelled" , prefix, session_id)
136+ /// Agent → bridge broadcast. Stream: RESPONSES.
137+ pub fn cancelled ( prefix : & str , session_id : & str ) -> PublishSubject {
138+ PublishSubject ( format ! ( "{}.session.{}.agent.cancelled" , prefix, session_id) )
49139 }
50140
51- pub fn set_mode ( prefix : & str , session_id : & str ) -> String {
52- format ! ( "{}.session.{}.agent.set_mode" , prefix, session_id)
141+ /// Bridge: JetStream publish. Stream: COMMANDS.
142+ pub fn set_mode ( prefix : & str , session_id : & str ) -> JetStreamSubject {
143+ JetStreamSubject ( format ! ( "{}.session.{}.agent.set_mode" , prefix, session_id) )
53144 }
54145
55- pub fn set_config_option ( prefix : & str , session_id : & str ) -> String {
56- format ! ( "{}.session.{}.agent.set_config_option" , prefix, session_id)
146+ /// Bridge: JetStream publish. Stream: COMMANDS.
147+ pub fn set_config_option ( prefix : & str , session_id : & str ) -> JetStreamSubject {
148+ JetStreamSubject ( format ! (
149+ "{}.session.{}.agent.set_config_option" ,
150+ prefix, session_id
151+ ) )
57152 }
58153
59- pub fn set_model ( prefix : & str , session_id : & str ) -> String {
60- format ! ( "{}.session.{}.agent.set_model" , prefix, session_id)
154+ /// Bridge: JetStream publish. Stream: COMMANDS.
155+ pub fn set_model ( prefix : & str , session_id : & str ) -> JetStreamSubject {
156+ JetStreamSubject ( format ! ( "{}.session.{}.agent.set_model" , prefix, session_id) )
61157 }
62158
63- pub fn fork ( prefix : & str , session_id : & str ) -> String {
64- format ! ( "{}.session.{}.agent.fork" , prefix, session_id)
159+ /// Bridge: JetStream publish. Stream: COMMANDS.
160+ pub fn fork ( prefix : & str , session_id : & str ) -> JetStreamSubject {
161+ JetStreamSubject ( format ! ( "{}.session.{}.agent.fork" , prefix, session_id) )
65162 }
66163
67- pub fn resume ( prefix : & str , session_id : & str ) -> String {
68- format ! ( "{}.session.{}.agent.resume" , prefix, session_id)
164+ /// Bridge: JetStream publish. Stream: COMMANDS.
165+ pub fn resume ( prefix : & str , session_id : & str ) -> JetStreamSubject {
166+ JetStreamSubject ( format ! ( "{}.session.{}.agent.resume" , prefix, session_id) )
69167 }
70168
71- pub fn close ( prefix : & str , session_id : & str ) -> String {
72- format ! ( "{}.session.{}.agent.close" , prefix, session_id)
169+ /// Bridge: JetStream publish. Stream: COMMANDS.
170+ pub fn close ( prefix : & str , session_id : & str ) -> JetStreamSubject {
171+ JetStreamSubject ( format ! ( "{}.session.{}.agent.close" , prefix, session_id) )
73172 }
74173
75- pub fn ext_ready ( prefix : & str , session_id : & str ) -> String {
76- format ! ( "{}.session.{}.agent.ext.ready" , prefix, session_id)
174+ /// Agent → bridge signal. Stream: RESPONSES.
175+ pub fn ext_ready ( prefix : & str , session_id : & str ) -> PublishSubject {
176+ PublishSubject ( format ! ( "{}.session.{}.agent.ext.ready" , prefix, session_id) )
77177 }
78178
179+ /// Agent → bridge async notification. Stream: NOTIFICATIONS.
79180 pub fn update ( prefix : & str , session_id : & str , req_id : & str ) -> String {
80181 format ! ( "{}.session.{}.agent.update.{}" , prefix, session_id, req_id)
81182 }
82183
184+ /// Agent → bridge streamed response. Stream: RESPONSES.
83185 pub fn prompt_response ( prefix : & str , session_id : & str , req_id : & str ) -> String {
84186 format ! (
85187 "{}.session.{}.agent.prompt.response.{}" ,
86188 prefix, session_id, req_id
87189 )
88190 }
89191
192+ /// Agent → bridge one-shot response. Stream: RESPONSES.
90193 pub fn response ( prefix : & str , session_id : & str , req_id : & str ) -> String {
91194 format ! (
92195 "{}.session.{}.agent.response.{}" ,
0 commit comments