A compromised npm package gets disclosed. The only question that matters in the first ten minutes is are we running it? — and answering it used to mean someone opening the cloud security console, writing a query, then doing the same thing again in the code-scanning tool, then reconciling two different answers by hand.
This answers it from where the team already works. Ask for a package, get back every workload and repository it appears in.
Reverse lookup across two sources
The supply-chain path is the main event. A package and version spec fans out to Wiz for the SBOM view — what's actually deployed and running — and to Semgrep for the code view of what's declared in a dependency file. Both run concurrently, because doing them in sequence is just a latency bug.
The version matching is where the real work went. An advisory rarely names one exact version: it says below 2.6.6, or gives a range, or a comma-list, or nothing at all. Each of those has to become a query the upstream API actually understands, with inclusive bounds handled correctly — an off-by-one on a range boundary is a package you tell the team you aren't running when you are. Bulk lists arrive as CSV uploads, since a real incident names hundreds of packages, not one.
Partial failure degrades, it doesn't hide. One source timing out never suppresses the other's results, and "the service was unavailable" is reported as a different thing from "the package wasn't found" — those mean opposite things to whoever's reading the reply.
Three more flows, same shape
The same reverse-lookup idea generalised, so the bot grew:
- Chrome extensions — an extension ID resolves to which managed devices and user profiles have it installed, via the Chrome Management Reports API. When a popular extension gets hijacked, this is the exposure question, and nothing else in the stack answers it.
- Takedowns — given an offending URL, it resolves who actually hosts the content and drafts one notice per host, choosing the DMCA form for US-registered providers.
- Indicator enrichment — a batch of IPs, hashes, or domains enriched against threat intelligence, one risk line each.
Adding a flow is one new file plus a line in the classifier prompt. Free-form requests get classified by a model, but it never acts on that guess directly — it proposes, the analyst confirms with a button, then the flow runs. Cheap way to keep a misclassification from turning into a wrong answer nobody checked.