dsh-composer-plus 1.12.0 → 1.13.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.12.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.13.0`.
33
33
 
34
34
  ## Recursos
35
35
 
@@ -37,10 +37,10 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
37
37
 
38
38
  | Recurso | Como usar | Captura de tela |
39
39
  |---|---|---|
40
- | **Painel de alterações** | <a id="feature-changespanel"></a>Barra lateral direita → `+` → **Alterações**. Escolha **Não confirmadas**, **Não preparadas**, **Preparadas** ou **Branch** para ver os arquivos alterados com as contagens `+/-`; clique em um arquivo para ver o diff dele. **Último turno** abre a revisão do próprio dsh para o turno mais recente. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Captura de tela: Painel de alterações"></a> |
40
+ | **Painel de alterações** | <a id="feature-changespanel"></a>Barra lateral direita → `+` → **Alterações**. Escolha **Não confirmadas**, **Não preparadas**, **Preparadas** ou **Branch** para ver os arquivos alterados com as contagens `+/-`; clique em um arquivo para ver o diff dele. **Último turno** abre a revisão do próprio dsh para o turno mais recente. Clique no nome do branch (ou escolha **Árvore**) para ver a árvore de branches: clique em um branch acima dela para ir até ele e em um commit para ver os arquivos e os diffs dele. **Este chat** lista só os arquivos que as ferramentas de arquivo do chat aberto (write, edit) escreveram, em todos os turnos dele, e o diff total desde a primeira mensagem. O botão **␣** oculta as alterações de espaço em branco (`git diff -w`): as linhas que mudaram só na indentação ou nas quebras de linha não aparecem. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Captura de tela: Painel de alterações"></a> |
41
41
  | **Ideias de recursos** | <a id="feature-featureideas"></a>Barra lateral direita → `+` → **Ideias de recursos** → **Sugerir recursos**. O próprio modelo do chat lê um breve resumo do projeto do chat (arquivos do nível superior, o início do README e do manifesto, os últimos 15 commits) e sugere até 8 recursos, exibidos como uma pilha de cartões no idioma da interface do dsh. Deslize um cartão para a direita (ou clique em **✓**, ou pressione `→`; em todos os casos, o cartão sai voando para aquele lado) para iniciar um novo chat no mesmo projeto: ele começa no modo de plano com a ideia como pedido, então nada muda antes de você aprovar o plano. Para pular o plano, clique em **▶ Criar agora** (ou pressione `↑`; o cartão sai voando para cima): o novo chat começa na hora com a ideia como um pedido comum, e o modelo faz a alteração e executa as verificações (as aprovações valem como de costume). Deslize para a esquerda (ou **✕**, ou `←`) para pular; **Desfazer** (ou `Z`) traz de volta um cartão pulado. Clique em **↓** (ou pressione `↓`) para salvar uma boa ideia para depois: ela vai para a lista **Depois** do projeto, que aparece em todos os chats da mesma pasta de projeto (também depois de reiniciar). **Depois (N)** abre a lista; **Planejar** inicia o mesmo chat no modo de plano para a ideia e **Criar agora** inicia o chat sem plano; os dois a tiram da lista. **Planejar tudo (N)** inicia um único chat no modo de plano para todas as ideias da lista, então as partes em comum são planejadas uma só vez. **Remover da lista** a exclui. **Copiar como lista de tarefas** copia a lista inteira para a área de transferência como uma lista de tarefas em Markdown (`- [ ] Title — Summary`, uma linha por ideia) para um rastreador de issues ou um arquivo TODO; ele não faz nenhuma chamada de rede. **Mais ideias** adiciona cartões. Para receber ideias sobre uma única área, digite um **Tema de foco** curto no campo ao lado de **Sugerir recursos** (no máximo 80 caracteres; `Enter` também sugere), ou clique em um dos temas fixos abaixo dele: **Desempenho**, **Acessibilidade**, **Testes**, **Segurança**, **Usabilidade** ou **Documentação** (clique de novo para limpá-lo). O modelo então sugere só recursos sobre esse tema; um campo vazio significa qualquer recurso. Uma ideia não é sugerida duas vezes no mesmo projeto: toda ideia sugerida (pulada, salva ou iniciada) vai para o **Histórico** do projeto, o modelo recebe a instrução de não sugeri-las de novo e um título repetido é descartado. **Histórico** lista as ideias como **Iniciada** ou **Sugerida**; **Esquecer** (ou **Esquecer tudo**) deixa uma delas voltar; uma ideia que ainda está na lista **Depois** fica fora das sugestões até você removê-la de lá. O modelo só é executado quando você clica. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Captura de tela: Ideias de recursos"></a> |
42
42
  | **Pesquisa no conteúdo** | <a id="feature-contentsearch"></a>A pesquisa da própria barra lateral do dsh (a lupa ao lado de **Workspaces**; `Cmd+K` no app desktop, `Cmd+Alt+K` no navegador) também encontra chats pelas palavras das suas mensagens e das respostas, não só pelo título, e mostra o texto correspondente abaixo do chat. O dsh já tem essa pesquisa, mas ela vem desativada; este recurso a ativa com um arquivo de índice de pesquisa no seu computador. O índice é criado na primeira pesquisa depois de iniciar (cerca de 15 s para 250 chats, veja Limites) e fica guardado para as próximas inicializações. Ativado por padrão; uma alteração vale depois que você reinicia o dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Captura de tela: Pesquisa no conteúdo"></a> |
43
- | **Reverter turno** | <a id="feature-turnrollback"></a>Passe o mouse sobre uma das suas mensagens e clique em **↶** (ao lado de Copiar). **Apenas o chat** remove essa mensagem e tudo o que vem depois dela (respostas, chamadas de ferramentas) do chat e do contexto do modelo, e coloca a mensagem de volta no editor de mensagens: altere-a e envie de novo. **Chat e arquivos** primeiro lista os arquivos do projeto que mudaram desde essa mensagem e depois também os deixa como estavam, incluindo as alterações feitas por comandos (`bash`), não só pelas ferramentas de edição do dsh. Um turno em execução é interrompido primeiro. O log do chat nunca é reescrito: um marcador oculto esconde a parte removida, do mesmo jeito que o `/compact` do próprio dsh esconde mensagens antigas. Quando o [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) está instalado, ele faz esse trabalho e o Composer Plus não mostra um segundo botão. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Captura de tela: Reverter turno"></a> |
43
+ | **Reverter turno** | <a id="feature-turnrollback"></a>Passe o mouse sobre uma das suas mensagens e clique em **↶** (ao lado de Copiar). **Apenas o chat** remove essa mensagem e tudo o que vem depois dela (respostas, chamadas de ferramentas) do chat e do contexto do modelo, e coloca a mensagem de volta no editor de mensagens: altere-a e envie de novo. **Chat e arquivos** primeiro lista os arquivos do projeto que mudaram desde essa mensagem e depois também os deixa como estavam, incluindo as alterações feitas por comandos (`bash`), não só pelas ferramentas de edição do dsh. Um turno em execução é interrompido primeiro. O log do chat nunca é reescrito: um marcador oculto esconde a parte removida, do mesmo jeito que o `/compact` do próprio dsh esconde mensagens antigas. Quando o [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) está instalado, ele faz esse trabalho e o Composer Plus não mostra um segundo botão. Depois de uma reversão, uma barra **Refazer** aparece acima do editor de mensagens: ela inicia um novo chat a partir de logo antes da reversão (as mesmas mensagens e o mesmo contexto) e, com **Chat e arquivos**, traz os arquivos de volta. Um arquivo que você alterou depois da reversão aparece na lista e é mantido, a menos que você marque a caixa que o sobrescreve. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Captura de tela: Reverter turno"></a> |
44
44
  | **Excluir chat** | <a id="feature-deletechat"></a>Barra lateral → menu **…** de um chat (ou clique com o botão direito) → **Excluir…** → **Excluir**. O próprio dsh só consegue arquivar. O chat é interrompido (o turno, as tarefas em segundo plano, os subagentes e os lembretes, como no arquivamento do próprio dsh) e o histórico salvo, com os chats dos subagentes, vai para o Lixo do macOS (em outros sistemas: `$DSH_HOME/trash`). Para recuperá-lo, coloque a pasta de volta e reinicie o dsh: ele aparece na exibição **Somente arquivadas** da barra lateral. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Captura de tela: Excluir chat"></a> |
45
45
  | **Nome do projeto no compositor** | <a id="feature-projectname"></a>A linha abaixo do editor de mensagens (turnos, tokens, acertos de cache, contexto) começa com o nome do projeto do chat, para você sempre saber em qual projeto um chat trabalha. É o título de projeto do próprio dsh, ou o nome da pasta quando o projeto não tem título. Passe o mouse sobre ele para ver o caminho completo da pasta. Clique nele para encontrar o chat na barra lateral, na visualização em lista ou por projeto: a barra lateral e o projeto se abrem (inclusive um projeto recolhido e o **Mostrar mais N sessões** dele), a lista rola até o chat e o chat pisca por 5 segundos. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Captura de tela: Nome do projeto no compositor"></a> |
46
46
  | **Histórico de entrada** | <a id="feature-inputhistory"></a>Com o editor de mensagens vazio, pressione `↑` / `↓` para percorrer as mensagens que você enviou, como em um terminal. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Captura de tela: Histórico de entrada"></a> |
@@ -49,22 +49,25 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
49
49
  | **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> |
50
50
  | **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> |
51
51
  | **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> |
52
+ | **Editar mensagem na fila no lugar** | <a id="feature-queueedit"></a>Clique duas vezes em uma mensagem na fila. Ela vira a própria caixa de edição do dsh: altere o texto e pressione `Enter` para salvar ou `Esc` para cancelar. A mensagem mantém o lugar dela na fila. Mensagens com imagens ou arquivos não podem ser editadas assim (a fila do dsh só edita texto). | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Captura de tela: Editar mensagem na fila no lugar"></a> |
52
53
  | **Copiar link da sessão** | <a id="feature-copydeeplink"></a>Clique com o botão direito em um chat na barra lateral → **Copiar link da sessão**. Cole o link `dsh-session:…` em outro chat para anexar aquele chat como contexto somente leitura. O dsh 0.2.1 tem o próprio **Copiar ID da sessão**, que copia só o ID simples; este item aparece logo depois dele. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Captura de tela: Copiar link da sessão"></a> |
54
+ | **Copiar link da mensagem** | <a id="feature-copymessagelink"></a>Passe o mouse sobre uma mensagem e clique em **🔗** (na linha de ações dela; em uma resposta, ao lado do horário). O link é o link da sessão mais o número da mensagem: `dsh-session:…#42`. Cole-o em uma mensagem e envie: no dsh 0.2.1 e posteriores, o link aparece como um chip. Um clique abre aquele chat, rola até a mensagem e a destaca por 2 segundos. Como um link da sessão, ele também anexa aquele chat como contexto somente leitura. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="Captura de tela: Copiar link da mensagem"></a> |
53
55
  | **Exportar chat como Markdown** | <a id="feature-exportmarkdown"></a>Clique com o botão direito em um chat na barra lateral (ou abra o menu **…** dele) → **Exportar como Markdown…**. Uma caixa de diálogo mostra quantas mensagens o chat tem; **Copiar para a área de transferência** copia o chat como Markdown, e **Salvar arquivo .md** o salva como `<chat title>.md` pelo download do navegador (no dsh desktop: na sua pasta Downloads ou por uma caixa de diálogo de salvar, conforme a configuração do seu sistema). O arquivo tem o título do chat, o nome do projeto e a data e, depois, uma seção `## Você` ou `## Assistente` para cada mensagem. Os blocos de código ficam como estão; um bloco de código que uma mensagem deixa aberto é fechado. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Captura de tela: Exportar chat como Markdown"></a> |
