Skip to content

chore(release): 0.239.0-rc.9 [skip ci] - #1653

Merged
edenreich merged 19 commits into
mainfrom
rc/testing-the-teleport-functionality-e2e
Oct 31, 2026
Merged

edenreich merged 19 commits into
mainfrom
rc/testing-the-teleport-functionality-e2e

Conversation

@edenreich

@edenreich edenreich commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Todos

  • Rename environments to workspaces
  • Make sure examples/session-teleport works
  • Integration - leverage the operator instead of using vanilla kubernetes manifests - deploy an orchestrator kind resource with sandbox - if the operator is not installed in the cluster, present an error and abort the teleportation
  • Deploy the gateway separately per workspace
  • Offer two types of machine to machine communication protocols - agui(ws) or a2a(jrpc) and present the type of the protocol near the workspace in the TUI so it's clear with what protocol it's going to communicate (for example k8s-desktop (a2a) or k8s-desktop (agui) default to ws rely

@edenreich
edenreich requested a review from a team as a code owner October 30, 2026 21:13
@github-project-automation github-project-automation Bot moved this to Todo in 2026 Oct 30, 2026
@edenreich edenreich changed the title chore(release): 0.239.0-rc.1 [skip ci] chore(release): 0.239.0-rc.5 [skip ci] Oct 30, 2026
@edenreich edenreich changed the title chore(release): 0.239.0-rc.5 [skip ci] chore(release): 0.239.0-rc.1 [skip ci] Oct 30, 2026
@edenreich edenreich changed the title chore(release): 0.239.0-rc.1 [skip ci] chore(release): 0.239.0-rc.6 [skip ci] Oct 30, 2026
@inference-gateway-releaser

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 0.239.0-rc.6 🎉

The release is available on:

Your semantic-release bot 📦🚀

@edenreich edenreich added rc Shipped in a release candidate and removed prerelease labels Oct 31, 2026
@edenreich edenreich moved this from Todo to QA in 2026 Oct 31, 2026
@inference-gateway-releaser

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 0.239.0-rc.7 🎉

The release is available on:

Your semantic-release bot 📦🚀

@edenreich edenreich changed the title chore(release): 0.239.0-rc.6 [skip ci] chore(release): 0.239.0-rc.7 [skip ci] Oct 31, 2026
@edenreich edenreich changed the title chore(release): 0.239.0-rc.7 [skip ci] chore(release): 0.239.0-rc.8 [skip ci] Oct 31, 2026
@inference-gateway-releaser

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 0.239.0-rc.8 🎉

The release is available on:

Your semantic-release bot 📦🚀

The tasks ran a prebuilt ./infer that could predate the teleport rename, so daemon teleport failed with unknown flag --to or hung against an older daemon. A build task now rebuilds it from this checkout first and the README says so.
…rt-functionality-e2e

# Conflicts:
#	examples/session-teleport/Taskfile.yml
@inference-gateway-releaser

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 0.239.0-rc.9 🎉

The release is available on:

Your semantic-release bot 📦🚀

@edenreich edenreich changed the title chore(release): 0.239.0-rc.8 [skip ci] chore(release): 0.239.0-rc.9 [skip ci] Oct 31, 2026
edenreich added a commit that referenced this pull request Oct 31, 2026
…1660)

## Summary

A `kind: kubernetes` workspace now creates one Inference Gateway
operator `Orchestrator` per session with `runtime: Sandbox`, instead of
building an agent-sandbox `Sandbox` and its pod itself. A teleport to a
cluster without the operator fails at `provisioning` before anything is
created. This covers the operator todo on #1653.

