← Blog Models & Routing 27 September 2026 9 min read

When your coding tool changes owners.

Cursor is now part of SpaceX. Coding tools get bought, merged and repriced, and the one you use every day is a company like any other. Here is how Luminair treats every vendor's agent as a dependency you can swap, not a home you live in.

Fig 01  The vendor is a dependencySchematic
VENDOR TOOLS · BUNDLED claude-agent-sdk0.3.281 · Anthropic @openai/codex0.153.4 · OpenAI @google/gemini-cli0.55.1 · Google @moonshot-ai/kimi-code0.36.0 · Moonshot AI Plus engines that talk to an API or a model on your own Mac. VERSIONS AS IN PACKAGE.JSON BUMPEDBY HAND SIGNED PIN sha512, then unpack DESKTOP/ENGINES · ONE FILE EACH claude-cli.js codex.js gemini.js kimi.js antigravity.js grok.js deepseek.js ollama.js … _TEMPLATE.js · copy me · never loaded 15 engine files, loaded automatically. A broken file is skipped, never fatal. A missing tool shows as unavailable. WHAT LUMINAIR KEEPS Session ledger append-only copy of every turn Handoff bridge 16,000 characters, newest first Accounts per engine the chip is remembered per engine The runner Stop, watchdogs, live mirror, tokens Swap the engine, keep the session. A vendor's tool is a package with a version number. Your history, accounts and routing live on your Mac.
Schematic of how vendor tools enter the app. The package names and versions are the ones in desktop/package.json today; the file names are real files in desktop/engines. Not every engine is drawn.

The short version

  1. On 14 August 2026 Cursor announced it had been acquired by SpaceX. Whatever you think of the deal, it is a reminder that your coding tool is a company, and companies change hands.
  2. Luminair wraps each vendor's agent in one engine file. Adding or dropping a vendor does not touch the rest of the app.
  3. The vendor tools ship inside the app as ordinary npm packages with version numbers. Newer builds arrive on purpose: by hand, or through a signed, hash-checked pin.
  4. Your conversation is kept by Luminair, so a session can move to another engine with its history. And the account you picked is remembered per engine, so a switch on one vendor never strands sessions on another.
02Built with Luminair

The engines folder almost vanished.

Luminair is built inside Luminair, and the idea in this post came from a scare. On 16 August 2026 a commit titled “Track the engine registry in git” admitted that the whole engines folder had never been added to the repository. All seven engine files of the time, the shared runner, the loader and the template “lived only on this Mac”. A clean checkout built an app with no engines at all.

That commit put 3,037 lines under version control. It also made the design visible: each vendor was already a separate file, shaped by one template, with nothing else in the app hard-wired to a particular company. Since then the folder has grown to fifteen engine files, and every one of them followed the same path in.

03A tool is a company

Coding tools get bought.

On 14 August 2026 Cursor's blog put it in one line: “Cursor has officially been acquired by SpaceX.” The post says the process started in April with a partnership with SpaceXAI, and that the company will now have “access to the largest fleet of GPUs in the world”. It also points to Grok 4.6 as “an early look at what we can now build together.”

TechCrunch filled in the rest the next day. The April deal gave SpaceX the option to acquire Cursor for $60 billion, and SpaceX had already acquired xAI earlier in the year.

Nothing in the announcement says anything will get worse for Cursor's users. It promises “more capable models at lower cost”. That is not the point. The point is that the tool many developers open first thing in the morning now has a new parent with its own models, its own compute and its own plans. Pricing, default models and priorities are decided by whoever owns the tool.

The market is also moving fast underneath. JetBrains surveyed more than 15,000 professional developers for its August 2026 report on coding agents. Between January and May to July 2026, Claude Code use at work went from 18% to around 39%, Codex from 3% to 16%, and Cursor from 18% to 12%. In the same survey, 90% of professional developers used AI coding agents at work at least weekly.

