feat: integrar structured logging en todos los componentes del shell
Se propaga *slog.Logger a todos los componentes impuros del shell: - shell/bus/ — logs de subscribe, send, reply, timeout, unsubscribe - shell/effects/ — duración y resultado de cada action ejecutada - shell/llm/ (anthropic, openai, factory) — request/response con tokens, duración, fallback - shell/memory/sqlite — open, save, recall, close con detalles - shell/ssh/ — inicio, fin, errores y duración de comandos SSH - tools/registry — registro, ejecución y errores de herramientas Se usa el paquete shell/logger para field names consistentes (FieldDurationMS, FieldTokensUsed, etc.). Cada componente recibe el logger por inyección de dependencias, sin globals. Las firmas de New/FromConfig se actualizan para aceptar *slog.Logger. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+19
-3
@@ -5,6 +5,7 @@ import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
@@ -38,11 +39,14 @@ CREATE INDEX IF NOT EXISTS idx_facts_subject ON facts(agent_id, subject);
|
||||
|
||||
// SQLiteStore implements memory.Store using SQLite.
|
||||
type SQLiteStore struct {
|
||||
db *sql.DB
|
||||
db *sql.DB
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
// New opens (or creates) a SQLite database at dbPath and runs migrations.
|
||||
func New(dbPath string) (*SQLiteStore, error) {
|
||||
func New(dbPath string, logger *slog.Logger) (*SQLiteStore, error) {
|
||||
log := logger.With("component", "memory", "db_path", dbPath)
|
||||
log.Info("memory_open")
|
||||
if err := os.MkdirAll(filepath.Dir(dbPath), 0o755); err != nil {
|
||||
return nil, fmt.Errorf("create memory db dir: %w", err)
|
||||
}
|
||||
@@ -54,15 +58,20 @@ func New(dbPath string) (*SQLiteStore, error) {
|
||||
db.Close()
|
||||
return nil, fmt.Errorf("migrate memory db: %w", err)
|
||||
}
|
||||
return &SQLiteStore{db: db}, nil
|
||||
log.Info("memory_ready")
|
||||
return &SQLiteStore{db: db, logger: log}, nil
|
||||
}
|
||||
|
||||
func (s *SQLiteStore) SaveFact(ctx context.Context, f memory.Fact) error {
|
||||
s.logger.Debug("memory_save_fact", "subject", f.Subject, "key", f.Key)
|
||||
_, err := s.db.ExecContext(ctx,
|
||||
`INSERT OR REPLACE INTO facts (agent_id, subject, key, value, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?)`,
|
||||
f.AgentID, f.Subject, f.Key, f.Value, time.Now().UTC(),
|
||||
)
|
||||
if err != nil {
|
||||
s.logger.Error("memory_save_fact_error", "subject", f.Subject, "key", f.Key, "err", err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -95,6 +104,7 @@ func (s *SQLiteStore) RecallFacts(ctx context.Context, agentID, subject string,
|
||||
}
|
||||
facts = append(facts, f)
|
||||
}
|
||||
s.logger.Debug("memory_recall", "subject", subject, "count", len(facts))
|
||||
return facts, rows.Err()
|
||||
}
|
||||
|
||||
@@ -114,11 +124,15 @@ func (s *SQLiteStore) DeleteFacts(ctx context.Context, agentID, subject string,
|
||||
}
|
||||
|
||||
func (s *SQLiteStore) SaveMessage(ctx context.Context, m memory.HistoryMessage) error {
|
||||
s.logger.Debug("memory_save_msg", "room", m.RoomID, "role", m.Role)
|
||||
_, err := s.db.ExecContext(ctx,
|
||||
`INSERT INTO messages (agent_id, room_id, role, content, created_at)
|
||||
VALUES (?, ?, ?, ?, ?)`,
|
||||
m.AgentID, m.RoomID, string(m.Role), m.Content, time.Now().UTC(),
|
||||
)
|
||||
if err != nil {
|
||||
s.logger.Error("memory_save_msg_error", "room", m.RoomID, "err", err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -152,6 +166,7 @@ func (s *SQLiteStore) LoadMessages(ctx context.Context, agentID, roomID string,
|
||||
for i, j := 0, len(msgs)-1; i < j; i, j = i+1, j-1 {
|
||||
msgs[i], msgs[j] = msgs[j], msgs[i]
|
||||
}
|
||||
s.logger.Debug("memory_load_msgs", "room", roomID, "count", len(msgs))
|
||||
return msgs, nil
|
||||
}
|
||||
|
||||
@@ -171,5 +186,6 @@ func (s *SQLiteStore) DeleteMessages(ctx context.Context, agentID string, roomID
|
||||
}
|
||||
|
||||
func (s *SQLiteStore) Close() error {
|
||||
s.logger.Info("memory_closed")
|
||||
return s.db.Close()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user