Requires operator v0.28.1 or later (inference-gateway/operator#298,
inference-gateway/operator#302).

## Changes

- `internal/agent/infrastructure/kubernetes/workspace.go`
- `requireOperator` asks discovery for
`core.inference-gateway.com/v1alpha1` `orchestrators` before anything
else. Without it, `Ensure`, `Reach` and `Probe` report `the Inference
Gateway operator is not installed in the cluster of workspace <name>`.
No Secret or Orchestrator is created.
- The Orchestrator spec sets the image, `runtime: Sandbox`, `sandbox`
(storage, retention, operating mode), and a binding authenticated by the
session's Secret with mTLS. It also sets `tools.enabled` and
`a2a.enabled`, which the operator would otherwise force off, and the
workspace env.
- The Orchestrator is created with strict field validation, so an
operator that predates `runtime: Sandbox` refuses `spec.runtime` instead
of running a Deployment.
- `awaitReady` waits for `Ready` at the current generation and returns
`status.podName`. It resumes an Orchestrator found suspended, including
one the operator parks during the wait. It fails fast on
`SandboxCRDMissing` and `InvalidSpec`.
- The Secret is owned by the Orchestrator. The pod spec, readiness
probe, volume claims and self-suspend env are gone, since the operator
owns them now.
- Pod side: the operator's pod has no Kubernetes API access. An idle pod
daemon writes `agents-done=<bool>` to `/dev/termination-log` and exits
0, and the operator parks the Orchestrator and starts its retention.
`SelfSuspend`, `teleport.Service.Suspend` and its dep are removed.
`Registry.AgentsDone` returns a single bool.
- `examples/session-teleport`
- `task cluster:create` installs operator v0.28.1 after agent-sandbox,
because the operator looks for agent-sandbox only at startup. k3s
already ships the Gateway API CRDs the operator needs.
  - The self-suspend ServiceAccount and Role are dropped.
- The desktop image is unchanged. v0.28.1 keeps its entrypoint, which
starts Xvfb and Chromium before the daemon.
- Docs: `docs/daemon.md` (prerequisites, kubeconfig RBAC, abort
behavior, retention), the protocol and commands references, the
session-teleport README and troubleshooting, and the agent and sessions
READMEs.

## Cross-repo

- inference-gateway/operator: v0.28.0 set `Command: ["infer"]` on the
daemon container, which skipped the desktop image's entrypoint. Fixed in
v0.28.1 (inference-gateway/operator#302), which this PR now requires.
- inference-gateway/docs: the teleport docs need the operator
prerequisite (docs ticket to follow).

## Out of scope

- `runtime_class` (gVisor or Kata) in `daemon.yaml`. The operator
supports it, but nobody asked for it yet.
- The per-workspace gateway and the protocol-choice todos on #1653.
- Bare `Sandbox` objects that earlier release candidates left behind
share the new Orchestrator names. Delete them by hand (see the example's
troubleshooting).

## Test plan

- [x] `go test -race` for `internal/agent/...`, `internal/sessions/...`
and `cmd/daemon/...`, plus `task test`
- [x] `task precommit:run`
- [x] k3d `infer-workspaces` without the operator: `infer daemon
workspaces` and `infer daemon teleport --to k8s-dev` report the operator
missing, the session stays on the laptop, and no new Secret is created
- [x] With operator v0.28.1: teleport to `k8s-dev` shows RUNTIME
`Sandbox` and READY `true`, and a turn runs on the pod
- [x] Idle exit set to 1m: the pod exits 0, the operator suspends the
Orchestrator, the Sandbox gets `agents-done=true` and a 24h
`shutdownTime`, and the next turn resumes it with the countdown cleared
- [x] `infer daemon teleport --to laptop` brings the session back, and
that pod reports agents done
- [x] `infer daemon stop` deletes the Orchestrator, its Secret and both
volumes
- [x] `task demo TARGET=k8s-desktop PROMPT="browse to example.com"` on
v0.28.1 with the unchanged desktop image: the pod runs the image
entrypoint with args `["daemon"]`, and `task desktop:screenshot` shows
Chromium on example.com under the operator's non-root pod without
capabilities
- [x] `task chat` walkthrough in the TUI: `say hello` on `⌂ laptop`,
`/workspaces` lists both Kubernetes workspaces reachable with their
orchestrator count, teleport to `k8s-desktop`, `browse to example.com`
runs every `Computer` call in the pod, `/teleport laptop` brings it back
and the next turn answers locally
- [x] The recording of that run lands in RustFS under the session id
(`task artifacts:list`)
edenreich added a commit that referenced this pull request Oct 31, 2026
…the provider keys (#1667)

## Summary

A Kubernetes workspace can keep the provider keys away from its agents.
In the default `standard` mode a teleport deploys one operator `Gateway`
per workspace beside its sessions and writes the keys listed under
`gateway_env` into the gateway's Secret. The agent's pod only learns the
gateway URL, so nothing the agent runs can read a key into its context.
`mode: all-in-one` runs the gateway inside the pod instead, which costs
one pod less and leaves the keys readable by the agent.

This covers the "Deploy the gateway separately per workspace" todo on
#1653.

## Changes

- Config: the workspace entry gains `mode` (`standard` or `all-in-one`,
empty is standard) and `gateway_env`. Both are rejected on any kind but
kubernetes. `config.Credentials` resolves names like the local gateway
does, the environment first and then `~/.infer/auth.yaml`.
- `internal/agent/infrastructure/kubernetes/gateway.go`
- `ensureGateway` writes the credentials Secret and creates or updates
the `Gateway`, both owned by every session's Orchestrator, so garbage
collection removes them with the last session.
- A key unset on the teleporting daemon keeps the value an earlier
teleport stored. Names no longer listed are dropped.
- A `credentials-revision` counter on the Secret only moves when a value
changes. The Gateway carries it as an env var, so a rotated key rolls
the gateway and a new session does not.
- `awaitGateway` waits for an available gateway pod before the restore,
which already imports the conversation through it. If the operator never
deploys it, the error names its `WATCH_NAMESPACE_SELECTOR`.
- The Gateway pins `spec.server.port: 8080`, the port the pod's
`INFER_GATEWAY_URL` names.
- `workspace.go`: the Orchestrator's `spec.gateway.url` points at the
workspace gateway in `standard`, at `127.0.0.1:8080` in `all-in-one`,
and stays unset without `gateway_env`. Only a teleport writes
credentials, never a relay.
- `internal/agent/teleport`: `workerEnv` seals `forward_env` and, in
`all-in-one`, the `gateway_env` keys plus `INFER_GATEWAY_RUN` and
`INFER_GATEWAY_STANDALONE_BINARY`. Those beat the operator's pod-level
`INFER_GATEWAY_RUN=false` because worker env is appended last.
- Example: a `k8s-cloud` workspace on `ollama_cloud/glm-5.3-flash` with
`gateway_env: [OLLAMA_CLOUD_API_KEY]`, and the namespace carries
`inference-gateway.com/managed=true` for the operator.
- Docs: `docs/daemon.md` (modes, credential sources, RBAC for
`gateways`, `deployments` and Secret `update`, the namespace label), the
configuration reference, the session-teleport README and the agent
README.

## Cross-repo

- inference-gateway/operator#304: a Gateway without `spec.server` shows
no port and its `status.url` omits 8080. The CLI sets the port
explicitly meanwhile.
- inference-gateway/operator#305: scale a Gateway to zero while every
Orchestrator using it is suspended. Until then the gateway keeps a pod
up through the sessions' retention.
- inference-gateway/docs#1052: document the gateway modes, `gateway_env`
and the Kubernetes prerequisites.

## Out of scope

- `all-in-one` keeps the sealed keys in the pod daemon's memory, as
`forward_env` already does. A pod resumed by a relay after idling out
has no keys until the next teleport. `standard` doesn't have this gap
since its Secret persists.
- No gateway auth or NetworkPolicy and no gateway image pin. `kind:
daemon` workspaces keep their own gateway config.

## Test plan

- [x] `go test` for `config`, `internal/agent/teleport` and
`internal/agent/infrastructure/kubernetes`
- [x] `task precommit:run`
- [x] `TestEnsureGatewayKeepsCredentialsOnTheGateway`: the Secret holds
only set keys, owners accumulate, the revision only moves on a changed
key, an unset key keeps the stored value, and the auth file is a
fallback. The Gateway and Orchestrator never carry a key's value.
- [x] `TestAwaitGateway`, `TestWorkerEnv`,
`TestOrchestratorPointsTheWorkersAtTheGateway`,
`TestCredentialsPreferTheEnvironmentOverTheAuthFile`,
`TestDaemonConfigValidate`
- [x] k3d session-teleport example with `ollama_cloud/glm-5.3-flash` and
the key from `~/.infer/auth.yaml`. The pod's turn answered through the
gateway, no process in the agent pod held `OLLAMA_CLOUD_API_KEY` and the
Secret did. A second session shared the gateway pod without a rollout.
`infer daemon stop` on both left the namespace empty.
- [ ] `all-in-one` against a cluster
@inference-gateway-releaser

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 0.239.0-rc.10 🎉

The release is available on:

Your semantic-release bot 📦🚀

@edenreich
edenreich merged commit d68b450 into main Oct 31, 2026
4 checks passed
@edenreich
edenreich deleted the rc/testing-the-teleport-functionality-e2e branch October 31, 2026 20:23
@inference-gateway-releaser

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 0.239.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@inference-gateway-releaser inference-gateway-releaser Bot added the released Shipped in a release label Oct 31, 2026
@edenreich edenreich moved this from QA to Done in 2026 Oct 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

rc Shipped in a release candidate released Shipped in a release

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant