Letting an LLM operate VS Code without letting it run whatever it wants The maintainer of Slashi, a VS Code extension, built a constrained agent that lets an LLM execute editor actions without giving it a shell. The model selects only from a pre-ranked shortlist of catalog items and settings, and every step is validated against known IDs and keys before execution, with the plan shown to the user first. In a test run, Claude Opus 5.5 correctly returned two setting steps (editor.fontSize to 16 and editor.wordWrap to on) from an 87-entry shortlist. The popup is the real Slashi webview. The progress notification and the confirmation dialog are VS Code's own UI, recreated from a real run whose output appears below. In Slashi https://github.com/meness/slashi , the VS Code extension I maintain, you can type /do make the font bigger and turn on word wrap and it happens. That's a small agent: a model reads a request and changes your editor. The usual way to build this is to give the model tools, often including a shell, and let it decide. I didn't want a model with a shell sitting one keystroke away in every editor. So /do works differently: the model can only choose from a list of actions Slashi already knows, every choice is checked against that list, and you see the plan before it runs. Code is from Slashi 0.6.0, October 2026. Slashi already has a catalog of a few hundred things it can do: VS Code commands with slash names, settings, project scripts, Git actions, file actions. Sending all of it to the model on every request would be slow and noisy, so the request is first run through the same fuzzy ranker the popup uses, in a mode where any word may match instead of all of them: js const query = parseQuery task, ; const ranked = rank indexItems all , query, { limit: 60, mode: 'any' } ; Settings that make the shortlist are added again by their exact key, with their type or allowed values, so the model can set a precise value. For "make the font bigger and turn on word wrap", the shortlist in my test run against the catalog Slashi's smoke test captures had 87 entries, including editor.fontSize number and editor.wordWrap one of off | on | wordWrapColumn | bounded . The system prompt describes exactly three kinds of step, and a few rules: {"reply": "one short sentence describing what you will do", "steps": {"type": "item", "id": "