54
56
  | **Copiar caminho do projeto** | <a id="feature-copyprojectpath"></a>Clique com o botão direito em um projeto na barra lateral → **Copiar caminho** copia o caminho completo da pasta dele. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Captura de tela: Copiar caminho do projeto"></a> |
55
57
  | **Busca de projetos em um novo chat** | <a id="feature-projectpicker"></a>Novo chat → o botão de projeto acima do editor de mensagens. Os projetos aparecem em ordem A–Z, com uma caixa **Buscar projetos** no topo. Digite parte de um nome (sem diferenciar maiúsculas, minúsculas e acentos) e pressione `Enter` para escolher o primeiro resultado. Quando nada corresponde, aparece **Nenhum projeto corresponde**. A ordem de projetos salva do dsh na barra lateral não muda. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Captura de tela: Busca de projetos em um novo chat"></a> |
56
58
  | **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> |
57
59
  | **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> |
58
60
  | **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> |
59
- | **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. Um chip no cabeçalho lista as autorizações 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> |
61
+ | **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> |
60
62
  | **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. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura de tela: Status do projeto"></a> |
63
+ | **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> |
61
64
  | **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> |
62
65
  | **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. 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> |
63
66
  | **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> |
64
67
  | **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> |
65
68
  | **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> |
66
69
  | **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> |
67
- | **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, 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. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura de tela: Conexão móvel (iPhone)"></a> |
70
+ | **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, 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> |
68
71
  | **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> |
69
72
 
70
73
  <!-- END GENERATED FEATURES -->
@@ -119,15 +122,15 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
119
122
  - **Continuar:** o endpoint local autenticado só retoma o último turno interrompido, rejeita pedidos antigos ou duplicados e mantém os hooks de aprovação existentes. Ele não envia uma nova mensagem do usuário.
120
123
  - **Retomar após reiniciar:** fica desativado até você ativar. A parte Host guarda só os IDs dos chats e os horários de início em `$DSH_HOME/storages/dsh-composer-plus/resume.json` (acesso só para o dono), e nada sai do seu computador. Ela só continua um chat quando o próprio log do dsh indica que foi o dsh (e não você) que interrompeu o último turno. As aprovações e a Revisão automática valem para o turno retomado, como de costume.
121
124
 
122
- - **Painel de alterações:** o git roda somente leitura no seu computador, na própria pasta do chat, pelo canal `/api` autenticado do dsh. Ele nunca faz commit, stage ou fetch, e só mostra caminhos que o próprio git listou.
125
+ - **Painel de alterações:** o git roda somente leitura no seu computador, na própria pasta do chat, pelo canal `/api` autenticado do dsh. Ele nunca faz commit, stage ou fetch, e só mostra caminhos que o próprio git listou. A árvore mostra os 300 commits mais recentes dos branches locais e remotos; ela nunca troca de branch (checkout). Em um repositório muito grande sem arquivo commit-graph, a árvore pode levar alguns segundos para abrir. **Este chat** lê o log do próprio chat para achar os arquivos que as ferramentas de arquivo dele gravaram e os compara com o snapshot de Reverter turno do chat em uma pasta temporária que é excluída na hora; ele não grava nada no seu repositório nem no armazenamento de snapshots.
123
126
  - **Ideias de recursos:** nada é executado até você clicar em **Sugerir recursos**. Então a parte Host lê só a própria pasta do chat (o navegador nunca envia um caminho): os nomes das entradas do nível superior, os primeiros 6 kB do README, do AGENTS.md e do manifesto (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) e `git log --oneline -15`, no máximo 16 kB no total. Ela ignora `.env*`, arquivos de chave e pastas como `node_modules`, e só lê arquivos comuns que ficam dentro da pasta: um symlink que aponta para fora da pasta, um FIFO ou um dispositivo é ignorado. Esse resumo vai para o modelo que o chat usa, pelas próprias configurações de provedor do dsh, como uma única solicitação; ele não é adicionado a nenhum chat. Nada no projeto é gravado. Uma ideia deslizada para a direita inicia um novo chat no modo de plano, então as aprovações e a revisão do plano valem como de costume. **Criar agora** inicia o chat sem o modo de plano: o modelo pode alterar arquivos na hora, com as aprovações de costume do chat e a Revisão automática. As ideias salvas para depois (título, resumo, motivo, esforço) ficam guardadas com o caminho da pasta do projeto em `storages/dsh-composer-plus/later.json`, dentro da pasta home do dsh (arquivo só para o dono); nada vai para o projeto. O histórico de ideias sugeridas (título, resumo, motivo, esforço, data, se foi iniciada) fica guardado da mesma forma em `storages/dsh-composer-plus/idea-history.json`, no máximo 200 por projeto (as mais antigas saem primeiro); os títulos dele vão para o modelo no próximo **Sugerir recursos** desse projeto.
124
127
  - **Pesquisa no conteúdo:** nenhum código novo pesquisa seus chats: o plugin só ativa o índice de mensagens do próprio dsh (SQLite FTS5, `dsh-session-query-sqlite`) e dá a ele um arquivo, `$DSH_HOME/cache/composer-plus/session-search.db` (arquivo e pasta só para o dono). O arquivo guarda o texto das suas mensagens e das mensagens do assistente, então é tão privado quanto os logs de chat em `$DSH_HOME/sessions`. Nada sai do seu computador. Ele é uma cópia que o dsh consegue refazer: você pode excluí-lo enquanto o dsh estiver fechado. A chave fica em `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
125
- - **Reverter turno:** antes de cada mensagem sua, o Host tira um snapshot git da pasta do chat em um armazenamento próprio, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (pasta só para o dono). Ele guarda cópias dos arquivos dessa pasta que o git enxerga (não os arquivos ignorados), então é tão privado quanto o projeto. Ele lê os objetos do seu repositório (sem copiar o que o git já tem) e nunca grava no index, no `HEAD`, nos branches, nas tags, no stash ou na configuração do seu repositório; a única mudança que o git faz ali é atualizar a data e hora dos arquivos de objeto que ele reaproveita (isso adia a limpeza deles pelo `git gc`). Uma reversão com arquivos só grava arquivos comuns dentro da pasta do chat; ela ignora symlinks, pipes e qualquer coisa fora da pasta. Nada sai do seu computador. Você pode excluir o armazenamento enquanto o dsh estiver fechado (aí a reversão só funciona para o chat, até haver novas mensagens). **Excluir chat** também exclui o armazenamento de um chat. A chave fica em `$DSH_HOME/storages/dsh-composer-plus/rollback.json`.
128
+ - **Reverter turno:** antes de cada mensagem sua, o Host tira um snapshot git da pasta do chat em um armazenamento próprio, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (pasta só para o dono). Ele guarda cópias dos arquivos dessa pasta que o git enxerga (não os arquivos ignorados), então é tão privado quanto o projeto. Ele lê os objetos do seu repositório (sem copiar o que o git já tem) e nunca grava no index, no `HEAD`, nos branches, nas tags, no stash ou na configuração do seu repositório; a única mudança que o git faz ali é atualizar a data e hora dos arquivos de objeto que ele reaproveita (isso adia a limpeza deles pelo `git gc`). Uma reversão com arquivos só grava arquivos comuns dentro da pasta do chat; ela ignora symlinks, pipes e qualquer coisa fora da pasta. Nada sai do seu computador. Você pode excluir o armazenamento enquanto o dsh estiver fechado (aí a reversão só funciona para o chat, até haver novas mensagens). **Excluir chat** também exclui o armazenamento de um chat. A chave fica em `$DSH_HOME/storages/dsh-composer-plus/rollback.json`. Uma reversão com arquivos também guarda os arquivos como estavam logo antes dela (`refs/r/…` no mesmo armazenamento), para **Refazer**; as reversões refeitas ficam listadas em `$DSH_HOME/storages/dsh-composer-plus/redone.json` (acesso só para o dono).
126
129
  - **Exportar chat como Markdown:** a parte Host lê só o próprio log do chat (as mesmas mensagens que o dsh mostra) e as entrega à página; ela não lê nenhum arquivo do projeto e não envia nada pela rede. O Markdown vai só para a sua área de transferência ou para o arquivo que você salva.
127
130
  - **Excluir chat:** move as pastas de log do próprio chat (`$DSH_HOME/sessions/<project>/<chat>`) para o Lixo. A pasta do projeto não é tocada.
128
- - **Permitir neste chat:** as autorizações ficam guardadas em `$DSH_HOME/storages/dsh-composer-plus/grants.json` (acesso só para o dono). Uma autorização cobre uma ferramenta exata em um chat. Se essa ferramenta pode gravar, a autorização também cobre qualquer gravação. Revogue-a pelo chip no cabeçalho.
131
+ - **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.
129
132
  - A Revisão automática continua sendo executada em toda chamada; falhas de revisão nunca são permitidas automaticamente.
130
- - **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. Dados: `$DSH_HOME/storages/dsh-composer-plus/mobile/`. Detalhes: [tether/README.md](tether/README.md).
133
+ - **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).
131
134
  - **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.
132
135
  - **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).
133
136
  - **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).
@@ -144,8 +147,9 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
144
147
  - **Não há botão ↶ nas minhas mensagens:** Reverter turno está desativado, o chat é um chat de subagente, ou o dsh-rewind-plugin está instalado (use o botão ↶ dele). Depois de uma atualização, reinicie o dsh.
145
148
  - **Chat e arquivos está acinzentado:** o projeto não é um repositório git, não há snapshot de antes daquela mensagem (a mensagem é mais antiga que o plugin, ou um dos 50 snapshots mais novos a substituiu), ou nenhum arquivo mudou.
146
149
  - **Excluir diz que outro dsh está com este chat aberto:** um segundo dsh no mesmo dsh home está com o bloqueio do chat. Feche essa janela ou esse dsh e exclua de novo. Enquanto isso, o chat continua arquivado.
150
+ - **Meu iPhone não consegue se conectar depois que ativei "Tailscale only":** o Tailscale precisa estar ativado no Mac e no iPhone. O painel da Conexão móvel avisa quando ele está desativado no Mac. O registro de acesso mostra cada tentativa recusada com o motivo.
147
151
  - **Um chat não continuou depois de reiniciar:** Retomar após reiniciar estava desativado quando o dsh fechou, você mesmo interrompeu aquele turno, o turno já tinha terminado (concluído ou com falha), o chat foi arquivado, ou mais de 20 chats estavam em execução (os 20 mais novos continuam).
148
- - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.12.0`); veja a nota de instalação acima.
152
+ - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.13.0`); veja a nota de instalação acima.
149
153
 
150
154
  ## Limites
151
155
 
@@ -161,9 +165,14 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
161
165
  - **Excluir chat** precisa do arquivamento do dsh (dsh 0.2.0 ou mais recente). Um chat (ou um dos chats de subagente dele) que não para em 15 s, ou que outro dsh está usando, continua arquivado, e nada é movido. Em sistemas que não são o macOS, a pasta de lixo precisa estar no mesmo disco que o histórico de chats. Um chat aberto que você exclui fica na memória do dsh, arquivado e oculto, até o dsh reiniciar. Esvazie o Lixo você mesmo; o dsh não faz isso.
162
166
  - 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.
163
167
  - 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.
168
+ - **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.
164
169
  - **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.
165
- - **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 app iOS ainda não está na App Store: compile-o a partir de `tether/ios` com o Xcode. 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.
166
- - Um link de sessão funciona dentro dos chats; clicar nele não abre o chat.
170
+ - **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 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.
171
+ - 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.
172
+ - **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.
173
+ - **Editar mensagem na fila no lugar** abre o editor de fila do próprio dsh, então tem os limites dele: uma mensagem com imagens ou arquivos não pode ser editada, e uma mensagem que começou a ser enviada nesse meio-tempo não é alterada (o dsh mostra o próprio erro).
174
+ - **Refazer** nunca altera o chat revertido: ele inicia um novo chat a partir de logo antes da reversão (a bifurcação do próprio dsh, o mesmo contexto do modelo), então o novo chat tem outro id e outro título. Só a reversão mais recente de um chat pode ser refeita, uma vez, e só enquanto nada veio depois dela (uma nova mensagem encerra a oferta). Um arquivo que você alterou depois da reversão é mantido, a menos que você marque a caixa que o sobrescreve. Refazer precisa do snapshot que a reversão guardou (a mesma janela de 50 entradas); uma reversão feita antes desta versão, ou com **Apenas o chat**, só traz de volta as mensagens.
175
+ - **Este chat** conta só os arquivos que as ferramentas de arquivo do dsh (`write`, `edit`, `str_replace_editor`) gravaram. Arquivos que um comando (`bash`) alterou não estão nesta visão; eles aparecem em **Não confirmadas**. Sem um snapshot de Reverter turno do chat (Reverter turno desativado, dsh-rewind-plugin instalado ou um chat mais antigo que o plugin), a visão compara com o último commit e avisa isso. Reverter turno guarda os 50 snapshots mais recentes de um chat: num chat mais longo, a visão compara com o mais antigo guardado, informa a partir de qual mensagem e não conta as alterações anteriores. **Ocultar alterações de espaço em branco** é `git diff -w`: uma linha que mudou só nos espaços dentro dela também fica oculta.
167
176
  - Uma notificação enviada antes de reiniciar só traz o dsh para a frente quando você clica nela.
168
177
  - 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.
169
178
  - 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. Use o filtro com **Workspace**: em **Árvore de workspaces**, uma pasta pai oculta também esconde os projetos ativos dentro dela. **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.
@@ -200,7 +209,21 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
200
209
 
201
210
  **Como reordeno as mensagens na fila do dsh?** Arraste a alça ⠿ de uma mensagem na fila, ou coloque o foco nela e pressione `↑` / `↓`.
202
211
 
203
- **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; revogue pelo chip no cabeçalho.
212
+ **Como corrijo um erro de digitação em uma mensagem na fila?** Dê um clique duplo na mensagem na fila, altere o texto e pressione `Enter` (`Esc` cancela). Ela mantém o lugar na fila.
213
+
214
+ **Como limpo de uma vez todos os pontos de não lido de um projeto?** Barra lateral → botão **…** do projeto → **Marcar tudo como lido**.
215
+
216
+ **Posso criar um link para uma única mensagem em um chat longo?** Sim: passe o mouse sobre a mensagem e clique em **🔗**. Envie o link em um chat: no dsh 0.2.1 ou mais recente, um clique nele abre o chat naquela mensagem.
217
+
218
+ **Reverti um turno por engano. Posso recuperá-lo?** Sim, com **Refazer** acima do editor de mensagens, logo depois da reversão: ele inicia um novo chat a partir de logo antes da reversão com as mesmas mensagens, e com **Chat e arquivos** também traz os arquivos de volta.
219
+
220
+ **Como vejo só os arquivos que um chat alterou?** Barra lateral direita → **Alterações** → **Este chat**. Clique em **␣** para ocultar alterações que são só espaço em branco.
221
+
222
+ **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**.
223
+
224
+ **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.
225
+
226
+ **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.
204
227
 
205
228
  **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.
206
229
 
package/README.ru.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Затем перезапустите dsh. (CLI не может устанавливать плагины в профиль настольного приложения: им управляет само приложение.)
31
31
 
32
- > pnpm в dsh пропускает версии, которые вышли меньше 24 часов назад. Сразу после выпуска укажите версию: `dsh-composer-plus@1.12.0`.
32
+ > pnpm в dsh пропускает версии, которые вышли меньше 24 часов назад. Сразу после выпуска укажите версию: `dsh-composer-plus@1.13.0`.
33
33
 
34
34
  ## Функции
35
35
 
@@ -37,10 +37,10 @@ dsh plugin --profile web add dsh-composer-plus
37
37
 
38
38
  | Функция | Как пользоваться | Снимок экрана |
39
39
  |---|---|---|
40
- | **Панель изменений** | <a id="feature-changespanel"></a>Правая боковая панель → `+` → **Изменения**. Выберите **Незафиксированные**, **Непроиндексированные**, **Проиндексированные** или **Ветка**: вы увидите изменённые файлы со счётчиками `+/-`. Нажмите на файл, чтобы открыть его diff. **Последний ход** открывает встроенный обзор dsh для последнего хода. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Снимок экрана: Панель изменений"></a> |
40
+ | **Панель изменений** | <a id="feature-changespanel"></a>Правая боковая панель → `+` → **Изменения**. Выберите **Незафиксированные**, **Непроиндексированные**, **Проиндексированные** или **Ветка**: вы увидите изменённые файлы со счётчиками `+/-`. Нажмите на файл, чтобы открыть его diff. **Последний ход** открывает встроенный обзор dsh для последнего хода. Нажмите на имя ветки (или выберите **Дерево**), чтобы увидеть дерево веток. Нажмите на ветку над ним, чтобы перейти к ней, или на коммит, чтобы увидеть его файлы и их diff. **Этот чат** показывает только файлы, которые записали файловые инструменты открытого чата (write, edit) во всех его ходах, и их общий diff с первого сообщения. Кнопка **␣** скрывает изменения пробелов (`git diff -w`): строки, в которых изменились только отступы или концы строк, не показываются. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Снимок экрана: Панель изменений"></a> |
41
41
  | **Идеи функций** | <a id="feature-featureideas"></a>Правая боковая панель → `+` → **Идеи функций** → **Предложить функции**. Модель чата читает краткую сводку проекта этого чата (файлы верхнего уровня, начало README и манифеста, последние 15 коммитов) и предлагает до 8 функций. Они появляются стопкой карточек на языке интерфейса dsh. Смахните карточку вправо (или нажмите **✓**, или клавишу `→`; в любом случае карточка улетает в свою сторону), чтобы начать новый чат в том же проекте. Чат начинается в режиме плана, а идея становится запросом, поэтому до одобрения плана ничего не меняется. Чтобы обойтись без плана, нажмите **▶ Создать сразу** (или клавишу `↑`; карточка улетает вверх): новый чат сразу начинается с идеей как обычным запросом, и модель вносит изменение и запускает свои проверки (одобрения действуют как обычно). Смахните влево (или **✕**, или `←`), чтобы пропустить карточку. **Отменить** (или `Z`) возвращает пропущенную карточку. Нажмите **↓** (или клавишу `↓`), чтобы отложить хорошую идею: она попадает в список проекта **На потом**. Этот список виден в каждом чате из той же папки проекта (и после перезапуска). **На потом (N)** открывает список. **Спланировать** начинает для идеи такой же чат в режиме плана, а **Создать сразу** — чат без плана; обе кнопки убирают её из списка. **Спланировать все (N)** начинает один чат в режиме плана для всех идей из списка, поэтому общие части планируются один раз. **Убрать из списка** удаляет её. **Копировать как чек-лист** копирует весь список в буфер обмена как чек-лист Markdown (`- [ ] Title — Summary`, по одной строке на идею) для трекера задач или файла TODO; сетевых запросов при этом нет. **Ещё идеи** добавляет карточки. Чтобы получить идеи только по одной области, введите короткую тему в поле **Тема** рядом с **Предложить функции** (не более 80 символов; `Enter` тоже запускает предложение) или нажмите одну из готовых тем под ним: **Производительность**, **Доступность**, **Тесты**, **Безопасность**, **Удобство** или **Документация** (повторное нажатие очищает тему). Тогда модель предлагает только функции по этой теме; пустое поле означает любые функции. В одном проекте идея не предлагается дважды: каждая предложенная идея (пропущенная, отложенная или начатая) попадает в список проекта **История**, модель получает указание больше не предлагать эти идеи, а идея с повторным заголовком отбрасывается. **История** показывает их с пометкой **Начата** или **Предложена**; **Забыть** (или **Забыть все**) позволяет идее появиться снова; идея, которая ещё есть в списке **На потом**, не попадает в предложения, пока вы не уберёте её оттуда. Модель запускается, только когда вы нажимаете кнопку. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Снимок экрана: Идеи функций"></a> |
42
42
  | **Поиск по содержимому** | <a id="feature-contentsearch"></a>Встроенный поиск dsh на боковой панели (лупа рядом с **Рабочие области**; `Cmd+K` в настольном приложении, `Cmd+Alt+K` в браузере) находит чаты не только по названию, но и по словам из ваших сообщений и ответов. Под чатом он показывает совпавший текст. Такой поиск в dsh уже есть, но выключен. Эта функция включает его и хранит поисковый индекс в файле на вашем компьютере. Индекс создаётся при первом поиске после запуска (около 15 с для 250 чатов, см. «Ограничения») и сохраняется для следующих запусков. Включено по умолчанию. Изменение действует после перезапуска dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Снимок экрана: Поиск по содержимому"></a> |
43
- | **Откат хода** | <a id="feature-turnrollback"></a>Наведите указатель на своё сообщение и нажмите **↶** (рядом с кнопкой «Копировать»). **Только чат** убирает это сообщение и всё, что было после него (ответы, вызовы инструментов), из чата и из контекста модели. Само сообщение возвращается в поле ввода: измените его и отправьте снова. **Чат и файлы** сначала показывает файлы проекта, которые изменились после этого сообщения, а затем возвращает и их в прежнее состояние. Это касается и изменений, сделанных командами (`bash`), а не только инструментами редактирования dsh. Если ход выполняется, он сначала останавливается. Журнал чата никогда не переписывается: отозванную часть прячет одна скрытая метка, так же как встроенная команда dsh `/compact` прячет старые сообщения. Если установлен [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin), эту работу делает он, и Composer Plus не показывает вторую кнопку. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Снимок экрана: Откат хода"></a> |
43
+ | **Откат хода** | <a id="feature-turnrollback"></a>Наведите указатель на своё сообщение и нажмите **↶** (рядом с кнопкой «Копировать»). **Только чат** убирает это сообщение и всё, что было после него (ответы, вызовы инструментов), из чата и из контекста модели. Само сообщение возвращается в поле ввода: измените его и отправьте снова. **Чат и файлы** сначала показывает файлы проекта, которые изменились после этого сообщения, а затем возвращает и их в прежнее состояние. Это касается и изменений, сделанных командами (`bash`), а не только инструментами редактирования dsh. Если ход выполняется, он сначала останавливается. Журнал чата никогда не переписывается: отозванную часть прячет одна скрытая метка, так же как встроенная команда dsh `/compact` прячет старые сообщения. Если установлен [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin), эту работу делает он, и Composer Plus не показывает вторую кнопку. После отката над полем ввода появляется панель **Повторить**. Она начинает новый чат с момента непосредственно перед откатом (те же сообщения и контекст), а в режиме **Чат и файлы** также возвращает файлы. Файл, который вы изменили после отката, попадает в список и сохраняется, если вы не отметите флажок, который его перезаписывает. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Снимок экрана: Откат хода"></a> |
44
44
  | **Удалить чат** | <a id="feature-deletechat"></a>Боковая панель → меню **…** чата (или правый щелчок) → **Удалить…** → **Удалить**. Сам dsh умеет только архивировать. Чат останавливается (его ход, задания, субагенты и расписания — так же, как при встроенной архивации dsh). Его сохранённая история вместе с чатами субагентов перемещается в Корзину macOS (в других системах — в `$DSH_HOME/trash`). Чтобы вернуть чат, верните папку на место и перезапустите dsh: чат появится в фильтре **Только архивные** на боковой панели. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Снимок экрана: Удалить чат"></a> |
45
45
  | **Название проекта в поле ввода** | <a id="feature-projectname"></a>Строка под полем ввода (ходы, токены, попадания в кеш, контекст) начинается с названия проекта чата. Так вы всегда видите, в каком проекте работает чат. Это встроенное название проекта в dsh или имя папки, если у проекта нет названия. Наведите на него указатель, чтобы увидеть полный путь к папке. Нажмите на него, чтобы найти чат на боковой панели, в виде списка или по проектам: открываются боковая панель и проект (в том числе свёрнутый проект и его **Показать ещё сеансов: N**), список прокручивается к чату, и чат мигает 5 секунд. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Снимок экрана: Название проекта в поле ввода"></a> |
46
46
  | **История ввода** | <a id="feature-inputhistory"></a>В пустом поле ввода нажимайте `↑` / `↓`, чтобы листать отправленные сообщения, как в терминале. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Снимок экрана: История ввода"></a> |
@@ -49,22 +49,25 @@ dsh plugin --profile web add dsh-composer-plus
49
49
  | **Продолжение в один клик** | <a id="feature-continuebutton"></a>После остановленного, завершившегося сбоем или оборванного хода в пустом поле ввода появляется **▶**. Один щелчок продолжает работу с текущего разговора. Ничего не нужно писать в поле ввода, и в чате не появляется новое сообщение. (Модель получает короткую скрытую заметку «продолжи с того места, где остановился», потому что некоторые провайдеры, например Claude, отклоняют запрос, который заканчивается ответом ассистента.) Сообщения в очереди остаются в ней: ▶ продолжает только остановленную задачу, а потом выполняется очередь. После завершённого хода остаётся обычная кнопка отправки. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Снимок экрана: Продолжение в один клик"></a> |
50
50
  | **Продолжать после перезапуска** | <a id="feature-resumeafterrestart"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. Если выйти из dsh (или он закроется), пока чат работает, этот чат сам продолжит работу, когда вы снова откроете dsh. Он получает ту же скрытую заметку, что и при продолжении в один клик. Если выполнялся раунд цели (`/goal`), цель продолжается со следующего раунда (при каждом запуске dsh приостанавливает цели, пока вы их не возобновите). Чаты, которые вы остановили, которые завершились или завершились сбоем, не продолжаются. В самом dsh такой настройки нет: он только помечает такой ход как прерванный. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Снимок экрана: Продолжать после перезапуска"></a> |
51
51
  | **Перетаскивание в очереди** | <a id="feature-queuereorder"></a>У сообщений в очереди появляется маркер (⠿). Перетащите его, чтобы изменить порядок, или переведите на него фокус и нажмите `↑` / `↓`. `Esc` отменяет перемещение. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Снимок экрана: Перетаскивание в очереди"></a> |
52
+ | **Правка сообщения в очереди на месте** | <a id="feature-queueedit"></a>Дважды щёлкните по сообщению в очереди. Оно превращается во встроенное поле редактирования dsh: измените текст и нажмите `Enter`, чтобы сохранить, или `Esc`, чтобы отменить. Сообщение остаётся на своём месте в очереди. Сообщения с изображениями или файлами так изменить нельзя (очередь dsh редактирует только текст). | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Снимок экрана: Правка сообщения в очереди на месте"></a> |
52
53
  | **Копировать ссылку на сеанс** | <a id="feature-copydeeplink"></a>Правый щелчок по чату на боковой панели → **Копировать ссылку на сеанс**. Вставьте ссылку `dsh-session:…` в другой чат, чтобы прикрепить этот чат как контекст только для чтения. В dsh 0.2.1 есть свой пункт **Копировать ID сеанса**, но он копирует только сам идентификатор. Пункт плагина стоит сразу после него. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Снимок экрана: Копировать ссылку на сеанс"></a> |
54
+ | **Копировать ссылку на сообщение** | <a id="feature-copymessagelink"></a>Наведите указатель на сообщение и нажмите **🔗** (в строке действий сообщения; у ответа — рядом со временем). Ссылка — это ссылка на сеанс плюс номер сообщения: `dsh-session:…#42`. Вставьте её в сообщение и отправьте. В dsh 0.2.1 и новее ссылка показывается как значок. Щелчок по нему открывает тот чат, прокручивает его до сообщения и подсвечивает сообщение на 2 секунды. Как и ссылка на сеанс, она также прикрепляет тот чат как контекст только для чтения. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="Снимок экрана: Копировать ссылку на сообщение"></a> |
53
55
  | **Экспорт чата в Markdown** | <a id="feature-exportmarkdown"></a>Правый щелчок по чату на боковой панели (или его меню **…**) → **Экспорт в Markdown…**. Диалог показывает, сколько сообщений в чате. **Копировать в буфер обмена** копирует чат как Markdown, а **Сохранить файл .md** сохраняет его как `<chat title>.md` через загрузку браузера (в настольном dsh — в папку «Загрузки» или через диалог сохранения, как настроено в системе). В файле есть название чата, название проекта и дата, а затем по одному разделу `## Вы` или `## Ассистент` на каждое сообщение. Блоки кода остаются как есть; блок кода, который сообщение оставило открытым, закрывается. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Снимок экрана: Экспорт чата в Markdown"></a> |
