@@ -268,6 +268,52 @@ def search(
268268 }
269269 return self ._make_request ("GET" , "/api/search" , params = params )
270270
271+ def semantic_search (
272+ self ,
273+ query : str ,
274+ data_sources : List [str ],
275+ paths : Optional [List [str ]] = None ,
276+ extensions : Optional [List [str ]] = None ,
277+ max_results : Optional [int ] = None ,
278+ ) -> Dict [str , Any ]:
279+ """Search indexed artifacts semantically using the canonical API."""
280+ params : Dict [str , Any ] = {
281+ "Query" : query ,
282+ "Names" : data_sources ,
283+ }
284+ if paths :
285+ params ["Paths" ] = paths
286+ if extensions :
287+ params ["Extensions" ] = extensions
288+ if max_results is not None :
289+ params ["MaxResults" ] = max_results
290+
291+ return self ._make_request ("GET" , "/api/search/semantic" , params = params )
292+
293+ def grep_search (
294+ self ,
295+ query : str ,
296+ data_sources : List [str ],
297+ paths : Optional [List [str ]] = None ,
298+ extensions : Optional [List [str ]] = None ,
299+ max_results : Optional [int ] = None ,
300+ regex : bool = False ,
301+ ) -> Dict [str , Any ]:
302+ """Search indexed artifacts by exact text or regex using the canonical API."""
303+ params : Dict [str , Any ] = {
304+ "Query" : query ,
305+ "Names" : data_sources ,
306+ "Regex" : str (regex ).lower (),
307+ }
308+ if paths :
309+ params ["Paths" ] = paths
310+ if extensions :
311+ params ["Extensions" ] = extensions
312+ if max_results is not None :
313+ params ["MaxResults" ] = max_results
314+
315+ return self ._make_request ("GET" , "/api/search/grep" , params = params )
316+
271317 def fetch_artifacts (
272318 self ,
273319 identifiers : List [str ],
@@ -393,6 +439,8 @@ def main():
393439 print ("Commands:" )
394440 print (" datasources [--all]" )
395441 print (" search <query> <data_source1> [data_source2...] [--mode auto|fast|deep] [--description-detail short|full]" )
442+ print (" semantic-search <query> <data_source1> [data_source2...] [--path PATH] [--ext EXT] [--max-results N]" )
443+ print (" grep-search <query> <data_source1> [data_source2...] [--regex] [--path PATH] [--ext EXT] [--max-results N]" )
396444 print (" fetch <identifier1> [identifier2...]" )
397445 print (" relationships <identifier> [--profile callsOnly|inheritanceOnly|allRelevant|referencesOnly] [--max-count N]" )
398446 print (" chat <question> <data_source1> [data_source2...] [--conversation-id ID]" )
@@ -433,6 +481,83 @@ def main():
433481 result = client .search (query , data_sources , mode , description_detail )
434482 print (json .dumps (result , indent = 2 ))
435483
484+ elif command == "semantic-search" :
485+ if len (sys .argv ) < 4 :
486+ print ("Usage: semantic-search <query> <data_source1> [data_source2...] [--path PATH] [--ext EXT] [--max-results N]" )
487+ sys .exit (1 )
488+
489+ query = sys .argv [2 ]
490+ data_sources = []
491+ paths = []
492+ extensions = []
493+ max_results = None
494+
495+ i = 3
496+ while i < len (sys .argv ):
497+ arg = sys .argv [i ]
498+ if arg == "--path" and i + 1 < len (sys .argv ):
499+ paths .append (sys .argv [i + 1 ])
500+ i += 2
501+ elif arg == "--ext" and i + 1 < len (sys .argv ):
502+ extensions .append (sys .argv [i + 1 ])
503+ i += 2
504+ elif arg == "--max-results" and i + 1 < len (sys .argv ):
505+ max_results = int (sys .argv [i + 1 ])
506+ i += 2
507+ else :
508+ data_sources .append (arg )
509+ i += 1
510+
511+ result = client .semantic_search (
512+ query ,
513+ data_sources ,
514+ paths = paths or None ,
515+ extensions = extensions or None ,
516+ max_results = max_results ,
517+ )
518+ print (json .dumps (result , indent = 2 ))
519+
520+ elif command == "grep-search" :
521+ if len (sys .argv ) < 4 :
522+ print ("Usage: grep-search <query> <data_source1> [data_source2...] [--regex] [--path PATH] [--ext EXT] [--max-results N]" )
523+ sys .exit (1 )
524+
525+ query = sys .argv [2 ]
526+ data_sources = []
527+ paths = []
528+ extensions = []
529+ max_results = None
530+ regex = False
531+
532+ i = 3
533+ while i < len (sys .argv ):
534+ arg = sys .argv [i ]
535+ if arg == "--regex" :
536+ regex = True
537+ i += 1
538+ elif arg == "--path" and i + 1 < len (sys .argv ):
539+ paths .append (sys .argv [i + 1 ])
540+ i += 2
541+ elif arg == "--ext" and i + 1 < len (sys .argv ):
542+ extensions .append (sys .argv [i + 1 ])
543+ i += 2
544+ elif arg == "--max-results" and i + 1 < len (sys .argv ):
545+ max_results = int (sys .argv [i + 1 ])
546+ i += 2
547+ else :
548+ data_sources .append (arg )
549+ i += 1
550+
551+ result = client .grep_search (
552+ query ,
553+ data_sources ,
554+ paths = paths or None ,
555+ extensions = extensions or None ,
556+ max_results = max_results ,
557+ regex = regex ,
558+ )
559+ print (json .dumps (result , indent = 2 ))
560+
436561 elif command == "fetch" :
437562 if len (sys .argv ) < 3 :
438563 print ("Usage: fetch <identifier1> [identifier2...]" )
0 commit comments