dsh-composer-plus 1.20.0 → 1.21.0

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.pt-BR.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem gerencia esse perfil é o app.)
31
31
 
32
- > O pnpm do dsh ignora versões publicadas há menos de 24 horas. Logo depois de uma nova versão, informe a versão: `dsh-composer-plus@1.20.0`.
32
+ > O pnpm do dsh ignora versões publicadas há menos de 24 horas. Logo depois de uma nova versão, informe a versão: `dsh-composer-plus@1.21.0`.
33
33
 
34
34
  ## Recursos
35
35
 
@@ -71,9 +71,21 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
71
71
  | **Etapas planejadas** | <a id="feature-plannedsteps"></a>Desativado por padrão: ative em **Configurações → Composer Plus**. O agente recebe a ferramenta `plan_next_steps`: na mesma mensagem de um comando, ele pode planejar os próximos comandos com os argumentos exatos e uma condição, por exemplo “rode `npm test` quando o build passar”. Quando o resultado atende à condição, o Composer Plus executa a próxima etapa sozinho, sem uma nova chamada ao modelo, e um chat longo usa menos tokens. A etapa aparece no chat como uma linha curta, “Composer Plus · Planned steps: ran `test` … without a model call”, seguida da chamada da ferramenta e do resultado. Somente etapas de `bash`, `read`, `grep` e `glob`; aprovações, sandbox e Arquivos protegidos valem para cada etapa como sempre. O modelo responde de novo quando uma condição falha, quando duas etapas ficam prontas ao mesmo tempo, depois da última etapa e quando você envia uma mensagem. A ideia vem do HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Captura de tela: Etapas planejadas"></a> |
72
72
  | **Arquivos protegidos** | <a id="feature-protectedfiles"></a>Ativado por padrão. As ferramentas de arquivo do próprio agente não podem ler nem alterar arquivos que correspondem aos seus padrões: `read`, `read_image` e `grep` em um arquivo são recusados para padrões de **leitura e gravação**, e `write`, `edit` e `str_replace_editor` para os dois tipos. O agente lê o motivo e é orientado a perguntar a você. Os padrões iniciais são `.env*`, `*.pem` e `*.key`. Configurações → Composer Plus → **Arquivos protegidos**: adicione um padrão (por exemplo `published/**` ou `config/*.yml`), clique no tipo dele para alternar entre **leitura e gravação** e **somente gravação**, remova-o com ✕ ou clique em **Usar os valores padrão**. Um padrão sem `/` corresponde a um nome de arquivo em qualquer pasta. Isto é uma barreira de proteção, não um sandbox: um comando de shell (`cat .env`), um script ou uma ferramenta MCP ainda podem acessar o arquivo (veja Limites). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Captura de tela: Arquivos protegidos"></a> |
73
73
  | **Comandos bloqueados** | <a id="feature-blockedcommands"></a>Ativado por padrão, com a lista vazia. Os comandos de shell do agente (`bash`, `pwsh`) não podem executar um comando que corresponda às suas regras: uma regra **bloquear** recusa a chamada (o agente lê o motivo e é orientado a perguntar a você), uma regra **perguntar antes** mostra o cartão de aprovação do dsh, e o comando só é executado quando você permite. Configurações → Composer Plus → **Comandos bloqueados**: digite uma regra (por exemplo `npm publish`, `git push --force` ou `ssh *192.168.2.19`), clique no tipo para alternar entre **bloquear** e **perguntar antes** e depois clique em **Adicionar**; clique no tipo de uma regra para mudá-lo e remova-a com ✕. Uma regra é um nome de comando e palavras que precisam vir depois dele nesta ordem; `*` corresponde a qualquer texto. A verificação também encontra o comando depois de `&&`, `;`, `\|`, dentro de `$(…)`, `bash -c "…"` ou `eval`, e depois de `sudo` ou `env`. Isto é uma barreira de proteção, não um sandbox: uma variável (`$CMD`), um arquivo de script ou outro programa ainda podem executar o comando (veja Limites). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Captura de tela: Comandos bloqueados"></a> |
74
- | **Quadro de tarefas** | <a id="feature-taskboard"></a>Barra lateral esquerda → **Quadro de tarefas**. Um quadro kanban dos seus chats do dsh com o estado ao vivo que a barra lateral mostra: um chat que espera sua aprovação, sua resposta ou a revisão de um plano fica em **Em revisão** com um ponto laranja, um chat em execução fica em **Fazendo** e um chat concluído fica em **Concluído** (verde até você abri-lo). Escolha um projeto ou **Todos os projetos** à esquerda; uma pasta de “Um branch por chat” conta como o projeto dela. Digite em **Buscar projetos**, acima da lista, para encontrar um projeto pelo nome (maiúsculas e acentos não importam; `Esc` limpa a caixa), e clique em **Ativos nas últimas 2 horas** para mostrar só os projetos com um chat que espera, está em execução, terminou sem ser visto ou mudou nas últimas 2 horas (fica salvo neste dispositivo). **Nova tarefa** (ou `n`) abre o próprio novo chat do dsh no projeto que o quadro mostra (com **Todos os projetos**, o projeto que a Nova sessão do dsh escolhe), então você pode adicionar arquivos, usar comandos e escolher o modelo como em qualquer chat. Quando a sua primeira mensagem é enviada, o quadro volta sozinho. Até lá, o chat espera em **A fazer** como **Nova tarefa**: clique nele para escrever a primeira mensagem. A coluna **A fazer** só aparece nesse momento. Um projeto com um chat que espera por você tem um ponto laranja na lista de projetos. O dsh dá nome ao chat e o modelo do chat escreve até 3 etiquetas a partir dessa mensagem. Clique em um cartão para abrir o chat dele. Em um cartão laranja, clique em **Responder** para responder no quadro: **Rejeitar** ou **Permitir uma vez**, **Aprovar** ou **Solicitar alterações** para um plano, ou as opções e o seu próprio texto para uma pergunta. **Ocultar concluídos** oculta **Concluído** neste dispositivo. Aponte para um cartão em **Fazendo** (ou mova o foco do teclado até ele) para ver o progresso: há quanto tempo ele está em execução, a etapa da sua lista de tarefas pendentes, a ferramenta que está em execução agora e a última linha do agente. Em Configurações → Composer Plus → Quadro de tarefas, **Progresso ao passar o cursor** escolhe **Rápido (sem IA)** (o padrão: só lê o chat) ou **Resumo com IA** (uma chamada curta ao modelo do chat também escreve uma ou duas frases). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Captura de tela: Quadro de tarefas"></a> |
74
+ | **Quadro de tarefas** | <a id="feature-taskboard"></a>Barra lateral esquerda → **Quadro de tarefas**, ou pressione `Cmd+Shift+K` (`Ctrl+Shift+K` no Windows e no Linux) em qualquer lugar do dsh. Um quadro kanban dos seus chats do dsh com o estado ao vivo que a barra lateral mostra: um chat que espera sua aprovação, sua resposta ou a revisão de um plano fica em **Em revisão** com um ponto laranja, um chat em execução fica em **Fazendo** e um chat concluído que você ainda não abriu fica em **Concluído** (verde). Quando você abre um chat, o cartão dele sai de **Concluído** sozinho; clique em **Concluídos recentemente (N)**, abaixo dos cartões verdes, para ver os chats concluídos que você já leu (os 10 mais recentes e depois **Mostrar N mais antigas**; aberto ou fechado fica salvo neste dispositivo). Um chat que termina enquanto está aberto atrás do quadro (uma **Nova tarefa**) fica verde até você abri-lo. Clique no nome do projeto, no topo do quadro, para abrir a lista de projetos e escolha um projeto ou **Todos os projetos**; uma pasta de “Um branch por chat” conta como o projeto dela. A lista fecha após a escolha, com `Esc` ou com um clique fora dela. Digite em **Buscar projetos**, no topo da lista, para encontrar um projeto pelo nome (maiúsculas e acentos não importam; `Esc` limpa a caixa), pressione `Enter` para escolher a primeira correspondência e clique em **Ativos nas últimas 2 horas** para mostrar só os projetos com um chat que espera, está em execução, terminou sem ser visto ou mudou nas últimas 2 horas (fica salvo neste dispositivo). **Nova tarefa** (ou `n`) abre o próprio novo chat do dsh no projeto que o quadro mostra (com **Todos os projetos**, o projeto que a Nova sessão do dsh escolhe), então você pode adicionar arquivos, usar comandos e escolher o modelo como em qualquer chat. Quando a sua primeira mensagem é enviada, o quadro volta sozinho. Até lá, o chat espera no topo de **Fazendo** como **Nova tarefa**: clique nele para escrever a primeira mensagem. Um projeto com um chat que espera por você tem um ponto laranja na lista de projetos (o nome do projeto no topo também tem, enquanto algum chat espera). O dsh dá nome ao chat e o modelo do chat escreve até 3 etiquetas a partir dessa mensagem. Clique em um cartão para abrir o chat dele. Clique em um cartão laranja (ou em **Responder**) para responder no quadro; o painel tem **Abrir chat** para ver o chat inteiro: **Rejeitar** ou **Permitir uma vez**, **Aprovar** ou **Solicitar alterações** para um plano, ou as opções e o seu próprio texto para uma pergunta. Clique em **×** em um cartão concluído para tirá-lo do quadro, ou abra **Concluídos recentemente** e clique em **Limpar tudo**, no topo de **Concluído**, para tirar esses cartões do quadro: primeiro ele mostra quantos cartões de qual projeto saem, e os cartões não lidos (verdes) ficam. Nos 8 segundos seguintes, **Desfazer** devolve os cartões; **Retirados (N)**, abaixo de **Concluído**, lista os cartões que estão fora do quadro, e **Devolver** mostra um deles de novo em **Concluído**. Nenhum chat é apagado: os chats continuam na barra lateral do dsh, o quadro se lembra disso depois de reiniciar (o Tether mostra o mesmo quadro) e um chat que é executado de novo volta ao quadro. Aponte para um cartão em **Fazendo** (ou mova o foco do teclado até ele) para ver o progresso: há quanto tempo ele está em execução, a etapa da sua lista de tarefas pendentes, a ferramenta que está em execução agora e a última linha do agente. Em Configurações → Composer Plus → Quadro de tarefas, **Progresso ao passar o cursor** escolhe **Rápido (sem IA)** (o padrão: só lê o chat) ou **Resumo com IA** (uma chamada curta ao modelo do chat também escreve uma ou duas frases). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Captura de tela: Quadro de tarefas"></a> |
75
75
  | **Memória do projeto** | <a id="feature-projectmemory"></a>Desativado por padrão: ative em **Configurações → Composer Plus**. Cada pasta de projeto tem a própria memória, que os chats seguintes desse projeto leem, como o DS Bot guarda uma por Bot. Depois de cada turno concluído, uma chamada ao modelo do chat lê as mensagens novas (não as revertidas), guarda suas preferências, decisões e fatos duradouros como notas curtas, e muda ou remove as antigas. O agente também pode salvar, remover e buscar notas sozinho (`memory_remember`, `memory_forget`, `memory_recall`). Uma nota também pode ser global: todos os projetos a leem. Um chat novo recebe as notas no prompt de sistema; uma nota salva depois aparece a partir do chat seguinte. Os arquivos são Markdown na pasta inicial do dsh (`storages/dsh-composer-plus/memory/`), nunca na pasta do projeto. **Abrir memória**, na mesma linha, mostra todas as notas salvas agrupadas por projeto (e a memória global), com um filtro. Escreva com suas palavras o que mudar (por exemplo "troquei yarn por pnpm") e toque em **Ver prévia das mudanças**: o modelo padrão do dsh propõe as mudanças e só **Aplicar** as salva. No Tether: menu do título do chat → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Captura de tela: Memória do projeto"></a> |
