- Mover dev/issues/0018-shared-knowledge.md a completed/ - Actualizar dev/issues/README.md: estado completado - Sistema de conocimiento compartido completamente implementado 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
7.8 KiB
018 — Shared Knowledge: base de conocimiento compartida entre agentes
Objetivo
Crear un sistema de conocimiento compartido (knowledges/ en la raiz del proyecto) donde multiples agentes pueden leer, escribir y buscar documentos en comun. Esto permite colaboracion entre agentes: uno puede registrar informacion que otros consultan.
Contexto
- Cada agente ya tiene su knowledge privado en
agents/<id>/knowledge/con SQLite FTS5 index (shell/knowledge/store.go). - Los tipos puros ya existen:
pkg/knowledge.Document,SearchResult,Storeinterface. - Las tools de knowledge ya existen:
tools/knowledgetools/(search, read, write, list). - El
FileStoreenshell/knowledge/ya implementa todo el CRUD + FTS5. - Lo que falta es una instancia compartida de
FileStoreapuntando aknowledges/con tools dedicadas que multiples agentes puedan usar.
Arquitectura
knowledges/ ← carpeta raiz, documentos .md compartidos
knowledges/data/knowledge.db ← SQLite FTS5 index compartido (en .gitignore)
pkg/knowledge/ ← sin cambios, los tipos puros ya cubren
shell/knowledge/store.go ← sin cambios, FileStore ya es reutilizable
tools/knowledgetools/shared.go ← NEW: tools prefijadas shared_knowledge_*
agents/runtime.go ← instanciar shared store + registrar tools
internal/config/schema.go ← config para habilitar shared knowledge
Patron pure core / impure shell
pkg/— sin cambios,knowledge.Storeinterface ya sirveshell/knowledge/— sin cambios,FileStoreya funciona con cualquier directoriotools/knowledgetools/— nuevas tools que wrappean el store compartidoagents/runtime.go— composicion: crea shared store y registra tools
Tareas
Fase 1: Config
- 1.1 Agregar seccion
shared_knowledgeal config eninternal/config/schema.go:type SharedKnowledgeCfg struct { Enabled bool `yaml:"enabled"` // default false Dir string `yaml:"dir"` // default "knowledges" DBPath string `yaml:"db_path"` // default "knowledges/data/knowledge.db" } - 1.2 Agregar campo
SharedKnowledge SharedKnowledgeCfgalToolsCfg(o alAgentConfigdirectamente).
Fase 2: Tools compartidas en tools/knowledgetools/
-
2.1 Crear
tools/knowledgetools/shared.gocon tools prefijadasshared_knowledge_*:shared_knowledge_search— buscar en la base compartidashared_knowledge_read— leer un documento compartido por slugshared_knowledge_write— crear/actualizar un documento compartidoshared_knowledge_list— listar todos los documentos compartidos- Reutilizar
KnowledgeStoreinterface y la misma logica de las tools privadas pero con nombres y descripciones que indican "shared across all agents"
-
2.2 Cada tool debe incluir en su descripcion que es conocimiento compartido entre agentes:
"Search the shared knowledge base accessible by all agents. Use this to find information other agents have recorded." -
2.3 Funcion constructora:
// NewSharedKnowledgeTools creates all shared knowledge tools backed by the given store. func NewSharedKnowledgeTools(store KnowledgeStore) []tools.Tool
Fase 3: Integracion en runtime
-
3.1 En
agents/runtime.go, sicfg.Tools.SharedKnowledge.Enabled(o donde se ponga en config):- Crear un
shellknowledge.New(dir, dbPath, logger)con la ruta compartida - Llamar
Sync(ctx)al arrancar - Registrar las tools de
NewSharedKnowledgeTools(sharedStore)en el registry - Guardar referencia para cerrar en defer
- Crear un
-
3.2 El shared store debe ser una instancia por agente (cada proceso abre su propia conexion SQLite al mismo archivo DB). SQLite soporta lecturas concurrentes y escrituras serializadas con WAL mode.
-
3.3 Habilitar WAL mode en el shared store para mejor concurrencia entre procesos:
db.Exec("PRAGMA journal_mode=WAL")Esto puede ir en
shell/knowledge/store.goNew()para beneficiar tambien al store privado.
Fase 4: Carpeta knowledges/
- 4.1 Crear
knowledges/en la raiz del proyecto con unREADME.mdexplicando su proposito. - 4.2 Agregar
knowledges/data/a.gitignore(la DB no se commitea, los .md si).
Fase 5: Coexistencia con knowledge privado
-
5.1 Un agente puede tener ambos habilitados: knowledge privado (
agents/<id>/knowledge/) y shared (knowledges/). Las tools se distinguen por nombre:knowledge_search/knowledge_read/knowledge_write/knowledge_list→ privadoshared_knowledge_search/shared_knowledge_read/shared_knowledge_write/shared_knowledge_list→ compartido
-
5.2 Documentar en el system prompt de los agentes la diferencia:
- Knowledge privado: "tu base de conocimiento personal, solo tu puedes ver"
- Knowledge compartido: "base compartida entre todos los agentes, usa para colaborar"
Fase 6: Tests
- 6.1 Test de
NewSharedKnowledgeTools— verificar que genera 4 tools con nombresshared_knowledge_*. - 6.2 Test de integracion: dos stores apuntando al mismo directorio pueden leer lo que el otro escribe (simula dos agentes).
- 6.3 Test de concurrencia basico con WAL mode.
Fase 7: Cleanup y docs
- 7.1 Actualizar
CLAUDE.md— agregarknowledges/a la estructura de directorios. - 7.2 Actualizar
.gitignoreconknowledges/data/. - 7.3 Ejemplo de config habilitando shared knowledge en un agente existente.
Ejemplo de config
tools:
knowledge:
enabled: true # knowledge privado del agente
dir: "knowledge" # relativo a agents/<id>/
shared_knowledge:
enabled: true # knowledge compartido
dir: "knowledges" # relativo a la raiz del proyecto
db_path: "knowledges/data/knowledge.db"
Ejemplo de flujo
1. agente-A recibe: "investiga X y guarda lo que encuentres"
→ LLM usa shared_knowledge_write(slug: "investigacion-x", content: "...")
→ Se escribe knowledges/investigacion-x.md + actualiza FTS5
2. agente-B recibe: "que sabemos sobre X?"
→ LLM usa shared_knowledge_search(query: "X")
→ Encuentra el documento que escribio agente-A
→ shared_knowledge_read(slug: "investigacion-x")
→ Responde con la informacion
3. Agentes colaboran acumulando conocimiento en la misma base
Decisiones de diseno
- Reusar FileStore: no crear un store nuevo.
shell/knowledge.FileStoreya tiene todo (CRUD, FTS5, Sync). Solo se instancia con una ruta diferente. - WAL mode: permite que multiples procesos lean/escriban concurrentemente. Es la forma estandar de compartir SQLite entre procesos.
- Prefix
shared_knowledge_: diferencia claramente las tools compartidas de las privadas. El LLM sabe cual usar segun contexto. - Los .md se commitean, la DB no: los documentos compartidos forman parte del repo (versionados). La DB FTS5 se reconstruye con
Sync()al arrancar. - Sin control de acceso por agente: cualquier agente con shared_knowledge habilitado puede leer y escribir. Simplicidad primero; RBAC se puede agregar despues si hace falta.
Prerequisitos
- Knowledge privado ya funcional (pkg/knowledge, shell/knowledge, tools/knowledgetools) — ya implementado.
- No tiene dependencias externas nuevas.
Riesgos
- Contention en escritura: si muchos agentes escriben simultaneamente, SQLite serializa las escrituras. Con WAL mode esto es manejable para el volumen esperado.
- Sync al arrancar: si hay muchos documentos, el Sync inicial puede tardar. No deberia ser problema con volumenes pequenos.
- Conflictos de slug: dos agentes podrian sobreescribir el mismo documento. Esto es intencional (ultimo gana), pero el LLM debe ser consciente via el system prompt.