Skip to content

provider_profile_sources does not disable builtins on sandbox create #2877

Description

@ebusto

User Story

As a farm operator, I want provider_profile_sources to be the only catalog the gateway uses — including sandbox create — so I can turn off compiled-in builtins and replace stock ids (github, nvidia, aws-bedrock, …) with our own profiles, which may be more strict.

Problem Statement

provider_profile_sources is documented as the exact ordered source set. Omitting { type = "builtin" } is supposed to make the remaining catalog authoritative.

That is only true for some RPCs. openshell provider list-profiles, import, and delete use state.provider_profile_sources from gateway.toml. CreateSandbox does not. It snapshots the catalog with ProviderProfileSources::with_default_sources(), which is always builtin + user.

Builtins are compiled into the gateway (builtin_profiles()), not DB rows. openshell provider profile delete github is rejected (managed by source 'builtin'). YAML under /etc/openshell/providers is not a source until --global import. There is no way to disable or replace a builtin id.

Impact / Why This Matters

We cannot run an operator-owned catalog. A user-only gateway.toml hides builtins in list-profiles and lets us import farm copies of those ids, then every sandbox create fails while merging builtin + user:

duplicate provider profile id 'aws-bedrock' across configured sources 'builtin' and 'user'

That fires on catalog snapshot, even if the sandbox does not attach the colliding type. We had to drop farm profiles that reused builtin ids and put { type = "builtin" } back, so we cannot ship a stricter github (or drop types we do not want on the farm).

Acceptance Criteria

  • With provider_profile_sources = [{ type = "user" }], CreateSandbox (and provider attach) uses that catalog, not hardcoded builtin + user.
  • Importing id: github as a user profile succeeds, and sandbox create does not report a builtin/user duplicate.
  • openshell provider list-profiles and sandbox create show the same set of profile ids.
  • Builtins stay unavailable for --type until { type = "builtin" } is listed again.
  • Existing builtin + user deployments keep current behavior when that is still the configured source list.

Reproduction Steps

Run OpenShell 0.0.110 with:

[openshell.gateway]
provider_profile_sources = [
{ type = "user" },
]
  • Confirm openshell provider list-profiles does not list github / aws-bedrock.
  • openshell provider profile import --global --from … a profile whose id is aws-bedrock (or github). Import succeeds.
  • openshell sandbox create -- bash (no --provider required).

Environment

  • OpenShell 0.0.110
  • Rocky Linux 9 gateway (Vagrant), Docker compute
  • providers_v2_enabled=true
  • Farm catalog imported --global as user profiles
  • gateway.toml tried as user-only, then reverted to builtin + user as a workaround

Logs

provider profile id 'aws-bedrock' across configured sources 'builtin' and 'user'
profile 'github' is managed by source'builtin' and cannot be deleted

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions