dsh-composer-plus 1.16.0 → 1.17.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.16.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.17.0`.
33
33
 
34
34
  ## Recursos
35
35
 
@@ -47,6 +47,7 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
47
47
  | **Modo de plano com Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` adiciona `/plan ` no início do rascunho (pressione de novo para remover). Se o chat já estiver no modo de plano, `Shift+Tab` sai dele. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Captura de tela: Modo de plano com Shift+Tab"></a> |
48
48
  | **Manter o foco no editor** | <a id="feature-keepfocus"></a>Depois que você envia um comando `/` ou uma skill, o cursor continua no editor de mensagens e você pode digitar de novo na hora. Isso também funciona com macros de teclado que digitam um comando e pressionam `Enter`. O dsh deixa o editor de mensagens somente leitura enquanto resolve o comando, e o navegador então tira o foco dele. Este recurso devolve o foco, a menos que um menu, uma caixa de diálogo ou outro campo esteja com ele. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Captura de tela: Manter o foco no editor"></a> |
49
49
  | **Ajustar o cartão de pergunta à janela** | <a id="feature-questionfit"></a>Quando o agente faz uma pergunta, a pergunta e as respostas rolam juntas no cartão, e **Pular** e **Enviar** continuam visíveis embaixo. O cartão usa a altura da janela (menos 200 px para o cabeçalho do chat e uma faixa do chat), então cresce e diminui com a janela. Sem este recurso, o dsh limita o cartão a 60% da janela (no máximo 520 px) e só as respostas rolam: uma pergunta longa pode empurrar o próprio final, as respostas e os botões para fora do cartão. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Captura de tela: Ajustar o cartão de pergunta à janela"></a> |
50
+ | **Ajustar o cabeçalho do chat à janela** | <a id="feature-headerfit"></a>Em uma janela estreita, os botões do cabeçalho do chat do dsh (o modo, os subagentes, as tarefas em segundo plano, Abrir em, a etiqueta do branch e a etiqueta de permissões) não se cobrem mais. O título do chat mantém pelo menos 120 px; os botões que não cabem vão para uma segunda linha à direita, e cada um continua clicável. Quando tudo cabe em uma linha (janela larga), o cabeçalho é exatamente o do dsh. Sem este recurso, o dsh só encolhe o título: com um subagente e tarefas em segundo plano, os botões se sobrepõem em uma coluna de chat estreita. A etiqueta do branch (**Um branch por chat**) e a de permissões (**Permitir neste chat**) também cabem no cabeçalho com esta chave desligada. | <a href="assets/features/headerFit.webp"><img src="assets/features/headerFit.webp" width="160" alt="Captura de tela: Ajustar o cabeçalho do chat à janela"></a> |
50
51
  | **Continuar com um clique** | <a id="feature-continuebutton"></a>Depois de um turno interrompido, com falha ou cortado, o editor de mensagens vazio mostra **▶**. Um clique retoma a partir da conversa existente, sem escrever no campo de entrada e sem adicionar uma mensagem visível ao chat (o modelo recebe uma breve nota oculta “continue de onde parou”, porque alguns provedores, como o Claude, rejeitam uma solicitação que termina com uma resposta do assistente). As mensagens da fila continuam nela: ▶ retoma só a tarefa interrompida e depois a fila é executada. Um turno concluído mantém o botão de enviar normal. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Captura de tela: Continuar com um clique"></a> |
51
52
  | **Retomar após reiniciar** | <a id="feature-resumeafterrestart"></a>Desativado por padrão: ative em **Configurações → Composer Plus**. Se você sair do dsh (ou ele fechar) enquanto um chat está trabalhando, esse chat continua sozinho quando você abre o dsh de novo, com a mesma nota oculta do Continuar com um clique. Se uma rodada de meta (`/goal`) estava em execução, a meta segue com a próxima rodada (o dsh pausa as metas a cada inicialização até você retomá-las). Chats que você interrompeu, que terminaram ou que falharam não continuam. O próprio dsh não tem uma configuração para isso: ele só marca esse turno como interrompido. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Captura de tela: Retomar após reiniciar"></a> |