54
56
  | **Копировать путь проекта** | <a id="feature-copyprojectpath"></a>Правый щелчок по проекту на боковой панели → **Копировать путь** копирует полный путь к его папке. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Снимок экрана: Копировать путь проекта"></a> |
55
57
  | **Поиск проекта в новом чате** | <a id="feature-projectpicker"></a>Новый чат → кнопка проекта над полем ввода. Проекты показаны в порядке A–Z, а сверху есть поле **Поиск проектов**. Введите часть названия (регистр и диакритические знаки не важны) и нажмите `Enter`, чтобы выбрать первое совпадение. Если ничего не подходит, появляется **Нет подходящих проектов**. Сохранённый порядок проектов dsh на боковой панели не меняется. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Снимок экрана: Поиск проекта в новом чате"></a> |
56
58
  | **Предсказание следующего сообщения** | <a id="feature-nextprediction"></a>По умолчанию включено: выключить функцию можно в **Настройки → Composer Plus**. Когда агент завершает ход (не остановленный и не завершившийся сбоем), пустое поле ввода серым текстом показывает предположение о вашем следующем сообщении и подсказку **Tab — принять**. `Tab` вставляет текст в поле ввода, но не отправляет его. `Esc` скрывает предположение до конца этого хода. Ввод текста тоже скрывает его, а новый ход заменяет его новым. Меню **Модель** под переключателем показывает собственные модели dsh (тот же список, что и в меню моделей dsh). По умолчанию выбран пункт **По умолчанию в dsh**: он следует модели dsh по умолчанию. Каждый завершённый ход стоит один короткий вызов модели. В Tether предположение появляется над пустым полем ввода: коснитесь его, чтобы вставить текст в поле. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Снимок экрана: Предсказание следующего сообщения"></a> |
