Connectors and confinement
A connector declares an address, and the kernel is what performs the call. No connector performs its own network call, not even the Ollama one. The transport refuses any non-local address, at registration and on every call. This page documents the connector registry, the locality rule, and the cases that were tested.
Why the connector does not do its own fetch
A connector is a contribution: a plugin may declare one. If it performed its own fetch, it would call whatever it liked, and the absence of network egress would be nothing more than a promise kept by third-party code.
By separating declaration from transport, the connector never holds the network. The check is therefore carried by the kernel, which ships with the application and can be reviewed in one place, rather than by plugin code installed later.
Declaring a connector
| Field | Description |
|---|---|
| id | Namespaced identifier. |
| base | Base address. Validated at registration: a non-local address is refused immediately. |
| capacites | What the connector can do: chat, outils, flux, embeddings. |
The locality rule
K.connectors.isLocal(url) normalises the URL with new URL(), then compares the whole hostname, never its prefix.
| Address | Verdict | Reason |
|---|---|---|
| http://127.0.0.1:11434/api/chat | Accepted | Loopback. |
| http://localhost:11434/api/chat | Accepted | Loopback. |
| http://[::1]:11434/api/chat | Accepted | IPv6 loopback. |
| http://2130706433/api | Accepted | Decimal IP. new URL() normalises it to 127.0.0.1. |
| http://0x7f.1/api | Accepted | Hexadecimal IP, normalised the same way. |
| http://127.1/api | Accepted | Abbreviated IP, normalised the same way. |
| http://127.0.0.1.evil.com/x | Refused | A domain name. Normalisation leaves it intact; a prefix comparison would have accepted it. |
| https://api.openai.com/v1/chat | Refused | Remote host. |
| http://192.168.1.50/api | Refused | Local network, but not this machine. |
| file:///etc/passwd | Refused | Scheme not allowed. |
| //evil.com/x | Refused | Implicit protocol. |
The transport
K.connectors.fetch(url, opts) is the only egress point. It applies, in this order:
| # | Check | On failure |
|---|---|---|
| 1 | Address locality. | Rejected, with a line in the journal. |
| 2 | Redirects are not followed. | Rejected. A redirect to a remote host would bypass check 1. |
| 3 | Outgoing headers are filtered. | Internal headers, campaign included, are never forwarded. |
Air-gap mode
Transport confinement is independent of air-gap mode: it applies in every case. In air-gap mode the software attempts no outbound connection at all, including to the community database or the science watch, and the assistant keeps working, since its connector is local.
Troubleshooting
| Symptom | Likely cause |
|---|---|
| The Assistant panel reports that no model is available. | Ollama is not listening on 127.0.0.1:11434. Check ollama serve. |
| A plugin connector does not appear. | Non-local address, refused at registration. The reason is in the journal. |
| Ollama runs on another machine on the network. | Unsupported configuration: the transport refuses any address outside the loopback, 192.168.x.x included. |
| Answers arrive all at once, without streaming. | Expected behaviour whenever tools are offered to the model. |