52
53
  | **Arrastar e soltar na fila** | <a id="feature-queuereorder"></a>As mensagens na fila ganham uma alça (⠿). Arraste para reordenar, ou coloque o foco na alça e pressione `↑` / `↓`. `Esc` cancela. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Captura de tela: Arrastar e soltar na fila"></a> |
@@ -63,19 +64,22 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
63
64
  | **Branches na árvore de workspaces** | <a id="feature-branchtree"></a>Configurações → Composer Plus → **Branches na árvore de workspaces** (desligado por padrão). Cada branch que tem uma pasta de worktree em `<project>/.worktrees/` aparece como um projeto dentro do seu projeto; escolha **Opções de exibição** → **Árvore de workspaces** do dsh para vê-la aninhada. Um branch cuja pasta é apagada sai da lista, e o dsh mostra os chats dele em **Sem grupo**. Quando o agente de um chat na pasta do projeto cria um branch e muda para ele (`git switch -c`, `git checkout -b`) sem alterações não commitadas na pasta, a pasta do projeto volta ao branch anterior, o branch ganha a própria pasta e o chat vai para lá: uma cópia abre no projeto do branch e continua a tarefa, e o chat antigo é arquivado. A lista é verificada ao iniciar, a cada 30 segundos, depois de cada turno e quando você volta à janela. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="Captura de tela: Branches na árvore de workspaces"></a> |
64
65
  | **Previsão da próxima mensagem** | <a id="feature-nextprediction"></a>Ativada por padrão; você pode desativá-la em **Configurações → Composer Plus**. Quando o agente termina um turno (não um turno interrompido ou que falhou), o editor de mensagens vazio mostra em cinza um palpite da sua próxima mensagem, com a dica **Tab para aceitar**. `Tab` coloca o texto no editor, mas não o envia. `Esc` esconde o palpite naquele turno. Começar a digitar também o esconde, e um novo turno o substitui. O menu **Modelo** abaixo da chave lista os próprios modelos do dsh (a mesma lista do menu de modelos do dsh). **Padrão do dsh** vem selecionado por padrão e segue o modelo padrão do dsh. Cada turno concluído custa uma chamada curta ao modelo. No Tether, o palpite aparece acima do editor vazio: toque nele para colocá-lo no campo. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Captura de tela: Previsão da próxima mensagem"></a> |
65
66
  | **Completar ao digitar** | <a id="feature-typingcompletion"></a>Desativado por padrão; você pode ativá-lo em **Configurações → Composer Plus**. Enquanto você digita, um texto cinza logo após o cursor mostra como sua mensagem pode continuar. `Tab` adiciona o texto à mensagem, mas não a envia. `Esc` esconde o texto. Ele sugere só as suas próprias próximas palavras: nunca uma resposta para você, nem textos de erro ou nomes inventados. Se a mensagem parecer completa ou o modelo não tiver certeza, nada aparece. Digitar as próximas letras do texto cinza o mantém, sem nova chamada ao modelo. Tem o próprio menu **Modelo** abaixo da sua chave. A primeira opção, **Igual à previsão da próxima mensagem**, usa o modelo da **Previsão da próxima mensagem** (é o padrão); escolha outro modelo para usar um modelo diferente em cada recurso, por exemplo um modelo mais rápido para os complementos. Faz uma chamada ao modelo a cada pausa enquanto você digita, por isso gasta muito mais tokens que a previsão: escolha um modelo rápido e de baixo custo. Não é executado em um comando de barra, em uma mensagem com um chip de arquivo nem quando o cursor não está no final. No Tether, o restante aparece acima do campo enquanto você digita: toque nele para adicioná-lo. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Captura de tela: Completar ao digitar"></a> |