If the ranking can flip in six months, the tool you use is a choice you will make again.

The sensible response is not to pick the winner. It is to keep the switching cost low. In software, that has a familiar name: treat the thing as a dependency.

04One file per engine

Adding a vendor is one file.

Luminair calls each vendor's agent an engine. Claude, Codex, Gemini, Kimi, Antigravity, Grok, DeepSeek, local models through Ollama and LM Studio: each is one file in desktop/engines. The loader reads every file in the folder, with a few exceptions it spells out:

desktop/engines/index.jsloadAll()
if (f === 'index.js' || f === 'runner-cli.js' || f.endsWith('-run.js')
    || f.startsWith('_') || f.startsWith('.')) continue;
try {
  const mod = require(path.join(__dirname, f));
  ...
} catch (e) {
  // A broken engine file must never take the app down with it.
}

The template, _TEMPLATE.js, starts with the whole job in three steps: copy the file, fill in the parts marked TODO, restart. Its header lists what then comes for free: “The model picker, the account menu, the ‘add account’ list, badges, colours, per session engine memory, the run, Stop, queues, live mirrors and token meters all pick it up.”

Every field is optional except id. An engine whose tool is not installed reports itself unavailable instead of crashing a send. And a vendor that streams JSON lines from a command-line tool only has to translate one line at a time into Luminair's small vocabulary: session, text, thinking, tool, usage, done, error. The shared runner handles the rest.

This is what makes a change of owner survivable. If a vendor's terms, prices or tool change, the blast radius is one file. If a new vendor appears, it is one new file. The template's comments even ask for one hue per engine so you can tell at a glance which company is running a turn.

05The CLI is a dependency

New versions arrive on purpose.

Most engines drive the vendor's own command-line tool. Those tools are not downloaded behind your back at run time. They are regular npm dependencies of the desktop app, with version numbers in package.json, unpacked next to the app so they can be launched.

The repository has Dependabot switched on for the desktop folder, checking weekly. In September it proposed new versions of all four vendor tools, including Kimi Code jumping a major version from 0.36.0 to 2.1.1. Here is the part that surprised us when we counted: of the 35 pull requests Dependabot has opened on the repository, none was merged. They work as a notice. The bumps that shipped were made by hand, in the app's own commits.

Fig 02  September 2026, vendor toolsReal data · git and GitHub
Shipped BY HAND 6 SEP Codex 0.147 → 0.153.4 7 SEP Signed-pin updater lands 23 SEP Agent SDK 0.3.220 → 0.3.281 Proposed DEPENDABOT 6 SEP Codex 0.153.0Gemini CLI 0.58.0Kimi Code 0.40.1Agent SDK 0.3.259 13 SEP Codex 0.154.0Gemini CLI 0.59.0Kimi Code 0.42.0Agent SDK 0.3.267 27 SEP Codex 0.156.1Gemini CLI 0.61.0Kimi Code 2.1.1Agent SDK 0.3.282 ALL CLOSED, NONE MERGED
changed in the appproposed and closed
Dates from the desktop/package.json history and the repository's Dependabot pull requests, showing the version each pull request first proposed (Dependabot later rewrites open ones to newer versions). Dots are placed by day of the month.

Why not just merge them? Because a vendor tool is not a library you call; it is the agent itself. A new version can change how it prints events, what models it accepts, or how it logs in. Luminair has 55 conformance tests that replay recorded vendor output through the real parsers and runner, but a recording only proves something about the version that produced it. A new version is a new thing to check.

There is a catch, and it bit us. On 4 September a new OpenAI model, GPT-6 Astra, came out, and the bundled Codex 0.147 could not run it until an app release carried 0.153. The comment at the top of lib/cli-updater.js records exactly that. The fix, from 7 September, is a second path that is still deliberate:

1

A signed catalog names the build