76
+ | **Histórico de versões da memória** | <a id="feature-memoryhistory"></a>Ativado por padrão enquanto **Memória do projeto** está ativada. Antes de cada gravação da memória (o agente, a revisão após um turno, **Abrir memória**), uma cópia das notas como estavam é guardada. Em **Abrir memória**, selecione um projeto ou **Memória global** e depois **Histórico**: as versões por data e quem mudou a memória depois de cada uma. Selecione uma versão para ver como diff o que uma restauração muda e depois **Restaurar**. As notas de antes de uma restauração também são guardadas, então você pode desfazê-la. As 50 versões mais recentes de cada memória ficam guardadas. No Tether: menu do título do chat → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Captura de tela: Histórico de versões da memória"></a> |
77
+ | **Exportar a memória para AGENTS.md** | <a id="feature-memoryexport"></a>Em **Abrir memória**, selecione um projeto e depois **Exportar para AGENTS.md**: as notas desse projeto vão para uma seção marcada de `AGENTS.md` na pasta dele, para você fazer commit e compartilhar com a equipe e outras ferramentas de agentes. Primeiro você vê a mudança como diff; só **Gravar AGENTS.md** salva. A próxima exportação substitui só essa seção. A memória global, as fontes e as datas ficam de fora. No Tether: menu do título do chat → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Captura de tela: Exportar a memória para AGENTS.md"></a> |
78
+ | **Link de origem das notas da memória** | <a id="feature-memorysource"></a>Em **Abrir memória**, uma nota que veio de um chat (o agente salvou, a revisão após um turno guardou ou você aceitou uma sugestão) tem **Origem** ao lado: um clique abre esse chat na mensagem, para você conferir por que a nota está lá antes de mudá-la ou apagá-la. Uma nota de uma versão anterior abre só o chat. No Tether: menu do título do chat → Project memory → Source. | <a href="assets/features/memorySource.webp"><img src="assets/features/memorySource.webp" width="160" alt="Captura de tela: Link de origem das notas da memória"></a> |
79
+ | **Copiar a memória para outro projeto** | <a id="feature-memorycopy"></a>Em **Abrir memória**, selecione um projeto ou **Memória global** e depois **Copiar para projeto**: marque as notas, pesquise os projetos do dsh e clique em um. Todas as notas marcadas vão para a memória desse projeto (com o tópico e a origem), ou nenhuma: se uma não couber, nada é copiado e o motivo aparece. Uma nota que o projeto já tem é ignorada. No Tether: menu do título do chat → Project memory → Copy to project. | <a href="assets/features/memoryCopy.webp"><img src="assets/features/memoryCopy.webp" width="160" alt="Captura de tela: Copiar a memória para outro projeto"></a> |
80
+ | **Encontrar notas de memória desatualizadas** | <a id="feature-memorystale"></a>Ao selecionar um projeto em **Abrir memória**, os caminhos de arquivo (em `código`), os scripts npm e os nomes de branch que as notas citam são comparados com o projeto atual. Uma nota que cita algo que o projeto não tem mais mostra ⚠ com o que falta, para você corrigi-la ou apagá-la antes que o modelo trabalhe com ela. Só lê arquivos comuns dentro da pasta do projeto e uma lista de branches do git; não muda nada nem chama nenhum modelo. No Tether: menu do título do chat → Project memory. | <a href="assets/features/memoryStale.webp"><img src="assets/features/memoryStale.webp" width="160" alt="Captura de tela: Encontrar notas de memória desatualizadas"></a> |
81
+ | **Não usar a memória neste chat** | <a id="feature-memoryperchat"></a>Enquanto **Memória do projeto** está ativada, o cabeçalho do chat mostra **Memória ativada**: clique para desativar a memória só nesse chat (**Memória desativada**). Então o modelo desse chat não recebe a seção de memória nem as ferramentas de memória, e a revisão após cada turno não o lê. No dsh 0.2.1 e posteriores o mesmo botão fica na tela de novo chat, então um chat de teste começa sem memória. Os outros chats não mudam. No Tether: menu do título do chat → Use project memory. | <a href="assets/features/memoryPerChat.webp"><img src="assets/features/memoryPerChat.webp" width="160" alt="Captura de tela: Não usar a memória neste chat"></a> |
82
+ | **Sugerir notas de memória a partir de um chat** | <a id="feature-memorysuggest"></a>Enquanto **Memória do projeto** está ativada, o cabeçalho do chat tem **Sugerir para a memória**: um clique pergunta ao modelo do chat quais regras e decisões deste chat vale a pena guardar para os próximos chats. Cada sugestão mostra o porquê; **Aceitar** salva com um link para o chat e a mensagem de onde veio, **Rejeitar** descarta. Nada é salvo antes de aceitar, e o modelo só é chamado quando você clica. Mensagens retiradas por uma reversão não são enviadas. No Tether: menu do título do chat → Suggest for memory. | <a href="assets/features/memorySuggest.webp"><img src="assets/features/memorySuggest.webp" width="160" alt="Captura de tela: Sugerir notas de memória a partir de um chat"></a> |
76
83
  | **Permitir neste chat** | <a id="feature-allowforchat"></a>Quando a Revisão automática pergunta, o cartão de aprovação ganha **Permitir neste chat**: a mesma ferramenta no mesmo chat passa a ser permitida daí em diante, com quaisquer argumentos, até o fim do limite de tempo (1 hora por padrão; escolha em **Configurações → Composer Plus → Permitir neste chat**). Depois, o agente pergunta de novo. Um chip no cabeçalho lista as autorizações com o horário de término e as revoga. As autorizações continuam valendo depois de reiniciar. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Captura de tela: Permitir neste chat"></a> |
84
+ | **Rejeitar com nota** | <a id="feature-rejectnote"></a>O cartão de aprovação mostra **Rejeitar com nota…** ao lado de **Rejeitar**. Clique, escreva o motivo ou o que fazer no lugar e clique em **Rejeitar** (ou pressione `Enter`; `Shift+Enter` adiciona uma linha, `Esc` fecha o campo). A nota vai primeiro para o agente, como uma mensagem no turno que espera, e depois a solicitação é rejeitada: o modelo lê a rejeição e a sua nota no mesmo turno, sem outra mensagem sua. Se a nota não puder ser enviada, nada é rejeitado e o campo continua aberto. No Tether: folha de aprovação → Reject with note. | <a href="assets/features/rejectNote.webp"><img src="assets/features/rejectNote.webp" width="160" alt="Captura de tela: Rejeitar com nota"></a> |
85
+ | **Entrada secreta** | <a id="feature-secretinput"></a>O agente recebe a ferramenta `request_secret`. Quando precisa de uma senha, um token ou uma chave de API, ele pede com ela em vez de pedir no chat: um cartão aparece na linha da ferramenta com o nome, por que ele precisa do valor, um campo de senha, **Salvar** e **Recusar**. **Salvar** grava o valor em um arquivo deste Mac que só você pode ler, e o agente recebe só o caminho do arquivo, que usa como entrada em um comando (por exemplo `"$(cat <path>)"`). Se um resultado de ferramenta posterior mostrar o valor, `[secret]` o substitui antes que o modelo o veja. O arquivo é apagado quando o turno termina. **Recusar** diz ao agente que você não o deu. Desative em **Configurações → Composer Plus** para remover a ferramenta. No Tether: a barra "Secret: …" acima do campo de texto → Enter. | <a href="assets/features/secretInput.webp"><img src="assets/features/secretInput.webp" width="160" alt="Captura de tela: Entrada secreta"></a> |
86
+ | **Citar na resposta** | <a id="feature-quotereply"></a>Selecione uma parte de uma resposta: um botão **Citar** aparece acima da seleção. Clique nele: essa parte vai para o campo de texto, na posição do cursor, como citação em Markdown (`> …`), com uma linha vazia depois, e o campo de texto recebe o foco para você escrever a resposta abaixo. Só conta o texto da resposta, não o raciocínio, as linhas de ferramenta ou suas próprias mensagens. Uma citação tem no máximo 2.000 caracteres. `Cmd+Z` (`Ctrl+Z`) a remove. No Tether: toque e segure uma resposta → Quote (a resposta inteira). | <a href="assets/features/quoteReply.webp"><img src="assets/features/quoteReply.webp" width="160" alt="Captura de tela: Citar na resposta"></a> |
87
+ | **Chat paralelo** | <a id="feature-sidechat"></a>Digite uma pergunta paralela no campo de texto e clique no botão de balões (**Perguntar em um chat paralelo**): uma cópia do chat abre e responde no modo somente leitura do dsh, enquanto o chat continua trabalhando. A cópia conhece o chat até agora, exceto as mensagens que ainda esperam na fila, e usa o modelo dele. Uma barra acima do campo de texto dela tem **Trazer de volta**: o chat abre e o campo de texto dele recebe suas perguntas (como citações `> `) e as respostas. **Voltar ao chat** só abre o chat. O chat paralelo fica na barra lateral como "↳ <pergunta>"; arquive-o lá. No Tether: menu do título do chat → Side chat…. | <a href="assets/features/sideChat.webp"><img src="assets/features/sideChat.webp" width="160" alt="Captura de tela: Chat paralelo"></a> |
88
+ | **Notas no diff** | <a id="feature-diffcomments"></a>No **Painel de alterações**, abra o diff de um arquivo e clique em **+** em uma linha (Shift+clique em uma segunda linha do mesmo bloco para um intervalo), escreva uma nota e clique em **Salvar nota**. As notas do chat esperam em uma barra no topo do painel; **Enviar ao campo de texto** as coloca na posição do cursor como Markdown: `path:12-14`, as linhas como bloco `diff` e sua nota. **Limpar** as descarta. As notas ficam neste navegador até você enviá-las ou limpá-las. Precisa do **Painel de alterações**. No Tether: o diff de um arquivo → toque e segure uma linha → Add note…. | <a href="assets/features/diffComments.webp"><img src="assets/features/diffComments.webp" width="160" alt="Captura de tela: Notas no diff"></a> |
77
89
  | **Status do projeto** | <a id="feature-projectstatus"></a>A linha de um projeto na barra lateral mostra o mesmo indicador de em execução / aguardando / concluído dos chats dele, então um projeto recolhido ainda avisa que um chat dentro dele está trabalhando ou precisa de você. Primeiro aparece um chat que está esperando você, depois um chat concluído que você ainda não abriu (o ponto verde, mesmo enquanto outro chat ainda está em execução) e depois o indicador de em execução. Passe o mouse sobre ele para ver os detalhes. Em **Árvore de workspaces**, a linha de uma pasta pai também mostra os chats de cada projeto dentro dela (por exemplo, cada pasta de branch em `.worktrees/`), mesmo quando ela está recolhida. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura de tela: Status do projeto"></a> |
78
90
  | **Branch do Git nas linhas de chat** | <a id="feature-sessionbranch"></a>Na visualização “Em uma única lista” da barra lateral, cada linha de chat mostra uma pequena etiqueta cinza com o branch do git em que a pasta do projeto do chat estava no último turno do chat (por exemplo `main` ou `feature/login`; um HEAD destacado não tem branch e não mostra etiqueta). Dois chats de um mesmo projeto em branches diferentes não parecem mais iguais, e você vê na hora quando está prestes a continuar um chat no branch errado. Passe o mouse sobre a etiqueta para ver o nome completo. A parte Host lê o branch (`git branch --show-current`, somente leitura) quando um turno começa e quando termina; um chat sem turno desde que você instalou isto, ou uma pasta que não é um repositório git, não mostra etiqueta. Em “Workspace” e “Árvore de workspaces”, nenhuma linha de chat mostra a etiqueta, porque o chat já fica abaixo da linha do projeto dele. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura de tela: Branch do Git nas linhas de chat"></a> |
79
91
  | **Marcar tudo como lido** | <a id="feature-markprojectread"></a>Na barra lateral, clique no botão **…** de um projeto → **Marcar tudo como lido**. Todos os chats desse projeto perdem o ponto verde de não lido de uma vez; os outros projetos mantêm os deles. O item fica cinza (**Nenhum chat não lido**) quando o projeto não tem nenhum. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Captura de tela: Marcar tudo como lido"></a> |
@@ -83,8 +95,11 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
83
95
  | **Ordenar por status** | <a id="feature-statusorder"></a>Barra lateral → opções de exibição → **Ordenar por** → **Por status** (com **Em uma única lista**). Os chats concluídos vêm primeiro (o ponto de “concluído” do dsh, que um turno que terminou com erro também recebe), depois os chats em execução ou aguardando, depois os chats com uma automação ativa (Tarefas de automação) e, por fim, os demais na ordem do dsh. Abrir um chat concluído o move para baixo. Só a exibição muda: selecione **Manual** ou **Última atualização** para voltar. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Captura de tela: Ordenar por status"></a> |
84
96
  | **Notificações em segundo plano** | <a id="feature-notifications"></a>Enquanto o dsh está em segundo plano, você recebe uma notificação quando um turno termina (a primeira linha da resposta) ou quando um chat realmente espera por você: uma aprovação (o nome da ferramenta), uma resposta (a pergunta) ou uma revisão de plano. Um pedido precisa continuar aberto 1,5 s depois, então as aprovações respondidas automaticamente (autorizações da Revisão automática, outros plugins) não geram aviso, e uma notificação é retirada assim que o pedido dela é respondido. O indicador no Dock/barra de tarefas conta os chats que estão aguardando. Clicar na notificação abre esse chat. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Captura de tela: Notificações em segundo plano"></a> |