66
- | **Melhorar prompt** | <a id="feature-promptimprove"></a>Digite um pedido aproximado e clique na varinha mágica (**Melhorar prompt**) ao lado do menu de modelos. Uma chamada ao modelo o reescreve como um prompt mais claro: primeiro o objetivo, passos numerados curtos quando há várias partes e a verificação a executar. Ele lê este chat (sem as mensagens revertidas), o README, o AGENTS.md e o manifesto do projeto, os arquivos alterados e os arquivos cujos nomes combinam com as suas palavras, e mantém o seu idioma. Ele nunca inventa nomes de arquivo. O novo texto substitui o seu rascunho, mas não é enviado: leia, edite e depois pressione `Enter`. `Cmd/Ctrl+Z` traz seu texto de volta em um passo, e o botão (**Desfazer melhoria**) também. Se você digitar enquanto ele trabalha, o seu novo texto fica. `Esc` ou um segundo clique cancela. Tem o próprio menu **Modelo** nas Configurações (padrão: **Igual ao modelo do chat**). Não funciona em comandos de barra nem em uma mensagem com um chip de arquivo. No Tether, a varinha fica ao lado do campo. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Captura de tela: Melhorar prompt"></a> |
67
- | **Verificação da meta** | <a id="feature-goalcheck"></a>Comece uma meta com `/goal`. Quando o agente marca a meta como concluída em uma rodada automática, a meta só é fechada depois de duas verificações. Primeiro, o comando de teste do projeto é executado na pasta do chat, no modo sandbox do chat. O comando é o seu próprio ou o encontrado em `package.json`, `Makefile`, `Cargo.toml`, `go.mod` ou pytest. Quando o passo mais recente do próprio agente foi uma execução bem-sucedida desse teste, ele não é executado de novo. Depois, uma chamada independente ao modelo, sem ferramentas, lê a meta, este chat, o `git status` e o resultado do teste. Se uma verificação falhar, a meta continua ativa e o agente lê o motivo; depois, a próxima rodada continua. Uma linha abaixo da barra da meta (**Verificação da meta**) mostra o teste e o último resultado. **Editar** define o seu próprio comando de teste e um limite de tempo ou de tokens; acima do limite, a meta fica bloqueada. **Executar agora** executa a verificação sem fechar a meta. Tem o próprio menu **Modelo** nas Configurações (padrão: **Igual ao modelo do chat**). Quando você mesmo conclui a meta, nada é verificado. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Captura de tela: Verificação da meta"></a> |
68
- | **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. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Captura de tela: Memória do projeto"></a> |
67
+ | **Melhorar prompt** | <a id="feature-promptimprove"></a>Digite um pedido aproximado e clique na varinha mágica (**Melhorar prompt**) ao lado do menu de modelos. Uma chamada ao modelo o reescreve como um prompt mais claro: primeiro o objetivo, passos numerados curtos quando há várias partes e a verificação a executar. Ele lê este chat (sem as mensagens revertidas), o README, o AGENTS.md e o manifesto do projeto, os arquivos alterados e os arquivos cujos nomes combinam com as suas palavras, e mantém o seu idioma. Ele nunca inventa nomes de arquivo. O novo texto substitui o seu rascunho, mas não é enviado: leia, edite e depois pressione `Enter`. `Cmd/Ctrl+Z` traz seu texto de volta em um passo, e o botão (**Desfazer melhoria**) também. Se você digitar enquanto ele trabalha, o seu novo texto fica. `Esc` ou um segundo clique cancela. Tem o próprio menu **Modelo** nas Configurações (padrão: **Igual ao modelo do chat**). Em uma mensagem `/goal <objective>`, ele reescreve só o objetivo, como uma condição de conclusão que a **Verificação da meta** pode verificar: as entregas, as verificações que precisam passar, a evidência a mostrar no chat, uma parte que não pode ser feita marcada como não resolvida e uma parada quando o mesmo bloqueio continua. O comando `/goal` fica. Não funciona em outros comandos de barra, em uma palavra de controle do `/goal` (`clear`, `pause`, `resume`) nem em uma mensagem com um chip de arquivo. No Tether, a varinha fica ao lado do campo. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Captura de tela: Melhorar prompt"></a> |
68
+ | **Verificação da meta** | <a id="feature-goalcheck"></a>Comece uma meta com `/goal`. Quando o agente marca a meta como concluída em uma rodada automática, a meta só é fechada depois de duas verificações. Primeiro, o comando de teste do projeto é executado na pasta do chat, no modo sandbox do chat. O comando é o seu próprio ou o encontrado em `package.json`, `Makefile`, `Cargo.toml`, `go.mod` ou pytest. Quando o passo mais recente do próprio agente foi uma execução bem-sucedida desse teste, ele não é executado de novo. Depois, uma chamada independente ao modelo, sem ferramentas, lê a meta, este chat, o `git status` e o resultado do teste. O modelo responde com uma tabela de evidências: cada parte da meta fica verificada, incorreta ou não resolvida, com a evidência e a correção; a meta só é fechada quando todas as partes estão verificadas. Se uma verificação falhar, a meta continua ativa e o agente lê cada parte em aberto com a evidência e a correção; depois, a próxima rodada continua. Uma linha abaixo da barra da meta (**Verificação da meta**) mostra o teste, o último resultado e quantas partes foram verificadas (passe o ponteiro sobre ela para ver a tabela). **Editar** define o seu próprio comando de teste e um limite de tempo ou de tokens; acima do limite, a meta fica bloqueada. O limite de tokens também conta os subagentes do chat. **Executar agora** executa a verificação sem fechar a meta. Tem o próprio menu **Modelo** nas Configurações (padrão: **Igual ao modelo do chat**). Quando você mesmo conclui a meta, nada é verificado. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Captura de tela: Verificação da meta"></a> |
69
+ | **Continuar em um novo chat** | <a id="feature-handoffchat"></a>Clique com o botão direito em um chat na barra lateral (ou abra o menu **…** dele) → **Continuar em um novo chat…**. Uma chamada ao próprio modelo do chat escreve uma nota de passagem com o que o chat mostra: Tarefa, Entregas, Concluído, Decisões, Pendências e Próxima ação (as chamadas de ferramentas e os resultados delas são a evidência; os passos que você reverteu ficam de fora). A nota abre em uma caixa de diálogo: leia e edite. **Escrever de novo** escreve uma nova nota. **Iniciar novo chat** (ou `Cmd/Ctrl+Enter`) abre um novo chat no mesmo projeto com a nota e um link para o chat antigo como primeira mensagem; o chat antigo fica como está. Use quando um chat longo estiver cheio ou lento, ou para continuar amanhã. Nada é gravado no projeto. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="Captura de tela: Continuar em um novo chat"></a> |
70
+ | **Detalhamento do contexto** | <a id="feature-contextbreakdown"></a>Barra lateral direita → `+` → **Contexto**. A página mostra o que preenche agora o contexto do modelo do chat aberto e quanto da janela de contexto ele usa: o prompt do sistema, as instruções do projeto (AGENTS.md), as skills, suas mensagens, as respostas do agente e as chamadas de ferramentas, os resultados de ferramentas (por ferramenta), os resultados de MCP (por servidor), as definições de ferramentas, o resumo da compactação e outras notas de contexto, cada um com os tokens e a sua parte. Clique em uma parte para ver as ferramentas ou os servidores dela. Lê só o log do chat, depois do `/compact` e das reversões, e não chama nenhum modelo; lê de novo depois de cada turno e com **Atualizar**. Use para ver por que um chat está lento ou cheio, por exemplo um resultado grande de uma ferramenta MCP ou muitas definições de ferramentas. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="Captura de tela: Detalhamento do contexto"></a> |
71
+ | **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> |
72
+ | **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> |
69
73
  | **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> |