57
59
  | **Дополнение при вводе** | <a id="feature-typingcompletion"></a>По умолчанию выключено: включить функцию можно в **Настройки → Composer Plus**. Пока вы печатаете, серый текст сразу после курсора показывает, как может продолжиться ваше сообщение. `Tab` добавляет его в сообщение, но не отправляет. `Esc` скрывает его. Функция предлагает только ваши собственные следующие слова: никогда не ответ вам и без выдуманных текстов ошибок или имён. Если сообщение выглядит законченным или модель не уверена, ничего не появляется. Если вы набираете следующие буквы серого текста, он остаётся, без нового вызова модели. Под её переключателем есть своё меню **Модель**. Первый пункт, **Как у предсказания следующего сообщения**, использует модель **Предсказание следующего сообщения** (выбран по умолчанию). Выберите другую модель, чтобы у каждой функции была своя, например более быстрая модель для дополнений. Она делает один вызов модели при каждой паузе в наборе, поэтому расходует намного больше токенов, чем предсказание: выберите быструю и недорогую модель. Она не работает для слеш-команды, для сообщения со значком файла и когда курсор стоит не в конце. В Tether остаток текста появляется над полем, пока вы печатаете: коснитесь его, чтобы добавить. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Снимок экрана: Дополнение при вводе"></a> |
58
60
  | **Улучшить промпт** | <a id="feature-promptimprove"></a>Напишите черновой запрос, затем нажмите волшебную палочку (**Улучшить промпт**) рядом с меню моделей. Один вызов модели переписывает его в более понятный промпт: сначала цель, короткие пронумерованные шаги, если частей несколько, и проверка, которую нужно запустить. Функция читает этот чат (без сообщений, убранных откатом), README, AGENTS.md и манифест проекта, изменённые файлы и файлы, имена которых совпадают с вашими словами, и сохраняет ваш язык. Она никогда не выдумывает имена файлов. Новый текст заменяет ваш черновик, но не отправляется: прочитайте его, отредактируйте, затем нажмите `Enter`. `Cmd/Ctrl+Z` возвращает ваш текст за один шаг, как и кнопка (**Отменить улучшение**). Если вы печатаете, пока она работает, ваш новый текст остаётся. `Esc` или повторное нажатие отменяет. У неё есть своё меню **Модель** в настройках (по умолчанию: **Как модель чата**). Не работает для слеш-команд и для сообщения со значком файла. В Tether палочка находится рядом с полем. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Снимок экрана: Улучшить промпт"></a> |
59
- | **Разрешить для этого чата** | <a id="feature-allowforchat"></a>Когда автопроверка спрашивает вас, на карточке одобрения появляется кнопка **Разрешить для этого чата**. После этого тот же инструмент в том же чате разрешён с любыми аргументами. Значок в заголовке показывает список разрешений и позволяет их отозвать. Разрешения сохраняются после перезапуска. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Снимок экрана: Разрешить для этого чата"></a> |
61
+ | **Разрешить для этого чата** | <a id="feature-allowforchat"></a>Когда автопроверка спрашивает вас, на карточке одобрения появляется кнопка **Разрешить для этого чата**. После этого тот же инструмент в том же чате разрешён с любыми аргументами, пока не истечёт лимит времени (по умолчанию 1 час; выберите его в **Настройки → Composer Plus → Разрешить для этого чата**). Затем агент снова спрашивает. Значок в заголовке показывает список разрешений со временем их окончания и позволяет их отозвать. Разрешения сохраняются после перезапуска. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Снимок экрана: Разрешить для этого чата"></a> |
60
62
  | **Статус проекта** | <a id="feature-projectstatus"></a>Строка проекта на боковой панели показывает ту же метку, что и его чаты: индикатор выполнения, ожидание или «готово». Поэтому даже свёрнутый проект сообщает, что чат внутри работает или ждёт вас. Сначала показывается чат, который ждёт вас, затем завершённый чат, который вы ещё не открыли (зелёная точка, даже пока другой чат ещё выполняется), затем индикатор выполнения. Наведите на метку указатель, чтобы увидеть подробности. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Снимок экрана: Статус проекта"></a> |
63
+ | **Отметить все как прочитанные** | <a id="feature-markprojectread"></a>На боковой панели нажмите кнопку **…** проекта → **Отметить все как прочитанные**. У всех чатов этого проекта сразу пропадает зелёная точка непрочитанного. У других проектов точки остаются. Если в проекте нет непрочитанных чатов, пункт показан серым (**Нет непрочитанных чатов**). | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Снимок экрана: Отметить все как прочитанные"></a> |
61
64
  | **Активные проекты сверху** | <a id="feature-activeprojectsfirst"></a>Когда чат начинает работать или ждёт вас, его проект перемещается в начало боковой панели со встроенной анимацией строк dsh (так же, как при перетаскивании). Завершённые проекты остаются на месте; их можно перетаскивать как обычно. Перемещения сохраняются в порядке проектов dsh, поэтому при отключении функции текущий порядок остаётся. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Снимок экрана: Активные проекты сверху"></a> |
62
65
  | **Фильтр недавних проектов** | <a id="feature-recentprojects"></a>Боковая панель → параметры просмотра (значок с ползунками) → **Активные за последние 2 часа**. Пока этот пункт выбран, боковая панель показывает только проекты с чатом, активным за последние 2 часа. Это чат, обновлённый за это время, выполняющийся или ожидающий чат, открытый чат или завершённый чат, который вы ещё не открыли (зелёная точка dsh «готово»), — такой чат оставляет проект на виду и после 2 часов. Проекты без такого чата скрыты, в том числе новые и пустые. Выберите пункт ещё раз, чтобы показать все проекты. Выбор сохраняется на этом устройстве. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Снимок экрана: Фильтр недавних проектов"></a> |