Luminair's live model catalog can pin a newer tool for Codex, the Claude command-line tool or Gemini. The catalog is signed with an Ed25519 key; a body that does not verify is never applied.

2

Only from the npm registry, only with a hash

The pin must point at a registry.npmjs.org tarball with a sha512 integrity value, and it must be newer than the version bundled in the app.

3

Checked before it is unpacked

The tarball is hashed before anything is extracted. A bad download is deleted and the bundled tool keeps running. Pins roll out in stages and can be withdrawn for everyone in one edit.

06Your history stays

The conversation is yours.

Switching tools usually costs you the thread. Each vendor keeps its own session files in its own format, and they do not read each other's.

Luminair keeps a copy of its own. Since August 2026, every line it sees in a session transcript is copied once into an append-only session ledger on your Mac, which neither the vendor's compaction nor Luminair's archive clean-up is allowed to trim. It was built to fix lost recall on long sessions, and it has a second effect: the record of a conversation does not depend on which company ran it.

When you move a session to another engine, Luminair builds a handoff from that record: up to 16,000 characters, filled newest turn first, each turn cut at 4,000. For Claude it can go one step further and write a native session file from the ledger, so the Claude SDK can resume a session that was born on another engine.

What this does not doThe handoff is text. The new engine sees a trimmed version of a long thread, not the old vendor's hidden state. For picking up the last few turns it works well; for a hundred turns of subtle context, expect the new model to know less.
07One account per engine

A switch on one vendor must not move another.

Using several vendors means holding several logins. Luminair shows the one in use as an account chip. For a while that chip was a single global setting, and in the first week of September that caused a quiet, expensive bug.

When Codex failed over from one of its accounts to another, or you simply picked a Codex account, the chip moved to Codex. From that moment no Claude account was “active”, so every open Claude session fell back to the account it was born on. The code comment describes the result: three panes kept hammering a maxed-out Primary account while the user had already switched.

Fig 03  Where Claude sessions ran after a Codex switchSchematic
BEFORE · ONE GLOBAL CHIP chip: Codex Claude pane Claude pane Claude pane Primary AT LIMIT each fell back to the account it was born on AFTER · REMEMBERED PER ENGINE codex → Codex 1 claude → Claude 2 Claude pane Claude pane Claude pane Claude 2 YOUR PICK every session of an engine follows its last pick
Account names are illustrative. The rule is from activeAccountForEngine in desktop/main.js: use the chip when it points at this engine, otherwise the last account the chip named for this engine, if it still exists.

The fix keeps a small map, activeByEngine, updated every time the settings are saved. Each engine remembers the last account you chose for it. Choosing a Codex account now says nothing about Claude, and the reverse.

A regression test pins this down with a Codex chip selected and a second Claude account remembered: an old Claude session routes to that second Claude account. The same test file asserts the opposite guard too. If you have no account for a vendor, Luminair will not quietly run your Claude turn on someone else's model. Its message in the test reads “never substitute another brand”.

08Checked, and limits

What we checked, and what we can't fix.

55/55
Engine conformance tests pass, replaying recorded vendor output through the real parsers and runner
7/7
Model catalog tests pass, including signature checks and the sha512 check before unpacking
5/5
Routing tests pass, including the per-engine account and “never substitute another brand”
0/35
Dependabot pull requests merged as they were opened

Worth knowing

  • An engine file cannot help if a vendor stops offering its tool, or changes who is allowed to use it. It only keeps the cost of that change inside one file.
  • Signed pins cover three tools today: Codex, the Claude command-line tool and Gemini. Kimi Code moves only with an app release.
  • The handoff between engines is text, trimmed to a budget. It is a catch-up note, not a transplant.
  • We have not measured how long it takes to move a real project from one vendor to another. We only claim the switch is available.

For how Luminair picks a model per turn once several engines are connected, read One window for every model.

Sources

Keep your options open

Connect more than one engine, and move a session between them when you need to.

Download Luminair →