70
74
  | **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> |
71
- | **Branch do Git nas linhas de chat** | <a id="feature-sessionbranch"></a>Cada linha de chat na barra lateral 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 mostra o ID curto do commit entre parênteses). 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. Se a linha de projeto acima do chat tem o mesmo nome do branch (por exemplo, uma pasta de “Um branch por chat”), a linha do chat não mostra a etiqueta, mas “Em uma única lista” ainda a mostra. | <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> |
75
+ | **Branch do Git nas linhas de chat** | <a id="feature-sessionbranch"></a>Cada linha de chat na barra lateral 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. Se a linha de projeto acima do chat tem o mesmo nome do branch (por exemplo, uma pasta de “Um branch por chat”), a linha do chat não mostra a etiqueta, mas “Em uma única lista” ainda a mostra. | <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> |
72
76
  | **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> |
73
77
  | **Projetos ativos primeiro** | <a id="feature-activeprojectsfirst"></a>Quando um chat começa a ser executado ou precisa de você, o projeto dele vai para o topo da barra lateral com a própria animação de linha do dsh (o mesmo movimento de arrastá-lo até lá). Projetos concluídos ficam onde estão; arraste-os para qualquer lugar, como de costume. As movimentações são salvas na ordem de projetos do dsh, então desativar este recurso mantém a ordem atual. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura de tela: Projetos ativos primeiro"></a> |
