dsh-composer-plus 1.20.0 → 1.21.1
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.de.md +74 -11
- package/README.es.md +74 -11
- package/README.fr.md +74 -11
- package/README.hi.md +74 -11
- package/README.id.md +74 -11
- package/README.ja.md +74 -11
- package/README.ko.md +74 -11
- package/README.md +74 -11
- package/README.pt-BR.md +74 -11
- package/README.ru.md +74 -11
- package/README.tr.md +74 -11
- package/README.vi.md +74 -11
- package/README.zh.md +74 -11
- package/assets/features/diffComments.webp +0 -0
- package/assets/features/memoryCopy.webp +0 -0
- package/assets/features/memoryExport.webp +0 -0
- package/assets/features/memoryHistory.webp +0 -0
- package/assets/features/memoryPerChat.webp +0 -0
- package/assets/features/memorySource.webp +0 -0
- package/assets/features/memoryStale.webp +0 -0
- package/assets/features/memorySuggest.webp +0 -0
- package/assets/features/nextWaiting.webp +0 -0
- package/assets/features/optionPicks.webp +0 -0
- package/assets/features/quoteReply.webp +0 -0
- package/assets/features/rejectNote.webp +0 -0
- package/assets/features/remoteComputers.webp +0 -0
- package/assets/features/secretInput.webp +0 -0
- package/assets/features/sideChat.webp +0 -0
- package/assets/features/taskBoard.webp +0 -0
- package/client.js +2664 -202
- package/index.js +1455 -82
- package/package.json +4 -3
- package/release-notes.json +14 -14
- package/tether/gateway/server.mjs +246 -21
package/README.es.md
CHANGED
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de eso se encarga la app).
|
|
31
31
|
|
|
32
|
-
> El pnpm de dsh omite las versiones publicadas hace menos de 24 horas. Justo después de una versión nueva, añade la versión: `dsh-composer-plus@1.
|
|
32
|
+
> El pnpm de dsh omite las versiones publicadas hace menos de 24 horas. Justo después de una versión nueva, añade la versión: `dsh-composer-plus@1.21.1`.
|
|
33
33
|
|
|
34
34
|
## Funciones
|
|
35
35
|
|
|
@@ -71,9 +71,21 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
71
71
|
| **Pasos planificados** | <a id="feature-plannedsteps"></a>Desactivada de forma predeterminada: actívala en **Configuración → Composer Plus**. El agente recibe la herramienta `plan_next_steps`: en el mismo mensaje que un comando, puede planificar los siguientes comandos con sus argumentos exactos y una condición, por ejemplo «ejecuta `npm test` cuando la compilación pase». Cuando el resultado cumple la condición, Composer Plus ejecuta el siguiente paso por sí mismo, sin una nueva llamada al modelo, así un chat largo usa menos tokens. El paso aparece en el chat como una línea corta, «Composer Plus · Planned steps: ran `test` … without a model call», seguida de su llamada a la herramienta y su resultado. Solo pasos de `bash`, `read`, `grep` y `glob`; las aprobaciones, el sandbox y Archivos protegidos se aplican a cada paso como siempre. El modelo vuelve a responder cuando una condición falla, cuando dos pasos están listos a la vez, después del último paso y cuando envías un mensaje. La idea viene de HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Captura: Pasos planificados"></a> |
|
|
72
72
|
| **Archivos protegidos** | <a id="feature-protectedfiles"></a>Activado de forma predeterminada. Las herramientas de archivos propias del agente no pueden leer ni cambiar los archivos que coinciden con tus patrones: `read`, `read_image` y `grep` sobre un archivo se rechazan con los patrones de **lectura y escritura**, y `write`, `edit` y `str_replace_editor` con los dos tipos. El agente lee el motivo y se le indica que te pregunte. Los patrones predeterminados son `.env*`, `*.pem` y `*.key`. Configuración → Composer Plus → **Archivos protegidos**: añade un patrón (por ejemplo `published/**` o `config/*.yml`), haz clic en su tipo para cambiar entre **lectura y escritura** y **solo escritura**, quítalo con ✕ o haz clic en **Usar los valores predeterminados**. Un patrón sin `/` coincide con un nombre de archivo en cualquier carpeta. Es una barrera de protección, no un sandbox: un comando de shell (`cat .env`), un script o una herramienta MCP aún pueden llegar al archivo (consulta Límites). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Captura: Archivos protegidos"></a> |
|
|
73
73
|
| **Comandos bloqueados** | <a id="feature-blockedcommands"></a>Activado de forma predeterminada, con una lista vacía. Los comandos de shell del agente (`bash`, `pwsh`) no pueden ejecutar un comando que coincida con tus reglas: una regla **bloquear** rechaza la llamada (el agente lee el motivo y se le indica que te pregunte), una regla **preguntar antes** muestra la tarjeta de aprobación de dsh, y el comando solo se ejecuta cuando tú lo permites. Configuración → Composer Plus → **Comandos bloqueados**: escribe una regla (por ejemplo `npm publish`, `git push --force` o `ssh *192.168.2.19`), haz clic en el tipo para cambiar entre **bloquear** y **preguntar antes** y luego haz clic en **Añadir**; haz clic en el tipo de una regla para cambiarlo y quítala con ✕. Una regla es un nombre de comando y palabras que deben venir después de él en este orden; `*` coincide con cualquier texto. La comprobación también encuentra el comando después de `&&`, `;`, `\|`, dentro de `$(…)`, `bash -c "…"` o `eval`, y después de `sudo` o `env`. Es una barrera de protección, no un sandbox: una variable (`$CMD`), un archivo de script u otro programa aún pueden ejecutar el comando (consulta Límites). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Captura: Comandos bloqueados"></a> |
|
|
74
|
-
| **Tablero de tareas** | <a id="feature-taskboard"></a>Barra lateral izquierda → **Tablero de tareas
|
|
74
|
+
| **Tablero de tareas** | <a id="feature-taskboard"></a>Barra lateral izquierda → **Tablero de tareas**, o pulsa `Cmd+Shift+K` (`Ctrl+Shift+K` en Windows y Linux) en cualquier lugar de dsh. Un tablero kanban de tus chats de dsh con el estado en vivo que muestra la barra lateral: un chat que espera tu aprobación, tu respuesta o la revisión de un plan está en **En revisión** con un punto naranja, un chat en ejecución está en **En curso** y un chat terminado que aún no abriste está en **Hecho** (verde). Cuando abres un chat, su tarjeta sale de **Hecho** por sí sola; haz clic en **Terminados hace poco (N)**, debajo de las tarjetas verdes, para ver los chats terminados que ya leíste (los 10 más recientes y luego **Mostrar N más antiguas**; abierto o cerrado se guarda en este dispositivo). Un chat que termina mientras está abierto detrás del tablero (una **Nueva tarea**) sigue verde hasta que lo abres. Haz clic en el nombre del proyecto, arriba del tablero, para abrir la lista de proyectos y elige un proyecto o **Todos los proyectos**; una carpeta de «Una rama por chat» cuenta como su proyecto. La lista se cierra al elegir, con `Esc` o con un clic fuera de ella. Escribe en **Buscar proyectos**, arriba de la lista, para encontrar un proyecto por su nombre (no importan las mayúsculas ni los acentos; `Esc` vacía el cuadro), pulsa `Enter` para elegir la primera coincidencia y haz clic en **Activos en las últimas 2 horas** para mostrar solo los proyectos con un chat que espera, se ejecuta, terminó sin que lo vieras o cambió en las últimas 2 horas (se guarda en este dispositivo). **Nueva tarea** (o `n`) abre el propio chat nuevo de dsh en el proyecto que muestra el tablero (con **Todos los proyectos**, el proyecto que elige Nueva sesión de dsh), así que puedes añadir archivos, usar comandos y elegir el modelo como en cualquier chat. Cuando se envía tu primer mensaje, el tablero vuelve por sí solo. Hasta entonces, el chat espera en la parte superior de **En curso** como **Nueva tarea**: haz clic en él para escribir el primer mensaje. Un proyecto con un chat que te espera tiene un punto naranja en la lista de proyectos (el nombre del proyecto arriba también lo tiene mientras algún chat espera). dsh pone nombre al chat y el modelo del chat escribe hasta 3 etiquetas a partir de ese mensaje. Haz clic en una tarjeta para abrir su chat. Haz clic en una tarjeta naranja (o en su **Responder**) para responderla en el tablero; el panel tiene **Abrir chat** para ver el chat entero: **Rechazar** o **Permitir una vez**, **Aprobar** o **Solicitar cambios** para un plan, o las opciones y tu propio texto para una pregunta. Haz clic en **×** en una tarjeta terminada para quitarla del tablero, o abre **Terminados hace poco** y haz clic en **Limpiar todo**, en la parte superior de **Hecho**, para quitar esas tarjetas del tablero: primero muestra cuántas tarjetas de qué proyecto se quitan, y las tarjetas sin leer (verdes) se quedan. Durante los 8 segundos siguientes, **Deshacer** devuelve las tarjetas; **Quitadas (N)**, debajo de **Hecho**, lista las tarjetas que están fuera del tablero, y **Volver a poner** muestra una de nuevo en **Hecho**. No se borra ningún chat: los chats siguen en la barra lateral de dsh, el tablero lo recuerda después de reiniciar (Tether muestra el mismo tablero) y un chat que vuelve a ejecutarse regresa al tablero. Apunta a una tarjeta de **En curso** (o mueve el foco del teclado a ella) para ver su progreso: cuánto tiempo lleva en ejecución, el paso de su lista de tareas pendientes, la herramienta que se ejecuta ahora y la última línea del agente. En Configuración → Composer Plus → Tablero de tareas, **Progreso al pasar el cursor** elige **Rápido (sin IA)** (el predeterminado: solo lee el chat) o **Resumen con IA** (una llamada corta al modelo del chat también escribe una o dos frases). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Captura: Tablero de tareas"></a> |
|
|
75
75
|
| **Memoria del proyecto** | <a id="feature-projectmemory"></a>Desactivada de forma predeterminada: actívala en **Configuración → Composer Plus**. Cada carpeta de proyecto tiene su propia memoria, que los chats posteriores de ese proyecto leen, como DS Bot guarda una por Bot. Después de cada turno terminado, una llamada al modelo del chat lee los mensajes nuevos (no los revertidos), guarda tus preferencias, decisiones y datos duraderos como notas breves, y cambia o elimina las antiguas. El agente también puede guardar, eliminar y buscar notas por sí mismo (`memory_remember`, `memory_forget`, `memory_recall`). Una nota también puede ser global: todos los proyectos la leen. Un chat nuevo recibe las notas en su prompt de sistema; una nota guardada después aparece desde el chat siguiente. Los archivos son Markdown en la carpeta de inicio de dsh (`storages/dsh-composer-plus/memory/`), nunca en la carpeta del proyecto. **Abrir memoria**, en la misma fila, muestra todas las notas guardadas agrupadas por proyecto (y la memoria global), con un filtro. Escribe con tus palabras qué cambiar (por ejemplo "cambié yarn por pnpm") y pulsa **Vista previa de los cambios**: el modelo predeterminado de dsh propone los cambios y solo **Aplicar** los guarda. En Tether: menú del título del chat → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Captura: Memoria del proyecto"></a> |
|
|
76
|
+
| **Historial de versiones de la memoria** | <a id="feature-memoryhistory"></a>Activado por defecto mientras **Memoria del proyecto** está activada. Antes de cada guardado de la memoria (el agente, la revisión tras un turno, **Abrir memoria**), se guarda una copia de las notas tal como estaban. En **Abrir memoria**, selecciona un proyecto o **Memoria global** y luego **Historial**: las versiones por fecha y quién cambió la memoria después de cada una. Selecciona una versión para ver como diff lo que cambia una restauración y luego **Restaurar**. Las notas anteriores a una restauración también se guardan, así que puedes deshacerla. Se conservan las 50 versiones más recientes de cada memoria. En Tether: menú del título del chat → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Captura: Historial de versiones de la memoria"></a> |
|
|
77
|
+
| **Exportar la memoria a AGENTS.md** | <a id="feature-memoryexport"></a>En **Abrir memoria**, selecciona un proyecto y luego **Exportar a AGENTS.md**: las notas de ese proyecto van a una sección marcada de `AGENTS.md` en su carpeta, para que puedas confirmarlas en git y compartirlas con tu equipo y otras herramientas de agentes. Primero ves el cambio como diff; solo **Escribir AGENTS.md** lo guarda. La siguiente exportación sustituye solo esa sección. La memoria global, las fuentes y las fechas no se incluyen. En Tether: menú del título del chat → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Captura: Exportar la memoria a AGENTS.md"></a> |
|
|
78
|
+
| **Enlace de origen de las notas de memoria** | <a id="feature-memorysource"></a>En **Abrir memoria**, una nota que vino de un chat (la guardó el agente, la conservó la revisión tras un turno o aceptaste una sugerencia) tiene **Origen** al lado: un clic abre ese chat en el mensaje, para que compruebes por qué está la nota antes de cambiarla o borrarla. Una nota de una versión anterior solo abre su chat. En Tether: menú del título del chat → Project memory → Source. | <a href="assets/features/memorySource.webp"><img src="assets/features/memorySource.webp" width="160" alt="Captura: Enlace de origen de las notas de memoria"></a> |
|
|
79
|
+
| **Copiar la memoria a otro proyecto** | <a id="feature-memorycopy"></a>En **Abrir memoria**, selecciona un proyecto o **Memoria global** y luego **Copiar al proyecto**: marca las notas, busca entre los proyectos de dsh y haz clic en uno. Todas las notas marcadas van a la memoria de ese proyecto (con su tema y su origen), o ninguna: si una no cabe, no se copia nada y se muestra el motivo. Una nota que el proyecto ya tiene se omite. En Tether: menú del título del chat → Project memory → Copy to project. | <a href="assets/features/memoryCopy.webp"><img src="assets/features/memoryCopy.webp" width="160" alt="Captura: Copiar la memoria a otro proyecto"></a> |
|
|
80
|
+
| **Buscar notas de memoria obsoletas** | <a id="feature-memorystale"></a>Al seleccionar un proyecto en **Abrir memoria**, las rutas de archivo (en `código`), los scripts de npm y los nombres de rama que mencionan sus notas se comparan con el proyecto actual. Una nota que menciona algo que el proyecto ya no tiene muestra ⚠ con lo que falta, para que la corrijas o la borres antes de que el modelo trabaje con ella. Solo lee archivos normales dentro de la carpeta del proyecto y una lista de ramas de git; no cambia nada ni llama a ningún modelo. En Tether: menú del título del chat → Project memory. | <a href="assets/features/memoryStale.webp"><img src="assets/features/memoryStale.webp" width="160" alt="Captura: Buscar notas de memoria obsoletas"></a> |
|
|
81
|
+
| **No usar la memoria en este chat** | <a id="feature-memoryperchat"></a>Mientras **Memoria del proyecto** está activada, la cabecera del chat muestra **Memoria activada**: haz clic para desactivar la memoria solo en ese chat (**Memoria desactivada**). Entonces el modelo de ese chat no recibe la sección de memoria ni las herramientas de memoria, y la revisión tras cada turno no lo lee. En dsh 0.2.1 y posteriores el mismo botón está en la pantalla de chat nuevo, así que un chat de prueba empieza sin memoria. Los demás chats no cambian. En Tether: menú del título del chat → Use project memory. | <a href="assets/features/memoryPerChat.webp"><img src="assets/features/memoryPerChat.webp" width="160" alt="Captura: No usar la memoria en este chat"></a> |
|
|
82
|
+
| **Sugerir notas de memoria desde un chat** | <a id="feature-memorysuggest"></a>Mientras **Memoria del proyecto** está activada, la cabecera del chat tiene **Sugerir para la memoria**: un clic pregunta al modelo del chat qué reglas y decisiones de este chat vale la pena guardar para los chats siguientes. Cada sugerencia muestra el porqué; **Aceptar** la guarda con un enlace al chat y al mensaje de donde vino, **Rechazar** la descarta. No se guarda nada antes de aceptar, y el modelo solo se llama cuando haces clic. Los mensajes retirados por una reversión no se envían. En Tether: menú del título del chat → Suggest for memory. | <a href="assets/features/memorySuggest.webp"><img src="assets/features/memorySuggest.webp" width="160" alt="Captura: Sugerir notas de memoria desde un chat"></a> |
|
|
76
83
|
| **Permitir en este chat** | <a id="feature-allowforchat"></a>Cuando la revisión automática te pregunta, la tarjeta de aprobación muestra **Permitir en este chat**: a partir de entonces, la misma herramienta en el mismo chat queda permitida, con cualquier argumento, hasta que termina el límite de tiempo (1 hora por defecto; elígelo en **Configuración → Composer Plus → Permitir en este chat**). Después, el agente vuelve a preguntar. Un chip en la cabecera muestra los permisos concedidos con su hora de fin y permite revocarlos. Los permisos se mantienen tras un reinicio. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Captura: Permitir en este chat"></a> |
|
|
84
|
+
| **Rechazar con nota** | <a id="feature-rejectnote"></a>La tarjeta de aprobación muestra **Rechazar con nota…** junto a **Rechazar**. Haz clic, escribe el motivo o qué hacer en su lugar y haz clic en **Rechazar** (o pulsa `Enter`; `Shift+Enter` añade una línea, `Esc` cierra el campo). La nota llega primero al agente, como un mensaje dentro del turno que espera, y después se rechaza la solicitud: el modelo lee el rechazo y tu nota en el mismo turno, sin otro mensaje tuyo. Si la nota no se puede enviar, no se rechaza nada y el campo sigue abierto. En Tether: hoja de aprobación → Reject with note. | <a href="assets/features/rejectNote.webp"><img src="assets/features/rejectNote.webp" width="160" alt="Captura: Rechazar con nota"></a> |
|
|
85
|
+
| **Entrada secreta** | <a id="feature-secretinput"></a>El agente recibe la herramienta `request_secret`. Cuando necesita una contraseña, un token o una clave de API, la pide con ella en lugar de en el chat: en la fila de la herramienta aparece una tarjeta con el nombre, para qué necesita el valor, un campo de contraseña, **Guardar** y **Rechazar**. **Guardar** escribe el valor en un archivo de este Mac que solo tú puedes leer, y el agente recibe solo la ruta del archivo, que usa como entrada en un comando (por ejemplo `"$(cat <path>)"`). Si un resultado de herramienta posterior muestra el valor, `[secret]` lo reemplaza antes de que el modelo lo vea. El archivo se borra al terminar el turno. **Rechazar** le dice al agente que no lo diste. Desactívala en **Configuración → Composer Plus** para quitar la herramienta. En Tether: la barra "Secret: …" sobre el campo de texto → Enter. | <a href="assets/features/secretInput.webp"><img src="assets/features/secretInput.webp" width="160" alt="Captura: Entrada secreta"></a> |
|
|
86
|
+
| **Citar en la respuesta** | <a id="feature-quotereply"></a>Selecciona una parte de una respuesta: aparece un botón **Citar** sobre la selección. Haz clic: esa parte va al campo de texto, en la posición del cursor, como cita de Markdown (`> …`), con una línea vacía después, y el campo de texto recibe el foco para que escribas tu respuesta debajo. Solo cuenta el texto de la respuesta, no el razonamiento, las filas de herramientas ni tus propios mensajes. Una cita tiene como máximo 2.000 caracteres. `Cmd+Z` (`Ctrl+Z`) la quita. En Tether: mantén pulsada una respuesta → Quote (la respuesta completa). | <a href="assets/features/quoteReply.webp"><img src="assets/features/quoteReply.webp" width="160" alt="Captura: Citar en la respuesta"></a> |
|
|
87
|
+
| **Chat lateral** | <a id="feature-sidechat"></a>Escribe una pregunta lateral en el campo de texto y haz clic en el botón de bocadillos (**Preguntar en un chat lateral**): se abre una copia del chat que la responde en el modo de solo lectura de dsh, mientras el chat sigue trabajando. La copia conoce el chat hasta ahora, salvo los mensajes que aún esperan en la cola, y usa su modelo. Una barra sobre su campo de texto tiene **Traer de vuelta**: el chat se abre y su campo de texto recibe tus preguntas (como citas `> `) y las respuestas. **Volver al chat** solo abre el chat. El chat lateral queda en la barra lateral como "↳ <pregunta>"; archívalo allí. En Tether: menú del título del chat → Side chat…. | <a href="assets/features/sideChat.webp"><img src="assets/features/sideChat.webp" width="160" alt="Captura: Chat lateral"></a> |
|
|
88
|
+
| **Notas del diff** | <a id="feature-diffcomments"></a>En **Panel de cambios**, abre el diff de un archivo y haz clic en **+** en una línea (Mayús+clic en una segunda línea del mismo bloque para un rango), escribe una nota y haz clic en **Guardar nota**. Las notas del chat esperan en una barra arriba del panel; **Enviar al campo de texto** las pone en la posición del cursor como Markdown: `path:12-14`, las líneas como bloque `diff` y tu nota. **Borrar** las descarta. Las notas quedan en este navegador hasta que las envíes o las borres. Necesita **Panel de cambios**. En Tether: el diff de un archivo → mantén pulsada una línea → Add note…. | <a href="assets/features/diffComments.webp"><img src="assets/features/diffComments.webp" width="160" alt="Captura: Notas del diff"></a> |
|
|
77
89
|
| **Estado del proyecto** | <a id="feature-projectstatus"></a>La fila de un proyecto en la barra lateral muestra el mismo indicador de en ejecución / en espera / terminado que sus chats, así que un proyecto contraído también te dice que un chat de dentro está trabajando o te necesita. Primero se muestra un chat que te espera, luego un chat terminado que aún no has abierto (el punto verde, también mientras otro chat sigue en ejecución) y luego el indicador de en ejecución. Pasa el puntero por encima para ver los detalles. En **Árbol de espacios de trabajo**, la fila de una carpeta superior también muestra los chats de cada proyecto que contiene (por ejemplo, cada carpeta de rama en `.worktrees/`), también cuando está contraída. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura: Estado del proyecto"></a> |
|
|
78
90
|
| **Rama de Git en las filas de chat** | <a id="feature-sessionbranch"></a>En la vista «En una sola lista» de la barra lateral, cada fila de chat muestra una pequeña etiqueta gris con la rama de git en la que estaba la carpeta del proyecto del chat en su último turno (por ejemplo `main` o `feature/login`; un HEAD separado no tiene rama y no muestra etiqueta). Dos chats de un mismo proyecto en ramas distintas ya no se ven iguales, y ves enseguida cuándo vas a continuar un chat en la rama equivocada. Pasa el puntero por la etiqueta para ver el nombre completo. La parte Host lee la rama (`git branch --show-current`, solo lectura) cuando un turno empieza y cuando termina; un chat sin turnos desde que instalaste esto, o una carpeta que no es un repositorio git, no muestra etiqueta. En «Espacio de trabajo» y «Árbol de espacios de trabajo», ninguna fila de chat muestra la etiqueta, porque el chat ya está debajo de la fila de su proyecto. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura: Rama de Git en las filas de chat"></a> |
|
|
79
91
|
| **Marcar todo como leído** | <a id="feature-markprojectread"></a>En la barra lateral, haz clic en el botón **…** de un proyecto → **Marcar todo como leído**. Todos los chats de ese proyecto pierden su punto verde de no leído a la vez; los demás proyectos conservan los suyos. La opción aparece en gris (**No hay chats sin leer**) cuando el proyecto no tiene ninguno. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Captura: Marcar todo como leído"></a> |
|
|
@@ -83,9 +95,12 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
83
95
|
| **Ordenar por estado** | <a id="feature-statusorder"></a>Barra lateral → opciones de vista → **Ordenar por** → **Por estado** (con **En una sola lista**). Primero aparecen los chats terminados (el punto de “terminado” de dsh, que también recibe un turno que acabó con un error), luego los chats en ejecución o en espera, luego los chats con una automatización activa (Tareas automatizadas) y, por último, el resto en el orden de dsh. Al abrir un chat terminado, este baja. Solo cambia la vista: selecciona **Manual** o **Última actualización** para volver. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Captura: Ordenar por estado"></a> |
|
|
84
96
|
| **Notificaciones en segundo plano** | <a id="feature-notifications"></a>Mientras dsh está en segundo plano, recibes una notificación cuando un turno termina (la primera línea de la respuesta) o cuando un chat de verdad te espera: una aprobación (el nombre de la herramienta), una respuesta (la pregunta) o la revisión de un plan. Una solicitud tiene que seguir abierta 1,5 s después, así que las aprobaciones que se responden automáticamente (permisos de la revisión automática, otros plugins) no generan ningún aviso, y una notificación se retira en cuanto se responde su solicitud. La insignia del Dock o de la barra de tareas cuenta los chats en espera. Al hacer clic se abre ese chat. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Captura: Notificaciones en segundo plano"></a> |
|
|
85
97
|
| **Abrir el chat en espera si estás inactivo** | <a id="feature-idleswitch"></a>Cuando un chat hace una pregunta, espera una aprobación o una revisión del plan (el punto naranja) o termina un turno que aún no has leído (el punto verde), y no usas dsh durante 30 segundos, dsh abre ese chat. Los chats naranjas se abren antes que los verdes. En cada grupo, primero se abre el que lleva más tiempo esperando; el siguiente se abre tras otros 30 segundos sin uso. Una tecla, un clic, un movimiento del ratón, la rueda de desplazamiento o un toque reinician los 30 segundos. Texto en el campo con el foco, texto seleccionado o un menú o diálogo abierto también detienen el cambio. Mientras un chat en espera está en pantalla, nada cambia. Si sales de un chat en espera sin responder, puede volver a abrirse tras los siguientes 30 segundos sin uso. Cuando se abre un chat verde, su punto desaparece; el siguiente chat verde solo se abre después de que vuelvas a usar dsh y luego pases 30 segundos sin usarlo. También funciona con dsh en segundo plano, pero dsh no pasa al frente. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Captura: Abrir el chat en espera si estás inactivo"></a> |
|
|
98
|
+
| **Siguiente chat en espera** | <a id="feature-nextwaiting"></a>Un botón en la cabecera de la barra lateral muestra cuántos otros chats te esperan, con un punto del color del siguiente: naranja cuando hace una pregunta o espera una aprobación o una revisión del plan, verde cuando terminó un turno que aún no has leído. Haz clic en él, o pulsa Cmd+Shift+E (Ctrl+Shift+E en Windows y Linux), para abrir ese chat. Los chats naranjas van antes que los verdes; en cada grupo, primero va el chat que lleva más tiempo esperando. El chat en pantalla no cuenta. Si ningún otro chat espera, el botón no aparece y la tecla no hace nada. Puedes cambiar la tecla en la página de atajos de teclado de dsh (Siguiente chat en espera). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Captura: Siguiente chat en espera"></a> |
|
|
99
|
+
| **Botones de opciones** | <a id="feature-optionpicks"></a>Cuando una respuesta termina con una lista de opciones (una lista numerada de 1 a 9 elementos bajo un título "Opciones" o una línea en negrita "Opciones", también "Próximos pasos" y las mismas palabras en los idiomas de la aplicación), aparece un botón para cada opción debajo de la respuesta. Un clic envía "Option N: …" con toda la opción como tu mensaje, como si lo hubieras escrito. La opción marcada "(recomendada)" se destaca. Los botones solo aparecen debajo de la respuesta más reciente, mientras el chat está inactivo y el cuadro de mensaje está vacío; una respuesta ya elegida y una respuesta retirada por una reversión no muestran botones. Mientras se muestran, la predicción del siguiente mensaje no propone nada. En una tarjeta de pregunta del agente, las teclas 1–9 eligen esa opción, igual que un clic (no en el campo de respuesta, ni en los primeros 0,8 segundos después de que aparece la pregunta). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Captura: Botones de opciones"></a> |
|
|
86
100
|
| **Idioma de la aplicación** | <a id="feature-language"></a>Configuración → Composer Plus → **Idioma de la aplicación** cambia toda la interfaz de dsh a Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt o हिन्दी (consulta más abajo). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Captura: Idioma de la aplicación"></a> |
|
|
87
101
|
| **Conexión móvil (iPhone)** | <a id="feature-mobileconnect"></a>Usa dsh desde tu iPhone con la app [Tether](tether/), en la misma red Wi-Fi o a través de [Tailscale](https://tailscale.com). Actívala en **Configuración → Composer Plus** (está desactivada de forma predeterminada, porque abre un puerto de red en este Mac). Después haz clic en **Conexión móvil**, abajo a la izquierda de la barra lateral: escanea el código QR con la Cámara del iPhone (toca **Open in Tether**) o con **Scan code** en Tether, toca **Connect** y haz clic en **Approve**. Primero instala Tether: sin la app, la Cámara no puede abrir el código. El teléfono muestra tus chats, envía mensajes (con fotos: el **+** del editor → Camera, Photos o Paste image), responde aprobaciones y preguntas, y cambia de modelo y de agente. Empareja todos los Mac que quieras: el nombre del Mac, arriba a la izquierda en la app, te permite cambiar entre ellos. El panel **Conexión móvil** muestra los iPhone emparejados con su última conexión: **Remove** desconecta uno al instante. “Tailscale only” rechaza la red local (para una red Wi-Fi compartida), y el registro de accesos muestra quién intentó conectarse. En Tether, “Settings → Privacy” bloquea la app con Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura: Conexión móvil (iPhone)"></a> |
|
|
88
|
-
| **
|
|
102
|
+
| **Equipos remotos** | <a id="feature-remotecomputers"></a>Abre el dsh de tus otros Mac a través de [Tailscale](https://tailscale.com) y continúa sus chats aquí. Actívala en **Configuración → Composer Plus** en cada Mac (está desactivada de forma predeterminada, porque abre puertos de red). En el Mac que quieres abrir, activa **Permitir que otros equipos abran este Mac**, haz clic en **Crear enlace de emparejamiento** y copia el enlace. En este Mac, elige **Añadir un equipo…** en el selector de equipos, a la izquierda del título del chat, pega el enlace y haz clic en **Conectar**. Después haz clic en **Aprobar** en el otro Mac. Desde entonces, el selector muestra **Este Mac** y tus equipos: elige uno y su dsh se abre en la pestaña Navegador de la barra lateral derecha (o en una ventana del navegador), con sus propios chats, herramientas y archivos. El panel de Configuración cambia el nombre de los equipos y los quita, y muestra los equipos que pueden abrir este Mac (**Quitar** desconecta uno al instante). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Captura: Equipos remotos"></a> |
|
|
103
|
+
| **Actualizaciones automáticas** | <a id="feature-autoupdate"></a>Al iniciar dsh, el plugin consulta la [última versión publicada en GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Si es más reciente y ya está en npm, instala esa versión exacta con el gestor de plugins propio de dsh (el mismo camino que Configuración → Plugins) y te avisa. Reinicia dsh para cargarla. **Configuración → Composer Plus → Actualizaciones de Composer Plus** muestra la versión y tiene los botones **Buscar actualizaciones** / **Actualizar ahora**. La primera vez que dsh se inicia con la nueva versión, una ventana **Novedades de Composer Plus N** muestra una vez las notas de esa versión en el idioma de **Idioma de la aplicación** (llegan con la nueva versión, sin otra llamada de red; un idioma sin notas muestra las notas en inglés); **Cerrar** o `Esc` la cierra. La ventana también aparece tras una actualización desde Configuración → Plugins o una carpeta copiada, una vez por versión nueva; no en la primera instalación. **Novedades de esta versión** en la fila de actualizaciones la abre de nuevo. Si en el disco hay una versión más reciente que la que se ejecuta, la fila pide reiniciar dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura: Actualizaciones automáticas"></a> |
|
|
89
104
|
| **Copia de seguridad** | <a id="feature-backup"></a>Configuración → Composer Plus → **Copia de seguridad** → **Hacer copia ahora** guarda todo tu directorio home de dsh (chats, ajustes, plugins, MCP, skills) en un único archivo comprimido en `~/Desktop/dsh-backups`, con una suma de comprobación. Los secretos se ocultan en el archivo comprimido: los archivos de credenciales, los archivos de claves (`.pem`, `.key`) y los valores token, secret y password de los ajustes yml se quedan solo en este equipo, en el `vault` de la carpeta. `cache/`, `dsh-runtimes/` y `node_modules` no entran en el archivo comprimido (dsh los vuelve a crear). Cada copia de seguridad de la lista tiene **Comprobar** (la lee completa), **Para otro equipo** (una carpeta para copiar al equipo nuevo, con la consola de rescate) y **Eliminar**. Los archivos comprimidos de dsh-backup en la misma carpeta también aparecen y funcionan. Para restaurar, sal de dsh y usa la consola de rescate. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Captura: Copia de seguridad"></a> |
|
|
90
105
|
| **Copia de seguridad automática** | <a id="feature-autobackup"></a>Activa **Copia de seguridad automática** (desactivada de forma predeterminada: cada copia ocupa más o menos lo mismo que tu directorio home de dsh sin su caché). Elige la frecuencia (**Cada**: de 6 horas a 7 días, 24 horas de forma predeterminada) y cuántas copias de seguridad se conservan (**Conservar**: de 3 a 14, 7 de forma predeterminada). La hora de la próxima copia aparece bajo el interruptor; una copia fallida también aparece allí y se vuelve a intentar 30 minutos después. Cuando dsh o Composer Plus se inicia con una versión nueva, se toma una instantánea poco después del inicio, antes de que la versión nueva haya usado tus datos mucho tiempo (se conservan las dos más recientes, marcadas como **Antes de una actualización**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Captura: Copia de seguridad automática"></a> |
|
|
91
106
|
| **Comprobación de registros de sesión** | <a id="feature-sessiondoctor"></a>**Comprobar registros de sesión** lee el registro de cada chat y muestra los que dsh no puede abrir (un bloque roto, una entrada cortada, un número de secuencia incorrecto). Un final incompleto no aparece en la lista: dsh lo repara por sí mismo. **Reparar desde copias de seguridad** vuelve a poner la copia de la copia de seguridad más reciente que tenga una versión sana y guarda el archivo dañado a su lado (`.corrupt-<hora>`). Los mensajes escritos después de esa copia de seguridad no están en la copia. Un chat abierto en este dsh no se repara aquí: sal de dsh y repáralo en la consola de rescate. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Captura: Comprobación de registros de sesión"></a> |
|
|
@@ -137,6 +152,9 @@ Cada paquete tiene 3280 textos: todos los textos de la interfaz de dsh `0.2.0-rc
|
|
|
137
152
|
| `Cmd+F` en un Mac, `Ctrl+F` en Windows y Linux | chat abierto | abrir **Buscar en el chat** |
|
|
138
153
|
| `Enter` / `Shift+Enter`, `↓` / `↑` | cuadro de **Buscar en el chat** | coincidencia siguiente / anterior |
|
|
139
154
|
| `Esc` | cuadro de **Buscar en el chat** | cerrar el cuadro |
|
|
155
|
+
| `Cmd+Shift+E` en Mac, `Ctrl+Shift+E` en Windows y Linux | en cualquier lugar de dsh | abrir el **Siguiente chat en espera** (se cambia en la página de atajos de teclado de dsh) |
|
|
156
|
+
| `Cmd+Shift+K` en Mac, `Ctrl+Shift+K` en Windows y Linux | en cualquier lugar de dsh | abrir el **Tablero de tareas** (se cambia en la página de atajos de teclado de dsh) |
|
|
157
|
+
| `1`–`9` | tarjeta de pregunta de dsh, no en su campo de respuesta | elegir esa opción (**Botones de opciones**) |
|
|
140
158
|
|
|
141
159
|
Un menú `/` o `@` abierto se queda con estas teclas.
|
|
142
160
|
|
|
@@ -162,17 +180,20 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
162
180
|
- **Permitir en este chat:** los permisos concedidos se guardan, con la hora en que se concedieron, en `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (archivo con permisos solo para el propietario). Un permiso cubre una herramienta exacta en un chat, hasta que termina el límite de tiempo (1 hora por defecto). Si esa herramienta puede escribir, el permiso también cubre cualquier escritura. Revócalo desde el chip de la cabecera.
|
|
163
181
|
- La revisión automática sigue ejecutándose en cada llamada; los fallos de la revisión nunca se permiten automáticamente.
|
|
164
182
|
- **Conexión móvil:** desactivada hasta que la actives. Mientras está activada, la parte Host ejecuta la pasarela de Tether: HTTPS en el puerto 19390, que solo acepta tu subred Wi-Fi y tu tailnet (100.64.0.0/10), y una página de emparejamiento en `127.0.0.1:19391` (solo este Mac). Un teléfono necesita un código de un solo uso del código QR (válido 5 minutos) y que hagas clic en **Approve** en el Mac. El teléfono fija el certificado de la pasarela. El Mac solo guarda un hash del token de cada teléfono (30 días, se renueva mientras se usa); **Remove** cierra de inmediato las conexiones de ese teléfono. Los teléfonos solo pueden llamar a una lista permitida de métodos de dsh (chats, prompts, adjuntos, comandos de barra, aprobaciones, preguntas, modelos, agentes, objetivos), no a la configuración, las credenciales, el explorador de archivos ni la terminal. «Tailscale only» rechaza todas las conexiones desde la red local, también las que ya están abiertas. El registro de accesos guarda los 200 intentos de conexión más recientes (hora, dirección IP, nombre del dispositivo, permitido o rechazado, y el motivo) en `access.json`; nunca guarda un token ni un código de emparejamiento. Datos: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (archivos solo para el propietario). Detalles: [tether/README.md](tether/README.md).
|
|
183
|
+
- **Equipos remotos:** la función está desactivada hasta que la actives, en cada Mac. **Permitir que otros equipos abran este Mac** abre un segundo puerto HTTPS (19392) solo en la dirección de Tailscale de este Mac (no en la red Wi-Fi, y sin anunciarlo con Bonjour). Otro Mac necesita un enlace de emparejamiento de un solo uso (válido 5 minutos), el certificado correspondiente (fijado) y que hagas clic en **Aprobar**. Este Mac solo guarda un hash de su token. Un equipo emparejado obtiene el control total de dsh en este Mac, como si lo usaras aquí: sus chats, modelos, herramientas, archivos y terminal. Quítalo en el panel de Configuración y sus conexiones se cierran al instante. El Mac que abre otro guarda el token de ese equipo en `$DSH_HOME/storages/dsh-composer-plus/computers.json` (solo para el propietario). Abre un relé en `127.0.0.1` para cada equipo que eliges. La página recibe un enlace de un solo uso (válido 60 segundos), y el relé solo acepta su propia página (su dirección, ningún otro sitio). Una página que abrió otro Mac no muestra el selector de equipos y no puede cambiar los equipos de este Mac.
|
|
165
184
|
- **Actualizaciones:** la parte Host pide a `api.github.com` la última versión publicada y a `registry.npmjs.org` esa versión exacta; no se envía nada sobre ti ni sobre tus chats. La instalación usa el gestor de plugins de dsh (`pnpm add dsh-composer-plus@<version>`; cuando dsh 0.2.1 lo rechaza para un plugin ya instalado, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, y después el perfil indica esa URL como origen del plugin), así que se aplican las comprobaciones propias de dsh del registro, de los scripts y de la compatibilidad de versiones. Nunca se instalan etiquetas de prerelease ni versiones anteriores.
|
|
185
|
+
- **Recuento de uso:** una vez al día, la parte Host pide a GitHub el pequeño archivo `active.txt` de la versión publicada que tienes instalada (`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/active.txt`). GitHub cuenta estas peticiones por archivo, así que el autor solo ve cuántas copias de cada versión lo pidieron ese día. La petición no lleva ningún id, cookie ni dato sobre ti o tus chats; GitHub ve tu dirección IP, igual que en cada comprobación de actualizaciones. El día de la última petición se guarda en `$DSH_HOME/storages/dsh-composer-plus/active.json`. Una copia git de este repositorio y una copia renombrada no envían nada. No hay ningún interruptor para esto.
|
|
166
186
|
- **Predicción del siguiente mensaje:** activada de forma predeterminada; desactívala en **Configuración → Composer Plus** para detener estas llamadas al modelo. Después de cada turno terminado, la parte Host envía tus propios mensajes del chat y las respuestas de texto del agente (sin salida de herramientas, sin contexto oculto ni razonamiento), como máximo unos 6.000 caracteres (la parte más reciente), al modelo elegido (el predeterminado de dsh, salvo que elijas otro). Va con los ajustes de proveedor propios de dsh, en una sola petición. No se guarda nada en el chat: la predicción no se añade al historial del chat. El interruptor y el modelo elegido están en `$DSH_HOME/storages/dsh-composer-plus/predict.json` (archivo solo para el propietario).
|
|
167
187
|
- **Completar al escribir:** desactivado hasta que lo actives. Mientras está activado, en cada pausa mientras escribes, la parte Host envía el texto que llevas escrito y tus propios mensajes del chat y las respuestas de texto del agente (sin salida de herramientas, sin contexto oculto ni razonamiento), como máximo unos 3.000 caracteres del chat, al modelo elegido en **Completar al escribir** (de forma predeterminada, el modelo de **Predicción del siguiente mensaje**). Una pausa más reciente detiene la petición anterior. No se guarda nada en el chat. El interruptor está en `$DSH_HOME/storages/dsh-composer-plus/complete.json` (archivo solo para el propietario).
|
|
168
188
|
- **Mejorar prompt:** no se ejecuta nada hasta que haces clic en la varita mágica. Entonces la parte Host envía tu borrador, tus propios mensajes del chat y las respuestas de texto del agente (sin salida de herramientas, sin contexto oculto, sin razonamiento ni mensajes revertidos; como máximo unos 6.000 caracteres, la parte más reciente), el mismo resumen del proyecto que **Ideas de funciones** (con las mismas reglas de archivos: sin `.env*` ni archivos de claves, sin enlaces simbólicos que salgan de la carpeta, sin FIFO), las rutas que `git status` muestra como modificadas y hasta 30 rutas con seguimiento o sin seguimiento (no ignoradas) cuyos nombres comparten palabras con tu borrador, al modelo elegido en **Mejorar prompt** (de forma predeterminada, el modelo del propio chat), en una sola petición. No se envía el contenido de ningún archivo aparte de ese resumen. No se escribe nada en el chat ni en el proyecto: la respuesta solo sustituye tu borrador en el editor, y tú decides si lo envías. El modelo elegido está en `$DSH_HOME/storages/dsh-composer-plus/improve.json` (archivo solo para el propietario).
|
|
169
189
|
- **Comprobación del objetivo:** solo se ejecuta cuando el agente marca un `/goal` como completado en una ronda automática (o cuando haces clic en **Ejecutar ahora**). La parte Host ejecuta el comando de prueba en la carpeta del chat con el modo sandbox del chat (como la propia herramienta `bash` de dsh: la misma política de acceso a archivos; si ese sandbox no puede iniciarse, la prueba no se ejecuta y la comprobación falla). Para encontrar el comando solo lee `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` y `pytest.ini`, como archivos normales dentro de la carpeta (sin enlaces simbólicos que salgan de ella, sin FIFO). Después envía el objetivo, el chat desde que empezó el objetivo (tus mensajes, las respuestas del agente, las llamadas a herramientas recortadas a 1.000 caracteres y los últimos 2.000 caracteres de cada resultado de herramienta; sin razonamiento ni pasos revertidos; como máximo unos 60.000 caracteres, la parte más reciente), `git status --short` y el final de la salida de la prueba al modelo elegido en **Comprobación del objetivo** (de forma predeterminada, el modelo del propio chat), en una sola petición sin herramientas. La salida de las herramientas puede contener lo que leyó el agente, así que esta petición puede incluir partes de tus archivos, igual que el propio chat. No se escribe nada en el chat ni en el proyecto. Tu comando de prueba, los límites, el último resultado (con el final de su salida) y el modelo elegido están en `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (archivo solo para el propietario, los 500 chats más recientes).
|
|
170
190
|
- **Continuar en un chat nuevo:** no se ejecuta nada hasta que haces clic. Entonces la parte Host envía el chat (tal como lo lee la Comprobación del objetivo: sin razonamiento ni pasos revertidos) al modelo del propio chat y muestra la nota de traspaso; solo **Iniciar chat nuevo** crea un chat nuevo. No se escribe nada en el proyecto.
|
|
171
191
|
- **Desglose del contexto:** la parte Host solo lee el registro del chat; ninguna llamada al modelo, ningún archivo del proyecto.
|
|
172
|
-
- **Tablero de tareas:** el tablero muestra los propios chats de dsh a partir de las propias listas de dsh en esta ventana; no añade datos de chat propios. **Nueva tarea** abre el propio chat nuevo de dsh, y tú escribes el primer mensaje en el editor de dsh, así que las aprobaciones, el sandbox y el modelo del chat se aplican como siempre. La parte Host guarda el primer mensaje de ese chat como el prompt de la tarjeta y lo envía (sus primeros 4.000 caracteres, nada más) al modelo de ese chat en una petición más, sin herramientas, para obtener hasta 3 etiquetas. El prompt, las etiquetas y la hora de inicio de cada tarea se guardan en `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (archivo solo para el propietario, las 2.000 más recientes); el interruptor está en `board-switch.json`, junto a él. No se escribe nada en ninguna carpeta de proyecto. **Responder** envía tu respuesta a la propia solicitud pendiente de dsh, igual que la tarjeta del propio chat. La antigua lista de tareas de versiones anteriores (`board.json`) se queda en el disco tal como estaba y no se lee. **Progreso al pasar el cursor** lee el registro del chat en este Mac. Con **Rápido (sin IA)** (el predeterminado), no se envía nada. Con **Resumen con IA**, mientras se ve el cuadro de progreso de una tarjeta en curso (o mientras el tablero de Tether está abierto, para hasta 8 tarjetas en curso), la parte Host envía la parte más reciente de ese chat (como máximo unos 6.000 caracteres: tus mensajes, las respuestas de texto del agente, sus llamadas a herramientas y el final de sus resultados; sin razonamiento ni mensajes revertidos) al modelo del chat, en una sola solicitud sin herramientas. Solo vuelve a enviar cuando el chat avanzó, como máximo una vez cada 20 segundos por chat. La nota solo se guarda en memoria; el ajuste está en `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (archivo solo para el propietario).
|
|
192
|
+
- **Tablero de tareas:** el tablero muestra los propios chats de dsh a partir de las propias listas de dsh en esta ventana; no añade datos de chat propios. **Nueva tarea** abre el propio chat nuevo de dsh, y tú escribes el primer mensaje en el editor de dsh, así que las aprobaciones, el sandbox y el modelo del chat se aplican como siempre. La parte Host guarda el primer mensaje de ese chat como el prompt de la tarjeta y lo envía (sus primeros 4.000 caracteres, nada más) al modelo de ese chat en una petición más, sin herramientas, para obtener hasta 3 etiquetas. El prompt, las etiquetas y la hora de inicio de cada tarea se guardan en `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (archivo solo para el propietario, las 2.000 más recientes), junto con los ID de los chats que quitaste del tablero con **×** o **Limpiar todo** (los 5.000 más recientes); el interruptor está en `board-switch.json`, junto a él. No se escribe nada en ninguna carpeta de proyecto. **Responder** envía tu respuesta a la propia solicitud pendiente de dsh, igual que la tarjeta del propio chat. La antigua lista de tareas de versiones anteriores (`board.json`) se queda en el disco tal como estaba y no se lee. **Progreso al pasar el cursor** lee el registro del chat en este Mac. Con **Rápido (sin IA)** (el predeterminado), no se envía nada. Con **Resumen con IA**, mientras se ve el cuadro de progreso de una tarjeta en curso (o mientras el tablero de Tether está abierto, para hasta 8 tarjetas en curso), la parte Host envía la parte más reciente de ese chat (como máximo unos 6.000 caracteres: tus mensajes, las respuestas de texto del agente, sus llamadas a herramientas y el final de sus resultados; sin razonamiento ni mensajes revertidos) al modelo del chat, en una sola solicitud sin herramientas. Solo vuelve a enviar cuando el chat avanzó, como máximo una vez cada 20 segundos por chat. La nota solo se guarda en memoria; el ajuste está en `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (archivo solo para el propietario).
|
|
173
193
|
- **Archivos protegidos:** la lista y el interruptor están en `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (archivo solo para el propietario). La comprobación solo lee la ruta de cada llamada a una herramienta de archivos (y su ruta real), nunca el archivo.
|
|
174
194
|
- **Comandos bloqueados:** las reglas y el interruptor están en `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (archivo solo para el propietario). La comprobación solo lee el texto del comando de cada llamada a `bash` y `pwsh`; no ejecuta nada y no envía nada.
|
|
175
|
-
- **
|
|
195
|
+
- **Entrada secreta:** el valor va de la tarjeta (o de Tether, a través del gateway, que no registra el cuerpo de las solicitudes) al Host solo en la solicitud de respuesta. El Host lo escribe en `$DSH_HOME/storages/dsh-composer-plus/secrets/<nombre aleatorio>` (carpeta 0700, archivo 0600); nada va al proyecto, al registro del chat ni al resultado de la herramienta. El Host guarda el valor en memoria para reemplazarlo por `[secret]` en los resultados de herramienta posteriores de ese chat. El archivo y esa copia se borran al terminar el turno del chat y al iniciar dsh. El interruptor está en `secrets.json`, a su lado. Un comando que el agente ejecuta con el archivo puede enviar el valor adonde ese comando lo envíe: ese es su propósito.
|
|
196
|
+
- **Memoria del proyecto:** desactivada hasta que la actives. Mientras está activada, después de cada turno terminado de un chat de nivel superior, la parte Host envía los mensajes nuevos del propio chat desde la última revisión (tus mensajes y las respuestas de texto del agente; sin salida de herramientas, sin razonamiento, sin contexto oculto, sin mensajes revertidos; la copia del chat padre en un chat bifurcado queda fuera; como máximo unos 16.000 caracteres) y las notas guardadas al modelo del propio chat, como una sola petición sin herramientas. Las notas son archivos Markdown en `$DSH_HOME/storages/dsh-composer-plus/memory/` (archivos solo para el propietario): `projects/<id>/` para cada carpeta de proyecto (`<id>` es un hash de la ruta real de la carpeta; `project.json` nombra la carpeta), `global/`, `journal.jsonl` (cada cambio con la línea anterior y la posterior) y `reviewed.json` (hasta dónde se leyó cada chat). No se escribe nada en la carpeta del proyecto. Se rechazan las notas que parecen una clave, un token, una contraseña o un número de identificación. Las notas de un proyecto entran en el prompt de sistema de cada chat nuevo en esa carpeta, así que llegan al modelo con cada petición de ese chat. El interruptor está en `memory.json`, en la misma carpeta. **Abrir memoria** no envía nada hasta que pulsas **Vista previa de los cambios**; entonces envía las notas que muestra y tu texto al modelo predeterminado de dsh, en una sola petición sin herramientas. Sus cambios se escriben solo con **Aplicar**, con `editor` en el registro. Tether lee y cambia las notas por la misma ruta. **Historial de versiones de la memoria** (activado por defecto) guarda una copia de los archivos de la memoria antes de cada guardado en `memory/history/`, junto a ellos (archivos solo del propietario, las 50 más recientes por memoria); no envía nada a ningún modelo. **Exportar la memoria a AGENTS.md** no envía nada a ningún modelo y solo escribe cuando haces clic en **Escribir AGENTS.md**: lee y escribe `AGENTS.md` en la carpeta del proyecto de esa memoria (solo un archivo normal dentro de ella, nunca a través de un enlace simbólico que salga de ella) y solo cambia su sección marcada. **Buscar notas de memoria obsoletas** no envía nada a ningún modelo y no escribe nada: comprueba las rutas dentro de la carpeta del proyecto con realpath (no lee ningún archivo), lee `package.json` solo como archivo normal dentro de la carpeta y ejecuta allí un `git for-each-ref`. **No usar la memoria en este chat** guarda cada chat que desactivas en `memory-chats.json`, junto a los demás archivos (solo del propietario, los 500 más recientes); ese chat no envía ninguna memoria a su modelo. **Sugerir notas de memoria desde un chat** no envía nada hasta que haces clic en **Sugerir para la memoria**; entonces envía las notas guardadas del proyecto del chat y las notas globales, y los mensajes y respuestas de texto del propio chat (sin salida de herramientas ni mensajes revertidos; la copia del padre en una bifurcación se omite; como máximo unos 24.000 caracteres), al propio modelo del chat, como una petición sin herramientas. Una sugerencia solo se guarda con **Aceptar**.
|
|
176
197
|
- **Copia de seguridad:** nada sale de tu equipo. Los archivos comprimidos van a `~/Desktop/dsh-backups` (archivos solo para el propietario). Los secretos no están en un archivo comprimido: los archivos de credenciales (`.credentials.yaml`, `.env`), los archivos de claves (`.pem`, `.key`, `.p12`, `.pfx`) y los valores de los ajustes token, secret, password y API key de los archivos yml se ocultan; sus copias reales se quedan en `composer-plus-vault/<archive>/`, en la misma carpeta (solo para el propietario), solo en este equipo. **Para otro equipo** no copia ningún vault: vuelve a introducir esos secretos allí. Tus registros de chat, tus ajustes y el resto del directorio home de dsh están tal cual en el archivo comprimido: mantén la carpeta privada, igual que el propio `$DSH_HOME`. La copia de seguridad lee los archivos con `O_NOFOLLOW | O_NONBLOCK`; un enlace simbólico se guarda como enlace (nunca se sigue) y un FIFO o un dispositivo se omite. El interruptor y los ajustes de la copia de seguridad automática están en `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, el interruptor de la consola de rescate en `rescue-console.json` y, mientras dsh se ejecuta, `running/host-<pid>.json` nombra cada proceso de dsh (la consola de rescate los lee para rechazar una restauración).
|
|
177
198
|
- **Consola de rescate:** un menú de terminal; no abre ningún puerto de red. Una restauración solo escribe en una carpeta nueva junto al directorio home de dsh (archivos con `O_EXCL | O_NOFOLLOW`, enlaces simbólicos al final y nunca seguidos) y rechaza un archivo comprimido con un nombre inseguro (`..`, una ruta absoluta), un dispositivo o FIFO, más de una carpeta superior o una entrada bajo un enlace.
|
|
178
199
|
|
|
@@ -194,7 +215,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
194
215
|
- **No hay etiqueta de rama en una fila de chat:** la barra lateral no está en «En una sola lista» (en «Espacio de trabajo» y «Árbol de espacios de trabajo», ninguna fila de chat muestra una etiqueta), el chat no tuvo ningún turno desde que instalaste esta versión, su carpeta no es un repositorio git o **Rama de Git en las filas de chat** está desactivada. Después de una actualización, reinicia dsh (la parte Host registra la rama).
|
|
195
216
|
- **Comprobación del objetivo dice que la prueba terminó con el código 127 o «not found»:** dsh iniciado desde el Finder o el Dock puede tener un PATH más corto que tu terminal, así que no encuentra `npm`, `pnpm` ni `cargo`. Inicia dsh desde una terminal, o define tu propio comando de prueba con la ruta completa en **Comprobación del objetivo** → **Editar**. **Ejecutar ahora** muestra el resultado al momento.
|
|
196
217
|
- **El objetivo no se cierra y el agente sigue trabajando:** **Comprobación del objetivo** encontró una prueba fallida o trabajo pendiente; la fila bajo el objetivo muestra el motivo (pasa el puntero por el resultado para ver los detalles). Corrige la causa o el comando de prueba, o completa el objetivo tú mismo con `/goal` o con la barra del objetivo (eso no se comprueba).
|
|
197
|
-
- **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.
|
|
218
|
+
- **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.21.1`); consulta la nota de instalación de más arriba.
|
|
198
219
|
- **Hacer copia ahora dice «Ya hay otra acción de copia de seguridad en curso»:** hay una acción en marcha en otra ventana de dsh o en la consola de rescate (comparten un archivo de bloqueo, `.composer-plus.lock`, en la carpeta de copias de seguridad). Espera a que termine. Si no hay ninguna acción en marcha, el siguiente clic toma el bloqueo de un proceso cerrado.
|
|
199
220
|
- **La consola de rescate dice «dsh is running»:** primero sal de dsh. Si dsh está realmente cerrado, el archivo que nombra el mensaje quedó de un cierre inesperado: elimínalo y vuelve a intentarlo.
|
|
200
221
|
- **Después de una restauración, dsh no se inicia o falta un plugin:** hay que volver a instalar los paquetes de plugins de un perfil. La consola de rescate lo ofrece después de una restauración; o ejecuta `pnpm install` en cada carpeta de `$DSH_HOME/profiles/` que indique. Los secretos que no estaban en el vault (otro equipo) hay que introducirlos de nuevo: la consola los enumera.
|
|
@@ -215,11 +236,18 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
215
236
|
- La cola de dsh no tiene una acción `move`, así que la parte Host del plugin mueve el propio mensaje dentro de la cola de dsh (un solo cambio, el mismo mensaje). Los mensajes con imágenes o archivos también se mueven. Solo se mueven tus propios mensajes: una ronda de un objetivo o una respuesta a una pregunta en la cola se queda donde está. Si un mensaje empieza a enviarse mientras arrastras, no se mueve nada y un aviso lo indica.
|
|
216
237
|
- dsh 0.2.1 carga una actualización de inmediato cuando la nueva versión no cambia ningún ajuste de dsh; en caso contrario, y en dsh 0.2.0, reinicia dsh para cargarla. El plugin nunca reinicia dsh por ti. Los perfiles web/CLI sin el gestor de plugins de dsh solo avisan de que hay una versión nueva.
|
|
217
238
|
- **Novedades de Composer Plus N** muestra las notas en el idioma de **Idioma de la aplicación**. Un idioma de interfaz con otra región recibe las notas de su idioma base (`en-GB` recibe las notas en inglés y `zh-TW`, las notas en chino de `zh`). Un idioma sin notas (uno que añade otro paquete de idioma, o `pt-PT`, que no es `pt-BR`) muestra las notas en inglés. Las notas llegan con la nueva versión. Si la copia en ejecución no tiene un archivo de notas legible (`release-notes.json`), la ventana muestra las notas en inglés de GitHub.
|
|
239
|
+
- Una versión que se instala mientras dsh se ejecuta (una actualización desde Configuración → Plugins o una carpeta copiada) se carga solo tras reiniciar dsh: hasta entonces, **Actualizaciones de Composer Plus** muestra la versión en ejecución y pide reiniciar. Su ventana **Novedades de Composer Plus N** aparece una vez en el primer inicio de esa versión. El primer inicio después de instalar este plugin no muestra ninguna ventana; **Novedades de esta versión** abre las notas de la versión en ejecución.
|
|
240
|
+
- **Rechazar con nota** envía la nota como un mensaje dentro del turno que espera y después rechaza la solicitud; dsh muestra la nota en el chat como un mensaje tuyo. Mientras el campo de la nota está abierto, la tarjeta muestra solo **Cancelar** y **Rechazar**, así que un clic no puede permitir la solicitud por error; `Esc` o **Cancelar** devuelve los botones de dsh. Una nota vacía no envía nada (usa el propio **Rechazar** de dsh). Si el rechazo falla después de enviar la nota (por ejemplo, porque mientras tanto la solicitud se respondió en otro lugar), la nota se queda en el chat y el modelo la lee en su siguiente paso. El botón va en el marcado de la tarjeta de aprobación de dsh (`data-approval-key`), porque dsh no tiene un espacio para acciones de la tarjeta; si una actualización de dsh cambia ese marcado, el botón no aparece y el propio **Rechazar** de dsh funciona como antes. Una nota puede tener como máximo 4.000 caracteres.
|
|
241
|
+
- **Entrada secreta** oculta solo el texto exacto de un valor: `[secret]` lo reemplaza en los resultados de herramienta posteriores del mismo chat. El agente aún puede leer el archivo con un comando de shell e imprimir el valor de otra forma (base64, una parte, con espacios), y esa forma llega al modelo. Las herramientas de archivos del propio agente (read, grep, write, edit) no pueden abrir la carpeta de secretos. Si el valor también es una palabra común, otros resultados de ese chat también muestran `[secret]`. El archivo se mantiene hasta que termina el turno; si dsh se cierra durante el turno, el siguiente inicio lo borra. Un chat puede tener una sola solicitud abierta a la vez. La herramienta añade unos 870 caracteres (unos 220 tokens, estimado) a cada solicitud al modelo: desactívala si no la usas.
|
|
242
|
+
- **Citar en la respuesta** cita el texto tal como lo muestra la página: un bloque de código, una tabla o una lista llegan como líneas simples, sin sus marcas de Markdown. Una selección que empieza en una respuesta y termina en otra, o que toca el razonamiento, una fila de herramienta o tu propio mensaje, no muestra el botón: selecciona dentro de una sola respuesta. El botón encuentra la respuesta por la estructura del chat de dsh, porque dsh no tiene un slot para la selección de texto; si una actualización de dsh cambia esa estructura, el botón no aparece. Cuando la cita queda al final del campo, se añade una línea vacía más para que la siguiente línea que escribas empiece debajo; dsh quita las líneas vacías del final al enviar.
|
|
243
|
+
- **Chat lateral** es de solo lectura gracias al modo de solo lectura de dsh: las herramientas de archivos no pueden escribir y los comandos de shell se ejecutan en el sandbox de dsh sin escritura (o no se ejecutan cuando el sandbox no puede iniciar). El agente aún puede pedir más acceso con la tarjeta de aprobación de dsh, y una llamada de red (por ejemplo, una solicitud a una API) aún puede cambiar algo fuera del equipo. La copia se hace en el momento más reciente en que no esperaba ningún mensaje en la cola, así que una pregunta hecha mientras esperan mensajes en la cola no ve lo que pasó después de ellos. Un paso del chat en curso se cierra en la copia, así que el chat lateral conoce el inicio de ese paso pero no su resultado. El chat lateral es un chat normal: queda en la barra lateral y cuenta para tu uso del modelo; archívalo allí. Traer de vuelta toma solo los mensajes propios del chat lateral (máximo 12.000 caracteres) y solo la última respuesta de cada pregunta; las notas del agente entre sus llamadas a herramientas quedan fuera. dsh no ofrece a los plugins un espacio para un chat dentro de la barra lateral derecha, así que el chat lateral se abre en la vista principal.
|
|
244
|
+
- **Notas del diff** funciona solo en el panel de cambios, no en la vista Último turno de dsh. Un rango debe quedar en un solo bloque del diff (una parte `@@`). Las notas se guardan en el almacenamiento de este navegador, así que otro navegador o dsh en otro equipo no las ve; Tether guarda sus propias notas en memoria. Una nota guarda las líneas como estaban al hacer clic: si el agente cambia el archivo después, la nota sigue mostrando las líneas y los números anteriores. Como máximo 50 notas por chat, 2.000 caracteres por nota y 40 líneas por nota (luego una línea `…`).
|
|
218
245
|
- **Permitir en este chat** cuenta el límite de tiempo desde el momento en que se concede el permiso. Un nuevo límite de tiempo se aplica al instante a los permisos vigentes, así que uno más corto puede terminarlos al instante. Los permisos de la versión 1.12 y anteriores no tienen hora: después de la actualización, el agente vuelve a preguntar una vez por esas herramientas.
|
|
219
246
|
- **Mantener el foco en el editor** solo devuelve el foco después de un comando `/` o una skill. Mientras dsh resuelve el comando, el editor queda en solo lectura unos milisegundos, así que las teclas que pulses en ese tiempo se pierden. Si el menú `/` de dsh sigue abierto, `Enter` elige la fila resaltada y no envía.
|
|
220
247
|
- **Ajustar la tarjeta de pregunta a la ventana** cambia solo la tarjeta de pregunta de dsh, no la tarjeta de revisión del plan. Encuentra la tarjeta por el marcado de dsh (`data-question-key`, `data-question-scroll`); si una actualización de dsh cambia ese marcado, la tarjeta se ve como la dibuja dsh. La altura de la tarjeta sigue a la ventana, no al chat: en un chat dentro de un panel lateral estrecho, una tarjeta alta puede sobresalir por encima del chat.
|
|
221
248
|
- **Ajustar la cabecera del chat a la ventana** encuentra la cabecera del chat de dsh por sus nombres de clase generados (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), porque dsh no ofrece un punto de enganche para su diseño. Si una actualización de dsh los cambia, la cabecera se muestra como la dibuja dsh. En una columna de chat muy estrecha la cabecera puede ocupar dos o tres líneas, así que queda menos espacio sobre los mensajes.
|
|
222
|
-
- **Conexión móvil** solo funciona en macOS (usa `en0`, `openssl`, `swift` y `dns-sd`). Usa los puertos fijos 19390 y 19391, así que solo un dsh por Mac puede ejecutarla a la vez (cada Mac es una entrada en la lista de Mac del teléfono). El teléfono solo recibe notificaciones mientras Tether está abierta o acaba de pasar a segundo plano (no hay servicio push). Tether solo las envía después de que actives «Settings → Notifications → Send notifications» en Tether.
|
|
249
|
+
- **Conexión móvil** solo funciona en macOS (usa `en0`, `openssl`, `swift` y `dns-sd`). Usa los puertos fijos 19390 y 19391, así que solo un dsh por Mac puede ejecutarla a la vez (cada Mac es una entrada en la lista de Mac del teléfono). El teléfono solo recibe notificaciones mientras Tether está abierta o acaba de pasar a segundo plano (no hay servicio push). Tether solo las envía después de que actives «Settings → Notifications → Send notifications» en Tether. Tether guarda esta opción y su horario por separado para cada Mac emparejado. Está desactivada de forma predeterminada en cada Mac, e iOS pide el permiso cuando la activas. La app de iOS aún no está en la App Store: compílala desde `tether/ios` con Xcode. «Tailscale only» sigue necesitando una dirección Wi-Fi o Ethernet en el Mac (la pasarela solo se inicia con una). El registro de accesos es propio de cada Mac y solo guarda los 200 intentos más recientes; un intento repetido en menos de un minuto suma uno a la misma fila. El bloqueo de la app Tether no oculta las vistas previas de las notificaciones en la pantalla bloqueada del iPhone: desactívalas en Ajustes de iOS. Los puntos verdes de Tether siguen al Mac: un chat que abres en dsh también pierde su punto en el teléfono. Un chat que abres en Tether pierde su punto solo en los teléfonos. El punto propio de dsh en el Mac se queda hasta que abres el chat allí.
|
|
250
|
+
- **Equipos remotos** necesita Tailscale en los dos Mac, y Composer Plus con esta función activada en el Mac que abres. Ese Mac no debe estar en reposo, y dsh debe estar en ejecución en él. El otro equipo se abre en la pestaña Navegador de la barra lateral derecha del chat que está en pantalla. La pestaña pertenece a ese chat, así que otro chat muestra su propia barra lateral. Sin un chat (o en dsh web sin su pestaña Navegador), el equipo se abre en una ventana del navegador. El selector solo aparece cuando hay un chat o la pantalla de nuevo chat en el área principal, no en el Tablero de tareas. Usa el puerto 19392 (solo un dsh por Mac puede dejar entrar a otros equipos). Un equipo que abriste dentro de la página de otro equipo no tiene selector, así que desde allí no puedes abrir un tercer Mac.
|
|
223
251
|
- Un enlace de sesión funciona dentro de los chats; hacer clic en él no abre el chat. Un enlace creado con **Copiar enlace del mensaje** abre su mensaje solo en dsh 0.2.1 y posteriores, y solo desde un mensaje de un chat (dsh 0.2.0 no tiene reglas de texto de usuario, así que allí el enlace se copia, pero se muestra como texto normal). Un mensaje que una reversión quitó, o que la compactación eliminó del historial que carga dsh, no se puede mostrar: el enlace lo indica. Los botones 🔗 se enganchan a las filas de mensajes de dsh; si una actualización de dsh cambia ese marcado, no aparecen.
|
|
224
252
|
- **Marcar todo como leído** cambia los puntos de no leído propios de dsh mediante una parte de dsh que no es una API pública (la lista `completionUnread` del estado de sesión de dsh). Si una actualización de dsh le cambia el nombre, el elemento no aparece. El elemento va en el menú «…» del proyecto de dsh, que no tiene un espacio para plugins; si dsh cambia ese menú, el elemento tampoco aparece.
|
|
225
253
|
- **Editar el mensaje en cola en su sitio** no cambia un mensaje que empezó a enviarse mientras tanto ni sobrescribe un mensaje que cambió mientras tanto (por ejemplo, en Tether en el iPhone): un aviso lo indica. Una imagen nueva necesita un modelo que acepte imágenes (se aplican los límites de imagen propios de dsh), y un archivo nuevo debe terminar de subirse antes de que puedas guardar. Solo se pueden editar tus propios mensajes en cola: una ronda de un objetivo o una respuesta a una pregunta en la cola, no. Tras una actualización del plugin, solo las ediciones de texto funcionan al momento: reinicia dsh antes de guardar un mensaje con imágenes o archivos (la parte Host se carga al iniciar).
|
|
@@ -234,6 +262,8 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
234
262
|
- **Ramas en el árbol de espacios de trabajo** escribe en git sin un clic: cuando mueve un chat, devuelve la carpeta del proyecto a su rama anterior (`git switch`) y añade un worktree (`git worktree add`). Nunca borra una rama, un worktree ni un archivo. dsh no puede cambiar la carpeta de un chat, así que un chat movido es una copia (la bifurcación propia de dsh, con un id nuevo) y el chat anterior se archiva. La copia sigue con la tarea detenida; una llamada a herramienta que se ejecutaba cuando apareció la rama termina con un rechazo, y el agente la vuelve a ejecutar en la carpeta nueva. Un objetivo del chat anterior no se mueve con él. Solo se mueve un chat cuya carpeta es la carpeta principal del repositorio, y solo por una rama que creó y a la que cambió en ese turno (`git switch -c`, `git checkout -b`): una rama hecha solo con `git branch`, una carpeta con cambios sin confirmar, un worktree vinculado o una subcarpeta no mueven nada. En el árbol solo aparecen los worktrees que están directamente en `<project>/.worktrees/` y tienen una rama; un worktree separado (detached) o uno en otro lugar no aparece. La copia se abre sola solo cuando su chat era el abierto (el plugin lo lee de la fila de la barra lateral de dsh); si no, está en el proyecto de la rama.
|
|
235
263
|
- **Buscar en el chat** solo busca en lo que muestra la página: los mensajes y respuestas cargados (desplázate hacia arriba o haz clic en **Cargar anteriores** para ver los más antiguos), no en los pasos de herramientas cerrados ni en el texto plegado dentro de la salida de una herramienta. Cuenta como máximo 2.000 coincidencias (después, «2000+»). Usa la API de resaltado del navegador (Chromium 105 y posteriores; la app de escritorio la tiene): en un navegador más antiguo, el recuento y los saltos funcionan sin el color. `Cmd+F` en un Mac (`Ctrl+F` en Windows y Linux) solo lo abre mientras hay un chat en pantalla; en otros lugares, la búsqueda propia del navegador funciona como antes. En un Mac, `Ctrl+F` mantiene su uso de macOS en los campos de texto (el cursor avanza un carácter).
|
|
236
264
|
- **Abrir el chat en espera si estás inactivo** solo conoce lo que ve la ventana de dsh: el trabajo en otra app no cuenta, así que con dsh en segundo plano puede abrir un chat en espera a los 30 segundos. No trae dsh al frente. Leer sin pulsar una tecla, hacer clic ni mover el ratón cuenta como inactividad. Solo mira los chats con el punto naranja de dsh (una pregunta, una aprobación o una revisión del plan) o con su punto verde (un turno terminado que aún no has abierto); la solicitud de un subagente se muestra en su chat principal. Los chats naranjas se abren primero. Abrir un chat verde quita su punto, así que los 30 segundos del siguiente chat verde solo empiezan tras tu siguiente tecla, clic, movimiento del ratón, rueda de desplazamiento o toque: cuando vuelves, los demás puntos verdes siguen ahí. Mientras un chat en espera está en pantalla, no se abre otro; un chat que dejaste sin responder puede volver a abrirse tras los siguientes 30 segundos sin uso. Los 30 segundos no se pueden cambiar.
|
|
265
|
+
- **Siguiente chat en espera** cuenta los mismos chats que **Abrir el chat en espera si estás inactivo**: el punto naranja de dsh (una pregunta, una aprobación o una revisión del plan que puedes responder aquí) y el punto verde (un turno terminado que aún no has abierto); la solicitud de un subagente aparece en su chat principal. dsh no guarda cuándo empezó a esperar un chat, así que el orden cuenta desde el momento en que esta ventana lo vio: después de recargar, los chats que ya esperaban mantienen el orden de dsh. La tecla es un atajo de dsh: en un navegador en Linux no tiene tecla hasta que la definas en la página de atajos de teclado de dsh, y una extensión del navegador u otra aplicación puede tomar `Cmd+Shift+E` antes. dsh no tiene un espacio para extensiones en la cabecera de la barra lateral, así que el botón se coloca en la estructura de esa cabecera; si una actualización de dsh la cambia, el botón no aparece y la tecla sigue funcionando. El botón no está en la barra lateral estrecha.
|
|
266
|
+
- **Botones de opciones** solo lee las respuestas que terminan con una lista de opciones: una lista numerada de 1 a 9 elementos, numerada desde 1, como última parte de la respuesta, justo debajo de un título o una línea en negrita "Opciones" o "Próximos pasos" (o las palabras en inglés "Options", "Choices" y "Next steps", y las mismas palabras en los otros idiomas de la aplicación). Una lista en medio de una respuesta, en un bloque de código o bajo otro título no tiene botones. Composer Plus no le pide al agente que escriba esa lista. Los botones solo aparecen debajo de la respuesta más reciente, mientras el chat está inactivo y el cuadro de mensaje está vacío, y solo cuando Composer Plus ya sabe qué respuestas retiró una reversión. En la tarjeta de pregunta de dsh, las teclas 1–9 no hacen nada en los primeros 0,8 segundos después de que aparece una pregunta, para que una tecla pensada para otra cosa no elija una opción que no leíste. dsh no tiene una API de teclas para su tarjeta de pregunta, así que las teclas buscan los botones de la tarjeta en el marcado de dsh; si una actualización de dsh lo cambia, las teclas no hacen nada.
|
|
237
267
|
- Al hacer clic en una notificación enviada antes de un reinicio, solo se trae dsh al frente.
|
|
238
268
|
- Los proyectos activos se mueven con el orden de proyectos guardado de dsh, así que el nuevo orden se mantiene tras un reinicio. Los chats que no pertenecen a ningún proyecto («Sin agrupar») no se pueden mover; dsh siempre los muestra al final.
|
|
239
269
|
- dsh no tiene un punto de extensión en el menú de opciones de vista de la barra lateral, así que la opción de proyectos recientes se añade al menú propio de dsh. Si una actualización de dsh cambia ese menú, la opción no aparece y todos los proyectos siguen visibles. El filtro funciona sobre las filas de proyecto, así que **En una sola lista** no se filtra. En **Árbol de espacios de trabajo**, una carpeta padre sigue visible mientras un proyecto que contiene está activo, y también se ocultan las filas de chat que no estuvieron activas en las últimas 2 horas; en **Espacio de trabajo** solo se filtran las filas de proyecto. El filtro lee qué vista muestra dsh desde el ajuste de vista que dsh guarda (no es una API pública); si una actualización de dsh le cambia el nombre, **Árbol de espacios de trabajo** se filtra como **Espacio de trabajo**. La función Estado del proyecto lee el mismo ajuste: en **Árbol de espacios de trabajo**, la fila de una carpeta padre también cuenta los chats de los proyectos que contiene; si dsh cambia el nombre del ajuste, cada fila muestra solo sus propios chats. **Por estado** tiene el mismo tipo de límite: dsh no tiene un espacio para el orden, así que la opción y el orden de las filas se enganchan al marcado del menú y de la lista de dsh.
|
|
@@ -249,9 +279,16 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
249
279
|
- **Continuar en un chat nuevo** envía el chat (mensajes, llamadas a herramientas y el final de cada resultado de herramienta, como máximo unos 60.000 caracteres, la parte más reciente) al modelo del propio chat. La nota de traspaso puede omitir una decisión o un archivo: léela antes de empezar. El chat nuevo solo conoce la nota y el chat enlazado (dsh adjunta el chat anterior como contexto de solo lectura); su contexto del modelo empieza pequeño y el chat anterior se queda como está. Solo una nota o un inicio por chat a la vez.
|
|
250
280
|
- **Desglose del contexto** muestra estimaciones con la regla propia de dsh (unos 4 caracteres por token), la misma regla que usa el anillo de contexto de dsh; el recuento propio del modelo puede ser distinto. Las definiciones de herramientas son las de la petición más reciente. Muestra el contexto tal como lo tiene el registro del chat; un turno que se está ejecutando aparece después de su siguiente paso.
|
|
251
281
|
- **Pasos planificados** ahorra tokens solo cuando el modelo planifica: mientras está activada, cada solicitud lleva la herramienta `plan_next_steps` y una instrucción breve (unos 500 tokens), también en los chats donde el modelo nunca planifica. Una condición prueba solo lo que dice (por ejemplo: el código de salida de la compilación fue 0), no que el trabajo sea correcto. `ok` lee las marcas de resultado propias de dsh (`[exit code: N]`, tiempos de espera, rechazos del sandbox); un comando que falla sin un código de salida distinto de cero pasa. Los pasos se ejecutan de uno en uno; dos pasos listos a la vez vuelven al modelo. El mensaje del paso se guarda como un mensaje del asistente del modelo del chat (dsh no tiene una marca para un mensaje escrito por un plugin), por eso su texto dice que Composer Plus lo ejecutó. No está en Tether.
|
|
252
|
-
- **Tablero de tareas** muestra los chats que dsh lista en esta ventana: un chat fuera de un proyecto solo aparece en **Todos los proyectos**, y una carpeta de «Una rama por chat» (`<project>/.worktrees/<name>`) cuenta como su proyecto. La columna de una tarjeta es el estado en vivo del chat, así que las tarjetas no se pueden arrastrar: un chat pasa a **Hecho** cuando termina su turno, también después de un error o una detención, y vuelve a **En curso** cuando se ejecuta de nuevo. El punto verde es el propio punto de terminado de dsh, que dsh solo guarda en esta ventana: después de recargar, los chats terminados aparecen sin él. **Hecho** muestra los 50 chats más recientes (**Mostrar N más antiguas** muestra el resto). **Buscar proyectos** encuentra un proyecto solo por su nombre, no por la ruta de su carpeta. **Activos en las últimas 2 horas** oculta un proyecto cuando todos sus chats tienen más de 2 horas, están inactivos y leídos; el tablero sigue mostrando el proyecto que elegiste. **Nueva tarea** solo recuerda el chat nuevo más reciente de esta ventana: cuando abres otro chat antes del primer mensaje, ese chat se queda en **
|
|
282
|
+
- **Tablero de tareas** muestra los chats que dsh lista en esta ventana: un chat fuera de un proyecto solo aparece en **Todos los proyectos**, y una carpeta de «Una rama por chat» (`<project>/.worktrees/<name>`) cuenta como su proyecto. La columna de una tarjeta es el estado en vivo del chat, así que las tarjetas no se pueden arrastrar: un chat pasa a **Hecho** cuando termina su turno, también después de un error o una detención, y vuelve a **En curso** cuando se ejecuta de nuevo. El punto verde es el propio punto de terminado de dsh, que dsh solo guarda en esta ventana: después de recargar, los chats terminados aparecen sin él. **Hecho** muestra los 50 chats más recientes (**Mostrar N más antiguas** muestra el resto). **Buscar proyectos** encuentra un proyecto solo por su nombre, no por la ruta de su carpeta. **Activos en las últimas 2 horas** oculta un proyecto cuando todos sus chats tienen más de 2 horas, están inactivos y leídos; el tablero sigue mostrando el proyecto que elegiste. **Nueva tarea** solo recuerda el chat nuevo más reciente de esta ventana: cuando abres otro chat antes del primer mensaje, ese chat se queda en la parte superior de **En curso** como **Nueva tarea** hasta que escribas en él, pero el tablero vuelve por sí solo únicamente para el más reciente. Después de recargar, un chat nuevo sin mensajes no está en el tablero (dsh lo guarda como su Nueva sesión vacía). Las etiquetas vienen de una llamada al modelo por cada tarea, a partir de su primer mensaje: pueden ser incorrectas, y un chat que no iniciaste en el tablero no tiene ninguna. El título es el propio título del chat en dsh (el servicio de títulos de dsh, con el modelo del chat); hasta que llega, la tarjeta muestra la primera línea del primer mensaje. **×** y **Limpiar todo** solo quitan tarjetas del tablero: no se borra ningún chat. **Deshacer** solo aparece durante 8 segundos, en esta ventana; después, **Quitadas (N)** → **Volver a poner** devuelve una tarjeta, y un chat que vuelve a ejecutarse regresa por sí solo. **Limpiar todo** pregunta primero y quita las tarjetas terminadas y leídas del proyecto que se muestra (de todos los proyectos con **Todos los proyectos**), también las que están detrás de **Mostrar N más antiguas**; una tarjeta sin leer (verde) se queda. dsh guarda su punto verde solo en esta ventana, así que después de recargar, Limpiar todo puede quitar una tarjeta cuya respuesta no leíste. La lista se guarda en este Mac para todas las ventanas y para Tether; cuando llega a 5.000 chats, los más antiguos vuelven. **Responder** solo responde la solicitud más reciente del chat: cuando el chat la respondió en otro lugar (otra ventana, Tether, la revisión automática) o pregunta algo nuevo, el panel lo indica y no envía nada. Las versiones anteriores tenían una lista de tareas con comentarios y herramientas para agentes; ya no existen, y el antiguo `board.json` no se muestra. La idea y el aspecto vienen de [Kanzo](https://github.com/emanuele-em/kanzo), de emanuele-em (AGPL-3.0); Composer Plus no usa su código. `Cmd+Shift+K` es un atajo de dsh: en un navegador en Linux no tiene tecla predeterminada (asígnala en la página de atajos de teclado de dsh), y una extensión del navegador u otra aplicación puede tomarla antes. Una tarjeta sale de **Hecho** cuando desaparece el punto verde de dsh (abriste el chat) o, para un chat que terminó detrás del tablero mientras era el chat abierto, cuando ese chat se muestra sin un panel encima. Este estado de leído vive solo en esta ventana de dsh, como los puntos de dsh: tras recargar o en otra ventana, cada chat terminado cuenta como leído, así que está en **Terminados hace poco**.
|
|
253
283
|
- **Prioridad al mensaje enviado tras Detener** solo actúa después de que detienes el chat (o tras un turno que falló, o al abrir un chat que aún tiene cola): un mensaje que envías mientras un turno se ejecuta sigue esperando al final de la cola. Solo pasa por delante de tus propios mensajes en cola: si en la cola espera una ronda de un objetivo o una respuesta a una pregunta, se mantiene el orden de dsh. Lee una parte de dsh que no es una API pública (si el turno detenido aún está terminando); si una actualización de dsh le cambia el nombre, el mensaje pasa delante solo cuando ese turno ha terminado. Los chats de subagentes mantienen el orden de dsh.
|
|
254
284
|
- **Memoria del proyecto** pertenece a la primera carpeta del chat (la carpeta de proyecto de dsh): un chat que cambia de carpeta con `cd` conserva la memoria de su primer proyecto, y la misma carpeta abierta por otra ruta a los mismos archivos la comparte. Un chat congela su sección de memoria al empezar, así que una nota guardada después aparece desde el chat siguiente (`memory_recall` la encuentra al momento). La revisión solo guarda lo que el modelo decide guardar: puede pasar por alto un dato o guardar uno erróneo; revísalas en **Abrir memoria** y cámbialas allí, o edita los archivos a mano con dsh cerrado. **Abrir memoria** envía las notas del proyecto seleccionado y las notas globales (todos los proyectos si seleccionas Todas las notas; como mucho unos 60.000 caracteres, el resto solo se cuenta y no puede cambiar en esa solicitud) y tu texto al modelo predeterminado de dsh, no al modelo del chat. Una vista previa se guarda en el Mac 30 minutos y hasta que dsh se reinicia; si una revisión o el agente cambian las notas mientras tanto, **Aplicar** se niega y vuelves a pedir la vista previa. **Aplicar** guarda todos los cambios de una vista previa o ninguno: si un cambio no se puede guardar (por ejemplo, MEMORY.md está lleno), las notas quedan como estaban y se muestra el motivo. Cada turno terminado con un mensaje tuyo cuesta una llamada al modelo; una llamada fallida vuelve a leer los mismos mensajes después del turno siguiente. Los chats de subagentes no se revisan. La idea y el formato de archivo vienen de [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus no usa su código y nunca lee ni escribe la memoria propia de DS Bot.
|
|
285
|
+
- **Historial de versiones de la memoria** conserva las 50 versiones más recientes de cada memoria (cada proyecto y la memoria global); las más antiguas se borran. Una versión guarda toda la memoria de ese proyecto, no una nota. **Restaurar** devuelve todos los archivos de esa versión (temas incluidos) y se niega si la memoria cambió después de abrir la versión; la memoria anterior a la restauración pasa a ser una versión nueva, así que puedes deshacerla. Con el interruptor desactivado no se guardan versiones nuevas y **Restaurar** se niega; las versiones guardadas se quedan. No hay versiones de antes de esta función: el historial empieza con el primer guardado tras instalarla.
|
|
286
|
+
- **Exportar la memoria a AGENTS.md** escribe solo las notas de la memoria de un proyecto; las notas globales, las fuentes y las fechas no se incluyen. La siguiente exportación sustituye toda la sección marcada, así que un cambio que hagas a mano dentro de ella se pierde (el diff lo muestra antes); el texto fuera de las marcas se queda. Si las marcas están rotas (falta una o están dos veces), la exportación se niega hasta que las corrijas. Se rechazan un AGENTS.md de más de 512 kB, un enlace simbólico que sale de la carpeta del proyecto y todo lo que no sea un archivo normal. Si AGENTS.md o las notas cambian tras la vista previa, **Escribir AGENTS.md** se niega y vuelves a exportar.
|
|
287
|
+
- **Enlace de origen de las notas de memoria** funciona con las notas guardadas después de instalar esta versión: una nota más antigua solo indica su chat (o nada), así que **Origen** solo abre el chat o no aparece. Si el mensaje ya no está (una reversión lo retiró o se borró el chat), el chat se abre y un aviso dice que el mensaje no está.
|
|
288
|
+
- **Copiar la memoria a otro proyecto** copia como máximo 100 notas a la vez y solo a un proyecto que dsh lista (lee la propia lista de proyectos de dsh; ninguna ruta viene de la ventana). Cada copia es independiente: un cambio posterior en una nota de un proyecto no cambia la copia. Si una nota marcada no cabe (el MEMORY.md o el tema de destino está lleno, o ya tiene 40 temas), no se copia nada. Una nota cuyo texto y tema ya están en el destino se omite, y el recuento dice cuántas.
|
|
289
|
+
- **Buscar notas de memoria obsoletas** solo encuentra lo que una nota escribe de una forma que conoce: una ruta en un fragmento de código (`src/cart.ts`), un script de npm tras `npm run` (o `npm test`, `pnpm lint`), un nombre de rama en un fragmento de código junto a la palabra "rama". Una ruta que sale de la carpeta del proyecto no se informa; un script solo se comprueba si el proyecto tiene `package.json`, una rama solo en un repositorio git. Comprueba como máximo 200 cosas a la vez. Un aviso significa "no se encuentra ahora", no "incorrecto": también se informa de un archivo que una compilación crea después.
|
|
290
|
+
- **No usar la memoria en este chat** actúa desde la siguiente petición al modelo de ese chat: una petición que ya está en curso conserva lo que tiene. Cambiarlo en un chat en marcha cambia su prompt de sistema una vez, así que esa petición no puede usar la caché del proveedor del modelo. Un subagente sigue a su chat raíz. La revisión no lee los mensajes que un chat recibe mientras su memoria está desactivada, tampoco si la vuelves a activar después. En dsh 0.2.0 la pantalla de chat nuevo no tiene sitio para el botón: aparece en la cabecera del chat tras el primer mensaje.
|
|
291
|
+
- **Sugerir notas de memoria desde un chat** muestra como máximo 10 sugerencias y las guarda 30 minutos y hasta que dsh se reinicia; después, al aceptar se te pide volver a sugerir. Un chat largo envía sus mensajes más recientes: las respuestas más antiguas del agente salen primero. Una sugerencia puede ser errónea: léela antes de aceptarla y usa **Abrir memoria** para cambiar una nota después. Una sugerencia rechazada puede volver en el siguiente clic.
|
|
255
292
|
- **Copia de seguridad** usa una sola carpeta fija, `~/Desktop/dsh-backups` (la predeterminada de dsh-backup, para que sus archivos comprimidos sigan sirviendo); no hay ningún ajuste para otra carpeta. Un archivo comprimido ocupa más o menos lo mismo que el directorio home de dsh sin `cache/` ni `dsh-runtimes/` (medido: 1,6 GB de archivos dieron un archivo comprimido de 830 MB en unos 30 s en Apple Silicon; dsh siguió respondiendo). Un archivo que cambia mientras se lee se guarda tal como estaba cuando la copia de seguridad lo abrió, así que el registro de un chat abierto puede terminar en una entrada cortada, que dsh repara en su siguiente escritura. El ocultamiento encuentra un secreto en un archivo yml por el nombre de su clave en una línea (`token:`, `apiKey:`, …); un secreto en un mapa de flujo (`{token: x}`), en una lista bajo una de esas claves, en un archivo JSON (por ejemplo, la `apiKey` de un servidor MCP en un archivo `.json`) o con otro nombre se queda en el archivo comprimido. Los archivos comprimidos por tipo de dsh-backup (`dsh-t-…`) no aparecen en la lista. **Para otro equipo** copia el archivo comprimido (un clon en APFS: sin espacio adicional); el vault no va con él. **Hacer copia ahora** no elimina ninguna copia de seguridad. Una copia de seguridad automática conserva las copias más recientes que hizo Composer Plus (el ajuste **Conservar** de **Copia de seguridad automática**) y elimina sus copias más antiguas; las instantáneas anteriores a una actualización se cuentan aparte (se quedan las 2 más recientes). Los archivos comprimidos de dsh-backup nunca se eliminan: quítalos con **Eliminar**. Mientras dsh-backup siga instalado, cuenta los archivos comprimidos de Composer Plus en su propio número de copias que conserva y puede eliminarlos.
|
|
256
293
|
- **Restaurar** solo funciona en la consola de rescate, con dsh cerrado: sustituye todo el directorio home de dsh. El anterior se queda a su lado como `.dsh.pre-restore-<time>` hasta que lo elimines, así que el disco necesita espacio para los dos. Los chats conservan las rutas de sus proyectos: en otro equipo, un proyecto en otra ruta aparece como ausente hasta que vuelvas a añadirlo. Los enlaces simbólicos que apuntan fuera del directorio home de dsh (por ejemplo, skills enlazadas desde otra carpeta) vuelven como enlaces; sus destinos deben existir en ese equipo.
|
|
257
294
|
- **Comprobación de registros de sesión** lee el registro más reciente de cada chat con las propias reglas de dsh sobre lo que se abre: una línea que no es JSON o que está fuera de orden solo cuenta como daño cuando después viene un final de turno (si no, dsh abre el chat sin las líneas desde ese punto, así que no aparece en la lista). No comprueba los eventos de un registro con las reglas de eventos del propio dsh, así que un registro que considera sano puede no abrirse después de una actualización de dsh. Una reparación toma la copia de una copia de seguridad: los mensajes posteriores a esa copia de seguridad se pierden en ese chat (el archivo dañado se queda a su lado). Un chat abierto en este dsh no se repara en Configuración: dsh lo tiene retenido.
|
|
@@ -286,7 +323,13 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
286
323
|
|
|
287
324
|
**¿Puede el agente recordar mis preferencias entre chats, como la memoria de DS Bot?** Sí, con **Memoria del proyecto** (desactivada de forma predeterminada): actívala en **Configuración → Composer Plus**. Después de cada turno, tus preferencias y decisiones duraderas se guardan como notas breves para el proyecto del chat, y cada chat nuevo de ese proyecto las lee. Pide al agente que recuerde algo y lo guarda al momento. Para ver o cambiar las notas, pulsa **Abrir memoria** en la misma fila y escribe qué cambiar.
|
|
288
325
|
|
|
289
|
-
|
|
326
|
+
**Yo o la IA hicimos un cambio incorrecto en la memoria. ¿Puedo recuperar las notas anteriores?** Sí, con **Historial de versiones de la memoria** (activado por defecto): en **Abrir memoria**, selecciona el proyecto y luego **Historial**. Selecciona la versión anterior al cambio para ver qué vuelve y luego **Restaurar**.
|
|
327
|
+
|
|
328
|
+
**¿Puedo compartir la memoria del proyecto con mi equipo u otra herramienta de agentes?** Sí, con **Exportar la memoria a AGENTS.md** (activado por defecto): en **Abrir memoria**, selecciona el proyecto y luego **Exportar a AGENTS.md**. Revisa el diff, luego **Escribir AGENTS.md**, y confirma el archivo en git.
|
|
329
|
+
|
|
330
|
+
**¿Puede la IA sugerir qué guardar de un chat largo?** Sí, con **Sugerir notas de memoria desde un chat** (activado por defecto mientras **Memoria del proyecto** está activada): haz clic en **Sugerir para la memoria** en la cabecera del chat y luego **Aceptar** en las notas que valga la pena guardar.
|
|
331
|
+
|
|
332
|
+
**¿Puedo ver todos mis chats como un tablero kanban e iniciar chats nuevos desde él?** Sí, con **Tablero de tareas** (activado de forma predeterminada): ábrelo en la barra lateral izquierda. Cada chat es una tarjeta en **En curso**, **En revisión** (te espera) o **Hecho**. **Nueva tarea** abre el chat nuevo de dsh en el proyecto, y el tablero vuelve cuando se envía tu primer mensaje; haz clic en **Responder** en una tarjeta naranja para responderla sin abrir el chat. **Limpiar todo**, en **Hecho**, pregunta primero y quita del tablero las tarjetas terminadas que ya leíste; **Deshacer** y **Quitadas (N)** las devuelven, y los chats siguen en dsh.
|
|
290
333
|
|
|
291
334
|
**¿Puede dsh hacer copias de seguridad de mis chats y ajustes, como dsh-backup?** Sí: **Configuración → Composer Plus → Copia de seguridad → Hacer copia ahora**. Escribe el mismo formato de archivo comprimido en la misma carpeta (`~/Desktop/dsh-backups`), así que los archivos comprimidos de dsh-backup también aparecen y se pueden restaurar, y puedes desinstalar dsh-backup. Activa **Copia de seguridad automática** para hacer copias según un horario.
|
|
292
335
|
|
|
@@ -314,10 +357,22 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
314
357
|
|
|
315
358
|
**¿Cómo evito que el agente ejecute `npm publish` o `git push --force`?** **Configuración → Composer Plus → Comandos bloqueados**: escribe `npm publish`, elige **bloquear** o **preguntar antes** y luego haz clic en **Añadir**. **bloquear** rechaza el comando y el agente te pregunta; **preguntar antes** muestra la tarjeta de aprobación cada vez. Archivos protegidos cubre las herramientas de archivos del agente; Comandos bloqueados cubre sus comandos de shell.
|
|
316
359
|
|
|
360
|
+
**¿Puedo decirle al agente por qué rechacé una llamada a herramienta?** Sí, con **Rechazar con nota** (activado de forma predeterminada): haz clic en **Rechazar con nota…** en la tarjeta de aprobación, escribe el motivo o qué hacer en su lugar y haz clic en **Rechazar**. El agente lee el rechazo y tu nota en el mismo turno.
|
|
361
|
+
|
|
362
|
+
**¿Cómo le doy al agente una contraseña o un token sin escribirlo en el chat?** Con **Entrada secreta** (activada de forma predeterminada): pide al agente que use `request_secret`, o espera a que lo pida. Escribe el valor en la tarjeta de la fila de la herramienta y haz clic en **Guardar**. El agente recibe solo la ruta de un archivo que contiene el valor, y el archivo se borra al terminar el turno.
|
|
363
|
+
|
|
364
|
+
**¿Cómo respondo solo a una parte de una respuesta larga?** Selecciona esa parte y haz clic en **Citar** sobre la selección (**Citar en la respuesta**, activada de forma predeterminada). La parte va al campo de texto como cita `> …` y escribes tu respuesta debajo.
|
|
365
|
+
|
|
366
|
+
**¿Puedo preguntar algo mientras el agente trabaja, sin detenerlo?** Escribe la pregunta y haz clic en **Preguntar en un chat lateral** en el campo de texto (**Chat lateral**, activado de forma predeterminada). Una copia de solo lectura del chat la responde mientras el chat sigue. En el chat lateral, **Traer de vuelta** pone la respuesta en el campo de texto del chat.
|
|
367
|
+
|
|
368
|
+
**¿Cómo le digo al agente qué cambiar en su diff?** En **Panel de cambios**, abre el diff del archivo, haz clic en **+** en una línea y escribe una nota (**Notas del diff**, activado de forma predeterminada). Luego haz clic en **Enviar al campo de texto**: las notas van al campo de texto con el archivo, los números de línea y las líneas.
|
|
369
|
+
|
|
317
370
|
**¿Cómo evito que la revisión automática pregunte por la misma herramienta en un chat?** Haz clic en **Permitir en este chat** en la tarjeta de aprobación. Solo cubre esa herramienta exacta en ese chat, durante 1 hora por defecto; revoca el permiso desde el chip de la cabecera. Cambia el tiempo en **Configuración → Composer Plus → Permitir en este chat**.
|
|
318
371
|
|
|
319
372
|
**Perdí mi iPhone. ¿Cómo evito que llegue a mi Mac?** Haz clic en **Conexión móvil**, abajo a la izquierda de la barra lateral, y haz clic en **Remove** junto a ese iPhone. Su clave deja de funcionar al instante; solo puede volver con un nuevo emparejamiento que apruebes en el Mac.
|
|
320
373
|
|
|
374
|
+
**¿Cómo continúo un chat de mi otro Mac desde este?** En el otro Mac, activa **Configuración → Composer Plus → Equipos remotos** y **Permitir que otros equipos abran este Mac**, haz clic en **Crear enlace de emparejamiento** y copia el enlace (envíatelo, por ejemplo con AirDrop o Notas). En este Mac, activa también **Equipos remotos**, elige **Añadir un equipo…** a la izquierda del título del chat, pega el enlace y haz clic en **Conectar**. Después haz clic en **Aprobar** en el otro Mac. Desde entonces, elige ese equipo en el mismo menú.
|
|
375
|
+
|
|
321
376
|
**¿Puedo bloquear Tether con Face ID?** Sí: en Tether, activa «Settings → Privacy → Lock with Face ID». Después, Tether pide Face ID (o el código) al abrirse y cuando vuelves a la app.
|
|
322
377
|
|
|
323
378
|
**¿Cómo muestro en la barra lateral de dsh solo los proyectos que usé hoy?** Barra lateral → opciones de vista (icono de controles deslizantes) → **Activos en las últimas 2 horas**. Selecciónalo otra vez para mostrar todos los proyectos.
|
|
@@ -330,6 +385,10 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
330
385
|
|
|
331
386
|
**¿Puede dsh abrir por sí solo el chat que me hace una pregunta?** Sí, con **Abrir el chat en espera si estás inactivo** (activado por defecto): cuando un chat espera una respuesta, una aprobación o una revisión del plan y no usas dsh durante 30 segundos, dsh lo abre. Un chat que terminó un turno que aún no has leído (el punto verde) se abre de la misma forma, después de los naranjas. Mientras escribes, te desplazas o mueves el ratón, espera.
|
|
332
387
|
|
|
388
|
+
**¿Puedo ir directamente al siguiente chat que me espera?** Sí, con **Siguiente chat en espera** (activado por defecto): pulsa `Cmd+Shift+E` (`Ctrl+Shift+E` en Windows y Linux) o haz clic en el botón con el número en la cabecera de la barra lateral. Primero van los chats que hacen una pregunta o esperan una aprobación, después los que terminaron un turno que aún no has leído.
|
|
389
|
+
|
|
390
|
+
**¿Puedo responder a las opciones de un agente con un clic?** Sí, con **Botones de opciones** (activado por defecto): cuando una respuesta termina con una lista "Opciones", haz clic en un botón debajo de ella. Envía "Option N: …" como tu mensaje. En una tarjeta de pregunta del agente, pulsa 1–9.
|
|
391
|
+
|
|
333
392
|
**¿Cómo cambio la interfaz de DeepSeek Harness a turco, español, japonés…?** Configuración → Composer Plus → **Idioma de la aplicación**.
|
|
334
393
|
|
|
335
394
|
**¿Cómo uso dsh desde mi iPhone?** Compila la app Tether desde `tether/ios` (Xcode), activa **Configuración → Composer Plus → Conexión móvil (iPhone)**, haz clic en **Conexión móvil** abajo a la izquierda, escanea el código QR (con la Cámara del iPhone o con **Scan code** en Tether), toca **Connect** y haz clic en **Approve**. Fuera de casa, usa Tailscale en los dos dispositivos.
|
|
@@ -359,9 +418,13 @@ PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/ds
|
|
|
359
418
|
PLAYWRIGHT=/path/to/playwright node test/browser-recent-tree.mjs /path/to/dsh/lib/bin.js
|
|
360
419
|
# Order by status (fake model + Schedule): real-app test + its thumbnail
|
|
361
420
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
|
|
421
|
+
# Next waiting chat and Option buttons (fake model): the sidebar button and Cmd+Shift+E open the waiting chats in order, the Keyboard shortcuts row, the option buttons and the question card keys, switch off + their thumbnails
|
|
422
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
|
|
423
|
+
# Reject with note, Secret input, Quote in reply, Side chat and Diff notes (fake model + a test-only approval gate): the button on dsh's card, the note after the rejection in the next request, Esc; the secret card, Save, the value in no request, file or page, Decline, Stop; a selected part of an answer → Quote → the sent message; a side question while the chat waits on a card (read-only, no queued message in it), Bring back; notes on a diff line and range → Send to composer → the sent message; switch off + their thumbnails
|
|
424
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
|
|
362
425
|
# every Settings feature row shows a loading screenshot and a ? link to its README row
|
|
363
426
|
PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
|
|
364
|
-
# What's new after an update: the release notes show once, Esc and Close close them
|
|
427
|
+
# What's new after an update: the release notes show once (also after an install through another path), Esc and Close close them; Settings → What’s new in this version opens them again
|
|
365
428
|
PLAYWRIGHT=/path/to/playwright node test/browser-whats-new.mjs /path/to/dsh/lib/bin.js
|
|
366
429
|
# README feature anchors (the ? links) on github.com, headless: each #feature-… shows the start of its row
|
|
367
430
|
PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
|
|
@@ -408,7 +471,7 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
|
|
|
408
471
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
409
472
|
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
410
473
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
411
|
-
# Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board,
|
|
474
|
+
# Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
|
|
412
475
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
413
476
|
```
|
|
414
477
|
|