Repository navigation
chore(release): 0.239.0-rc.9 [skip ci] - #1653
Merged
Merged
Conversation
Contributor
|
🎉 This PR is included in version 0.239.0-rc.6 🎉 The release is available on: Your semantic-release bot 📦🚀 |
Contributor
|
🎉 This PR is included in version 0.239.0-rc.7 🎉 The release is available on: Your semantic-release bot 📦🚀 |
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
Contributor
|
🎉 This PR is included in version 0.239.0-rc.9 🎉 The release is available on: Your semantic-release bot 📦🚀 |
10 tasks done
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
Contributor
|
🎉 This PR is included in version 0.239.0-rc.10 🎉 The release is available on: Your semantic-release bot 📦🚀 |
Contributor
|
🎉 This PR is included in version 0.239.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Todos
environmentstoworkspacesk8s-desktop (a2a)ork8s-desktop (agui)default to ws rely