74
78
  | **Filtro de projetos recentes** | <a id="feature-recentprojects"></a>Barra lateral → opções de exibição (ícone de controles deslizantes) → **Ativos nas últimas 2 horas**. Enquanto essa opção está selecionada, a barra lateral mostra só os projetos com um chat ativo nas últimas 2 horas: um chat atualizado nesse período, um chat em execução ou aguardando, o chat aberto, ou um chat concluído que você ainda não abriu (o ponto verde de “concluído” do dsh), mesmo depois das 2 horas. Projetos sem um chat assim ficam ocultos, inclusive os novos e vazios. Em **Árvore de workspaces**, uma pasta pai continua visível enquanto um projeto dentro dela estiver ativo, e os chats que não ficaram ativos nas últimas 2 horas também ficam ocultos, então só aparecem os chats recentes. Selecione a opção de novo para mostrar todos os projetos. A escolha fica salva neste dispositivo. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Captura de tela: Filtro de projetos recentes"></a> |
75
79
  | **Recolher todos os projetos** | <a id="feature-collapseprojects"></a>Enquanto um projeto estiver aberto na barra lateral, aparece um botão ao lado das opções de exibição (ícone de controles deslizantes). Clique nele para fechar todos os projetos abertos de uma vez, por exemplo 3 projetos abertos de 5. O botão some de novo quando nenhum projeto está aberto. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Captura de tela: Recolher todos os projetos"></a> |
76
80
  | **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> |
77
81
  | **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> |
78
- | **Abrir o chat em espera quando ocioso** | <a id="feature-idleswitch"></a>Quando um chat faz uma pergunta ou aguarda uma aprovação ou uma revisão do plano (o ponto laranja) e você não usa o dsh por 30 segundos, o dsh abre esse chat. Quando vários chats aguardam, 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. 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> |
82
+ | **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> |
79
83
  | **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> |
80
84
  | **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> |
81
85
  | **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 (da mesma verificação de atualizações, sem outra chamada de rede); **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> |
@@ -160,7 +164,10 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
160
164
  - **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).
161
165
  - **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).
162
166
  - **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).
163
- - **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.
167
+ - **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.
168
+ - **Detalhamento do contexto:** a parte Host lê só o log do chat; nenhuma chamada ao modelo, nenhum arquivo do projeto.
169
+ - **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.
170
+ - **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.
164
171
  - **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).
165
172
  - **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.
166
173
 
@@ -182,7 +189,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
182
189
  - **Nenhuma etiqueta de branch em uma linha de chat:** 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).
183
190
  - **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.
184
191
  - **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).
185
- - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.16.0`); veja a nota de instalação acima.
192
+ - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.17.0`); veja a nota de instalação acima.
186
193
  - **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.
187
194
  - **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.
188
195
  - **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.
@@ -205,6 +212,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
205
212
  - **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.
206
213
  - **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.
207
214
  - **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.
215
+ - **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.
208
216
  - **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.
209
217
  - 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.
210
218
  - **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.
@@ -216,10 +224,10 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
216
224
  - **Chats que alteraram este arquivo** só conhece as ferramentas de arquivo do dsh (`write`, `edit`, `str_replace_editor`), como **Este chat**: uma alteração feita por um comando (`bash`) não aparece na lista. Ele lê os 300 chats mais recentes do repositório (pela data de criação) e avisa quando há mais; mostra no máximo 100 linhas. Um arquivo renomeado aparece com o nome que a ferramenta escreveu. Um chat cuja pasta fica fora do repositório (também por outro caminho para os mesmos arquivos) não é contado. A primeira abertura depois de iniciar o dsh lê todos os registros de chat do repositório (cerca de 4 s para 275 chats); as aberturas seguintes leem só os chats que mudaram desde então.
