Signature
search the cad workspace with ripgrep or semgrep
Parameters
Response
A JSON object. The search-wide fields are:
Each entry in
results names the location that matched and how to read it back:
Invocation
Operational notes
Every open document is serialized on the Parashell main thread into one Python record per object, written to a private temporary directory, searched, and then deleted. The record is the same payloadget_object returns, so anything that
tool can see is searchable — properties, placement, shape summary, sketch
geometry and constraints, and the ExpressionEngine entries that carry
parametric expressions. No object type receives special handling, so anything
the shared serializer cannot reach is not searchable either; a
Spreadsheet::Sheet exposes its cell grid through a property object rather than
plain values, so cell contents do not appear in the corpus.
Because records are emitted as Python literals, ripgrep sees them as text and
semgrep parses them as Python. Semgrep patterns therefore follow Python
structure: match a mapping entry as {..., 'Radius': $X, ...}, not
'Radius': $X. Semgrep does not return matched source text to anonymous
callers, so match is always read back from the corpus rather than from engine
output, and multi-line semgrep matches are joined into a single line.
Ripgrep queries are case-sensitive regular expressions and are passed as a
single argument, never through a shell. In both mode results are interleaved
between engines so one noisy engine cannot consume the whole limit.
Engine resolution is cached per process. Each engine gets a 60 second wall-clock
budget and indexing gets the standard RPC budget; exceeding either returns an
actionable error telling you to narrow location or simplify query. If one
engine fails while the other succeeds the call still succeeds and the failure is
reported in engine_errors.