chore: move completed tasks to completed/ directory
Mueve las tareas completadas (01-bot-tools, 02-bot-memory, 04-bot-avatar) al directorio .claude/tasks/completed/ para organización. Añade nueva tarea 06. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# Plan: Herramientas para los bots
|
||||
|
||||
## Objetivo
|
||||
Permitir que los bots ejecuten herramientas reales (funciones Go) como respuesta a
|
||||
decisiones del LLM — patrón function calling / tool use.
|
||||
|
||||
## Estado: COMPLETADO
|
||||
|
||||
---
|
||||
|
||||
## Diseño
|
||||
|
||||
### Capa pura (`pkg/tools/`)
|
||||
- Definir `ToolSpec` con nombre, descripción y esquema JSON de parámetros
|
||||
- Definir `ToolCallAction` en `pkg/decision/` — acción pura que contiene
|
||||
`ToolName string` y `Args map[string]any`
|
||||
- El motor de reglas puede emitir `ToolCallAction` como cualquier otra acción
|
||||
|
||||
### Capa shell (`shell/tools/`)
|
||||
- `Executor` que mapea nombre → función Go real
|
||||
- Ejecuta la herramienta y devuelve `ToolResult{Output string, Err error}`
|
||||
- El Runner de `shell/effects/` llama al Executor cuando recibe `ToolCallAction`
|
||||
|
||||
### Integración LLM
|
||||
- `shell/llm/anthropic.go` y `openai.go` ya soportan tool_use / function_calling
|
||||
- Mapear `[]ToolSpec` al formato nativo de cada proveedor
|
||||
- Parsear la respuesta del LLM para extraer llamadas a herramientas
|
||||
|
||||
### Herramientas iniciales a implementar
|
||||
| Herramienta | Descripción | Shell |
|
||||
|-----------------|-------------------------------------|-------------------|
|
||||
| `http_get` | GET a una URL, devuelve body | `shell/tools/` |
|
||||
| `http_post` | POST JSON a una URL | `shell/tools/` |
|
||||
| `ssh_command` | Ejecutar comando remoto por SSH | `shell/ssh/` |
|
||||
| `read_file` | Leer archivo local | `shell/tools/` |
|
||||
| `matrix_send` | Enviar mensaje a una sala Matrix | `shell/matrix/` |
|
||||
|
||||
---
|
||||
|
||||
## Archivos a crear/modificar
|
||||
- `pkg/tools/spec.go` — ToolSpec, ToolResult
|
||||
- `pkg/decision/actions.go` — añadir ToolCallAction
|
||||
- `shell/tools/executor.go` — registro y ejecución de herramientas
|
||||
- `shell/effects/runner.go` — manejar ToolCallAction
|
||||
- `shell/llm/anthropic.go` — emitir tools en el request, parsear tool_use blocks
|
||||
- `shell/llm/openai.go` — idem para function_calling
|
||||
- `agents/<id>/agent.go` — registrar herramientas por agente
|
||||
|
||||
## Notas
|
||||
- Las herramientas se declaran en `pkg/` (pure spec) pero se implementan en `shell/`
|
||||
- Un agente solo tiene acceso a las herramientas declaradas en su config
|
||||
- Respetar `security.allowed_tools` del config YAML
|
||||
@@ -0,0 +1,95 @@
|
||||
# Plan: Memoria para los bots
|
||||
|
||||
## Objetivo
|
||||
Que cada bot recuerde conversaciones anteriores, hechos importantes sobre usuarios
|
||||
y contexto de salas. Memoria a corto plazo (ventana de conversación) y largo plazo
|
||||
(SQLite persistente).
|
||||
|
||||
## Estado: completado ✓
|
||||
|
||||
---
|
||||
|
||||
## Tipos de memoria
|
||||
|
||||
### 1. Memoria de conversación (corto plazo)
|
||||
- Ventana deslizante de `N` mensajes por room
|
||||
- Se pasa como historial al LLM en cada llamada
|
||||
- Vive en RAM; se pierde al reiniciar (aceptable)
|
||||
|
||||
### 2. Memoria episódica (largo plazo)
|
||||
- Hechos extraídos de conversaciones: nombre del usuario, preferencias, eventos
|
||||
- Guardados en SQLite (`agents/<id>/data/memory.db`)
|
||||
- El LLM puede leer y escribir hechos mediante herramientas (`remember`, `recall`)
|
||||
|
||||
---
|
||||
|
||||
## Diseño capa pura (`pkg/memory/`)
|
||||
|
||||
```go
|
||||
// Tipos puros — sin I/O
|
||||
type Message struct {
|
||||
Role string // "user" | "assistant"
|
||||
Content string
|
||||
At time.Time
|
||||
}
|
||||
|
||||
type Fact struct {
|
||||
Subject string
|
||||
Key string
|
||||
Value string
|
||||
At time.Time
|
||||
}
|
||||
|
||||
// Ventana de conversación
|
||||
type Window struct {
|
||||
RoomID string
|
||||
Messages []Message
|
||||
MaxSize int
|
||||
}
|
||||
|
||||
func (w Window) Append(m Message) Window { ... } // pura
|
||||
func (w Window) ToLLMMessages() []llm.Message { ... } // pura
|
||||
```
|
||||
|
||||
## Diseño capa shell (`shell/memory/`)
|
||||
|
||||
```go
|
||||
// Acceso a SQLite — impuro
|
||||
type Store interface {
|
||||
SaveFact(ctx, agentID, fact) error
|
||||
GetFacts(ctx, agentID, subject) ([]Fact, error)
|
||||
GetHistory(ctx, agentID, roomID, limit) ([]Message, error)
|
||||
AppendMessage(ctx, agentID, roomID, msg) error
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Herramientas LLM para memoria
|
||||
- `remember(subject, key, value)` — guardar un hecho
|
||||
- `recall(subject, key)` — recuperar hechos sobre alguien/algo
|
||||
- `forget(subject, key)` — borrar un hecho
|
||||
|
||||
---
|
||||
|
||||
## Integración con el flujo actual
|
||||
1. `agents/runtime.go` mantiene un `map[roomID]memory.Window` en RAM
|
||||
2. Antes de llamar al LLM, inyectar historial de la ventana al request
|
||||
3. Después de la respuesta, hacer `Append` con el mensaje del bot
|
||||
4. Las herramientas `remember`/`recall` van al `Store` SQLite
|
||||
|
||||
---
|
||||
|
||||
## Archivos a crear/modificar
|
||||
- `pkg/memory/types.go` — Message, Fact, Window (puros)
|
||||
- `pkg/memory/window.go` — operaciones sobre Window (puras)
|
||||
- `shell/memory/sqlite_store.go` — Store SQLite
|
||||
- `shell/memory/migrations/001_init.sql` — schema
|
||||
- `agents/runtime.go` — inyectar historial antes del LLM call
|
||||
- `agents/<id>/agent.go` — registrar herramientas remember/recall
|
||||
|
||||
## Notas
|
||||
- Schema SQLite: tabla `facts(agent_id, subject, key, value, updated_at)`,
|
||||
tabla `messages(agent_id, room_id, role, content, created_at)`
|
||||
- El tamaño de la ventana se configura en `storage.max_context_messages`
|
||||
(añadir al schema de config)
|
||||
@@ -0,0 +1,69 @@
|
||||
# Plan: Editar fotos de perfil de los bots
|
||||
|
||||
## Objetivo
|
||||
Poder actualizar el avatar (foto de perfil) y el display name de cada bot en Matrix
|
||||
desde la CLI (`agentctl`) o desde un dev-script.
|
||||
|
||||
## Estado: COMPLETADO
|
||||
|
||||
---
|
||||
|
||||
## Cómo funciona en Matrix
|
||||
- Endpoint: `PUT /_matrix/client/v3/profile/{userId}/avatar_url`
|
||||
- Body: `{ "avatar_url": "mxc://..." }` — URI de contenido subido al Media repo
|
||||
- Para subir una imagen: `POST /_matrix/media/v3/upload` con el body binario
|
||||
y `Content-Type` de la imagen
|
||||
- También se puede cambiar el display name:
|
||||
`PUT /_matrix/client/v3/profile/{userId}/displayname`
|
||||
|
||||
La secuencia es:
|
||||
1. Subir imagen → obtener `mxc://server/mediaID`
|
||||
2. Establecer `avatar_url` en el perfil con esa URI
|
||||
|
||||
---
|
||||
|
||||
## Diseño
|
||||
|
||||
### CLI: `agentctl avatar <agent-id> <image-path>`
|
||||
Nuevo subcomando en `cmd/agentctl/`:
|
||||
```
|
||||
agentctl avatar assistant-bot /path/to/photo.png
|
||||
agentctl displayname assistant-bot "Assistant Bot"
|
||||
```
|
||||
|
||||
### Shell: `shell/matrix/profile.go`
|
||||
```go
|
||||
// UploadMedia sube un archivo y devuelve la mxc:// URI
|
||||
func UploadMedia(ctx, client, filePath string) (mxcURI string, err error)
|
||||
|
||||
// SetAvatar establece avatar_url en el perfil del bot
|
||||
func SetAvatar(ctx, client, mxcURI string) error
|
||||
|
||||
// SetDisplayName cambia el displayname
|
||||
func SetDisplayName(ctx, client, name string) error
|
||||
```
|
||||
|
||||
Usa el cliente `mautrix.Client` ya existente en `shell/matrix/client.go`.
|
||||
|
||||
### Dev-script: `dev-scripts/avatar.sh`
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Uso: ./dev-scripts/avatar.sh <agent-id> <image-path>
|
||||
./bin/agentctl avatar "$1" "$2"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Archivos a crear/modificar
|
||||
- `shell/matrix/profile.go` — UploadMedia, SetAvatar, SetDisplayName
|
||||
- `cmd/agentctl/avatar.go` — subcomando `avatar` y `displayname`
|
||||
- `cmd/agentctl/main.go` — registrar los nuevos subcomandos en Cobra
|
||||
- `dev-scripts/avatar.sh` — wrapper convenience
|
||||
|
||||
## Notas
|
||||
- El token del bot necesita permiso de escritura en su propio perfil (normal por defecto)
|
||||
- Formatos soportados: PNG, JPG, WebP — Matrix los acepta todos
|
||||
- mautrix-go tiene métodos `client.UploadMedia()` y `client.SetAvatarURL()`;
|
||||
usar esos directamente para evitar HTTP manual
|
||||
- El comando debe cargar el token del bot desde las env vars (`MATRIX_TOKEN_<BOT>`)
|
||||
igual que hace `cmd/launcher/`
|
||||
Reference in New Issue
Block a user