63
66
  | **Свернуть все проекты** | <a id="feature-collapseprojects"></a>Пока на боковой панели открыт хотя бы один проект, рядом с параметрами просмотра (значок с ползунками) есть кнопка. Нажмите её, чтобы сразу закрыть все открытые проекты, например 3 открытых из 5. Когда открытых проектов нет, кнопка снова скрывается. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Снимок экрана: Свернуть все проекты"></a> |
64
67
  | **Сортировка по состоянию** | <a id="feature-statusorder"></a>Боковая панель → параметры просмотра → **Сортировать** → **По состоянию** (вместе с **Одним списком**). Сначала идут завершённые чаты (с точкой dsh «готово»; её получает и ход, который закончился ошибкой), затем выполняющиеся или ожидающие чаты, затем чаты с активной автоматизацией (расписанием), затем остальные в порядке dsh. Когда вы открываете завершённый чат, он опускается ниже. Меняется только вид: чтобы вернуться, выберите **Вручную** или **По дате изменения**. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Снимок экрана: Сортировка по состоянию"></a> |
65
68
  | **Фоновые уведомления** | <a id="feature-notifications"></a>Пока dsh работает в фоне, вы получаете уведомление, когда ход завершён (первая строка ответа) или когда чат действительно ждёт вас: одобрения (имя инструмента), ответа (сам вопрос) или проверки плана. Запрос должен оставаться открытым и через 1,5 с. Поэтому одобрения, на которые ответили автоматически (разрешения автопроверки, другие плагины), не вызывают уведомлений. Уведомление убирается, как только на его запрос ответили. Значок в Dock или на панели задач показывает число ожидающих чатов. Щелчок по уведомлению открывает этот чат. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Снимок экрана: Фоновые уведомления"></a> |
66
69
  | **Язык приложения** | <a id="feature-language"></a>Настройки → Composer Plus → **Язык приложения** переключает весь интерфейс dsh на Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt или हिन्दी (см. ниже). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Снимок экрана: Язык приложения"></a> |