217
225
  - **Branch do Git nas linhas de chat** mostra o branch da pasta do chat quando o último turno dele começou ou terminou, não o branch atual: uma troca de branch fora de um turno aparece depois do próximo turno. Chats de antes desta versão não mostram etiqueta até o próximo turno. A etiqueta fica na marcação das linhas de chat do dsh (o dsh não tem um espaço ali); se uma atualização do dsh mudar essa marcação, nenhuma etiqueta aparece. Se a linha de projeto acima do chat tem o mesmo nome do branch (por exemplo, uma pasta de “Um branch por chat”), a linha do chat não mostra a etiqueta, mas “Em uma única lista” ainda a mostra.
218
226
  - **Um branch por chat** no modo de plano: o dsh envia `/plan <mensagem>` como comando, não como mensagem, então o Composer Plus intercepta o envio do comando no editor de mensagens do dsh (não é uma API pública). Se uma atualização do dsh mudar isso, `/plan <mensagem>` com **Novo branch** escolhido roda no Novo chat aberto como comando do próprio dsh. Quando o Host não consegue ativar o modo de plano no novo chat, a pasta do branch fica e a mensagem não é enviada, então o novo chat não altera arquivos no modo padrão.
219
- - **Um branch por chat**: quando a pasta do branch de um chat (`<project>/.worktrees/<name>`) é excluída, por exemplo quando o próprio agente do chat remove o worktree e exclui o branch, o próximo passo do chat tira o chat dessa pasta. O projeto da pasta do branch sai da barra lateral, e o chat aparece em Sem grupo e continua aberto. No dsh 0.2.1 e posteriores, o chat continua na pasta principal do projeto, e o modelo recebe uma nota sobre a nova pasta. No dsh 0.2.0, o chat mantém a pasta excluída: um comando nela falha até você começar um novo chat. A mudança acontece só no próximo passo do chat, então o projeto de um branch excluído que nenhum chat usa fica na barra lateral: remova-o com o menu de projeto do próprio dsh. Enquanto um chat é movido, **Novo branch** no mesmo repositório responde "tente de novo". Com a chave desligada, o erro do próprio dsh volta a aparecer ("working-directory: directory does not exist").
227
+ - **Um branch por chat**: quando a pasta do branch de um chat (`<project>/.worktrees/<name>`) é excluída, por exemplo quando o próprio agente do chat remove o worktree e exclui o branch, o próximo passo do chat tira o chat dessa pasta. O projeto da pasta do branch sai da barra lateral, e o chat aparece em Sem grupo e continua aberto. No dsh 0.2.1 e posteriores, o chat continua na pasta principal do projeto, e o modelo recebe uma nota sobre a nova pasta. No dsh 0.2.0, o chat mantém a pasta excluída: um comando nela falha até você começar um novo chat. O projeto de um branch excluído que nenhum chat usa também sai da barra lateral: o Composer Plus verifica as pastas de branch ao iniciar e a cada 30 segundos, também sem filtro da barra lateral. Enquanto um chat é movido, **Novo branch** no mesmo repositório responde "tente de novo". Com a chave desligada, o erro do próprio dsh volta a aparecer ("working-directory: directory does not exist").
220
228
  - **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.
221
229
  - **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).
222
- - **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); o pedido de um subagente aparece no chat principal dele. 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.
230
+ - **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.
223
231
  - Uma notificação enviada antes de reiniciar só traz o dsh para a frente quando você clica nela.
224
232
  - 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.
225
233
  - 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.
@@ -228,10 +236,13 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
228
236
  - O dsh também não tem um ponto de extensão que escolha onde **Nova sessão** abre. **Espaço de trabalho padrão para Nova sessão** envolve um método do dsh que não é uma API pública (`startSession` do serviço de espaços de trabalho do dsh). Se uma atualização do dsh renomeá-lo, **Nova sessão** abre onde o dsh escolher (o projeto aberto ou o mais recente). Toda chamada que não indica um projeto usa o padrão: o botão da barra lateral, seu atalho, o logotipo e também **Nova** na página **Tarefas de automação**. O dsh ainda abre o último chat ao iniciar. A pasta geral é criada e adicionada aos seus projetos no primeiro uso; no Windows ou Linux com a pasta Documents movida, ela pode ser diferente da pasta do próprio dsh.
