@iaforged/context-code 1.0.84 → 1.0.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1118
- package/docs/BRIDGES.md +90 -0
- package/docs/Contex.md +70 -0
- package/docs/LIMITS.md +37 -0
- package/docs/MCP_SERVERS.md +51 -0
- package/docs/MULTI_PROVIDER.md +201 -0
- package/docs/MULTI_SQUAD_ORCHESTRATION_PLAN.md +639 -0
- package/docs/PHASE_1_WORKSPACES_AGENTS_TEAMS.md +161 -0
- package/docs/PHASE_2_SQLITE_ORCHESTRATION.md +127 -0
- package/docs/PHASE_3_DOMAIN_EXECUTION.md +215 -0
- package/docs/PHASE_3_VALIDATION.md +136 -0
- package/docs/PHASE_4_RISKS_AND_TESTS.md +182 -0
- package/docs/RECOVERY_NOTES.md +78 -0
- package/docs/RENAMING_NOTES.md +25 -0
- package/docs/SKILLS.md +27 -0
- package/docs/TEAMS_AND_ORCHESTRATION.md +626 -0
- package/docs/TROUBLESHOOTING.md +72 -0
- package/docs/comandos.md +121 -0
- package/docs/index.md +37 -0
- package/package.json +2 -1
package/docs/BRIDGES.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
## Puentes con mensajería móvil
|
|
2
|
+
|
|
3
|
+
Context Code puede conectarse con **Telegram** y **WhatsApp** para que veas y respondas la conversación completa desde tu móvil. Cada mensaje que escribes en la terminal se refleja en el chat, cada respuesta del modelo llega de vuelta, y cada herramienta que ejecuta el asistente (Bash, Read, Edit…) se resume en una línea. También puedes escribir **desde el móvil** y el texto se inyecta al REPL como si lo hubieras tecleado en la terminal — la conversación es la misma, da igual por dónde entres.
|
|
4
|
+
|
|
5
|
+
Los dos puentes funcionan de forma independiente: puedes usar solo Telegram, solo WhatsApp, o los dos a la vez.
|
|
6
|
+
|
|
7
|
+
### Qué se sincroniza
|
|
8
|
+
|
|
9
|
+
- **De la terminal al móvil:** tus prompts (`👤`), las respuestas de texto del modelo (`🤖`) y una línea por cada tool call (`🔧 Bash: npm test`, `🔧 Read: src/foo.ts`, etc.). No se manda el output crudo de las herramientas para no saturar el chat.
|
|
10
|
+
- **Del móvil a la terminal:** cualquier texto que envíes aterriza en la cola de entrada del REPL con la misma prioridad que si lo hubieras escrito en la CLI.
|
|
11
|
+
- **Antiduplicado:** si escribes desde el móvil, ese texto no se reenvía de vuelta al mismo canal. El otro canal sí lo recibe (si está activo).
|
|
12
|
+
- **Código no sincronizado:** mensajes internos del sistema, salidas de slash commands y otros eventos auxiliares no se envían a los canales.
|
|
13
|
+
|
|
14
|
+
### `/telegram` — Bridge con Telegram
|
|
15
|
+
|
|
16
|
+
Usa la [Bot API oficial de Telegram](https://core.telegram.org/bots/api) vía `grammy`. Requiere crear un bot en **@BotFather** y darle al wizard el token.
|
|
17
|
+
|
|
18
|
+
Flujo en 3 pasos:
|
|
19
|
+
|
|
20
|
+
1. **Intro** con instrucciones para crear el bot en `@BotFather` (`/newbot`, nombre, username, token).
|
|
21
|
+
2. **Pegar el token** — input con validación de formato `123456789:ABC-...`.
|
|
22
|
+
3. **Iniciar bot** — el bridge queda corriendo.
|
|
23
|
+
|
|
24
|
+
Desde el móvil, envía `/start` al bot y ese chat queda registrado como destinatario primario. El bot también responde a `/status`, `/model <nombre>` y `/provider <nombre>` para cambiar proveedor o modelo desde Telegram.
|
|
25
|
+
|
|
26
|
+
Comandos dentro de la CLI:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
/telegram # abre el wizard (alias: /tele, /bot)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
El token queda guardado localmente en la config (`~/.context/...`) y nunca sale del equipo.
|
|
33
|
+
|
|
34
|
+
### `/whatsapp` — Bridge con WhatsApp
|
|
35
|
+
|
|
36
|
+
Usa **Baileys** (`@whiskeysockets/baileys`) vía WhatsApp Web para vincular una cuenta como dispositivo enlazado. Baileys es **opcional**: solo se carga cuando ejecutas `/whatsapp` por primera vez, así no pesa en la instalación base. El QR se dibuja en la terminal usando el paquete `qrcode`, ya incluido en el proyecto.
|
|
37
|
+
|
|
38
|
+
> ⚠️ **Aviso importante.** Baileys es una librería no-oficial. Conectarse por esta vía viola los Términos de Servicio de WhatsApp. Para uso personal en un proyecto privado rara vez pasa nada, pero el número que uses podría ser baneado por WhatsApp en casos extremos. Se recomienda usar un **número dedicado para el bot** (eSIM, número secundario, etc.), no tu WhatsApp personal.
|
|
39
|
+
|
|
40
|
+
Flujo en 5 pasos:
|
|
41
|
+
|
|
42
|
+
1. **Intro + aviso de riesgo.**
|
|
43
|
+
2. **Escanear QR** — el wizard dibuja el QR en la terminal. En el móvil del bot: WhatsApp → *Dispositivos Vinculados* → *Vincular un dispositivo* → escaneas.
|
|
44
|
+
3. **Tu número (destinatario primario)** — el número en formato E.164 (`+573001234567`) donde quieres recibir el espejo. También puedes saltar y el primer número que escriba al bot se auto-registra.
|
|
45
|
+
4. **Allowlist de números autorizados** — agregas los números que pueden escribirle al bot. Los mensajes de números fuera de la lista se ignoran en silencio.
|
|
46
|
+
5. **Iniciar bridge** — el bridge queda corriendo.
|
|
47
|
+
|
|
48
|
+
Desde el panel de ejecución puedes detener el bridge, gestionar la lista de autorizados o cambiar el destinatario sin reiniciar.
|
|
49
|
+
|
|
50
|
+
Comandos dentro de la CLI:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
/whatsapp # abre el wizard (alias: /wa, /whats)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Las credenciales de sesión de WhatsApp Web se guardan como archivos en `~/.context/whatsapp-auth/` (respetando `CLAUDE_CONFIG_DIR` si está definido), porque Baileys necesita manejar ese directorio de auth. La configuracion lógica del bridge, como destinatario primario, allowlist, identidad vinculada y estado `running`, se guarda en SQLite mediante `secure_storage` en Windows/Linux.
|
|
57
|
+
|
|
58
|
+
### Configuración guardada
|
|
59
|
+
|
|
60
|
+
Ambos bridges persisten su configuracion en el storage seguro. En Windows/Linux esto vive cifrado dentro de `~/.context/provider-state.sqlite3`; en macOS se mantiene el backend de keychain/fallback disponible.
|
|
61
|
+
|
|
62
|
+
```jsonc
|
|
63
|
+
{
|
|
64
|
+
"telegramBot": {
|
|
65
|
+
"token": "…",
|
|
66
|
+
"allowedUserIds": [123456],
|
|
67
|
+
"primaryChatId": 123456,
|
|
68
|
+
"isRunning": true
|
|
69
|
+
},
|
|
70
|
+
"whatsappBot": {
|
|
71
|
+
"authDir": "~/.context/whatsapp-auth",
|
|
72
|
+
"primaryRecipient": "+573001234567",
|
|
73
|
+
"allowedNumbers": ["+573001234567", "+573109876543"],
|
|
74
|
+
"selfJid": "573...@s.whatsapp.net",
|
|
75
|
+
"selfE164": "+573...",
|
|
76
|
+
"running": true
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Si existe configuracion vieja en el archivo JSON global, se migra automaticamente al leer o actualizar el bridge y se elimina esa clave legacy para evitar dos fuentes de verdad.
|
|
82
|
+
|
|
83
|
+
### Ritmo de envío
|
|
84
|
+
|
|
85
|
+
Cada canal usa una cola con throttling para no dispararse contra los rate limits de la plataforma:
|
|
86
|
+
|
|
87
|
+
- **Telegram:** 150 ms entre mensajes (~6 msg/s, bien por debajo del límite oficial de 30 msg/s por bot).
|
|
88
|
+
- **WhatsApp:** 500 ms entre mensajes (más conservador — Baileys no publica límites formales y enviar demasiado rápido puede disparar shadow-bans).
|
|
89
|
+
|
|
90
|
+
Si escribes prompts muy rápido la cola se llena hasta 200 items, y a partir de ahí descarta el más viejo para no crecer sin límite.
|
package/docs/Contex.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Contex.md — Instrucciones para Claude
|
|
2
|
+
|
|
3
|
+
## Descripción del Proyecto
|
|
4
|
+
|
|
5
|
+
Este proyecto es **Context Code** (`@context-ai/context-code`), una herramienta de línea de comandos que permite a Claude entender bases de código, editar archivos, ejecutar comandos de terminal y gestionar flujos de trabajo completos directamente desde la terminal.
|
|
6
|
+
|
|
7
|
+
- **Versión actual:** 2.1.88
|
|
8
|
+
- **Binario principal:** `context` (via `cli.js`)
|
|
9
|
+
- **Lenguaje:** TypeScript (ES2022, módulos ESM)
|
|
10
|
+
- **Runtime:** Node.js >= 18.0.0
|
|
11
|
+
|
|
12
|
+
## Estructura del Proyecto
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
src/
|
|
16
|
+
assistant/ # Lógica del asistente principal
|
|
17
|
+
cli/ # Punto de entrada CLI
|
|
18
|
+
commands/ # Definición de comandos disponibles
|
|
19
|
+
components/ # Componentes de UI (Ink/React)
|
|
20
|
+
context/ # Gestión del contexto de conversación
|
|
21
|
+
coordinator/ # Coordinación de tareas y costos
|
|
22
|
+
entrypoints/ # Puntos de entrada de la aplicación
|
|
23
|
+
hooks/ # Hooks personalizados
|
|
24
|
+
plugins/ # Sistema de plugins
|
|
25
|
+
query/ # Motor de consultas (QueryEngine)
|
|
26
|
+
screens/ # Pantallas de la interfaz
|
|
27
|
+
services/ # Servicios externos e internos
|
|
28
|
+
skills/ # Habilidades del agente
|
|
29
|
+
state/ # Gestión de estado
|
|
30
|
+
tasks/ # Sistema de tareas
|
|
31
|
+
tools/ # Herramientas disponibles para el agente
|
|
32
|
+
utils/ # Utilidades generales
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Comandos de Desarrollo
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm run typecheck # Verificar tipos TypeScript
|
|
39
|
+
npm run build # Compilar el proyecto
|
|
40
|
+
npm run dev:build # Alias de build
|
|
41
|
+
npm run dev:watch # Compilar en modo watch
|
|
42
|
+
npm run dev:run # Ejecutar versión de desarrollo
|
|
43
|
+
npm run start # Ejecutar la versión compilada
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Sistema de Proveedores
|
|
47
|
+
|
|
48
|
+
El proyecto ya no debe asumirse como proveedor-unico. La capa actual distingue entre proveedor activo y perfil activo:
|
|
49
|
+
|
|
50
|
+
- `provider profiles` guardan base URL, ultimo modelo y credenciales cuando aplica.
|
|
51
|
+
- `agentName` queda reservado como nombre operativo para futuros subagentes.
|
|
52
|
+
- los proveedores visibles ya resuelven perfiles de forma compatible; `ollama` y `zai` fueron la primera migracion completa y el resto usa fallback a la configuracion anterior.
|
|
53
|
+
- La configuracion anterior sigue sirviendo como fallback para no romper instalaciones existentes.
|
|
54
|
+
|
|
55
|
+
## Convenciones de Código
|
|
56
|
+
|
|
57
|
+
- **TypeScript estricto desactivado** (`strict: false`), pero mantener buenas prácticas de tipado.
|
|
58
|
+
- **Módulos ESM** (`"type": "module"`), usar `import`/`export` siempre.
|
|
59
|
+
- **Resolución de módulos:** `NodeNext` — incluir extensiones en imports cuando sea necesario.
|
|
60
|
+
- **JSX:** `react-jsx` (usado con Ink para la UI de terminal).
|
|
61
|
+
- **Sin comentarios innecesarios** en el código a menos que se soliciten explícitamente.
|
|
62
|
+
- Mantener cambios **mínimos y enfocados** en la tarea solicitada.
|
|
63
|
+
- Respetar el estilo de formato existente (indentación, espacios, etc.).
|
|
64
|
+
|
|
65
|
+
## Notas Importantes
|
|
66
|
+
|
|
67
|
+
- No publicar el paquete directamente; el proceso de publicación requiere la variable de entorno `AUTHORIZED`.
|
|
68
|
+
- `tsconfig.json` se usa para compilaciones del proyecto y `tsconfig.typecheck.json` para validación de tipos.
|
|
69
|
+
- Los archivos de distribución se generan en `dist/`.
|
|
70
|
+
- Consultar `RECOVERY_NOTES.md` y `RENAMING_NOTES.md` para contexto histórico del proyecto.
|
package/docs/LIMITS.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
## Limites y uso por proveedor
|
|
2
|
+
|
|
3
|
+
`/limites` (alias `/limits`) consulta cada proveedor configurado y te muestra cuanto has consumido, cuanto te queda y los limites de tu plan, en una sola vista.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
/limites
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Que hace:
|
|
10
|
+
|
|
11
|
+
1. Itera sobre todos los `provider profile` que tienes guardados.
|
|
12
|
+
2. Para cada uno, si hay un adapter implementado, llama a su API real en paralelo (con timeout).
|
|
13
|
+
3. Suma a la respuesta el contador local de tokens del CLI: cuantos tokens ha consumido este perfil en la sesion actual y en el historico persistido en SQLite.
|
|
14
|
+
|
|
15
|
+
Estado de cada proveedor:
|
|
16
|
+
|
|
17
|
+
| Proveedor | Que se consulta |
|
|
18
|
+
|----------------|-----------------------------------------------------------------------------------------------------------------------|
|
|
19
|
+
| Claude (OAuth) | `GET /api/oauth/usage` -> ventanas (5h/7d/Opus/Sonnet) y extra usage. Reusa el cliente que alimenta a `/usage` |
|
|
20
|
+
| Anthropic API | `no-data` — solo headers `anthropic-ratelimit-*` por llamada |
|
|
21
|
+
| OpenAI OAuth | `no-data` — Codex/ChatGPT solo exponen rate limits dentro del `TokenCountEvent` de cada respuesta del modelo |
|
|
22
|
+
| OpenAI API | `GET /v1/usage` (requiere admin key); si la key no tiene permiso, `no-data` |
|
|
23
|
+
| OpenRouter | `GET /api/v1/auth/key` -> creditos, limite, rate limit |
|
|
24
|
+
| MiniMax | `GET /v1/token_plan/remains` -> uso por modelo (endpoint reverse-engineered desde MiniMax-AI/cli `mmx quota show`) |
|
|
25
|
+
| Z.AI | `GET /api/monitor/usage/quota/limit` -> tokens usados/limite del coding plan |
|
|
26
|
+
| Ollama local | Siempre `ok` (ilimitado, corre en tu maquina); cuenta modelos disponibles |
|
|
27
|
+
| Ollama Cloud | `no-data` salvo localhost |
|
|
28
|
+
|
|
29
|
+
El contador local de tokens funciona para todos los proveedores por igual: se persiste en `~/.context/provider-state.sqlite3` y te permite saber cuanto has gastado aunque el proveedor no exponga API. La cuenta empieza en cero la primera vez que ejecutas `/limites` despues de instalar.
|
|
30
|
+
|
|
31
|
+
Comandos relacionados:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
/limites # vista interactiva por proveedor
|
|
35
|
+
/usage # solo Claude: limites del plan vistos por Settings
|
|
36
|
+
/cost # costo de la sesion actual
|
|
37
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
## Servidores MCP externos
|
|
2
|
+
|
|
3
|
+
Context Code soporta el [Model Context Protocol](https://modelcontextprotocol.io). Puedes conectar servidores MCP de terceros para dar a los agentes herramientas extra: leer una base de datos, consultar Sentry, hablar con tu wiki interna, etc.
|
|
4
|
+
|
|
5
|
+
Comandos:
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
/mcp # abre el panel de servidores configurados
|
|
9
|
+
/mcp add <name> -- <command> [args...] # registra un servidor stdio
|
|
10
|
+
/mcp add --transport http <name> <url> # registra un servidor HTTP
|
|
11
|
+
/mcp add --transport sse <name> <url> # registra un servidor SSE
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Tambien puedes registrar servidores con `--scope project` (escribe en `.mcp.json` del proyecto) o `--scope user` (queda solo para tu usuario). El default es `project` cuando estas dentro de un repo y `user` cuando no.
|
|
15
|
+
|
|
16
|
+
### Ejemplo: conectar una base de datos SQLite
|
|
17
|
+
|
|
18
|
+
Existen servidores MCP listos para hablar con bases de datos. El mas conocido es `mcp-server-sqlite`. Lo instalas y lo registras:
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
# 1. Instalar el servidor (o usar npx para no instalar)
|
|
22
|
+
pip install mcp-server-sqlite
|
|
23
|
+
|
|
24
|
+
# 2. Registrarlo en Context Code apuntando a tu DB
|
|
25
|
+
/mcp add sqlite-local -- mcp-server-sqlite --db-path ./data/app.sqlite
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
A partir de ese momento, los agentes que ejecuten en este proyecto pueden listar tablas, hacer SELECT y describir el esquema sin que tu tengas que escribir SQL ni copiar/pegar resultados.
|
|
29
|
+
|
|
30
|
+
### Ejemplo: conectar Postgres
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
# Con uvx (recomendado, sin instalacion previa)
|
|
34
|
+
/mcp add postgres-prod --transport stdio -- uvx mcp-server-postgres \
|
|
35
|
+
--connection-string "postgres://user:pass@localhost:5432/mydb"
|
|
36
|
+
|
|
37
|
+
# O con un servidor HTTP ya desplegado
|
|
38
|
+
/mcp add postgres-prod --transport http https://mcp.midominio.com/postgres \
|
|
39
|
+
--header "Authorization: Bearer $TOKEN"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Pasos a tener en cuenta:
|
|
43
|
+
|
|
44
|
+
- Los servidores MCP corren con tus permisos. Si conectas a una DB de produccion, considera dar al servidor solo credenciales de lectura.
|
|
45
|
+
- Variables sensibles: usa `-e VAR=valor` al registrar el server stdio para inyectar tokens sin que queden en el comando visible.
|
|
46
|
+
- Las herramientas MCP aparecen en los agentes con prefijo `mcp__<name>__<tool>`. Puedes restringir cuales se autorizan con `--allowedTools` al iniciar la sesion.
|
|
47
|
+
- Si un equipo (`database`, por ejemplo) tendria que usar este MCP, asignale un agente con `/team equipo <team> database <provider>/<agent>` y el orquestador local lo invocara cuando el plan lo requiera.
|
|
48
|
+
|
|
49
|
+
### Diferencia con el storage interno
|
|
50
|
+
|
|
51
|
+
El archivo `~/.context/provider-state.sqlite3` es persistencia interna del CLI (perfiles, runs, credenciales). **No es un MCP** y los agentes no lo consultan directamente; solo el runtime lo lee/escribe. Si quieres exponer datos de una base **a los agentes**, registra un servidor MCP como en los ejemplos de arriba.
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
## Sistema multi-proveedor y multi-perfil
|
|
2
|
+
|
|
3
|
+
Context Code ya funciona con una capa de proveedores mas flexible. La idea base es separar:
|
|
4
|
+
|
|
5
|
+
- el `provider` como backend de inferencia
|
|
6
|
+
- el `provider profile` como perfil guardado dentro de ese proveedor
|
|
7
|
+
- el `agentName` como nombre operativo pensado para futuros subagentes
|
|
8
|
+
|
|
9
|
+
### Provider profile
|
|
10
|
+
|
|
11
|
+
Un `provider profile` es una configuracion persistida para un proveedor concreto. Sirve para guardar datos que quieres recordar por separado, por ejemplo:
|
|
12
|
+
|
|
13
|
+
- base URL
|
|
14
|
+
- ultimo modelo usado
|
|
15
|
+
- credenciales o token, cuando el proveedor lo soporta
|
|
16
|
+
|
|
17
|
+
El nombre del perfil es el identificador humano que ves en el comando. El `agentName` es el nombre tecnico que queda preparado para el futuro sistema de subagentes. Por ejemplo:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
/provider ollama profile local
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Puede guardar un perfil llamado `local` con un `agentName` del estilo `ollama-local`.
|
|
24
|
+
|
|
25
|
+
### Comando `/provider`
|
|
26
|
+
|
|
27
|
+
El comando `/provider` ahora sirve para cambiar de proveedor y tambien para activar un perfil concreto.
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
/provider
|
|
31
|
+
/provider list
|
|
32
|
+
/provider ollama
|
|
33
|
+
/provider zai profile main
|
|
34
|
+
/provider ollama profile local
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Comportamiento de `/provider`:
|
|
38
|
+
|
|
39
|
+
- `/provider` (sin argumentos) abre el selector interactivo de proveedores.
|
|
40
|
+
- `/provider list` muestra una tabla detallada con todos tus proveedores, perfiles guardados, estado de conexión (Conectado/Desconectado) y perfiles activos.
|
|
41
|
+
- `/provider <proveedor>` cambia al proveedor especificado.
|
|
42
|
+
- `/provider <proveedor> profile <nombre>` activa (o crea) un perfil específico para ese proveedor.
|
|
43
|
+
- `/provider <proveedor> <URL>` cambia la Base URL del proveedor (ej. `/provider ollama http://localhost:11434/v1`).
|
|
44
|
+
- `/provider <proveedor> clear` restaura la URL por defecto del proveedor.
|
|
45
|
+
|
|
46
|
+
Tambien existe `/profile` para inspeccionar y navegar perfiles ya guardados:
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
/profile
|
|
50
|
+
/profile list
|
|
51
|
+
/profile current
|
|
52
|
+
/profile use ollama local
|
|
53
|
+
/profile rename ollama local gpu-lab
|
|
54
|
+
/profile model ollama gpu-lab llama3.2
|
|
55
|
+
/profile model ollama gpu-lab clear
|
|
56
|
+
/profile agent ollama gpu-lab ollama-lab
|
|
57
|
+
/profile remove all
|
|
58
|
+
/profile remove ollama gpu-lab
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Comportamiento de `/profile`:
|
|
62
|
+
|
|
63
|
+
- `/profile` o `/profile list` muestra todos los perfiles guardados por proveedor.
|
|
64
|
+
- `/profile current` muestra el perfil activo.
|
|
65
|
+
- `/profile use <proveedor> <perfil>` activa el perfil y restaura su ultimo modelo si existe.
|
|
66
|
+
- `/profile rename <proveedor> <actual> <nuevo>` renombra el perfil.
|
|
67
|
+
- `/profile model <proveedor> <perfil> <modelo>` corrige o fija el ultimo modelo guardado para ese perfil.
|
|
68
|
+
- `/profile model <proveedor> <perfil> clear` limpia el modelo guardado.
|
|
69
|
+
- `/profile agent <proveedor> <perfil> <agentName>` cambia el nombre tecnico del perfil para futuros subagentes.
|
|
70
|
+
- `/profile remove <proveedor> <perfil>` elimina el perfil.
|
|
71
|
+
- `/profile remove all` elimina todos los perfiles guardados de una sola vez.
|
|
72
|
+
|
|
73
|
+
Notas importantes:
|
|
74
|
+
|
|
75
|
+
- El nombre visible del perfil y el `agentName` no son lo mismo.
|
|
76
|
+
- El nombre visible sirve para navegar con `/provider ... profile ...` o `/profile use ...`.
|
|
77
|
+
- `agentName` queda reservado como identificador operativo para el futuro sistema de subagentes.
|
|
78
|
+
- Al renombrar un perfil, sus credenciales por perfil tambien se mueven al nuevo identificador para no perder API keys u OAuth.
|
|
79
|
+
- Al borrar un perfil, tambien se limpian sus credenciales scoped cuando existen.
|
|
80
|
+
- `/profile remove all` limpia todos los perfiles y sus credenciales scoped asociadas, pero no toca los fallbacks legacy de compatibilidad.
|
|
81
|
+
|
|
82
|
+
Comportamiento esperado:
|
|
83
|
+
|
|
84
|
+
- `/provider` abre la seleccion de proveedor.
|
|
85
|
+
- `/provider <proveedor>` cambia al proveedor activo.
|
|
86
|
+
- `/provider <proveedor> profile <nombre>` selecciona o crea ese perfil y lo deja activo.
|
|
87
|
+
- La configuracion de ese perfil se reutiliza la proxima vez que vuelvas al mismo proveedor o perfil.
|
|
88
|
+
|
|
89
|
+
Despues de activar un perfil, puedes seguir ajustando sus valores con los comandos normales del proveedor:
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
/provider ollama http://localhost:11434/v1
|
|
93
|
+
/provider ollama clear
|
|
94
|
+
/provider list
|
|
95
|
+
/model
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Soporte Multi-cuenta real
|
|
99
|
+
|
|
100
|
+
Context Code permite gestionar múltiples cuentas del mismo proveedor (como varias cuentas de Claude o OpenAI) de forma independiente.
|
|
101
|
+
|
|
102
|
+
```sh
|
|
103
|
+
/login --profile personal
|
|
104
|
+
/login --profile trabajo
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
- Al usar el flag `--profile` (o `-p`), las credenciales se guardan específicamente en ese perfil.
|
|
108
|
+
- El sistema detecta automáticamente si el perfil ya existe o crea uno nuevo.
|
|
109
|
+
- Puedes saltar entre cuentas fácilmente usando `/provider claude profile personal` o listarlas todas con `/provider list`.
|
|
110
|
+
|
|
111
|
+
### Persistencia por perfil
|
|
112
|
+
|
|
113
|
+
La persistencia queda separada por perfil cuando el proveedor lo soporta.
|
|
114
|
+
|
|
115
|
+
- `base URL` queda guardada por perfil.
|
|
116
|
+
- `ultimo modelo` queda guardado por perfil.
|
|
117
|
+
- `credenciales` quedan guardadas por perfil cuando aplica, incluyendo OAuth y API keys.
|
|
118
|
+
- Si no existe un perfil nuevo, el sistema intenta reutilizar o migrar la configuracion vieja para no romper instalaciones existentes.
|
|
119
|
+
|
|
120
|
+
### SQLite autogenerable
|
|
121
|
+
|
|
122
|
+
La metadata de proveedores y perfiles ahora se apoya en una base SQLite autogenerable:
|
|
123
|
+
|
|
124
|
+
- archivo: `~/.context/provider-state.sqlite3`
|
|
125
|
+
- se crea sola al arrancar si no existe
|
|
126
|
+
- si hay configuracion legacy previa, puede migrarla con `/profile migrate`
|
|
127
|
+
- en Windows/Linux, las credenciales de proveedores tambien se almacenan en esta misma DB
|
|
128
|
+
- esas credenciales se guardan cifradas localmente antes de persistirse en `secure_storage`
|
|
129
|
+
|
|
130
|
+
Que se guarda ahi:
|
|
131
|
+
|
|
132
|
+
- perfiles por proveedor
|
|
133
|
+
- perfil activo
|
|
134
|
+
- proveedor activo
|
|
135
|
+
- ultimo modelo por proveedor
|
|
136
|
+
- estado runtime necesario para restaurar contexto rapido
|
|
137
|
+
- API keys, tokens OAuth y credenciales scoped por perfil, mediante la tabla `secure_storage`
|
|
138
|
+
- el contenido de `secure_storage.value` ya no queda en JSON legible; se cifra localmente antes de escribirse
|
|
139
|
+
|
|
140
|
+
Migracion de credenciales:
|
|
141
|
+
|
|
142
|
+
- si existe `~/.context/.credentials.json`, se importa automaticamente a SQLite la primera vez que se lee el storage seguro
|
|
143
|
+
- si la importacion termina bien, el archivo legacy `.credentials.json` se elimina para evitar dos fuentes de verdad
|
|
144
|
+
- en macOS se mantiene el flujo de keychain con fallback, segun el backend disponible
|
|
145
|
+
|
|
146
|
+
Estado actual:
|
|
147
|
+
|
|
148
|
+
- Windows/Linux ya trabajan en modo `SQLite-only` para providers, perfiles, modelos, base URLs y credenciales
|
|
149
|
+
- `/status` y `/profile migrate` muestran si el runtime quedo completamente migrado
|
|
150
|
+
- macOS sigue usando keychain/fallback por diseno; esa ruta queda fuera de esta migracion
|
|
151
|
+
|
|
152
|
+
### Proveedores actuales
|
|
153
|
+
|
|
154
|
+
Estos son los proveedores visibles hoy y su estado general:
|
|
155
|
+
|
|
156
|
+
- `Claude (Anthropic)`: usa OAuth y ahora puede resolver sesion por perfil, manteniendo fallback al storage anterior.
|
|
157
|
+
- `OpenAI / Codex`: usa OAuth por perfil con compatibilidad hacia atras.
|
|
158
|
+
- `OpenRouter`: usa API key y endpoint configurable por perfil.
|
|
159
|
+
- `Ollama Local`: ya trabaja con perfiles; no usa API key y guarda base URL y modelo por perfil.
|
|
160
|
+
- `Ollama Cloud`: usa endpoint configurable y queda alineado con la capa de perfiles.
|
|
161
|
+
- `Z.AI`: ya trabaja con perfiles; guarda API key, base URL y modelo por perfil.
|
|
162
|
+
- `MiniMax`: usa API key y endpoint compatible con Anthropic por perfil.
|
|
163
|
+
|
|
164
|
+
### Compatibilidad hacia atras
|
|
165
|
+
|
|
166
|
+
La migracion esta pensada para no romper la configuracion anterior:
|
|
167
|
+
|
|
168
|
+
- los valores anteriores pueden servir de base para crear el perfil por defecto durante la migracion inicial
|
|
169
|
+
- `/profile migrate` limpia el remanente legacy cuando la DB ya quedo consistente
|
|
170
|
+
- en Windows/Linux el objetivo final ya es `SQLite-only`
|
|
171
|
+
|
|
172
|
+
### Notas de uso
|
|
173
|
+
|
|
174
|
+
- `Ollama` esta pensado como backend local, con el default en `http://localhost:11434/v1`.
|
|
175
|
+
- `Z.AI` requiere API key por perfil y es el primer proveedor no local con soporte real de perfiles.
|
|
176
|
+
- `Claude`, `OpenAI`, `OpenRouter`, `MiniMax` y `Ollama Cloud` ya resuelven su estado desde la arquitectura nueva con fallback a la configuracion anterior.
|
|
177
|
+
- El comando `/model` sigue existiendo y ahora debe entenderse junto con el perfil activo.
|
|
178
|
+
|
|
179
|
+
## Datos guardados en SQLite
|
|
180
|
+
|
|
181
|
+
La base se crea automaticamente en:
|
|
182
|
+
|
|
183
|
+
```text
|
|
184
|
+
~/.context/provider-state.sqlite3
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Ademas de perfiles y credenciales de providers, ahi se guardan:
|
|
188
|
+
|
|
189
|
+
- `provider_workspaces`: proveedores disponibles para equipos
|
|
190
|
+
- `provider_agents`: agentes por proveedor/perfil
|
|
191
|
+
- `provider_agent_capabilities`: capacidades declaradas de agentes
|
|
192
|
+
- `teams`: equipos
|
|
193
|
+
- `team_units`: equipos internos dentro de un team
|
|
194
|
+
- `team_unit_members`: miembros de cada equipo interno
|
|
195
|
+
- `orchestration_runs`: ejecuciones
|
|
196
|
+
- `orchestration_tasks`: tareas
|
|
197
|
+
- `orchestration_messages`: bitacora de decisiones y eventos
|
|
198
|
+
- `orchestration_task_results`: resultados por tarea
|
|
199
|
+
- `orchestration_team_reports`: reportes por equipo interno
|
|
200
|
+
- `orchestration_run_reports`: reporte consolidado de una ejecucion
|
|
201
|
+
- `secure_storage`: credenciales cifradas y configuracion sensible de providers, Telegram y WhatsApp en Windows/Linux
|