85
97
  | **Abrir o chat em espera quando ocioso** | <a id="feature-idleswitch"></a>Quando um chat faz uma pergunta, aguarda uma aprovação ou uma revisão do plano (o ponto laranja) ou termina um turno que você ainda não leu (o ponto verde), e você não usa o dsh por 30 segundos, o dsh abre esse chat. Os chats laranja abrem antes dos verdes. Em cada grupo, o que espera há mais tempo abre primeiro; o próximo abre depois de mais 30 segundos sem uso. Uma tecla, um clique, um movimento do mouse, a roda de rolagem ou um toque reiniciam os 30 segundos. Texto no campo com o foco, texto selecionado ou um menu ou caixa de diálogo aberta também impedem a troca. Enquanto um chat em espera está na tela, nada muda. Se você sair de um chat em espera sem responder, ele pode abrir de novo depois dos próximos 30 segundos sem uso. Quando um chat verde abre, o ponto dele some; o próximo chat verde só abre depois que você usar o dsh de novo e então ficar 30 segundos sem usá-lo. Também funciona com o dsh em segundo plano, mas o dsh não vem para a frente. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Captura de tela: Abrir o chat em espera quando ocioso"></a> |
98
+ | **Próximo chat em espera** | <a id="feature-nextwaiting"></a>Um botão no cabeçalho da barra lateral mostra quantos outros chats estão esperando por você, com um ponto na cor do próximo: laranja quando ele faz uma pergunta ou aguarda uma aprovação ou uma revisão do plano, verde quando terminou um turno que você ainda não leu. Clique nele, ou pressione Cmd+Shift+E (Ctrl+Shift+E no Windows e no Linux), para abrir esse chat. Os chats laranja vêm antes dos verdes; em cada grupo, o chat que espera há mais tempo vem primeiro. O chat na tela não conta. Quando nenhum outro chat espera, o botão não aparece e a tecla não faz nada. Você pode mudar a tecla na página de atalhos de teclado do dsh (Próximo chat em espera). | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="Captura de tela: Próximo chat em espera"></a> |
99
+ | **Botões de opções** | <a id="feature-optionpicks"></a>Quando uma resposta termina com uma lista de opções (uma lista numerada de 1 a 9 itens sob um título "Opções" ou uma linha em negrito "Opções", também "Próximos passos" e as mesmas palavras nos idiomas do aplicativo), aparece um botão para cada opção abaixo da resposta. Um clique envia "Option N: …" com a opção inteira como sua mensagem, como se você a tivesse digitado. A opção marcada "(recomendada)" fica destacada. Os botões só aparecem abaixo da resposta mais recente, enquanto o chat está ocioso e a caixa de mensagem está vazia; uma resposta já escolhida e uma resposta retirada por uma reversão não mostram botões. Enquanto eles aparecem, a previsão da próxima mensagem não sugere nada. Em um cartão de pergunta do agente, as teclas 1–9 escolhem essa opção, como um clique (não no campo de resposta, nem nos primeiros 0,8 segundo depois que a pergunta aparece). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Captura de tela: Botões de opções"></a> |
86
100
  | **Idioma do aplicativo** | <a id="feature-language"></a>Configurações → Composer Plus → **Idioma do aplicativo** muda toda a interface do dsh para Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt ou हिन्दी (veja abaixo). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Captura de tela: Idioma do aplicativo"></a> |