229
237
  - O dsh também não tem um ponto de extensão para uma dica no editor de mensagens, então o texto da **Previsão da próxima mensagem** fica sobre o texto de exemplo do próprio dsh (`[data-composer-placeholder]`). Se uma atualização do dsh mudar essa marcação, nenhuma previsão aparece. Enquanto ela está ativada, cada turno concluído custa uma chamada curta ao modelo.
230
238
  - **Completar ao digitar** mostra o texto pela própria dica do editor de mensagens do dsh (o estilo `--dsh-composer-hint` que o dsh usa para a dica de argumento de um comando de barra). Ele não é executado em um comando de barra, em uma mensagem com um chip de arquivo ou de símbolo nem quando o cursor não está no final da mensagem. Se uma atualização do dsh mudar esse estilo, nenhum complemento aparece. Cada pausa enquanto você digita custa uma chamada ao modelo.
231
- - **Melhorar prompt** vê só um resumo curto do projeto, os caminhos alterados e os caminhos cujos nomes combinam com as suas palavras: não o código em si. Por isso, pode não encontrar o arquivo certo, e só cita caminhos que recebeu. Leia o novo texto antes de enviá-lo. Ele não é executado em um comando de barra nem em uma mensagem com um chip de arquivo ou de símbolo (o novo texto é texto simples, então o chip se perderia), e uma mensagem pode ter no máximo 8.000 caracteres. As imagens continuam anexadas: só o texto muda. Cada clique custa uma chamada ao modelo; um modelo forte pode levar um minuto (`Esc` cancela).
232
- - **Verificação da meta** verifica só uma conclusão que o agente faz em uma rodada automática da meta: uma conclusão que você pede no chat, `/goal` e a barra da meta não são verificados. O agente pode alterar os testes ou os arquivos do comando de teste por conta própria; o verificador lê o chat e pode ver isso, mas pode errar nos dois sentidos (um "não concluída" errado custa mais uma rodada; um "concluída" errado fecha a meta). O verificador vê o chat e o `git status`, não o código em si. Uma execução de teste só é reaproveitada quando o passo mais recente do agente que pode alterar arquivos foi a sua própria execução bem-sucedida de `bash` com exatamente o mesmo comando na mesma pasta; um comando com pipe (`| tail`) ou `&&` não é reaproveitado. O orçamento é medido quando um turno termina, então um turno pode ultrapassá-lo. Só contam as chamadas ao modelo do próprio chat (não as dos subagentes dele). `update_goal` espera enquanto a verificação é executada (o teste no máximo 15 minutos, o verificador no máximo 3 minutos). Uma bifurcação recebe um novo id de chat, então começa sem o comando de teste e os limites próprios do chat original. Cada conclusão que chega ao verificador custa uma chamada ao modelo.
239
+ - **Melhorar prompt** vê só um resumo curto do projeto, os caminhos alterados e os caminhos cujos nomes combinam com as suas palavras: não o código em si. Por isso, pode não encontrar o arquivo certo, e só cita caminhos que recebeu. Leia o novo texto antes de enviá-lo. Ele não é executado em um comando de barra que não seja `/goal <meta>`, em uma palavra de controle do `/goal` (`clear`, `pause`, `resume`) nem em uma mensagem com um chip de arquivo ou de símbolo (o novo texto é texto simples, então o chip se perderia), e uma mensagem pode ter no máximo 8.000 caracteres. Para uma meta do `/goal`, ele escreve condições só a partir do rascunho e do contexto; uma condição rígida demais pode custar rodadas da meta, então leia-a antes de enviar. As imagens continuam anexadas: só o texto muda. Cada clique custa uma chamada ao modelo; um modelo forte pode levar um minuto (`Esc` cancela).
240
+ - **Verificação da meta** verifica só uma conclusão que o agente faz em uma rodada automática da meta: uma conclusão que você pede no chat, `/goal` e a barra da meta não são verificados. O agente pode alterar os testes ou os arquivos do comando de teste por conta própria; o verificador lê o chat e pode ver isso, mas pode errar nos dois sentidos (um "não concluída" errado custa mais uma rodada; um "concluída" errado fecha a meta). O verificador vê o chat e o `git status`, não o código em si. Uma execução de teste só é reaproveitada quando o passo mais recente do agente que pode alterar arquivos foi a sua própria execução bem-sucedida de `bash` com exatamente o mesmo comando na mesma pasta; um comando com pipe (`| tail`) ou `&&` não é reaproveitado. O orçamento é medido quando um turno termina, então um turno pode ultrapassá-lo. O orçamento de tokens também conta as chamadas dos chats de subagentes do chat (lidas dos logs salvos deles ao fim de cada turno, então um chat com muitos subagentes leva um pouco mais para ser verificado). A tabela de evidências vem da própria leitura do chat feita pelo verificador: uma parte que ele chama de verificada ainda precisa que você mesmo olhe quando isso importa. `update_goal` espera enquanto a verificação é executada (o teste no máximo 15 minutos, o verificador no máximo 3 minutos). Uma bifurcação recebe um novo id de chat, então começa sem o comando de teste e os limites próprios do chat original. Cada conclusão que chega ao verificador custa uma chamada ao modelo.
241
+ - **Arquivos protegidos** é uma barreira de proteção, não um sandbox. Cobre as ferramentas de arquivo do próprio dsh (`read`, `read_image`, `grep` em um arquivo, `write`, `edit`, `str_replace_editor`). Um comando de shell (`cat .env`), um script que o agente escreve, o shell de um subagente, uma ferramenta MCP, uma listagem de `glob` e um `grep` em uma pasta inteira ainda podem acessar um arquivo protegido. Para um limite real, use os modos sandbox do dsh ou mantenha segredos fora da pasta do projeto. Os padrões conhecem `*`, `**` e `?`, não `{a,b}` nem `[ab]`, e ignoram maiúsculas e minúsculas.
242
+ - **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.
243
+ - **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.
233
244
  - **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.
