mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-09-04 00:17:17 +00:00
- Enable merge UI for linking channel contacts to tenant_users - Contact → tenant_user resolution with cached lookup (60s TTL) - MCP per-user credentials via user-keyed connection pool - Secure CLI per-user credentials with AES-256-GCM encryption - Unified UserPickerCombobox searching contacts + tenant_users - Group contact collection with chat title in all channels - Group permission inheritance via wildcard user_id="*" - Fix heartbeat using wrong userID in group chats - Filter internal senders from contact collection - Add contact_type column (user/group) to channel_contacts - SQLite schema v2 migration for desktop edition
67 lines
1.6 KiB
Go
67 lines
1.6 KiB
Go
package mcp
|
|
|
|
import "strings"
|
|
|
|
func mapToEnvSlice(env map[string]string) []string {
|
|
if len(env) == 0 {
|
|
return nil
|
|
}
|
|
s := make([]string, 0, len(env))
|
|
for k, v := range env {
|
|
s = append(s, k+"="+v)
|
|
}
|
|
return s
|
|
}
|
|
|
|
func toSet(items []string) map[string]struct{} {
|
|
if len(items) == 0 {
|
|
return nil
|
|
}
|
|
s := make(map[string]struct{}, len(items))
|
|
for _, item := range items {
|
|
s[item] = struct{}{}
|
|
}
|
|
return s
|
|
}
|
|
|
|
func joinErrors(errs []string) string {
|
|
var result strings.Builder
|
|
for i, e := range errs {
|
|
if i > 0 {
|
|
result.WriteString("; ")
|
|
}
|
|
result.WriteString(e)
|
|
}
|
|
return result.String()
|
|
}
|
|
|
|
// ParseJSONBytesToStringSlice converts JSONB []byte to []string (exported for loop_mcp_user).
|
|
func ParseJSONBytesToStringSlice(data []byte) []string { return jsonBytesToStringSlice(data) }
|
|
|
|
// ParseJSONBytesToStringMap converts JSONB []byte to map[string]string (exported for loop_mcp_user).
|
|
func ParseJSONBytesToStringMap(data []byte) map[string]string { return jsonBytesToStringMap(data) }
|
|
|
|
// jsonBytesToStringSlice converts JSONB []byte to []string. Returns nil on error.
|
|
func jsonBytesToStringSlice(data []byte) []string {
|
|
if len(data) == 0 {
|
|
return nil
|
|
}
|
|
var result []string
|
|
if err := jsonUnmarshal(data, &result); err != nil {
|
|
return nil
|
|
}
|
|
return result
|
|
}
|
|
|
|
// jsonBytesToStringMap converts JSONB []byte to map[string]string. Returns nil on error.
|
|
func jsonBytesToStringMap(data []byte) map[string]string {
|
|
if len(data) == 0 {
|
|
return nil
|
|
}
|
|
var result map[string]string
|
|
if err := jsonUnmarshal(data, &result); err != nil {
|
|
return nil
|
|
}
|
|
return result
|
|
}
|