Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 31 additions & 8 deletions sdk/go/agent/control_plane_memory_backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,11 @@ func (b *ControlPlaneMemoryBackend) Set(scope MemoryScope, scopeID, key string,
"data": value,
"scope": b.apiScope(scope),
}
req, err := http.NewRequest(http.MethodPost, endpoint, mustJSONReader(body))
reader, err := jsonReader(body)
if err != nil {
return err
}
req, err := http.NewRequest(http.MethodPost, endpoint, reader)
if err != nil {
return err
}
Expand Down Expand Up @@ -85,7 +89,11 @@ func (b *ControlPlaneMemoryBackend) Get(scope MemoryScope, scopeID, key string)
"key": key,
"scope": b.apiScope(scope),
}
req, err := http.NewRequest(http.MethodPost, endpoint, mustJSONReader(body))
reader, err := jsonReader(body)
if err != nil {
return nil, false, err
}
req, err := http.NewRequest(http.MethodPost, endpoint, reader)
if err != nil {
return nil, false, err
}
Expand Down Expand Up @@ -122,7 +130,11 @@ func (b *ControlPlaneMemoryBackend) Delete(scope MemoryScope, scopeID, key strin
"key": key,
"scope": b.apiScope(scope),
}
req, err := http.NewRequest(http.MethodPost, endpoint, mustJSONReader(body))
reader, err := jsonReader(body)
if err != nil {
return err
}
req, err := http.NewRequest(http.MethodPost, endpoint, reader)
if err != nil {
return err
}
Expand Down Expand Up @@ -200,7 +212,11 @@ func (b *ControlPlaneMemoryBackend) SetVector(scope MemoryScope, scopeID, key st
"metadata": metadata,
"scope": b.apiScope(scope),
}
req, err := http.NewRequest(http.MethodPost, endpoint, mustJSONReader(body))
reader, err := jsonReader(body)
if err != nil {
return err
}
req, err := http.NewRequest(http.MethodPost, endpoint, reader)
if err != nil {
return err
}
Expand Down Expand Up @@ -285,7 +301,11 @@ func (b *ControlPlaneMemoryBackend) SearchVector(scope MemoryScope, scopeID stri
body["scope"] = b.apiScope(opts.Scope)
}

req, err := http.NewRequest(http.MethodPost, endpoint, mustJSONReader(body))
reader, err := jsonReader(body)
if err != nil {
return nil, err
}
req, err := http.NewRequest(http.MethodPost, endpoint, reader)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -399,7 +419,10 @@ func (b *ControlPlaneMemoryBackend) apiScope(scope MemoryScope) string {
}
}

func mustJSONReader(v any) io.Reader {
data, _ := json.Marshal(v)
return bytes.NewReader(data)
func jsonReader(v any) (io.Reader, error) {
data, err := json.Marshal(v)
if err != nil {
return nil, err
}
return bytes.NewReader(data), nil
}
14 changes: 12 additions & 2 deletions sdk/go/agent/control_plane_memory_backend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ func TestControlPlaneMemoryBackend_ErrorPathsAndHelpers(t *testing.T) {
assert.Contains(t, err.Error(), "vector memory search failed")
})

t.Run("scope helpers and mustJSONReader", func(t *testing.T) {
t.Run("scope helpers and jsonReader", func(t *testing.T) {
b := NewControlPlaneMemoryBackend("http://example.com///", "token-123", "agent-1")
assert.Equal(t, "http://example.com", b.baseURL)
assert.Equal(t, "workflow", b.apiScope(ScopeWorkflow))
Expand All @@ -210,8 +210,18 @@ func TestControlPlaneMemoryBackend_ErrorPathsAndHelpers(t *testing.T) {
assert.Equal(t, "global", b.apiScope(ScopeGlobal))
assert.Equal(t, "global", b.apiScope(MemoryScope("unexpected")))

body, err := io.ReadAll(mustJSONReader(map[string]any{"ok": true}))
reader, err := jsonReader(map[string]any{"ok": true})
require.NoError(t, err)
body, err := io.ReadAll(reader)
require.NoError(t, err)
assert.JSONEq(t, `{"ok":true}`, string(body))
})

t.Run("jsonReader surfaces marshal errors", func(t *testing.T) {
// Values that cannot be serialized (e.g. a channel) must return an
// error instead of silently yielding an empty reader. See issue #434.
reader, err := jsonReader(map[string]any{"bad": make(chan int)})
require.Error(t, err)
assert.Nil(t, reader)
})
}
Loading