@@ -389,7 +389,7 @@ def handle_searchsnippet_get(args: argparse.Namespace) -> Tuple[int, Dict[str, A
389389 account_id = resolve_account_id (session_json , args .account )
390390 ids = parse_json_arg (args .email_ids )
391391 filt = parse_json_arg (args .filter )
392- call = SearchSnippetGet (ids = ids , filter = filt , properties = args . properties )
392+ call = SearchSnippetGet (ids = ids , filter = filt )
393393 using , mrs = jmap_request (client , account_id , call , raise_errors = True )
394394 resp = mrs [0 ].response
395395 capabilities_server = session_json .get ("capabilities" , {}).keys ()
@@ -474,8 +474,13 @@ def handle_events_listen(args: argparse.Namespace) -> Tuple[int, Dict[str, Any]]
474474 try :
475475 client , session_json = build_client (args .host , args .api_token , args .timeout , not args .insecure )
476476 account_id = resolve_account_id (session_json , args .account )
477- # Recreate client with last_event_id
478- client = Client .create_with_api_token (args .host , args .api_token , last_event_id = args .since )
477+ from jmapc .client import EventSourceConfig
478+ esc = EventSourceConfig (
479+ types = args .types or "*" ,
480+ closeafter = args .closeafter ,
481+ ping = args .ping ,
482+ )
483+ client = Client .create_with_api_token (args .host , args .api_token , last_event_id = args .since , event_source_config = esc )
479484 meta_base = meta_block (
480485 args .host ,
481486 account_id ,
@@ -510,7 +515,7 @@ def handle_events_listen(args: argparse.Namespace) -> Tuple[int, Dict[str, Any]]
510515
511516def handle_help (args : argparse .Namespace ) -> Tuple [int , Dict [str , Any ]]:
512517 data = {"commands" : [{"name" : k , "summary" : v ["summary" ]} for k , v in COMMAND_SPECS ().items ()]}
513- meta = meta_block ( args . host , "n/a" , [], None )
518+ meta = { "timestamp" : utc_now_iso (), " host" : "n/a" , "accountId" : " n/a" , "capabilitiesUsed" : []}
514519 return 0 , envelope (True , "help" , vars (args ), meta , data = data )
515520
516521
@@ -520,7 +525,7 @@ def handle_describe(args: argparse.Namespace) -> Tuple[int, Dict[str, Any]]:
520525 err = {"type" : "validationError" , "message" : f"Unknown command { args .command_name } " , "details" : {}}
521526 return 2 , envelope (False , "describe" , vars (args ), meta_block (args .host , "unknown" , []), error = err )
522527 data = {"command" : args .command_name , ** specs [args .command_name ]}
523- meta = meta_block ( args . host , "n/a" , [], None )
528+ meta = { "timestamp" : utc_now_iso (), " host" : "n/a" , "accountId" : " n/a" , "capabilitiesUsed" : []}
524529 return 0 , envelope (True , "describe" , vars (args ), meta , data = data )
525530
526531
@@ -624,11 +629,11 @@ def build_parser() -> argparse.ArgumentParser:
624629 sub = parser .add_subparsers (dest = "command" , required = True )
625630
626631 h = sub .add_parser ("help" , help = "List commands" )
627- add_connection_opts ( h )
632+ h . add_argument ( "--json" , choices = [ "compact" , "pretty" ], default = "compact" , help = "JSON output style" )
628633
629634 d = sub .add_parser ("describe" , help = "Describe a command" )
630- add_connection_opts (d )
631635 d .add_argument ("command_name" )
636+ d .add_argument ("--json" , choices = ["compact" , "pretty" ], default = "compact" , help = "JSON output style" )
632637
633638 s = sub .add_parser ("session.get" , help = "Return JMAP session object" )
634639 add_connection_opts (s )
@@ -683,6 +688,9 @@ def build_parser() -> argparse.ArgumentParser:
683688 add_connection_opts (ev )
684689 ev .add_argument ("--since" , help = "lastEventId" )
685690 ev .add_argument ("--max-events" , type = int , help = "Max events before exit" )
691+ ev .add_argument ("--types" , help = "Comma-separated event types (default *)" )
692+ ev .add_argument ("--closeafter" , default = "no" , help = "closeafter param (no|state|push)" )
693+ ev .add_argument ("--ping" , type = int , default = 0 , help = "ping interval seconds (0=default)" )
686694
687695 pl = sub .add_parser ("pipeline.run" , help = "Run raw multi-call pipeline" )
688696 add_connection_opts (pl )
@@ -696,6 +704,13 @@ def main(argv: Optional[List[str]] = None) -> int:
696704 parser = build_parser ()
697705 args = parser .parse_args (argv )
698706
707+ if args .command in {"help" , "describe" }:
708+ # No auth needed for introspection
709+ args_dict = vars (args )
710+ code , payload = command_map [args .command ](args )
711+ json_dump (payload , args .json )
712+ return code
713+
699714 if not args .api_token :
700715 err = envelope (
701716 False ,
@@ -729,7 +744,6 @@ def main(argv: Optional[List[str]] = None) -> int:
729744 code , payload = handler (args )
730745 if payload is not None :
731746 if args .json == "jsonl" and args .command != "events.listen" :
732- # jsonl only makes sense for streaming; treat as validation error
733747 err = envelope (
734748 False ,
735749 args .command ,
@@ -739,7 +753,7 @@ def main(argv: Optional[List[str]] = None) -> int:
739753 )
740754 json_dump (err , "compact" )
741755 return 2
742- json_dump (payload , args .json if args . command == "events.listen" else ( "compact" if args . json == "jsonl" else args . json ) )
756+ json_dump (payload , args .json )
743757 return code
744758
745759
0 commit comments