87
101
  | **Conexão móvel (iPhone)** | <a id="feature-mobileconnect"></a>Use o dsh no seu iPhone com o app [Tether](tether/), na mesma rede Wi-Fi ou pelo [Tailscale](https://tailscale.com). Ative em **Configurações → Composer Plus** (o recurso vem desativado por padrão, porque abre uma porta de rede neste Mac). Depois, clique em **Conexão móvel** no canto inferior esquerdo da barra lateral: leia o código QR com a Câmera do iPhone (toque em **Open in Tether**) ou com **Scan code** no Tether, toque em **Connect** e clique em **Approve**. Instale o Tether antes: sem ele, a Câmera não consegue abrir o código. O celular mostra seus chats, envia mensagens (com fotos: o **+** do editor de mensagens → Camera, Photos ou Paste image), responde a aprovações e perguntas, e troca de modelo e de agente. Pareie quantos Macs quiser: o nome do Mac no canto superior esquerdo do app alterna entre eles. O painel **Conexão móvel** lista os iPhones pareados com a última conexão de cada um: **Remove** desconecta um deles na hora. “Tailscale only” recusa a rede local (para um Wi-Fi compartilhado), e o registro de acesso mostra quem tentou se conectar. No Tether, “Settings → Privacy” bloqueia o app com o Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura de tela: Conexão móvel (iPhone)"></a> |
102
+ | **Computadores remotos** | <a id="feature-remotecomputers"></a>Abra o dsh dos seus outros Macs pelo [Tailscale](https://tailscale.com) e continue os chats deles aqui. Ative em **Configurações → Composer Plus** em cada Mac (o recurso vem desativado por padrão, porque abre portas de rede). No Mac que você quer abrir, ative **Permitir que outros computadores abram este Mac**, clique em **Criar link de pareamento** e copie o link. Neste Mac, escolha **Adicionar um computador…** no seletor de computadores, à esquerda do título do chat, cole o link e clique em **Conectar**. Depois, clique em **Aprovar** no outro Mac. A partir daí, o seletor lista **Este Mac** e os seus computadores: escolha um, e o dsh dele abre na aba Navegador da barra lateral direita (ou em uma janela do navegador), com os próprios chats, ferramentas e arquivos. O painel de Configurações renomeia e remove computadores, e lista os computadores que podem abrir este Mac (**Remover** desconecta um deles na hora). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Captura de tela: Computadores remotos"></a> |
88
103
  | **Atualizações automáticas** | <a id="feature-autoupdate"></a>Quando o dsh inicia, o plugin verifica a [versão mais recente no GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Se ela for mais nova e já estiver no npm, o plugin instala exatamente essa versão pelo próprio gerenciador de plugins do dsh (o mesmo caminho de Configurações → Plugins) e avisa você. Reinicie o dsh para carregá-la. **Configurações → Composer Plus → Atualizações do Composer Plus** mostra a versão e tem **Verificar atualizações** / **Atualizar agora**. Na primeira vez que o dsh abre com a nova versão, uma janela **Novidades do Composer Plus N** mostra uma vez as notas dessa versão no idioma de **Idioma do aplicativo** (elas vêm com a nova versão, sem outra chamada de rede; um idioma sem notas mostra as notas em inglês); **Fechar** ou `Esc` a fecha. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura de tela: Atualizações automáticas"></a> |
89
104
  | **Backup** | <a id="feature-backup"></a>Configurações → Composer Plus → **Backup** → **Fazer backup agora** grava toda a sua pasta home do dsh (chats, configurações, plugins, MCP, skills) em um único arquivo compactado em `~/Desktop/dsh-backups`, com checksum. Os segredos ficam mascarados no arquivo compactado: arquivos de credenciais, arquivos de chave (`.pem`, `.key`) e os valores token, secret e password das configurações yml ficam só neste computador, no `vault` da pasta. `cache/`, `dsh-runtimes/` e `node_modules` não entram no arquivo compactado (o dsh os cria de novo). Cada backup da lista tem **Verificar** (lê o backup inteiro), **Para outro computador** (uma pasta para copiar para o novo computador, com o console de resgate) e **Excluir**. Os arquivos compactados do dsh-backup na mesma pasta também aparecem e funcionam. Para restaurar, saia do dsh e use o console de resgate. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Captura de tela: Backup"></a> |
90
105
  | **Backup automático** | <a id="feature-autobackup"></a>Ative **Backup automático** (desativado por padrão: cada cópia tem mais ou menos o tamanho da sua pasta home do dsh sem o cache). Escolha a frequência (**A cada**: de 6 horas a 7 dias, 24 horas por padrão) e quantos backups ficam guardados (**Manter**: de 3 a 14, 7 por padrão). O horário do próximo backup aparece abaixo da chave; um backup que falhou também aparece ali e é tentado de novo 30 minutos depois. Quando o dsh ou o Composer Plus inicia com uma nova versão, um snapshot é feito logo após o início, antes que a nova versão use seus dados por muito tempo (os dois mais recentes ficam guardados, marcados como **Antes de uma atualização**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Captura de tela: Backup automático"></a> |
@@ -137,6 +152,9 @@ Cada pacote tem 3.280 textos: todos os textos da interface do dsh `0.2.0-rc.2` e
137
152
  | `Cmd+F` no Mac, `Ctrl+F` no Windows e no Linux | chat aberto | abrir **Buscar no chat** |
138
153
  | `Enter` / `Shift+Enter`, `↓` / `↑` | caixa do **Buscar no chat** | próxima / anterior ocorrência |
139
154
  | `Esc` | caixa do **Buscar no chat** | fechar a caixa |
155
+ | `Cmd+Shift+E` no Mac, `Ctrl+Shift+E` no Windows e no Linux | em qualquer lugar do dsh | abrir o **Próximo chat em espera** (mude na página de atalhos de teclado do dsh) |
156
+ | `Cmd+Shift+K` no Mac, `Ctrl+Shift+K` no Windows e no Linux | em qualquer lugar do dsh | abrir o **Quadro de tarefas** (mude na página de atalhos de teclado do dsh) |
157
+ | `1`–`9` | cartão de pergunta do dsh, fora do campo de resposta | escolher essa opção (**Botões de opções**) |
140
158
 
141
159
  Um menu `/` ou `@` aberto fica com essas teclas para ele.
142
160
 
@@ -162,17 +180,20 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
162
180
  - **Permitir neste chat:** as autorizações ficam guardadas, com o horário em que foram dadas, em `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (acesso só para o dono). Uma autorização cobre uma ferramenta exata em um chat, até o fim do limite de tempo (1 hora por padrão). Se essa ferramenta pode gravar, a autorização também cobre qualquer gravação. Revogue-a pelo chip no cabeçalho.
163
181
  - A Revisão automática continua sendo executada em toda chamada; falhas de revisão nunca são permitidas automaticamente.
164
182
  - **Conexão móvel:** fica desativada até você ativar. Enquanto está ativada, a parte Host executa o gateway do Tether: HTTPS na porta 19390, que só aceita a sua sub-rede Wi-Fi e a sua tailnet (100.64.0.0/10), e uma página de pareamento em `127.0.0.1:19391` (só neste Mac). Um celular precisa de um código de uso único do código QR (válido por 5 minutos) e de você clicar em **Approve** no Mac. O celular fixa o certificado do gateway. O Mac guarda só um hash do token de cada celular (30 dias, renovado enquanto estiver em uso); **Remove** fecha na hora as conexões daquele celular. Os celulares só podem chamar uma lista permitida de métodos do dsh (chats, prompts, anexos, comandos de barra, aprovações, perguntas, modelos, agentes, metas), não configurações, credenciais, o navegador de arquivos ou o terminal. "Tailscale only" recusa toda conexão vinda da rede local, inclusive as que já estão abertas. O registro de acesso guarda as 200 tentativas de conexão mais recentes (horário, endereço IP, nome do aparelho, permitida ou recusada, e o motivo) em `access.json`; ele nunca guarda um token nem um código de pareamento. Dados: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (arquivos só para o dono). Detalhes: [tether/README.md](tether/README.md).
183
+ - **Computadores remotos:** o recurso fica desativado até você ativá-lo em cada Mac. **Permitir que outros computadores abram este Mac** abre uma segunda porta HTTPS (19392) só no endereço do Tailscale deste Mac (não no Wi-Fi, e sem anúncio pelo Bonjour). Outro Mac precisa de um link de pareamento de uso único (válido por 5 minutos), do certificado correspondente (fixado) e de você clicar em **Aprovar**. Este Mac guarda só um hash do token dele. Um computador pareado ganha controle total do dsh neste Mac, como se você o usasse aqui: chats, modelos, ferramentas, arquivos e terminal. Remova-o no painel de Configurações, e as conexões dele fecham na hora. O Mac que abre outro guarda o token desse computador em `$DSH_HOME/storages/dsh-composer-plus/computers.json` (só para o dono). Ele abre um relay em `127.0.0.1` para cada computador que você escolhe. A página recebe um link de uso único (válido por 60 segundos), e o relay só aceita a própria página (o endereço dela, nenhum outro site). Uma página que outro Mac abriu não mostra o seletor de computadores e não pode mudar os computadores deste Mac.
165
184
  - **Atualizações:** a parte Host pede a `api.github.com` a versão mais recente e a `registry.npmjs.org` exatamente essa versão; nada sobre você ou seus chats é enviado. A instalação usa o gerenciador de plugins do dsh (`pnpm add dsh-composer-plus@<version>`; quando o dsh 0.2.1 recusa isso para um plugin já instalado, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, e o perfil passa a listar essa URL como a origem do plugin), então valem as verificações de registro, de scripts e de compatibilidade de versão do próprio dsh. Tags de pré-lançamento e versões mais antigas nunca são instaladas.
185
+ - **Contagem de uso:** uma vez por dia, a parte Host pede ao GitHub o pequeno arquivo `active.txt` da versão publicada que você tem instalada (`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/active.txt`). O GitHub conta esses pedidos por arquivo, então o autor só vê quantas cópias de cada versão pediram naquele dia. O pedido não tem id, cookie nem dados sobre você ou seus chats; o GitHub vê seu endereço IP, como em cada verificação de atualização. O dia do último pedido fica em `$DSH_HOME/storages/dsh-composer-plus/active.json`. Uma cópia git deste repositório e uma cópia renomeada não enviam nada. Não há chave para isso.
166
186
  - **Previsão da próxima mensagem:** vem ativada por padrão; desative-a em **Configurações → Composer Plus** para parar essas chamadas ao modelo. Após cada turno concluído, a parte Host envia as suas próprias mensagens do chat e as respostas em texto do agente (sem saída de ferramentas, sem contexto oculto e sem raciocínio), no máximo cerca de 6.000 caracteres (a parte mais recente), para o modelo escolhido (o padrão do dsh, a menos que você escolha outro). O envio usa as próprias configurações de provedor do dsh, como uma única solicitação. Nada é salvo no chat: o palpite não entra no histórico do chat. A chave e o modelo escolhido ficam em `$DSH_HOME/storages/dsh-composer-plus/predict.json` (arquivo só para o dono).
167
187
  - **Completar ao digitar:** fica desativado até você ativar. Enquanto está ativado, a cada pausa enquanto você digita, a parte Host envia o texto que você digitou até ali e as suas próprias mensagens do chat e as respostas em texto do agente (sem saída de ferramentas, sem contexto oculto e sem raciocínio), no máximo cerca de 3.000 caracteres do chat, para o modelo escolhido em **Completar ao digitar** (por padrão, o modelo da **Previsão da próxima mensagem**). Uma pausa mais nova interrompe a solicitação anterior. Nada é salvo no chat. A chave fica em `$DSH_HOME/storages/dsh-composer-plus/complete.json` (arquivo só para o dono).
168
188
  - **Melhorar prompt:** nada é executado até você clicar na varinha mágica. Então a parte Host envia o seu rascunho, as suas próprias mensagens do chat e as respostas em texto do agente (sem saída de ferramentas, sem contexto oculto, sem raciocínio e sem mensagens revertidas; no máximo cerca de 6.000 caracteres, a parte mais recente), o mesmo resumo do projeto usado em **Ideias de recursos** (com as mesmas regras de arquivos: sem `.env*` nem arquivos de chave, sem symlink para fora da pasta, sem FIFO), os caminhos que o `git status` lista como alterados e até 30 caminhos rastreados ou não rastreados (não ignorados) cujos nomes têm palavras em comum com o seu rascunho, para o modelo escolhido em **Melhorar prompt** (por padrão, o próprio modelo do chat), como uma única solicitação. Nenhum outro conteúdo de arquivo além desse resumo é enviado. Nada é gravado no chat nem no projeto: a resposta só substitui o seu rascunho no editor de mensagens, e você decide se vai enviá-lo. O modelo escolhido fica em `$DSH_HOME/storages/dsh-composer-plus/improve.json` (arquivo só para o dono).
169
189
  - **Verificação da meta:** só é executada quando o agente marca uma `/goal` como concluída em uma rodada automática (ou quando você clica em **Executar agora**). A parte Host executa o comando de teste na pasta do chat, no modo sandbox do chat (como a própria ferramenta `bash` do dsh: a mesma política de acesso a arquivos; quando esse sandbox não consegue iniciar, o teste não é executado e a verificação falha). Para encontrar o comando, ela lê só `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` e `pytest.ini`, como arquivos comuns dentro da pasta (sem symlink para fora dela, sem FIFO). Depois envia a meta, o chat desde o início da meta (as suas mensagens, as respostas do agente, as chamadas de ferramentas cortadas em 1.000 caracteres e os últimos 2.000 caracteres de cada resultado de ferramenta; sem raciocínio e sem passos revertidos; no máximo cerca de 60.000 caracteres, a parte mais recente), o `git status --short` e o fim da saída do teste para o modelo escolhido em **Verificação da meta** (por padrão, o próprio modelo do chat), como uma única solicitação sem ferramentas. A saída das ferramentas pode conter o que o agente leu, então essa solicitação pode ter partes dos seus arquivos, como o próprio chat. Nada é gravado no chat nem no projeto. O seu comando de teste, os limites, o último resultado (com o fim da saída) e o modelo escolhido ficam em `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (arquivo só para o dono, os 500 chats mais recentes).
170
190
  - **Continuar em um novo chat:** nada é executado até você clicar. Então a parte Host envia o chat (como a Verificação da meta o lê: sem raciocínio e sem passos revertidos) para o próprio modelo do chat e mostra a nota de passagem; só **Iniciar novo chat** cria um novo chat. Nada é gravado no projeto.
171
191
  - **Detalhamento do contexto:** a parte Host lê só o log do chat; nenhuma chamada ao modelo, nenhum arquivo do projeto.
172
- - **Quadro de tarefas:** o quadro mostra os próprios chats do dsh, a partir das próprias listas do dsh nesta janela; ele não adiciona dados de chat próprios. **Nova tarefa** abre o próprio novo chat do dsh, e você escreve a primeira mensagem no editor de mensagens do dsh, então as aprovações, o sandbox e o modelo do chat valem como de costume. A parte Host guarda a primeira mensagem desse chat como o prompt do cartão e a envia (os primeiros 4.000 caracteres dela, nada mais) ao modelo desse chat em mais uma solicitação, sem ferramentas, para obter até 3 etiquetas. O prompt, as etiquetas e a hora de início de cada tarefa ficam em `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (arquivo só para o dono, as 2.000 mais recentes); a chave fica em `board-switch.json`, ao lado. Nada é gravado em uma pasta de projeto. **Responder** envia a sua resposta para a solicitação pendente do próprio dsh, do mesmo jeito que o cartão do próprio chat. A lista de tarefas antiga das versões anteriores (`board.json`) fica no disco como estava e não é lida. **Progresso ao passar o cursor** lê o registro do chat neste Mac. Com **Rápido (sem IA)** (o padrão), nada é enviado. Com **Resumo com IA**, enquanto a caixa de progresso de um cartão em andamento aparece (ou enquanto o quadro do Tether está aberto, para até 8 cartões em andamento), a parte Host envia a parte mais recente desse chat (no máximo cerca de 6.000 caracteres: suas mensagens, as respostas em texto do agente, as chamadas de ferramentas e o fim dos resultados delas; sem raciocínio e sem mensagens revertidas) ao modelo do chat, em uma única solicitação sem ferramentas. Ela só envia de novo depois que o chat avançou, no máximo uma vez a cada 20 segundos por chat. A nota fica só na memória; a configuração fica em `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (arquivo só para o dono).
192
+ - **Quadro de tarefas:** o quadro mostra os próprios chats do dsh, a partir das próprias listas do dsh nesta janela; ele não adiciona dados de chat próprios. **Nova tarefa** abre o próprio novo chat do dsh, e você escreve a primeira mensagem no editor de mensagens do dsh, então as aprovações, o sandbox e o modelo do chat valem como de costume. A parte Host guarda a primeira mensagem desse chat como o prompt do cartão e a envia (os primeiros 4.000 caracteres dela, nada mais) ao modelo desse chat em mais uma solicitação, sem ferramentas, para obter até 3 etiquetas. O prompt, as etiquetas e a hora de início de cada tarefa ficam em `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (arquivo só para o dono, as 2.000 mais recentes), junto com os IDs dos chats que você tirou do quadro com **×** ou **Limpar tudo** (os 5.000 mais recentes); a chave fica em `board-switch.json`, ao lado. Nada é gravado em uma pasta de projeto. **Responder** envia a sua resposta para a solicitação pendente do próprio dsh, do mesmo jeito que o cartão do próprio chat. A lista de tarefas antiga das versões anteriores (`board.json`) fica no disco como estava e não é lida. **Progresso ao passar o cursor** lê o registro do chat neste Mac. Com **Rápido (sem IA)** (o padrão), nada é enviado. Com **Resumo com IA**, enquanto a caixa de progresso de um cartão em andamento aparece (ou enquanto o quadro do Tether está aberto, para até 8 cartões em andamento), a parte Host envia a parte mais recente desse chat (no máximo cerca de 6.000 caracteres: suas mensagens, as respostas em texto do agente, as chamadas de ferramentas e o fim dos resultados delas; sem raciocínio e sem mensagens revertidas) ao modelo do chat, em uma única solicitação sem ferramentas. Ela só envia de novo depois que o chat avançou, no máximo uma vez a cada 20 segundos por chat. A nota fica só na memória; a configuração fica em `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (arquivo só para o dono).
173
193
  - **Arquivos protegidos:** a lista e a chave ficam em `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (arquivo só para o dono). A verificação lê só o caminho de cada chamada de ferramenta de arquivo (e o caminho real dele), nunca o arquivo.
174
194
  - **Comandos bloqueados:** as regras e a chave ficam em `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (arquivo só para o dono). A verificação lê só o texto do comando de cada chamada de `bash` e `pwsh`; não executa nada e não envia nada.
175
- - **Memória do projeto:** desativada até você ativar. Enquanto está ativada, depois de cada turno concluído de um chat de nível superior, a parte Host envia as mensagens novas do próprio chat desde a última revisão (suas mensagens e as respostas de texto do agente; sem saída de ferramentas, sem raciocínio, sem contexto oculto, sem mensagens revertidas; a cópia do chat pai num chat ramificado fica de fora; no máximo cerca de 16.000 caracteres) e as notas salvas para o modelo do próprio chat, como uma única solicitação sem ferramentas. As notas são arquivos Markdown em `$DSH_HOME/storages/dsh-composer-plus/memory/` (arquivos só do proprietário): `projects/<id>/` para cada pasta de projeto (`<id>` é um hash do caminho real da pasta; `project.json` nomeia a pasta), `global/`, `journal.jsonl` (cada mudança com a linha antes e depois) e `reviewed.json` (até onde cada chat foi lido). Nada é escrito na pasta do projeto. Notas que parecem uma chave, um token, uma senha ou um número de documento são recusadas. As notas de um projeto entram no prompt de sistema de cada chat novo nessa pasta, então chegam ao modelo com cada solicitação desse chat. A chave fica em `memory.json`, na mesma pasta. **Abrir memória** não envia nada até você tocar em **Ver prévia das mudanças**; então envia as notas que mostra e o seu texto ao modelo padrão do dsh, em uma única solicitação sem ferramentas. As mudanças só são gravadas em **Aplicar**, com `editor` no registro. O Tether lê e muda as notas pela mesma rota.
195
+ - **Entrada secreta:** o valor vai do cartão (ou do Tether, pelo gateway, que não registra o corpo das solicitações) para o Host só na solicitação de resposta. O Host o grava em `$DSH_HOME/storages/dsh-composer-plus/secrets/<nome aleatório>` (pasta 0700, arquivo 0600); nada vai para o projeto, o registro do chat ou o resultado da ferramenta. O Host mantém o valor na memória para substituí-lo por `[secret]` nos resultados de ferramenta posteriores desse chat. O arquivo e essa cópia são apagados quando o turno do chat termina e quando o dsh inicia. A chave fica em `secrets.json`, ao lado. Um comando que o agente executa com o arquivo pode enviar o valor para onde esse comando envia: esse é o propósito.
196
+ - **Memória do projeto:** desativada até você ativar. Enquanto está ativada, depois de cada turno concluído de um chat de nível superior, a parte Host envia as mensagens novas do próprio chat desde a última revisão (suas mensagens e as respostas de texto do agente; sem saída de ferramentas, sem raciocínio, sem contexto oculto, sem mensagens revertidas; a cópia do chat pai num chat ramificado fica de fora; no máximo cerca de 16.000 caracteres) e as notas salvas para o modelo do próprio chat, como uma única solicitação sem ferramentas. As notas são arquivos Markdown em `$DSH_HOME/storages/dsh-composer-plus/memory/` (arquivos só do proprietário): `projects/<id>/` para cada pasta de projeto (`<id>` é um hash do caminho real da pasta; `project.json` nomeia a pasta), `global/`, `journal.jsonl` (cada mudança com a linha antes e depois) e `reviewed.json` (até onde cada chat foi lido). Nada é escrito na pasta do projeto. Notas que parecem uma chave, um token, uma senha ou um número de documento são recusadas. As notas de um projeto entram no prompt de sistema de cada chat novo nessa pasta, então chegam ao modelo com cada solicitação desse chat. A chave fica em `memory.json`, na mesma pasta. **Abrir memória** não envia nada até você tocar em **Ver prévia das mudanças**; então envia as notas que mostra e o seu texto ao modelo padrão do dsh, em uma única solicitação sem ferramentas. As mudanças só são gravadas em **Aplicar**, com `editor` no registro. O Tether lê e muda as notas pela mesma rota. **Histórico de versões da memória** (ativado por padrão) guarda uma cópia dos arquivos da memória antes de cada gravação em `memory/history/`, ao lado deles (arquivos só do dono, as 50 mais recentes por memória); não envia nada a nenhum modelo. **Exportar a memória para AGENTS.md** não envia nada a nenhum modelo e só grava quando você clica em **Gravar AGENTS.md**: lê e grava `AGENTS.md` na pasta do projeto dessa memória (só um arquivo comum dentro dela, nunca por um link simbólico que saia dela) e só muda a seção marcada. **Encontrar notas de memória desatualizadas** não envia nada a nenhum modelo e não grava nada: verifica os caminhos dentro da pasta do projeto com realpath (nenhum arquivo é lido), lê `package.json` só como arquivo comum dentro da pasta e roda ali um `git for-each-ref`. **Não usar a memória neste chat** guarda cada chat que você desativa em `memory-chats.json`, ao lado dos outros arquivos (só do dono, os 500 mais recentes); esse chat não envia nenhuma memória ao modelo. **Sugerir notas de memória a partir de um chat** não envia nada até você clicar em **Sugerir para a memória**; então envia as notas salvas do projeto do chat e as notas globais, e as mensagens e respostas de texto do próprio chat (sem saída de ferramentas nem mensagens revertidas; a cópia do pai num fork fica de fora; no máximo cerca de 24.000 caracteres), ao próprio modelo do chat, como um pedido sem ferramentas. Uma sugestão só é salva com **Aceitar**.
176
197
  - **Backup:** nada sai do seu computador. Os arquivos compactados vão para `~/Desktop/dsh-backups` (arquivos só para o dono). Os segredos não ficam no arquivo compactado: arquivos de credenciais (`.credentials.yaml`, `.env`), arquivos de chave (`.pem`, `.key`, `.p12`, `.pfx`) e os valores das configurações token, secret, password e API key nos arquivos yml são mascarados; as cópias reais ficam em `composer-plus-vault/<archive>/`, na mesma pasta (só para o dono), só neste computador. **Para outro computador** não copia nenhum vault: informe esses segredos de novo lá. Os seus logs de chat, as suas configurações e o resto do dsh home ficam no arquivo compactado como estão: mantenha a pasta privada, como o próprio `$DSH_HOME`. O backup lê os arquivos com `O_NOFOLLOW | O_NONBLOCK`; um symlink é guardado como link (nunca é seguido) e um FIFO ou dispositivo é ignorado. A chave e as opções do backup automático ficam em `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, a chave do console de resgate em `rescue-console.json` e, enquanto o dsh está em execução, `running/host-<pid>.json` identifica cada processo do dsh (o console de resgate os lê para recusar uma restauração).
177
198
  - **Console de resgate:** um menu de terminal; ele não abre nenhuma porta de rede. Uma restauração grava só em uma pasta nova ao lado do dsh home (arquivos com `O_EXCL | O_NOFOLLOW`, symlinks por último e nunca seguidos) e recusa um arquivo compactado com um nome inseguro (`..`, um caminho absoluto), um dispositivo ou FIFO, mais de uma pasta de nível superior ou uma entrada abaixo de um link.
178
199
 
@@ -194,7 +215,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
194
215
  - **Nenhuma etiqueta de branch em uma linha de chat:** a barra lateral não está em “Em uma única lista” (em “Workspace” e “Árvore de workspaces”, nenhuma linha de chat mostra uma etiqueta), o chat não teve nenhum turno desde que você instalou esta versão, a pasta dele não é um repositório git, ou **Branch do Git nas linhas de chat** está desativado. Depois de uma atualização, reinicie o dsh (a parte Host registra o branch).
195
216
  - **Verificação da meta diz que o teste saiu com o código 127 ou "not found":** o dsh iniciado pelo Finder ou pelo Dock pode ter um PATH mais curto que o do seu terminal, então ele não encontra `npm`, `pnpm` ou `cargo`. Inicie o dsh a partir de um terminal ou defina o seu próprio comando de teste com o caminho completo em **Verificação da meta** → **Editar**. **Executar agora** mostra o resultado na hora.
196
217
  - **A meta não fecha e o agente continua trabalhando:** **Verificação da meta** encontrou um teste com falha ou trabalho faltando; a linha abaixo da meta mostra o motivo (passe o mouse sobre o resultado para ver os detalhes). Corrija a causa ou o comando de teste, ou conclua a meta você mesmo com `/goal` ou com a barra da meta (isso não é verificado).
197
- - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.20.0`); veja a nota de instalação acima.
218
+ - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.21.0`); veja a nota de instalação acima.
198
219
  - **Fazer backup agora diz "Outra ação de backup está em andamento":** uma ação está em execução em outra janela do dsh ou no console de resgate (eles compartilham um arquivo de bloqueio, `.composer-plus.lock`, na pasta de backups). Aguarde até ela terminar. Se nenhuma ação estiver em execução, o próximo clique assume o bloqueio de um processo encerrado.
199
220
  - **O console de resgate diz "dsh is running":** feche o dsh primeiro. Se o dsh estiver mesmo fechado, o arquivo citado na mensagem sobrou de uma falha: remova-o e tente de novo.
200
221
  - **Depois de uma restauração, o dsh não inicia ou falta um plugin:** os pacotes de plugin de um perfil precisam ser instalados de novo. O console de resgate oferece isso depois de uma restauração; ou execute `pnpm install` em cada pasta de `$DSH_HOME/profiles/` que ele listar. Os segredos que não estavam no vault (outro computador) precisam ser informados de novo: o console os lista.
@@ -215,11 +236,17 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
215
236
  - A fila do dsh não tem uma ação `move`, então a parte Host do plugin move a própria mensagem na fila do dsh (uma única alteração, a mesma mensagem). Mensagens com imagens ou arquivos também são movidas. Só as suas próprias mensagens são movidas: uma rodada de meta ou uma resposta a uma pergunta na fila fica onde está. Se uma mensagem começar a ser enviada enquanto você arrasta, nada é movido e um aviso informa isso.
216
237
  - O dsh 0.2.1 carrega uma atualização imediatamente quando a nova versão não muda nenhuma configuração do dsh; caso contrário, e no dsh 0.2.0, reinicie o dsh para carregá-la. O plugin nunca reinicia o dsh por você. Perfis web/CLI sem o gerenciador de plugins do dsh só avisam que há uma nova versão.
217
238
  - **Novidades do Composer Plus N** mostra as notas no idioma de **Idioma do aplicativo**. Um idioma da interface com outra região recebe as notas do seu idioma base (`en-GB` recebe as notas em inglês, e `zh-TW`, as notas em chinês de `zh`). Um idioma sem notas (um que outro pacote de idioma adiciona, ou `pt-PT`, que não é `pt-BR`) mostra as notas em inglês. As notas vêm com a nova versão. Se a cópia em execução não tiver um arquivo de notas legível (`release-notes.json`), a janela mostra as notas em inglês do GitHub.
239
+ - **Rejeitar com nota** envia a nota como uma mensagem no turno que espera e depois rejeita a solicitação; o dsh mostra a nota no chat como uma mensagem sua. Enquanto o campo da nota está aberto, o cartão mostra só **Cancelar** e **Rejeitar**, então um clique não pode permitir a solicitação por engano; `Esc` ou **Cancelar** traz de volta os botões do dsh. Uma nota vazia não envia nada (use o próprio **Rejeitar** do dsh). Se a rejeição falhar depois que a nota foi enviada (por exemplo, a solicitação foi respondida em outro lugar nesse meio-tempo), a nota fica no chat e o modelo a lê no próximo passo dele. O botão fica na marcação do cartão de aprovação do dsh (`data-approval-key`), porque o dsh não tem um espaço para ações do cartão; se uma atualização do dsh mudar essa marcação, o botão não aparece e o próprio **Rejeitar** do dsh funciona como antes. Uma nota pode ter no máximo 4.000 caracteres.
240
+ - **Entrada secreta** esconde só o texto exato de um valor: `[secret]` o substitui nos resultados de ferramenta posteriores do mesmo chat. O agente ainda pode ler o arquivo com um comando de shell e imprimir o valor de outra forma (base64, uma parte, com espaços), e essa forma chega ao modelo. As ferramentas de arquivo do próprio agente (read, grep, write, edit) não conseguem abrir a pasta de segredos. Se o valor também for uma palavra comum, outros resultados desse chat também mostram `[secret]`. O arquivo fica até o turno terminar; se o dsh fechar durante o turno, a próxima inicialização o apaga. Um chat pode ter um só pedido aberto por vez. A ferramenta adiciona cerca de 870 caracteres (cerca de 220 tokens, estimado) a cada solicitação ao modelo: desative-a quando não a usar.
241
+ - **Citar na resposta** cita o texto como a página o mostra: um bloco de código, uma tabela ou uma lista vêm como linhas simples, sem as marcas de Markdown. Uma seleção que começa em uma resposta e termina em outra, ou que toca o raciocínio, uma linha de ferramenta ou sua própria mensagem, não mostra o botão: selecione dentro de uma só resposta. O botão encontra a resposta pela estrutura do chat do dsh, porque o dsh não tem um slot para seleção de texto; se uma atualização do dsh mudar essa estrutura, o botão não aparece. Quando a citação fica no fim do campo, mais uma linha vazia entra depois dela para que a próxima linha digitada comece abaixo; o dsh remove as linhas vazias do fim ao enviar.
242
+ - **Chat paralelo** é somente leitura pelo próprio modo somente leitura do dsh: as ferramentas de arquivo não podem escrever e os comandos de shell rodam no sandbox do dsh sem escrita (ou não rodam quando o sandbox não consegue iniciar). O agente ainda pode pedir mais acesso com o cartão de aprovação do dsh, e uma chamada de rede (por exemplo, uma requisição a uma API) ainda pode mudar algo fora do computador. A cópia é feita no momento mais recente em que nenhuma mensagem esperava na fila, então uma pergunta feita enquanto há mensagens na fila não vê o que aconteceu depois delas. Uma etapa do chat em andamento é fechada na cópia, então o chat paralelo conhece o início dessa etapa, mas não o resultado. O chat paralelo é um chat comum: fica na barra lateral e conta no seu uso do modelo; arquive-o lá. Trazer de volta pega só as mensagens do próprio chat paralelo (no máximo 12.000 caracteres) e só a última resposta de cada pergunta; as notas do agente entre as chamadas de ferramenta ficam de fora. O dsh não oferece aos plugins um espaço para um chat dentro da barra lateral direita, então o chat paralelo abre na visão principal.
243
+ - **Notas no diff** funciona só no painel de alterações, não na visão Último turno do dsh. Um intervalo deve ficar em um só bloco do diff (uma parte `@@`). As notas ficam no armazenamento deste navegador, então outro navegador ou o dsh em outro computador não as vê; o Tether guarda as próprias notas na memória. Uma nota guarda as linhas como estavam no clique: se o agente mudar o arquivo depois, a nota ainda mostra as linhas e os números antigos. No máximo 50 notas por chat, 2.000 caracteres por nota e 40 linhas por nota (depois uma linha `…`).
218
244
  - **Permitir neste chat** conta o limite de tempo a partir do momento da autorização. Um novo limite de tempo vale na hora para as autorizações em vigor, então um limite menor pode encerrá-las na hora. As autorizações da versão 1.12 e anteriores não têm horário: depois da atualização, o agente pergunta mais uma vez sobre essas ferramentas.
219
245
  - **Manter o foco no editor** só devolve o foco depois de um comando `/` ou de uma skill. Enquanto o dsh resolve o comando, o editor de mensagens fica somente leitura por alguns milissegundos, então as teclas pressionadas nesse tempo se perdem. Se o menu `/` do dsh ainda estiver aberto, `Enter` escolhe a linha destacada e não envia.
220
246
  - **Ajustar o cartão de pergunta à janela** muda só o cartão de pergunta do dsh, não o cartão de revisão do plano. Ele encontra o cartão pela marcação do dsh (`data-question-key`, `data-question-scroll`); se uma atualização do dsh mudar essa marcação, o cartão aparece como o dsh o desenha. A altura do cartão segue a janela, não o chat: em um chat dentro de um painel lateral estreito, um cartão alto ainda pode passar do topo do chat.
221
247
  - **Ajustar o cabeçalho do chat à janela** encontra o cabeçalho do chat do dsh pelos nomes de classe gerados (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), porque o dsh não oferece um ponto de extensão para o layout dele. Se uma atualização do dsh mudar esses nomes, o cabeçalho aparece como o dsh o desenha. Em uma coluna de chat muito estreita o cabeçalho pode ocupar duas ou três linhas, então sobra menos espaço acima das mensagens.
222
- - **Conexão móvel** só funciona no macOS (ela usa `en0`, `openssl`, `swift` e `dns-sd`). Ela usa as portas fixas 19390 e 19391, então só um dsh em cada Mac pode executá-la por vez (cada Mac é uma entrada na lista de Macs do celular). O celular só recebe notificações enquanto o Tether está aberto ou acabou de ir para segundo plano (não há serviço de push). O Tether só as envia depois que você ativa "Settings → Notifications → Send notifications" no Tether. Essa opção vem desativada por padrão, e o iOS pede a permissão quando você a ativa. O app iOS ainda não está na App Store: compile-o a partir de `tether/ios` com o Xcode. "Tailscale only" ainda precisa de um endereço de Wi-Fi ou Ethernet no Mac (o gateway só inicia com um). O registro de acesso é de cada Mac e guarda só as 200 tentativas mais recentes; uma tentativa repetida em até um minuto soma um na mesma linha. O bloqueio do app Tether não oculta as prévias das notificações na Tela Bloqueada do iPhone: desative-as nos Ajustes do iOS. Os pontos verdes do Tether seguem o Mac: um chat que você abre no dsh também perde o ponto no celular. Um chat que você abre no Tether perde o ponto só nos celulares. O ponto do próprio dsh no Mac fica até você abrir o chat no Mac.
248
+ - **Conexão móvel** só funciona no macOS (ela usa `en0`, `openssl`, `swift` e `dns-sd`). Ela usa as portas fixas 19390 e 19391, então só um dsh em cada Mac pode executá-la por vez (cada Mac é uma entrada na lista de Macs do celular). O celular só recebe notificações enquanto o Tether está aberto ou acabou de ir para segundo plano (não há serviço de push). O Tether só as envia depois que você ativa "Settings → Notifications → Send notifications" no Tether. O Tether guarda essa opção e o horário dela separadamente para cada Mac pareado. Ela vem desativada por padrão em cada Mac, e o iOS pede a permissão quando você a ativa. O app iOS ainda não está na App Store: compile-o a partir de `tether/ios` com o Xcode. "Tailscale only" ainda precisa de um endereço de Wi-Fi ou Ethernet no Mac (o gateway só inicia com um). O registro de acesso é de cada Mac e guarda só as 200 tentativas mais recentes; uma tentativa repetida em até um minuto soma um na mesma linha. O bloqueio do app Tether não oculta as prévias das notificações na Tela Bloqueada do iPhone: desative-as nos Ajustes do iOS. Os pontos verdes do Tether seguem o Mac: um chat que você abre no dsh também perde o ponto no celular. Um chat que você abre no Tether perde o ponto só nos celulares. O ponto do próprio dsh no Mac fica até você abrir o chat no Mac.
249
+ - **Computadores remotos** precisa do Tailscale nos dois Macs, e do Composer Plus com este recurso ativado no Mac que você abre. Esse Mac não pode estar em repouso, e o dsh precisa estar em execução nele. O outro computador abre na aba Navegador da barra lateral direita do chat que está na tela. A aba pertence a esse chat, então outro chat mostra a própria barra lateral. Sem um chat (ou no dsh web sem a aba Navegador), o computador abre em uma janela do navegador. O seletor só aparece quando um chat ou a tela de novo chat está na área principal, não no Quadro de tarefas. Ele usa a porta 19392 (só um dsh em cada Mac pode deixar outros computadores entrarem). Um computador que você abriu dentro da página de outro computador não tem seletor, então você não pode abrir um terceiro Mac a partir dali.
223
250
  - Um link de sessão funciona dentro dos chats; clicar nele não abre o chat. Um link criado com **Copiar link da mensagem** só abre a mensagem no dsh 0.2.1 ou mais recente, e só a partir de uma mensagem em um chat (o dsh 0.2.0 não tem regras de texto do usuário, então ali o link é copiado, mas aparece como texto simples). Uma mensagem que uma reversão removeu, ou que a compactação tirou do histórico que o dsh carrega, não pode ser mostrada: o link avisa isso. Os botões 🔗 se prendem às linhas de mensagem do dsh; se uma atualização do dsh mudar essa marcação, eles não aparecem.
224
251
  - **Marcar tudo como lido** muda os pontos de não lido do próprio dsh por uma parte do dsh que não é uma API pública (a lista `completionUnread` do status de sessão do dsh). Se uma atualização do dsh mudar esse nome, o item não aparece. O item fica no menu "…" do projeto no dsh, que não tem espaço para plugins; se o dsh mudar esse menu, o item também não aparece.
225
252
  - **Editar mensagem na fila no lugar** não altera uma mensagem que começou a ser enviada nesse meio-tempo nem sobrescreve uma mensagem que mudou nesse meio-tempo (por exemplo, no Tether do iPhone): um aviso informa isso. Uma imagem nova precisa de um modelo que aceite imagens (valem os limites de imagem do próprio dsh), e um arquivo novo precisa terminar o upload antes que você possa salvar. Só as suas próprias mensagens na fila podem ser editadas: uma rodada de meta ou uma resposta a uma pergunta na fila, não. Depois de uma atualização do plugin, só as edições de texto funcionam na hora: reinicie o dsh antes de salvar uma mensagem com imagens ou arquivos (a parte Host carrega na inicialização).
@@ -234,6 +261,8 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
234
261
  - **Branches na árvore de workspaces** escreve no git sem um clique: quando move um chat, volta a pasta do projeto para o branch anterior (`git switch`) e adiciona um worktree (`git worktree add`). Nunca apaga um branch, um worktree ou um arquivo. O dsh não pode mudar a pasta de um chat, então um chat movido é uma cópia (o fork do próprio dsh, com um id novo) e o chat antigo é arquivado. A cópia continua a tarefa parada; uma chamada de ferramenta que rodava quando o branch apareceu termina com uma recusa, e o agente a roda de novo na pasta nova. Um objetivo do chat antigo não vai junto. Só se move um chat cuja pasta é a pasta principal do repositório, e só por um branch que ele criou e para o qual mudou naquele turno (`git switch -c`, `git checkout -b`): um branch feito só com `git branch`, uma pasta com alterações não commitadas, um worktree vinculado ou uma subpasta não movem nada. Na árvore só aparecem worktrees diretamente em `<project>/.worktrees/` com um branch; um worktree desanexado (detached) ou em outro lugar não aparece. A cópia abre sozinha só quando o chat dela era o aberto (o plugin lê isso da linha da barra lateral do dsh); senão, ela está no projeto do branch.
235
262
  - **Buscar no chat** busca só no que a página mostra: as mensagens e respostas carregadas (role para cima ou clique em **Carregar anteriores** para ver as mais antigas), não as etapas de ferramenta fechadas nem o texto recolhido dentro da saída de uma ferramenta. Ele conta no máximo 2.000 ocorrências (depois, "2000+"). Ele usa a API de destaque do navegador (Chromium 105 ou mais recente; o app para desktop tem): em um navegador mais antigo, a contagem e os saltos funcionam sem a cor. `Cmd+F` no Mac (`Ctrl+F` no Windows e no Linux) só o abre enquanto há um chat na tela; em outros lugares, a busca do próprio navegador funciona como antes. No Mac, `Ctrl+F` mantém seu uso do macOS nos campos de texto (o cursor avança um caractere).
236
263
  - **Abrir o chat em espera quando ocioso** conhece só o que a janela do dsh vê: o trabalho em outro app não conta, então, com o dsh em segundo plano, ele pode abrir um chat em espera após 30 segundos. Ele não traz o dsh para a frente. Ler sem tocar em uma tecla, clicar ou mover o mouse conta como ocioso. Ele olha só os chats com o ponto laranja do dsh (uma pergunta, uma aprovação ou uma revisão do plano) ou com o ponto verde (um turno concluído que você ainda não abriu); o pedido de um subagente aparece no chat principal dele. Os chats laranja abrem primeiro. Abrir um chat verde remove o ponto dele, então os 30 segundos do próximo chat verde só começam depois da sua próxima tecla, clique, movimento do mouse, roda de rolagem ou toque: quando você volta, os outros pontos verdes continuam lá. Enquanto um chat em espera está na tela, nenhum outro abre; um chat que você deixou sem responder pode abrir de novo depois dos próximos 30 segundos sem uso. Os 30 segundos não podem ser alterados.
264
+ - **Próximo chat em espera** conta os mesmos chats que **Abrir o chat em espera quando ocioso**: o ponto laranja do dsh (uma pergunta, uma aprovação ou uma revisão do plano que você pode responder aqui) e o ponto verde (um turno concluído que você ainda não abriu); o pedido de um subagente aparece no chat principal dele. O dsh não registra quando um chat começou a esperar, então a ordem conta a partir do momento em que esta janela o viu: depois de recarregar, os chats que já esperavam mantêm a ordem do dsh. A tecla é um atalho do dsh: em um navegador no Linux ela não tem tecla até você definir uma na página de atalhos de teclado do dsh, e uma extensão do navegador ou outro app pode pegar `Cmd+Shift+E` antes. O dsh não tem um espaço para extensões no cabeçalho da barra lateral, então o botão entra na estrutura desse cabeçalho; se uma atualização do dsh mudar essa estrutura, o botão não aparece e a tecla continua funcionando. O botão não fica na barra lateral estreita.
265
+ - **Botões de opções** só lê as respostas que terminam com uma lista de opções: uma lista numerada de 1 a 9 itens, numerada a partir de 1, como última parte da resposta, logo abaixo de um título ou de uma linha em negrito "Opções" ou "Próximos passos" (ou as palavras em inglês "Options", "Choices" e "Next steps", e as mesmas palavras nos outros idiomas do aplicativo). Uma lista no meio de uma resposta, em um bloco de código ou sob outro título não recebe botões. O Composer Plus não pede ao agente que escreva essa lista. Os botões só aparecem abaixo da resposta mais recente, enquanto o chat está ocioso e a caixa de mensagem está vazia, e só depois que o Composer Plus sabe quais respostas uma reversão retirou. No cartão de pergunta do dsh, as teclas 1–9 não fazem nada nos primeiros 0,8 segundo depois que uma pergunta aparece, para que uma tecla que você queria usar para outra coisa não escolha uma opção que você não leu. O dsh não tem uma API de teclas para o cartão de pergunta, então as teclas encontram os botões do cartão na marcação do dsh; se uma atualização do dsh mudar essa marcação, as teclas não fazem nada.
237
266
  - Uma notificação enviada antes de reiniciar só traz o dsh para a frente quando você clica nela.
238
267
  - Os projetos ativos são movidos com a ordem de projetos salva do dsh, então a nova ordem continua depois de reiniciar. Chats fora de qualquer projeto ("Sem grupo") não podem ser movidos; o dsh sempre os lista por último.
239
268
  - O dsh não tem um ponto de extensão no menu de opções de exibição da barra lateral, então a opção de projetos recentes é adicionada ao próprio menu do dsh. Se uma atualização do dsh mudar esse menu, a opção não aparece e todos os projetos continuam visíveis. O filtro funciona nas linhas de projeto, então **Em uma única lista** não é filtrada. Em **Árvore de workspaces**, uma pasta pai continua visível enquanto um projeto dentro dela está ativo, e as linhas de chat que não estiveram ativas nas últimas 2 horas também ficam ocultas; em **Workspace**, só as linhas de projeto são filtradas. O filtro lê qual visualização o dsh mostra a partir da configuração de visualização que o dsh salva (não é uma API pública); se uma atualização do dsh mudar esse nome, **Árvore de workspaces** é filtrada como **Workspace**. O recurso Status do projeto lê a mesma configuração: em **Árvore de workspaces**, a linha de uma pasta pai também conta os chats dos projetos dentro dela; se o dsh mudar o nome da configuração, cada linha mostra só os próprios chats. **Por status** tem o mesmo tipo de limite: o dsh não tem um espaço para ordenação, então o item e a ordem das linhas se prendem à marcação do menu e da lista do dsh.
@@ -249,9 +278,16 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
249
278
  - **Continuar em um novo chat** envia o chat (mensagens, chamadas de ferramentas e o fim de cada resultado de ferramenta, no máximo cerca de 60.000 caracteres, a parte mais recente) para o próprio modelo do chat. A nota de passagem pode deixar de fora uma decisão ou um arquivo: leia-a antes de iniciar. O novo chat conhece só a nota e o chat vinculado (o dsh anexa o chat antigo como contexto somente leitura); o contexto do modelo dele começa pequeno, e o chat antigo fica como está. Só uma nota ou um início por chat de cada vez.
250
279
  - **Detalhamento do contexto** mostra estimativas com a regra do próprio dsh (cerca de 4 caracteres por token), a mesma regra do anel de contexto do dsh; a contagem do próprio modelo pode ser diferente. As definições de ferramentas são as da solicitação mais recente. Ele mostra o contexto como o log do chat o tem; um turno em execução aparece depois do próximo passo dele.
251
280
  - **Etapas planejadas** economiza tokens só quando o modelo planeja: enquanto está ativado, cada requisição leva a ferramenta `plan_next_steps` e uma instrução curta (cerca de 500 tokens), também em chats em que o modelo nunca planeja. Uma condição prova só o que diz (por exemplo: o código de saída do build foi 0), não que o trabalho está certo. `ok` lê as marcas de resultado do próprio dsh (`[exit code: N]`, tempo esgotado, recusas do sandbox); um comando que falha sem um código de saída diferente de zero passa. As etapas rodam uma de cada vez; duas etapas prontas ao mesmo tempo voltam para o modelo. A mensagem da etapa fica salva como mensagem de assistente do modelo do chat (o dsh não tem uma marca para mensagem escrita por plugin), por isso o texto diz que o Composer Plus a executou. Não está no Tether.
252
- - **Quadro de tarefas** mostra os chats que o dsh lista nesta janela: um chat fora de um projeto aparece só em **Todos os projetos**, e uma pasta de “Um branch por chat” (`<project>/.worktrees/<name>`) conta como o projeto dela. A coluna de um cartão é o estado ao vivo do chat, então os cartões não podem ser arrastados: um chat vai para **Concluído** quando o turno dele termina, também depois de um erro ou de uma parada, e volta para **Fazendo** quando é executado de novo. O ponto verde é o próprio ponto de concluído do dsh, que o dsh mantém só nesta janela: depois de recarregar, os chats concluídos aparecem sem ele. **Concluído** mostra os 50 chats mais recentes (**Mostrar N mais antigas** mostra o resto). **Buscar projetos** encontra um projeto só pelo nome, não pelo caminho da pasta. **Ativos nas últimas 2 horas** oculta um projeto quando todos os chats dele têm mais de 2 horas, estão ociosos e lidos; o quadro continua mostrando o projeto que você escolheu. **Nova tarefa** lembra só o novo chat mais recente desta janela: quando você abre outro chat antes da primeira mensagem, esse chat fica em **A fazer** como **Nova tarefa** até você escrever nele, mas o quadro volta sozinho só para o mais recente. Depois de recarregar, um novo chat sem mensagem não aparece no quadro (o dsh o mantém como a Nova sessão vazia dele). As etiquetas vêm de uma chamada ao modelo por tarefa, a partir da primeira mensagem dela: elas podem estar erradas, e um chat que você não iniciou no quadro não tem nenhuma. O título é o próprio título do chat no dsh (o serviço de títulos do dsh, com o modelo do chat); até ele chegar, o cartão mostra a primeira linha da primeira mensagem. **Responder** responde só à solicitação mais recente do chat: quando o chat a respondeu em outro lugar (outra janela, Tether, Revisão automática) ou pergunta algo novo, o painel avisa e não envia nada. As versões anteriores tinham uma lista de tarefas com comentários e ferramentas para agentes; elas não existem mais, e o `board.json` antigo não é mostrado. A ideia e a aparência vêm do [Kanzo](https://github.com/emanuele-em/kanzo), de emanuele-em (AGPL-3.0); o Composer Plus não usa código dele.
281
+ - **Quadro de tarefas** mostra os chats que o dsh lista nesta janela: um chat fora de um projeto aparece só em **Todos os projetos**, e uma pasta de “Um branch por chat” (`<project>/.worktrees/<name>`) conta como o projeto dela. A coluna de um cartão é o estado ao vivo do chat, então os cartões não podem ser arrastados: um chat vai para **Concluído** quando o turno dele termina, também depois de um erro ou de uma parada, e volta para **Fazendo** quando é executado de novo. O ponto verde é o próprio ponto de concluído do dsh, que o dsh mantém só nesta janela: depois de recarregar, os chats concluídos aparecem sem ele. **Concluído** mostra os 50 chats mais recentes (**Mostrar N mais antigas** mostra o resto). **Buscar projetos** encontra um projeto só pelo nome, não pelo caminho da pasta. **Ativos nas últimas 2 horas** oculta um projeto quando todos os chats dele têm mais de 2 horas, estão ociosos e lidos; o quadro continua mostrando o projeto que você escolheu. **Nova tarefa** lembra só o novo chat mais recente desta janela: quando você abre outro chat antes da primeira mensagem, esse chat fica no topo de **Fazendo** como **Nova tarefa** até você escrever nele, mas o quadro volta sozinho só para o mais recente. Depois de recarregar, um novo chat sem mensagem não aparece no quadro (o dsh o mantém como a Nova sessão vazia dele). As etiquetas vêm de uma chamada ao modelo por tarefa, a partir da primeira mensagem dela: elas podem estar erradas, e um chat que você não iniciou no quadro não tem nenhuma. O título é o próprio título do chat no dsh (o serviço de títulos do dsh, com o modelo do chat); até ele chegar, o cartão mostra a primeira linha da primeira mensagem. **×** e **Limpar tudo** só tiram cartões do quadro: nenhum chat é apagado. **Desfazer** aparece só por 8 segundos, nesta janela; depois, **Retirados (N)** → **Devolver** traz um cartão de volta, e um chat que é executado de novo volta sozinho. **Limpar tudo** pergunta antes e tira os cartões concluídos e lidos do projeto mostrado (de todos os projetos com **Todos os projetos**), também os que estão atrás de **Mostrar N mais antigas**; um cartão não lido (verde) fica. O dsh mantém o ponto verde só nesta janela, então, depois de recarregar, o Limpar tudo pode tirar um cartão cuja resposta você não leu. A lista fica neste Mac para todas as janelas e para o Tether; quando ela chega a 5.000 chats, os mais antigos voltam. **Responder** responde só à solicitação mais recente do chat: quando o chat a respondeu em outro lugar (outra janela, Tether, Revisão automática) ou pergunta algo novo, o painel avisa e não envia nada. As versões anteriores tinham uma lista de tarefas com comentários e ferramentas para agentes; elas não existem mais, e o `board.json` antigo não é mostrado. A ideia e a aparência vêm do [Kanzo](https://github.com/emanuele-em/kanzo), de emanuele-em (AGPL-3.0); o Composer Plus não usa código dele. `Cmd+Shift+K` é um atalho do dsh: em um navegador no Linux, ele não tem tecla padrão (defina uma na página de atalhos de teclado do dsh), e uma extensão do navegador ou outro aplicativo pode usá-la antes. Um cartão sai de **Concluído** quando o ponto verde do dsh some (você abriu o chat) ou, para um chat que terminou atrás do quadro enquanto era o chat aberto, quando esse chat aparece sem um painel por cima. Esse estado de lido fica só nesta janela do dsh, como os pontos do dsh: depois de recarregar ou em outra janela, todo chat concluído conta como lido, então fica em **Concluídos recentemente**.
253
282
  - **Prioridade à mensagem enviada após Parar** só age depois que você interrompe o chat (ou depois de um turno que falhou, ou ao abrir um chat que ainda tem fila): uma mensagem enviada enquanto um turno é executado continua esperando no fim da fila. Ela só passa à frente das suas próprias mensagens na fila: se uma rodada de meta ou uma resposta a uma pergunta espera na fila, a ordem do dsh fica. Ela lê uma parte do dsh que não é uma API pública (se o turno interrompido ainda está terminando); se uma atualização do dsh mudar esse nome, a mensagem só passa à frente depois que esse turno terminar. Chats de subagentes mantêm a ordem do dsh.
254
283
  - **Memória do projeto** pertence à primeira pasta do chat (a pasta de projeto do dsh): um chat que muda de pasta com `cd` continua com a memória do primeiro projeto, e a mesma pasta aberta por outro caminho para os mesmos arquivos a compartilha. Um chat congela sua seção de memória quando começa, então uma nota salva depois aparece a partir do chat seguinte (`memory_recall` a encontra na hora). A revisão guarda só o que o modelo decide guardar: pode deixar passar um fato ou guardar um errado; confira em **Abrir memória** e mude lá, ou edite os arquivos à mão com o dsh fechado. **Abrir memória** envia as notas do projeto selecionado e as notas globais (todos os projetos quando você seleciona Todas as notas; no máximo cerca de 60.000 caracteres, o resto só é contado e não pode mudar nesse pedido) e o seu texto ao modelo padrão do dsh, não ao modelo do chat. Uma prévia fica no Mac por 30 minutos e até o dsh reiniciar; se uma revisão ou o agente mudar as notas nesse meio-tempo, **Aplicar** recusa e você pede a prévia de novo. **Aplicar** grava todas as mudanças de uma prévia ou nenhuma: se uma mudança não puder ser gravada (por exemplo, MEMORY.md está cheio), as notas ficam como estavam e o motivo aparece. Cada turno concluído com uma mensagem sua custa uma chamada ao modelo; uma chamada com falha lê as mesmas mensagens de novo depois do turno seguinte. Chats de subagentes não são revisados. A ideia e o formato de arquivo vêm do [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); o Composer Plus não usa o código dele e nunca lê nem escreve a memória do próprio DS Bot.
284
+ - **Histórico de versões da memória** guarda as 50 versões mais recentes de cada memória (cada projeto e a memória global); as mais antigas são apagadas. Uma versão guarda toda a memória daquele projeto, não uma nota. **Restaurar** devolve todos os arquivos daquela versão (tópicos incluídos) e recusa quando a memória mudou depois que você abriu a versão; a memória de antes da restauração vira uma nova versão, então você pode desfazê-la. Com a chave desativada, nenhuma versão nova é guardada e **Restaurar** recusa; as versões guardadas ficam. Não há versões de antes deste recurso: o histórico começa com a primeira gravação depois de instalá-lo.
285
+ - **Exportar a memória para AGENTS.md** grava só as notas da memória de um projeto; notas globais, fontes e datas ficam de fora. A próxima exportação substitui toda a seção marcada, então uma mudança feita à mão dentro dela se perde (o diff mostra antes); o texto fora das marcas fica. Se as marcas estiverem quebradas (falta uma ou aparecem duas vezes), a exportação recusa até você corrigi-las. Um AGENTS.md com mais de 512 kB, um link simbólico que sai da pasta do projeto e tudo que não for arquivo comum são recusados. Se o AGENTS.md ou as notas mudarem depois da prévia, **Gravar AGENTS.md** recusa e você exporta de novo.
286
+ - **Link de origem das notas da memória** funciona para notas salvas depois que você instalar esta versão: uma nota mais antiga indica só o chat (ou nada), então **Origem** só abre o chat ou não aparece. Quando a mensagem não existe mais (uma reversão a retirou ou o chat foi apagado), o chat abre e um aviso diz que a mensagem não está lá.
287
+ - **Copiar a memória para outro projeto** copia no máximo 100 notas por vez e só para um projeto que o dsh lista (lê a lista de projetos do próprio dsh; nenhum caminho vem da janela). Cada cópia é independente: uma mudança posterior numa nota de um projeto não muda a cópia. Se uma nota marcada não couber (o MEMORY.md ou o tópico de destino está cheio, ou já tem 40 tópicos), nada é copiado. Uma nota cujo texto e tópico já estão no destino é ignorada, e a contagem diz quantas.
288
+ - **Encontrar notas de memória desatualizadas** só encontra o que uma nota escreve numa forma que conhece: um caminho num trecho de código (`src/cart.ts`), um script npm depois de `npm run` (ou `npm test`, `pnpm lint`), um nome de branch num trecho de código perto da palavra "branch". Um caminho que sai da pasta do projeto não é informado; um script só é verificado se o projeto tem `package.json`, um branch só num repositório git. Verifica no máximo 200 itens por vez. Um aviso significa "não encontrado agora", não "errado": um arquivo que uma build cria depois também é informado.
289
+ - **Não usar a memória neste chat** vale a partir do próximo pedido ao modelo desse chat: um pedido já em andamento mantém o que tem. Mudar num chat em andamento muda o prompt de sistema uma vez, então esse pedido não pode usar o cache do provedor do modelo. Um subagente segue o chat raiz. A revisão não lê as mensagens que um chat recebe enquanto a memória dele está desativada, nem se você ativar de novo depois. No dsh 0.2.0 a tela de novo chat não tem lugar para o botão: ele aparece no cabeçalho do chat depois da primeira mensagem.
290
+ - **Sugerir notas de memória a partir de um chat** mostra no máximo 10 sugestões e as guarda por 30 minutos e até o dsh reiniciar; depois disso, ao aceitar você é pedido para sugerir de novo. Um chat longo envia as mensagens mais recentes: as respostas mais antigas do agente saem primeiro. Uma sugestão pode estar errada: leia antes de aceitar e use **Abrir memória** para mudar uma nota depois. Uma sugestão rejeitada pode voltar no próximo clique.
255
291
  - **Backup** usa uma única pasta fixa, `~/Desktop/dsh-backups` (o padrão do dsh-backup, para que os arquivos compactados dele continuem utilizáveis); não há opção para outra pasta. Um arquivo compactado tem mais ou menos o tamanho do dsh home sem `cache/` e `dsh-runtimes/` (medido: 1,6 GB de arquivos geraram um arquivo compactado de 830 MB em cerca de 30 s no Apple Silicon; o dsh continuou respondendo). Um arquivo que muda enquanto é lido é guardado como estava quando o backup o abriu, então o log de um chat aberto pode terminar em um registro cortado, que o dsh repara na próxima gravação. O mascaramento encontra um segredo em um arquivo yml pelo nome da chave em uma linha (`token:`, `apiKey:`, …); um segredo em um mapa de fluxo (`{token: x}`), em uma lista sob uma dessas chaves, em um arquivo JSON (por exemplo, a `apiKey` de um servidor MCP em um arquivo `.json`) ou com outro nome fica no arquivo compactado. Os arquivos compactados por tipo do dsh-backup (`dsh-t-…`) não aparecem na lista. **Para outro computador** copia o arquivo compactado (um clone no APFS: sem espaço extra); o vault não vai junto. **Fazer backup agora** não exclui nenhum backup. Um backup automático mantém os backups mais recentes feitos pelo Composer Plus (a opção **Manter** do **Backup automático**) e exclui os backups mais antigos que ele fez; os snapshots de antes de uma atualização são contados à parte (os 2 mais recentes ficam). Os arquivos compactados do dsh-backup nunca são excluídos: remova-os com **Excluir**. Enquanto o dsh-backup ainda estiver instalado, ele conta os arquivos compactados do Composer Plus no próprio limite de cópias mantidas e pode excluí-los.
256
292
  - **Restaurar** só funciona no console de resgate, com o dsh fechado: substitui todo o dsh home. O antigo fica ao lado como `.dsh.pre-restore-<time>` até você removê-lo, então o disco precisa de espaço para os dois. Os chats mantêm os caminhos dos projetos: em outro computador, um projeto em outro caminho aparece como ausente até você adicioná-lo de novo. Symlinks que apontam para fora do dsh home (por exemplo, skills vinculadas de outra pasta) voltam como links; os destinos deles precisam existir nesse computador.
257
293
  - **Verificação de logs de sessão** lê o log mais recente de cada chat com as próprias regras do dsh sobre o que abre: uma linha que não é JSON ou que está fora de ordem só conta como dano quando um fim de turno vem depois dela (senão o dsh abre o chat sem as linhas a partir dali, então ele não aparece na lista). Ela não confere os eventos de um log com as regras de eventos do próprio dsh, então um log que ela considera íntegro ainda pode não abrir depois de uma atualização do dsh. Um reparo pega a cópia de um backup: as mensagens depois desse backup se perdem nesse chat (o arquivo danificado fica ao lado). Um chat aberto neste dsh não é reparado em Configurações: o dsh o mantém em uso.
@@ -286,7 +322,13 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
286
322
 
287
323
  **O agente pode lembrar minhas preferências entre chats, como a memória do DS Bot?** Sim, com **Memória do projeto** (desativada por padrão): ative em **Configurações → Composer Plus**. Depois de cada turno, suas preferências e decisões duradouras são guardadas como notas curtas para o projeto do chat, e cada chat novo desse projeto as lê. Peça ao agente para lembrar algo e ele salva na hora. Para ver ou mudar as notas, clique em **Abrir memória** na mesma linha e escreva o que mudar.
288
324
 
289
- **Posso ver todos os meus chats como um quadro kanban e iniciar novos chats a partir dele?** Sim, com **Quadro de tarefas** (ativado por padrão): abra-o na barra lateral esquerda. Cada chat é um cartão em **Fazendo**, **Em revisão** (ele espera por você) ou **Concluído**. **Nova tarefa** abre o novo chat do dsh no projeto, e o quadro volta quando a sua primeira mensagem é enviada; clique em **Responder** em um cartão laranja para responder sem abrir o chat.
325
+ **Eu ou a IA fizemos uma mudança errada na memória. Posso recuperar as notas antigas?** Sim, com **Histórico de versões da memória** (ativado por padrão): em **Abrir memória**, selecione o projeto e depois **Histórico**. Selecione a versão de antes da mudança para ver o que volta e depois **Restaurar**.
326
+
327
+ **Posso compartilhar a memória do projeto com minha equipe ou outra ferramenta de agentes?** Sim, com **Exportar a memória para AGENTS.md** (ativado por padrão): em **Abrir memória**, selecione o projeto e depois **Exportar para AGENTS.md**. Confira o diff, depois **Gravar AGENTS.md**, e faça commit do arquivo.
328
+
329
+ **A IA pode sugerir o que guardar de um chat longo?** Sim, com **Sugerir notas de memória a partir de um chat** (ativado por padrão enquanto **Memória do projeto** está ativada): clique em **Sugerir para a memória** no cabeçalho do chat e depois em **Aceitar** nas notas que vale a pena guardar.
330
+
331
+ **Posso ver todos os meus chats como um quadro kanban e iniciar novos chats a partir dele?** Sim, com **Quadro de tarefas** (ativado por padrão): abra-o na barra lateral esquerda. Cada chat é um cartão em **Fazendo**, **Em revisão** (ele espera por você) ou **Concluído**. **Nova tarefa** abre o novo chat do dsh no projeto, e o quadro volta quando a sua primeira mensagem é enviada; clique em **Responder** em um cartão laranja para responder sem abrir o chat. **Limpar tudo**, em **Concluído**, pergunta antes e tira do quadro os cartões concluídos que você leu; **Desfazer** e **Retirados (N)** os trazem de volta, e os chats continuam no dsh.
290
332
 
291
333
  **O dsh consegue fazer backup dos meus chats e configurações, como o dsh-backup?** Sim: **Configurações → Composer Plus → Backup → Fazer backup agora**. Ele grava o mesmo formato de arquivo compactado na mesma pasta (`~/Desktop/dsh-backups`), então os arquivos compactados do dsh-backup também aparecem e podem ser restaurados, e você pode remover o dsh-backup. Ative **Backup automático** para ter backups agendados.
292
334
 
@@ -314,10 +356,22 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
314
356
 
315
357
  **Como impeço o agente de executar `npm publish` ou `git push --force`?** **Configurações → Composer Plus → Comandos bloqueados**: digite `npm publish`, escolha **bloquear** ou **perguntar antes** e depois clique em **Adicionar**. **bloquear** recusa o comando e o agente pergunta a você; **perguntar antes** mostra o cartão de aprovação toda vez. Arquivos protegidos cobre as ferramentas de arquivo do agente; Comandos bloqueados cobre os comandos de shell dele.
316
358
 
359
+ **Posso dizer ao agente por que rejeitei uma chamada de ferramenta?** Sim, com **Rejeitar com nota** (ativado por padrão): clique em **Rejeitar com nota…** no cartão de aprovação, escreva o motivo ou o que fazer no lugar e clique em **Rejeitar**. O agente lê a rejeição e a sua nota no mesmo turno.
360
+
361
+ **Como dou ao agente uma senha ou um token sem escrever no chat?** Com **Entrada secreta** (ativada por padrão): peça ao agente que use `request_secret`, ou espere que ele peça. Digite o valor no cartão da linha da ferramenta e clique em **Salvar**. O agente recebe só o caminho de um arquivo que contém o valor, e o arquivo é apagado quando o turno termina.
362
+
363
+ **Como respondo só a uma parte de uma resposta longa?** Selecione essa parte e clique em **Citar** acima da seleção (**Citar na resposta**, ativado por padrão). A parte vai para o campo de texto como citação `> …`, e você escreve sua resposta abaixo.
364
+
365
+ **Posso perguntar algo enquanto o agente trabalha, sem pará-lo?** Digite a pergunta e clique em **Perguntar em um chat paralelo** no campo de texto (**Chat paralelo**, ativado por padrão). Uma cópia somente leitura do chat responde enquanto o chat continua. No chat paralelo, **Trazer de volta** coloca a resposta no campo de texto do chat.
366
+
367
+ **Como digo ao agente o que mudar no diff dele?** No **Painel de alterações**, abra o diff do arquivo, clique em **+** em uma linha e escreva uma nota (**Notas no diff**, ativado por padrão). Depois clique em **Enviar ao campo de texto**: as notas vão para o campo de texto com o arquivo, os números de linha e as linhas.
368
+
317
369
  **Como faço a Revisão automática parar de perguntar sobre a mesma ferramenta em um chat?** Clique em **Permitir neste chat** no cartão de aprovação. Isso cobre só aquela ferramenta exata naquele chat, por 1 hora por padrão; revogue pelo chip no cabeçalho. Mude o tempo em **Configurações → Composer Plus → Permitir neste chat**.
318
370
 
319
371
  **Perdi meu iPhone. Como impeço que ele acesse meu Mac?** Clique em **Conexão móvel** no canto inferior esquerdo da barra lateral e clique em **Remove** ao lado desse iPhone. A chave dele para de funcionar na hora; ele só volta com um novo pareamento que você aprove no Mac.
320
372
 
373
+ **Como continuo um chat do meu outro Mac a partir deste?** No outro Mac, ative **Configurações → Composer Plus → Computadores remotos** e **Permitir que outros computadores abram este Mac**, clique em **Criar link de pareamento** e copie o link (envie o link para você mesmo, por exemplo pelo AirDrop ou pelo Notas). Neste Mac, ative também **Computadores remotos**, escolha **Adicionar um computador…** à esquerda do título do chat, cole o link e clique em **Conectar**. Depois, clique em **Aprovar** no outro Mac. A partir daí, escolha esse computador no mesmo menu.
374
+
321
375
  **Posso bloquear o Tether com o Face ID?** Sim: no Tether, ative "Settings → Privacy → Lock with Face ID". Depois disso, o Tether pede o Face ID (ou o código) quando abre e quando você volta para ele.
322
376
 
323
377
  **Como mostro na barra lateral do dsh só os projetos que usei hoje?** Barra lateral → opções de exibição (ícone de controles deslizantes) → **Ativos nas últimas 2 horas**. Selecione de novo para mostrar todos os projetos.
@@ -330,6 +384,10 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
330
384
 
331
385
  **O dsh pode abrir sozinho o chat que me faz uma pergunta?** Sim, com **Abrir o chat em espera quando ocioso** (ativado por padrão): quando um chat aguarda uma resposta, uma aprovação ou uma revisão do plano e você não usa o dsh por 30 segundos, o dsh o abre. Um chat que concluiu um turno que você ainda não leu (o ponto verde) abre do mesmo jeito, depois dos laranja. Enquanto você digita, rola a tela ou move o mouse, ele espera.
332
386
 
387
+ **Posso ir direto para o próximo chat que está esperando por mim?** Sim, com **Próximo chat em espera** (ativado por padrão): pressione `Cmd+Shift+E` (`Ctrl+Shift+E` no Windows e no Linux) ou clique no botão com o número no cabeçalho da barra lateral. Primeiro vêm os chats que fazem uma pergunta ou aguardam uma aprovação, depois os que terminaram um turno que você ainda não leu.
388
+
389
+ **Posso responder às opções de um agente com um clique?** Sim, com **Botões de opções** (ativado por padrão): quando uma resposta termina com uma lista "Opções", clique em um botão abaixo dela. Ele envia "Option N: …" como sua mensagem. Em um cartão de pergunta do agente, pressione 1–9.
390
+
333
391
  **Como mudo a interface do DeepSeek Harness para turco, espanhol, japonês…?** Configurações → Composer Plus → **Idioma do aplicativo**.
334
392
 
335
393
  **Como uso o dsh no meu iPhone?** Compile o app Tether a partir de `tether/ios` (Xcode), ative **Configurações → Composer Plus → Conexão móvel (iPhone)**, clique em **Conexão móvel** no canto inferior esquerdo, leia o código QR (com a Câmera do iPhone ou com **Scan code** no Tether), toque em **Connect** e clique em **Approve**. Longe de casa, use o Tailscale nos dois aparelhos.
@@ -359,6 +417,10 @@ PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/ds
359
417
  PLAYWRIGHT=/path/to/playwright node test/browser-recent-tree.mjs /path/to/dsh/lib/bin.js
360
418
  # Order by status (fake model + Schedule): real-app test + its thumbnail
361
419
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
420
+ # 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
421
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
422
+ # 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
423
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
362
424
  # every Settings feature row shows a loading screenshot and a ? link to its README row
363
425
  PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
364
426
  # What's new after an update: the release notes show once, Esc and Close close them
@@ -408,7 +470,7 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
408
470
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
409
471
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
410
472
  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, Hide finished, the switch
473
+ # 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
474
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
413
475
  ```
414
476