67
- | **Мобильное подключение (iPhone)** | <a id="feature-mobileconnect"></a>Работайте с dsh на iPhone через приложение [Tether](tether/) в той же сети Wi-Fi или через [Tailscale](https://tailscale.com). Включите функцию в **Настройки → Composer Plus** (по умолчанию она выключена, потому что открывает сетевой порт на этом Mac). Затем нажмите **Мобильное подключение** внизу слева на боковой панели, отсканируйте QR-код камерой iPhone (коснитесь **Open in Tether**) или кнопкой **Scan code** в Tether, коснитесь **Connect** и нажмите **Approve**. Сначала установите Tether: без него камера не сможет открыть код. Телефон показывает ваши чаты, отправляет сообщения, отвечает на запросы одобрения и вопросы, переключает модели и агентов. Можно связать сколько угодно Mac: имя Mac вверху слева в приложении переключает между ними. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Снимок экрана: Мобильное подключение (iPhone)"></a> |
70
+ | **Мобильное подключение (iPhone)** | <a id="feature-mobileconnect"></a>Работайте с dsh на iPhone через приложение [Tether](tether/) в той же сети Wi-Fi или через [Tailscale](https://tailscale.com). Включите функцию в **Настройки → Composer Plus** (по умолчанию она выключена, потому что открывает сетевой порт на этом Mac). Затем нажмите **Мобильное подключение** внизу слева на боковой панели, отсканируйте QR-код камерой iPhone (коснитесь **Open in Tether**) или кнопкой **Scan code** в Tether, коснитесь **Connect** и нажмите **Approve**. Сначала установите Tether: без него камера не сможет открыть код. Телефон показывает ваши чаты, отправляет сообщения, отвечает на запросы одобрения и вопросы, переключает модели и агентов. Можно связать сколько угодно Mac: имя Mac вверху слева в приложении переключает между ними. Панель **Мобильное подключение** показывает связанные iPhone и время их последнего подключения: **Remove** сразу отключает любой из них. «Tailscale only» отклоняет подключения из локальной сети (для общей сети Wi-Fi), а журнал доступа показывает, кто пытался подключиться. В Tether «Settings → Privacy» блокирует приложение с помощью Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Снимок экрана: Мобильное подключение (iPhone)"></a> |
68
71
  | **Автоматические обновления** | <a id="feature-autoupdate"></a>При запуске dsh плагин проверяет [последний выпуск на GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Если он новее и уже есть в npm, плагин устанавливает именно эту версию через встроенный менеджер плагинов dsh (тем же путём, что и Настройки → Плагины) и уведомляет вас. Перезапустите dsh, чтобы загрузить её. **Настройки → Composer Plus → Обновления Composer Plus** показывает версию и кнопки **Проверить обновления** / **Обновить сейчас**. При первом запуске dsh с новой версией окно **Что нового в Composer Plus N** один раз показывает примечания к этой версии (из той же проверки обновлений, без нового сетевого запроса); **Закрыть** или `Esc` закрывает его. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Снимок экрана: Автоматические обновления"></a> |
69
72
 
70
73
  <!-- END GENERATED FEATURES -->
@@ -119,15 +122,15 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
119
122
  - **Продолжить:** аутентифицированная локальная конечная точка возобновляет только последний прерванный ход, отклоняет устаревшие и повторные запросы и сохраняет существующие хуки одобрения. Новое сообщение пользователя она не отправляет.
120
123
  - **Продолжать после перезапуска:** выключено, пока вы его не включите. Host-часть хранит только ID чатов и время их запуска в `$DSH_HOME/storages/dsh-composer-plus/resume.json` (доступ только для владельца), и ничего не покидает ваш компьютер. Чат продолжается, только если собственный журнал dsh показывает, что последний ход остановил dsh, а не вы. Одобрения и автопроверка действуют для продолженного хода как обычно.
121
124
 
122
- - **Панель изменений:** git работает только на чтение на вашем компьютере, в папке самого чата, через аутентифицированный канал dsh `/api`. Он никогда не выполняет commit, stage или fetch и показывает только пути, которые перечислил сам git.
125
+ - **Панель изменений:** git работает только на чтение на вашем компьютере, в папке самого чата, через аутентифицированный канал dsh `/api`. Он никогда не выполняет commit, stage или fetch и показывает только пути, которые перечислил сам git. Дерево показывает последние 300 коммитов локальных и удалённых веток и никогда не переключает ветку (checkout). В очень большом репозитории без файла commit-graph дерево может открываться несколько секунд. **Этот чат** читает собственный журнал чата, чтобы найти файлы, которые записали его файловые инструменты, и сравнивает их со снимком отката хода этого чата во временной папке, которая сразу удаляется; он ничего не записывает ни в ваш репозиторий, ни в хранилище снимков.
123
126
  - **Идеи функций:** ничего не запускается, пока вы не нажмёте **Предложить функции**. Затем Host-часть читает только папку самого чата (браузер никогда не отправляет путь): имена записей верхнего уровня, первые 6 КБ файлов README, AGENTS.md и манифеста (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) и `git log --oneline -15`, всего не более 16 КБ. Она пропускает `.env*`, файлы ключей и папки вроде `node_modules` и читает только обычные файлы внутри папки: символическая ссылка за пределы папки, FIFO или устройство пропускаются. Эта сводка уходит одним запросом к модели, которую использует чат, через настройки провайдера самого dsh. Она не добавляется ни в один чат. В проекте ничего не записывается. Идея, смахнутая вправо, начинает новый чат в режиме плана, поэтому одобрения и проверка плана действуют как обычно. **Создать сразу** начинает чат без режима плана: модель может сразу менять файлы, с обычными одобрениями чата и автопроверкой. Идеи, отложенные на потом (заголовок, описание, обоснование, объём работы), хранятся вместе с путём к папке проекта в `storages/dsh-composer-plus/later.json` в домашней папке dsh (файл доступен только владельцу); в проект ничего не попадает. История предложенных идей (заголовок, описание, обоснование, объём работы, дата, начата ли идея) хранится так же, в `storages/dsh-composer-plus/idea-history.json`, не более 200 на проект (первыми удаляются самые старые); её заголовки уходят модели при следующем нажатии **Предложить функции** в этом проекте.
124
127
  - **Поиск по содержимому:** никакой новый код не ищет по вашим чатам. Плагин только включает встроенный индекс сообщений dsh (SQLite FTS5, `dsh-session-query-sqlite`) и даёт ему файл `$DSH_HOME/cache/composer-plus/session-search.db` (файл и папка доступны только владельцу). В файле хранится текст ваших сообщений и сообщений ассистента, поэтому он так же конфиденциален, как журналы чатов в `$DSH_HOME/sessions`. Ничего не покидает ваш компьютер. Это копия, которую dsh может создать заново: её можно удалить, пока dsh закрыт. Переключатель хранится в `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
125
- - **Откат хода:** перед каждым вашим сообщением Host делает git-снимок папки чата в собственном хранилище `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (папка доступна только владельцу). В нём хранятся копии тех файлов этой папки, которые видит git (кроме игнорируемых), поэтому оно так же конфиденциально, как сам проект. Хранилище читает объекты вашего репозитория (то, что уже есть в git, не копируется) и никогда не записывает индекс, `HEAD`, ветки, теги, stash или конфигурацию вашего репозитория. Единственное, что git там меняет, — более новая отметка времени у файлов объектов, которые он использует повторно (из-за этого `git gc` удаляет их позже). Откат с файлами записывает только обычные файлы внутри папки чата; символические ссылки, каналы (pipes) и всё за пределами папки он пропускает. Ничего не покидает ваш компьютер. Хранилище можно удалить, пока dsh закрыт (тогда откат работает только для чата, пока не появятся новые сообщения). **Удалить чат** удаляет и хранилище чата. Переключатель хранится в `$DSH_HOME/storages/dsh-composer-plus/rollback.json`.
128
+ - **Откат хода:** перед каждым вашим сообщением Host делает git-снимок папки чата в собственном хранилище `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (папка доступна только владельцу). В нём хранятся копии тех файлов этой папки, которые видит git (кроме игнорируемых), поэтому оно так же конфиденциально, как сам проект. Хранилище читает объекты вашего репозитория (то, что уже есть в git, не копируется) и никогда не записывает индекс, `HEAD`, ветки, теги, stash или конфигурацию вашего репозитория. Единственное, что git там меняет, — более новая отметка времени у файлов объектов, которые он использует повторно (из-за этого `git gc` удаляет их позже). Откат с файлами записывает только обычные файлы внутри папки чата; символические ссылки, каналы (pipes) и всё за пределами папки он пропускает. Ничего не покидает ваш компьютер. Хранилище можно удалить, пока dsh закрыт (тогда откат работает только для чата, пока не появятся новые сообщения). **Удалить чат** удаляет и хранилище чата. Переключатель хранится в `$DSH_HOME/storages/dsh-composer-plus/rollback.json`. Откат с файлами также сохраняет файлы в том виде, в каком они были непосредственно перед ним (`refs/r/…` в том же хранилище), для кнопки **Повторить**; повторённые откаты перечислены в `$DSH_HOME/storages/dsh-composer-plus/redone.json` (доступ только для владельца).
126
129
  - **Экспорт чата в Markdown:** Host-часть читает только журнал самого чата (те же сообщения, которые показывает dsh) и передаёт их странице; она не читает файлы проекта и ничего не отправляет по сети. Markdown попадает только в ваш буфер обмена или в файл, который вы сохраняете.
127
130
  - **Удалить чат:** перемещает в Корзину только папки журнала самого чата (`$DSH_HOME/sessions/<project>/<chat>`). Папку проекта функция не трогает.
128
- - **Разрешить для этого чата:** разрешения хранятся в `$DSH_HOME/storages/dsh-composer-plus/grants.json` (доступ только для владельца). Разрешение действует для одного конкретного инструмента в одном чате. Если этот инструмент может выполнять запись, разрешение покрывает и любую запись. Отозвать его можно через значок в заголовке.
131
+ - **Разрешить для этого чата:** разрешения хранятся вместе со временем выдачи в `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (доступ только для владельца). Разрешение действует для одного конкретного инструмента в одном чате, пока не истечёт лимит времени (по умолчанию 1 час). Если этот инструмент может выполнять запись, разрешение покрывает и любую запись. Отозвать его можно через значок в заголовке.
129
132
  - Автопроверка по-прежнему выполняется при каждом вызове. Если проверка завершилась сбоем, вызов никогда не разрешается автоматически.
130
- - **Мобильное подключение:** выключено, пока вы его не включите. Когда оно включено, Host-часть запускает шлюз Tether: HTTPS на порту 19390, который принимает подключения только из вашей подсети Wi-Fi и вашего tailnet (100.64.0.0/10), и страницу сопряжения на `127.0.0.1:19391` (только для этого Mac). Телефону нужен одноразовый код из QR-кода (действует 5 минут) и ваше подтверждение **Approve** на Mac. Телефон закрепляет сертификат шлюза. Mac хранит только хеш токена каждого телефона (30 дней, срок продлевается при использовании); **Remove** сразу закрывает подключения этого телефона. Телефоны могут вызывать только разрешённый список методов dsh (чаты, запросы, вложения, слеш-команды, одобрения, вопросы, модели, агенты, цели), но не настройки, учётные данные, обозреватель файлов или терминал. Данные: `$DSH_HOME/storages/dsh-composer-plus/mobile/`. Подробности: [tether/README.md](tether/README.md).
133
+ - **Мобильное подключение:** выключено, пока вы его не включите. Когда оно включено, Host-часть запускает шлюз Tether: HTTPS на порту 19390, который принимает подключения только из вашей подсети Wi-Fi и вашего tailnet (100.64.0.0/10), и страницу сопряжения на `127.0.0.1:19391` (только для этого Mac). Телефону нужен одноразовый код из QR-кода (действует 5 минут) и ваше подтверждение **Approve** на Mac. Телефон закрепляет сертификат шлюза. Mac хранит только хеш токена каждого телефона (30 дней, срок продлевается при использовании); **Remove** сразу закрывает подключения этого телефона. Телефоны могут вызывать только разрешённый список методов dsh (чаты, запросы, вложения, слеш-команды, одобрения, вопросы, модели, агенты, цели), но не настройки, учётные данные, обозреватель файлов или терминал. «Tailscale only» отклоняет любое подключение из локальной сети, в том числе уже открытые. Журнал доступа хранит 200 самых новых попыток подключения (время, IP-адрес, имя устройства, разрешено или отклонено и причина) в `access.json`; токенов и кодов сопряжения в нём никогда нет. Данные: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (файлы доступны только владельцу). Подробности: [tether/README.md](tether/README.md).
131
134
  - **Обновления:** Host-часть запрашивает у `api.github.com` последний выпуск, а у `registry.npmjs.org` — именно эту версию. Никакие данные о вас или ваших чатах не отправляются. Установка идёт через менеджер плагинов dsh (`pnpm add dsh-composer-plus@<version>`; если dsh 0.2.1 отклоняет её для уже установленного плагина, то `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, и тогда профиль указывает этот URL как источник плагина), поэтому действуют встроенные проверки dsh: реестр, скрипты и совместимость версий. Предварительные выпуски и более старые версии никогда не устанавливаются.
132
135
  - **Предсказание следующего сообщения:** по умолчанию включено. Чтобы остановить эти вызовы модели, выключите его в **Настройки → Composer Plus**. После каждого завершённого хода Host-часть отправляет ваши собственные сообщения в чате и текстовые ответы агента (без вывода инструментов, скрытого контекста и рассуждений), не более примерно 6 000 символов (самую новую часть), выбранной модели (по умолчанию это модель dsh, если вы не выберете другую). Это один запрос через настройки провайдера самого dsh. В чате ничего не сохраняется: предположение не попадает в историю чата. Переключатель и выбранная модель хранятся в `$DSH_HOME/storages/dsh-composer-plus/predict.json` (файл доступен только владельцу).
133
136
  - **Дополнение при вводе:** выключено, пока вы его не включите. Когда оно включено, при каждой паузе в наборе Host-часть отправляет уже набранный текст, а также ваши собственные сообщения в чате и текстовые ответы агента (без вывода инструментов, скрытого контекста и рассуждений), не более примерно 3 000 символов чата, модели, выбранной для **Дополнение при вводе** (по умолчанию это модель **Предсказание следующего сообщения**). Новая пауза останавливает предыдущий запрос. В чате ничего не сохраняется. Переключатель хранится в `$DSH_HOME/storages/dsh-composer-plus/complete.json` (файл доступен только владельцу).
@@ -144,8 +147,9 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
144
147
  - **На моих сообщениях нет кнопки ↶:** откат хода выключен, это чат субагента, или установлен dsh-rewind-plugin (пользуйтесь его кнопкой ↶). После обновления перезапустите dsh.
145
148
  - **Пункт «Чат и файлы» недоступен (серый):** проект не является репозиторием git, нет снимка до этого сообщения (сообщение старше плагина, или его снимок вытеснили 50 более новых), или ни один файл не изменился.
146
149
  - **При удалении появляется сообщение, что этот чат открыт в другом dsh:** второй dsh с той же домашней папкой dsh удерживает блокировку чата. Закройте это окно или dsh и удалите чат снова. До этого чат остаётся в архиве.
150
+ - **iPhone не подключается после включения «Tailscale only»:** Tailscale должен быть включён и на Mac, и на iPhone. Панель «Мобильное подключение» предупреждает, если на Mac он выключен. Журнал доступа показывает каждую отклонённую попытку и её причину.
147
151
  - **Чат не продолжился после перезапуска:** функция «Продолжать после перезапуска» была выключена, когда dsh завершил работу; вы сами остановили этот ход; ход уже закончился (готово или сбой); чат был в архиве; или работало больше 20 чатов (продолжаются 20 самых новых).
148
- - **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.12.0`), см. примечание об установке выше.
152
+ - **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.13.0`), см. примечание об установке выше.
149
153
 
150
154
  ## Ограничения
151
155
 
@@ -161,9 +165,14 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
161
165
  - **Удалить чат** требует архивации dsh (dsh 0.2.0 и новее). Если чат (или один из чатов его субагентов) не останавливается за 15 с или его удерживает другой dsh, он остаётся в архиве, и ничего не перемещается. В системах, отличных от macOS, папка корзины должна быть на том же диске, что и история чатов. Открытый чат, который вы удалили, остаётся в памяти dsh (в архиве и скрытым) до перезапуска dsh. Очищайте Корзину сами: dsh этого не делает.
162
166
  - В очереди dsh нет действия `move`, поэтому Host-часть плагина перемещает само сообщение в очереди dsh (одно изменение, то же самое сообщение). Сообщения с изображениями или файлами тоже перемещаются. Перемещаются только ваши собственные сообщения: раунд цели или ответ на вопрос в очереди остаётся на своём месте. Если сообщение начинает отправляться, пока вы перетаскиваете, ничего не перемещается, и об этом сообщает уведомление.
163
167
  - dsh 0.2.1 загружает обновление сразу, если новая версия не меняет никаких настроек dsh; в остальных случаях, а также в dsh 0.2.0, перезапустите dsh, чтобы загрузить его. Плагин никогда не перезапускает dsh за вас. Профили Web/CLI без менеджера плагинов dsh только сообщают о новой версии.
168
+ - **Разрешить для этого чата** отсчитывает лимит времени с момента выдачи разрешения. Новый лимит времени сразу применяется к действующим разрешениям, поэтому более короткий лимит может сразу их завершить. У разрешений из версии 1.12 и более ранних нет времени: после обновления агент ещё раз спросит об этих инструментах.
164
169
  - **Сохранять фокус в поле ввода** возвращает фокус только после команды `/` или навыка. Пока dsh обрабатывает команду, поле ввода несколько миллисекунд доступно только для чтения, поэтому клавиши, нажатые в это время, теряются. Если меню `/` в dsh ещё открыто, `Enter` выбирает выделенную строку и ничего не отправляет.
165
- - **Мобильное подключение** работает только в macOS (оно использует `en0`, `openssl`, `swift` и `dns-sd`). Оно использует фиксированные порты 19390 и 19391, поэтому на каждом Mac его может одновременно запускать только один dsh (каждый Mac — одна запись в списке Mac на телефоне). Телефон получает уведомления, только пока Tether открыт или только что ушёл в фон (сервиса push-уведомлений нет). Приложения для iOS пока нет в App Store: соберите его из `tether/ios` в Xcode. Зелёные точки в Tether следуют за Mac: у чата, который вы открыли в dsh, точка пропадает и на телефоне. У чата, который вы открыли в Tether, точка пропадает только на телефонах. Собственная точка dsh на Mac остаётся, пока вы не откроете чат на Mac.
166
- - Ссылка на сеанс работает внутри чатов; щелчок по ней не открывает чат.
170
+ - **Мобильное подключение** работает только в macOS (оно использует `en0`, `openssl`, `swift` и `dns-sd`). Оно использует фиксированные порты 19390 и 19391, поэтому на каждом Mac его может одновременно запускать только один dsh (каждый Mac — одна запись в списке Mac на телефоне). Телефон получает уведомления, только пока Tether открыт или только что ушёл в фон (сервиса push-уведомлений нет). Приложения для iOS пока нет в App Store: соберите его из `tether/ios` в Xcode. «Tailscale only» всё равно требует адрес Wi-Fi или Ethernet на Mac (шлюз запускается только при таком адресе). Журнал доступа у каждого Mac свой и хранит только 200 самых новых попыток; повторная попытка в течение минуты увеличивает счётчик той же строки на один. Блокировка приложения Tether не скрывает превью уведомлений на экране блокировки iPhone: выключите их в настройках iOS. Зелёные точки в Tether следуют за Mac: у чата, который вы открыли в dsh, точка пропадает и на телефоне. У чата, который вы открыли в Tether, точка пропадает только на телефонах. Собственная точка dsh на Mac остаётся, пока вы не откроете чат на Mac.
171
+ - Ссылка на сеанс работает внутри чатов; щелчок по ней не открывает чат. Ссылка, созданная через **Копировать ссылку на сообщение**, открывает своё сообщение только в dsh 0.2.1 и новее и только из сообщения в чате (в dsh 0.2.0 нет правил для пользовательского текста, поэтому там ссылка копируется, но показывается как обычный текст). Сообщение, которое убрал откат или которое сжатие удалило из истории, загружаемой dsh, показать нельзя: ссылка тогда сообщает об этом. Кнопки 🔗 привязаны к строкам сообщений dsh; если обновление dsh изменит эту разметку, они не появятся.
172
+ - **Отметить все как прочитанные** меняет собственные точки непрочитанного dsh через часть dsh, которая не является публичным API (список `completionUnread` в состоянии сеансов dsh). Если обновление dsh переименует его, пункт не появится. Пункт добавляется в меню «…» проекта в dsh, где нет места для плагинов; если dsh изменит это меню, пункт тоже не появится.
173
+ - **Правка сообщения в очереди на месте** открывает встроенный редактор очереди dsh, поэтому у неё те же ограничения: сообщение с изображениями или файлами изменить нельзя, а сообщение, которое тем временем начало отправляться, не меняется (dsh показывает свою ошибку).
174
+ - **Повторить** никогда не меняет откаченный чат: кнопка начинает новый чат с момента непосредственно перед откатом (встроенное ответвление dsh, тот же контекст модели), поэтому у нового чата новый id и новое название. Повторить можно только самый новый откат чата, один раз и только пока после него ничего не было (новое сообщение убирает эту возможность). Файл, который вы изменили после отката, сохраняется, если вы не отметите флажок, который его перезаписывает. Для повтора нужен снимок, который сохранил откат (то же окно из 50 записей); откат, сделанный до этой версии или с вариантом **Только чат**, возвращает только сообщения.
175
+ - **Этот чат** учитывает только файлы, которые записали файловые инструменты dsh (`write`, `edit`, `str_replace_editor`). Файлов, которые изменила команда (`bash`), в этом представлении нет; они показаны в разделе **Незафиксированные**. Без снимка отката хода для чата (откат хода выключен, установлен dsh-rewind-plugin или чат старше плагина) представление сравнивает с последним коммитом и сообщает об этом. Откат хода хранит 50 последних снимков чата: в более длинном чате представление сравнивает с самым старым сохранённым снимком, сообщает, с какого сообщения, и не учитывает более ранние изменения. **Скрыть изменения пробелов** — это `git diff -w`: строка, в которой изменились только пробелы внутри неё, тоже скрывается.
167
176
  - Уведомление, отправленное до перезапуска, при щелчке только выводит dsh на передний план.
168
177
  - Активные проекты перемещаются через сохранённый порядок проектов dsh, поэтому новый порядок сохраняется после перезапуска. Чаты вне проектов («Без группы») перемещать нельзя; dsh всегда показывает их последними.
169
178
  - В меню параметров просмотра на боковой панели у dsh нет точки расширения, поэтому пункт фильтра недавних проектов добавляется во встроенное меню dsh. Если обновление dsh изменит это меню, пункт не появится, и все проекты останутся видны. Фильтр работает со строками проектов, поэтому режим **Одним списком** не фильтруется. Используйте фильтр с **По рабочей области**: в режиме **Дерево рабочих областей** скрытая родительская папка скрывает и активные проекты внутри неё. У **По состоянию** ограничение того же рода: в dsh нет места для своего порядка сортировки, поэтому пункт и порядок строк привязаны к разметке меню и списка dsh.
@@ -200,7 +209,21 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
200
209
 
201
210
  **Как изменить порядок сообщений в очереди dsh?** Перетащите маркер ⠿ на сообщении в очереди или переведите на него фокус и нажмите `↑` / `↓`.
202
211
 
203
- **Как сделать, чтобы автопроверка не спрашивала об одном и том же инструменте в одном чате?** Нажмите **Разрешить для этого чата** на карточке одобрения. Разрешение действует только для этого инструмента в этом чате; отозвать его можно через значок в заголовке.
212
+ **Как исправить опечатку в сообщении в очереди?** Дважды щёлкните сообщение в очереди, измените текст и нажмите `Enter` (`Esc` отменяет). Сообщение остаётся на своём месте в очереди.
213
+
214
+ **Как сразу убрать все точки непрочитанного в проекте?** Боковая панель → кнопка **…** проекта → **Отметить все как прочитанные**.
215
+
216
+ **Можно ли дать ссылку на одно сообщение в длинном чате?** Да: наведите указатель на сообщение и нажмите **🔗**. Отправьте ссылку в чате: в dsh 0.2.1 и новее щелчок по ней открывает чат на этом сообщении.
217
+
218
+ **Я откатил ход по ошибке. Можно его вернуть?** Да, кнопкой **Повторить** над полем ввода сразу после отката: она начинает новый чат с момента непосредственно перед откатом с теми же сообщениями, а после отката с вариантом **Чат и файлы** возвращает и файлы.
219
+
220
+ **Как увидеть только файлы, которые изменил один чат?** Правая боковая панель → **Изменения** → **Этот чат**. Нажмите **␣**, чтобы скрыть изменения, которые состоят только из пробелов.
221
+
222
+ **Как сделать, чтобы автопроверка не спрашивала об одном и том же инструменте в одном чате?** Нажмите **Разрешить для этого чата** на карточке одобрения. Разрешение действует только для этого инструмента в этом чате, по умолчанию 1 час; отозвать его можно через значок в заголовке. Изменить время можно в **Настройки → Composer Plus → Разрешить для этого чата**.
223
+
224
+ **Я потерял iPhone. Как не дать ему подключаться к моему Mac?** Нажмите **Мобильное подключение** внизу слева на боковой панели и нажмите **Remove** рядом с этим iPhone. Его ключ сразу перестаёт работать; вернуться он сможет только после нового сопряжения, которое вы подтвердите на Mac.
225
+
226
+ **Можно ли заблокировать Tether с помощью Face ID?** Да: в Tether включите «Settings → Privacy → Lock with Face ID». После этого Tether запрашивает Face ID (или код-пароль) при открытии и при возврате в приложение.
204
227
 
205
228
  **Как показать на боковой панели dsh только проекты, с которыми я работал сегодня?** Боковая панель → параметры просмотра (значок с ползунками) → **Активные за последние 2 часа**. Выберите пункт ещё раз, чтобы показать все проекты.
206
229