mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-06-10 16:10:59 +00:00
6eb33f9cea
Add independent `share_memory` config flag to control memory and knowledge graph sharing separately from workspace folder isolation. - Add ShareMemory field to WorkspaceSharingConfig - Decouple WithSharedMemory(ctx) from shouldShareWorkspace() in loop.go - Add shouldShareMemory() helper independent of workspace sharing - Fix KG Traverse CTE to scope user_id in recursive step (pre-existing bug) - Add memory toggle UI with violet styling in workspace sharing section - Add i18n translations (en/vi/zh) for new memory sharing controls - Add unit tests for shouldShareMemory() independence
141 lines
4.4 KiB
Go
141 lines
4.4 KiB
Go
package agent
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/nextlevelbuilder/goclaw/internal/store"
|
|
)
|
|
|
|
func TestShouldShareWorkspace_NilConfig(t *testing.T) {
|
|
l := &Loop{workspaceSharing: nil}
|
|
if l.shouldShareWorkspace("user1", "direct") {
|
|
t.Error("nil config should never share")
|
|
}
|
|
}
|
|
|
|
func TestShouldShareWorkspace_SharedDM(t *testing.T) {
|
|
l := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{SharedDM: true}}
|
|
|
|
if !l.shouldShareWorkspace("user1", "direct") {
|
|
t.Error("shared_dm=true should share for direct peer")
|
|
}
|
|
if l.shouldShareWorkspace("user1", "group") {
|
|
t.Error("shared_dm=true should NOT share for group peer")
|
|
}
|
|
}
|
|
|
|
func TestShouldShareWorkspace_SharedGroup(t *testing.T) {
|
|
l := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{SharedGroup: true}}
|
|
|
|
if !l.shouldShareWorkspace("group:telegram:-100", "group") {
|
|
t.Error("shared_group=true should share for group peer")
|
|
}
|
|
if l.shouldShareWorkspace("user1", "direct") {
|
|
t.Error("shared_group=true should NOT share for direct peer")
|
|
}
|
|
}
|
|
|
|
func TestShouldShareWorkspace_SharedUsers(t *testing.T) {
|
|
l := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{
|
|
SharedUsers: []string{"telegram:386246614", "group:telegram:-100"},
|
|
}}
|
|
|
|
if !l.shouldShareWorkspace("telegram:386246614", "direct") {
|
|
t.Error("user in shared_users should share regardless of peerKind")
|
|
}
|
|
if !l.shouldShareWorkspace("group:telegram:-100", "group") {
|
|
t.Error("group in shared_users should share")
|
|
}
|
|
if l.shouldShareWorkspace("unknown-user", "direct") {
|
|
t.Error("user NOT in shared_users should not share")
|
|
}
|
|
}
|
|
|
|
func TestShouldShareWorkspace_SharedUsersTakesPriority(t *testing.T) {
|
|
// shared_dm=false, shared_group=false, but user is in shared_users
|
|
l := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{
|
|
SharedDM: false,
|
|
SharedGroup: false,
|
|
SharedUsers: []string{"special-user"},
|
|
}}
|
|
|
|
if !l.shouldShareWorkspace("special-user", "direct") {
|
|
t.Error("shared_users should override shared_dm=false")
|
|
}
|
|
if l.shouldShareWorkspace("other-user", "direct") {
|
|
t.Error("non-listed user should not share when shared_dm=false")
|
|
}
|
|
}
|
|
|
|
func TestShouldShareWorkspace_UnknownPeerKind(t *testing.T) {
|
|
l := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{SharedDM: true, SharedGroup: true}}
|
|
|
|
if l.shouldShareWorkspace("user1", "unknown") {
|
|
t.Error("unknown peerKind should default to not sharing")
|
|
}
|
|
if l.shouldShareWorkspace("user1", "") {
|
|
t.Error("empty peerKind should default to not sharing")
|
|
}
|
|
}
|
|
|
|
// shouldShareMemory tests — independent of workspace sharing
|
|
|
|
func TestShouldShareMemory_NilConfig(t *testing.T) {
|
|
l := &Loop{workspaceSharing: nil}
|
|
if l.shouldShareMemory() {
|
|
t.Error("nil config should not share memory")
|
|
}
|
|
}
|
|
|
|
func TestShouldShareMemory_Enabled(t *testing.T) {
|
|
l := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{ShareMemory: true}}
|
|
if !l.shouldShareMemory() {
|
|
t.Error("share_memory=true should share memory")
|
|
}
|
|
}
|
|
|
|
func TestShouldShareMemory_DisabledByDefault(t *testing.T) {
|
|
l := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{SharedDM: true}}
|
|
if l.shouldShareMemory() {
|
|
t.Error("SharedDM without ShareMemory should not share memory")
|
|
}
|
|
}
|
|
|
|
func TestShouldShareMemory_IndependentOfWorkspace(t *testing.T) {
|
|
// share_memory=true but no workspace sharing → memory shared, workspace per-user
|
|
l := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{ShareMemory: true}}
|
|
if !l.shouldShareMemory() {
|
|
t.Error("share_memory should work without workspace sharing")
|
|
}
|
|
if l.shouldShareWorkspace("user1", "direct") {
|
|
t.Error("workspace should NOT be shared when only share_memory is set")
|
|
}
|
|
|
|
// workspace shared but share_memory=false → workspace shared, memory per-user
|
|
l2 := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{SharedDM: true, ShareMemory: false}}
|
|
if l2.shouldShareMemory() {
|
|
t.Error("memory should NOT be shared when share_memory=false")
|
|
}
|
|
if !l2.shouldShareWorkspace("user1", "direct") {
|
|
t.Error("workspace should be shared when SharedDM=true")
|
|
}
|
|
}
|
|
|
|
func TestShouldShareWorkspace_BothEnabled(t *testing.T) {
|
|
l := &Loop{workspaceSharing: &store.WorkspaceSharingConfig{
|
|
SharedDM: true,
|
|
SharedGroup: true,
|
|
SharedUsers: []string{"extra-user"},
|
|
}}
|
|
|
|
if !l.shouldShareWorkspace("user1", "direct") {
|
|
t.Error("should share DM")
|
|
}
|
|
if !l.shouldShareWorkspace("group:tg:-100", "group") {
|
|
t.Error("should share group")
|
|
}
|
|
if !l.shouldShareWorkspace("extra-user", "direct") {
|
|
t.Error("should share listed user")
|
|
}
|
|
}
|