234
- - **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; abra os arquivos para conferir e edite ou apague à mão com o dsh fechado. 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.
245
+ - **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.
235
246
  - **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.
236
247
  - **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.
237
248
  - **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.
@@ -264,7 +275,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
264
275
 
265
276
  **O agente pode parar de marcar o próprio trabalho como concluído, como nos loops de verificação da loop engineering?** Sim, com **Verificação da meta** (ativada por padrão): comece uma meta com `/goal`. Quando o agente diz que a meta foi concluída, os testes do projeto são executados e uma chamada independente ao modelo confere a meta com o chat; se algum dos dois falhar, a meta continua aberta e o agente lê o motivo. Defina o seu próprio comando de teste, um limite de tempo ou um limite de tokens com **Editar** na linha **Verificação da meta** abaixo da meta.
266
277
 
267
- **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.
278
+ **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.
268
279
 
269
280
  **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.
270
281
 
@@ -304,7 +315,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
304
315
 
305
316
  **Como recebo notificações do macOS / Windows quando uma tarefa do dsh termina ou precisa de aprovação?** Mantenha **Notificações em segundo plano** ativado (padrão) e permita notificações para o DeepSeek Harness nas configurações do sistema operacional.
306
317
 
307
- **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. Enquanto você digita, rola a tela ou move o mouse, ele espera.
318
+ **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.
308
319
 
309
320
  **Como mudo a interface do DeepSeek Harness para turco, espanhol, japonês…?** Configurações → Composer Plus → **Idioma do aplicativo**.
310
321
 
@@ -343,6 +354,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
343
354
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
344
355
  # Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
345
356
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
357
+ # Fit chat header to window (fake model, subagent + background jobs, branch pill, grants chip): no overlap from 1280 to 320 px, wide header unchanged + its thumbnail
358
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-header-fit.mjs /path/to/dsh/lib/bin.js
346
359
  # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
347
360
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
348
361
  # Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not