Compare commits

...

4 Commits

Author SHA1 Message Date
Mauro c362114cf1 Merge pull request #3113 from chengzhichao-xydt/codex/manager-channel-marshal-errors
fix(channels): check json marshal/unmarshal errors in toChannelHashes
2026-06-12 13:17:00 +02:00
Mauro d8c0b783a8 Merge pull request #3112 from chengzhichao-xydt/codex/toolloop-marshal-error-check
fix(tools): handle json.Marshal error in toolloop tool call arguments
2026-06-12 13:16:33 +02:00
程智超0668000959 7338df2cfb fix(channels): check json marshal/unmarshal errors in toChannelHashes
Replace silently discarded json.Marshal and json.Unmarshal errors with
explicit checks. If serialization fails, log a warning and either
return early (for the config-level marshal/unmarshal) or skip the
channel (for per-channel marshal). This prevents silent data loss
when channel configuration contains unexpected types.
2026-06-12 14:18:28 +08:00
程智超0668000959 1719067aca fix(tools): handle json.Marshal error in toolloop tool call arguments 2026-06-12 14:16:18 +08:00
2 changed files with 20 additions and 5 deletions
+15 -4
View File
@@ -4,6 +4,7 @@ import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"log"
"github.com/sipeed/picoclaw/pkg/config"
)
@@ -11,17 +12,27 @@ import (
func toChannelHashes(cfg *config.Config) map[string]string {
result := make(map[string]string)
ch := cfg.Channels
// should not be error
marshal, _ := json.Marshal(ch)
marshal, err := json.Marshal(ch)
if err != nil {
log.Printf("[manager_channel] failed to marshal channels config: %v", err)
return result
}
var channelConfig map[string]map[string]any
_ = json.Unmarshal(marshal, &channelConfig)
if err := json.Unmarshal(marshal, &channelConfig); err != nil {
log.Printf("[manager_channel] failed to unmarshal channels config: %v", err)
return result
}
for key, value := range channelConfig {
if enabled, ok := value["enabled"].(bool); !ok || !enabled {
continue
}
hiddenValues(key, value, ch.Get(key))
valueBytes, _ := json.Marshal(value)
valueBytes, err := json.Marshal(value)
if err != nil {
log.Printf("[manager_channel] failed to marshal channel %s config: %v", key, err)
continue
}
hash := md5.Sum(valueBytes)
result[key] = hex.EncodeToString(hash[:])
}
+5 -1
View File
@@ -132,7 +132,11 @@ func RunToolLoop(
Content: response.Content,
}
for _, tc := range normalizedToolCalls {
argumentsJSON, _ := json.Marshal(tc.Arguments)
argumentsJSON, err := json.Marshal(tc.Arguments)
if err != nil {
logger.Warnf("toolloop: failed to marshal tool call arguments for %s: %v", tc.Name, err)
argumentsJSON = []byte("{}")
}
assistantMsg.ToolCalls = append(assistantMsg.ToolCalls, providers.ToolCall{
ID: tc.ID,
Type: "function",