zed: delete context_servers key to fix serde parse error; update tests

This commit is contained in:
2026-05-23 21:12:47 +01:00
parent bde3128dba
commit 00ba950cd9
3 changed files with 19 additions and 16 deletions
+11 -3
View File
@@ -52,7 +52,7 @@ func (a *Adapter) Capabilities() adapter.HarnessCapabilities {
return adapter.HarnessCapabilities{
ManagesProviders: true,
ManagesModels: true,
ManagesMCP: true,
ManagesMCP: false, // Agent panel uses Extensions; context_servers key causes serde parse errors
ManagesSkills: false,
ManagesInstructions: false,
HasBuiltInSub: false,
@@ -67,14 +67,22 @@ func (a *Adapter) Detect() bool {
// Render produces the FileSet that applies the canonical bundle to Zed.
// settings.json is MERGED to preserve all user-managed Zed configuration.
// Manages: context_servers (MCP), language_models.openai, agent.default_model.
// Manages: language_models.openai_compatible, agent.default_model.
//
// NOTE: context_servers is NOT written. Zed 1.3+ uses Extension-based MCP
// servers in the Agent panel; writing context_servers causes a serde parse
// error (ContextServerSettingsContent untagged enum bug) that aborts loading
// the entire settings.json. We clear any existing context_servers key to fix
// pre-existing parse errors from user-configured entries.
func (a *Adapter) Render(b *canonical.Bundle) (*adapter.FileSet, error) {
fs := adapter.NewFileSet()
cfgPath := filepath.Join(a.home, ".config", "zed", "settings.json")
existing, _ := os.ReadFile(cfgPath)
// Set context_servers to nil so MergeJSONKeys removes the key entirely,
// clearing any entries that trigger the serde ContextServerSettingsContent bug.
overlay := map[string]any{
"context_servers": common.BuildMCPMapStyled(&b.MCP, common.MCPZedStyle),
"context_servers": nil,
}
if b.Profile.Gateway.URL != "" {
+7 -13
View File
@@ -58,13 +58,9 @@ func TestZedRenderProducesExpectedTargets(t *testing.T) {
gw := oc["harness-sync-gateway"].(map[string]any)
assert.Equal(t, "https://llmgw.example.com/v1", gw["api_url"])
// context_servers — no "enabled" or "source" (Zed serde bug workaround).
cs := parsed["context_servers"].(map[string]any)
fp := cs["filepuff"].(map[string]any)
assert.Equal(t, "/bin/filepuff", fp["command"])
assert.Equal(t, []any{"--serve"}, fp["args"])
assert.NotContains(t, fp, "enabled")
assert.NotContains(t, fp, "source")
// context_servers must be absent — Zed serde untagged-enum bug aborts
// settings loading when this key is present; we delete it via nil overlay.
assert.NotContains(t, parsed, "context_servers")
}
func TestZedRenderMergesExistingKeys(t *testing.T) {
@@ -96,9 +92,9 @@ func TestZedRenderMergesExistingKeys(t *testing.T) {
assert.Equal(t, "One Dark", parsed["theme"])
assert.Equal(t, float64(16), parsed["font_size"])
assert.Equal(t, true, parsed["vim_mode"])
// Managed keys present.
// Managed keys present; context_servers absent (serde bug — we delete it).
assert.Contains(t, parsed, "agent")
assert.Contains(t, parsed, "context_servers")
assert.NotContains(t, parsed, "context_servers")
}
func TestZedRenderNoMCP(t *testing.T) {
@@ -118,10 +114,8 @@ func TestZedRenderNoMCP(t *testing.T) {
cfgDest := filepath.Join(home, ".config", "zed", "settings.json")
var parsed map[string]any
require.NoError(t, json.Unmarshal(seen[cfgDest].Content, &parsed))
// context_servers key present but empty map.
cs, ok := parsed["context_servers"]
assert.True(t, ok)
assert.Empty(t, cs)
// context_servers must be absent (nil overlay deletes the key).
assert.NotContains(t, parsed, "context_servers")
}
func TestZedRenderEmitsLanguageModelsOpenAICompatible(t *testing.T) {