dsh-composer-plus 1.24.0 → 1.25.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.24.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.25.0`.
33
33
 
34
34
  ## Recursos
35
35
 
@@ -75,7 +75,11 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
75
75
  | **Arquivos protegidos** | <a id="feature-protectedfiles"></a>Ativado por padrão. As ferramentas de arquivo do próprio agente não podem ler nem alterar arquivos que correspondem aos seus padrões: `read`, `read_image` e `grep` em um arquivo são recusados para padrões de **leitura e gravação**, e `write`, `edit` e `str_replace_editor` para os dois tipos. O agente lê o motivo e é orientado a perguntar a você. Os padrões iniciais são `.env*`, `*.pem` e `*.key`. Configurações → Composer Plus → **Arquivos protegidos**: adicione um padrão (por exemplo `published/**` ou `config/*.yml`), clique no tipo dele para alternar entre **leitura e gravação** e **somente gravação**, remova-o com ✕ ou clique em **Usar os valores padrão**. Um padrão sem `/` corresponde a um nome de arquivo em qualquer pasta. Isto é uma barreira de proteção, não um sandbox: um comando de shell (`cat .env`), um script ou uma ferramenta MCP ainda podem acessar o arquivo (veja Limites). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Captura de tela: Arquivos protegidos"></a> |
76
76
  | **Comandos bloqueados** | <a id="feature-blockedcommands"></a>Ativado por padrão, com a lista vazia. Os comandos de shell do agente (`bash`, `pwsh`) não podem executar um comando que corresponda às suas regras: uma regra **bloquear** recusa a chamada (o agente lê o motivo e é orientado a perguntar a você), uma regra **perguntar antes** mostra o cartão de aprovação do dsh, e o comando só é executado quando você permite. Configurações → Composer Plus → **Comandos bloqueados**: digite uma regra (por exemplo `npm publish`, `git push --force` ou `ssh *192.168.2.19`), clique no tipo para alternar entre **bloquear** e **perguntar antes** e depois clique em **Adicionar**; clique no tipo de uma regra para mudá-lo e remova-a com ✕. Uma regra é um nome de comando e palavras que precisam vir depois dele nesta ordem; `*` corresponde a qualquer texto. A verificação também encontra o comando depois de `&&`, `;`, `\|`, dentro de `$(…)`, `bash -c "…"` ou `eval`, e depois de `sudo` ou `env`. Isto é uma barreira de proteção, não um sandbox: uma variável (`$CMD`), um arquivo de script ou outro programa ainda podem executar o comando (veja Limites). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Captura de tela: Comandos bloqueados"></a> |
77
77
  | **Quadro de tarefas** | <a id="feature-taskboard"></a>Barra lateral esquerda → **Quadro de tarefas**, ou pressione `Cmd+Shift+K` (`Ctrl+Shift+K` no Windows e no Linux) em qualquer lugar do dsh. Um quadro kanban dos seus chats do dsh com o estado ao vivo que a barra lateral mostra: um chat que espera sua aprovação, sua resposta ou a revisão de um plano fica em **Em revisão** com um ponto laranja, um chat em execução fica em **Fazendo** e um chat concluído que você ainda não abriu fica em **Concluído** (verde). Quando você abre um chat, o cartão dele sai de **Concluído** sozinho; clique em **Concluídos recentemente (N)**, abaixo dos cartões verdes, para ver os chats concluídos que você já leu (os 10 mais recentes e depois **Mostrar N mais antigas**; aberto ou fechado fica salvo neste dispositivo). Um chat que termina enquanto está aberto atrás do quadro (uma **Nova tarefa**) fica verde até você abri-lo. Clique no nome do projeto, no topo do quadro, para abrir a lista de projetos e escolha um projeto ou **Todos os projetos**; uma pasta de “Um branch por chat” conta como o projeto dela. A lista fecha após a escolha, com `Esc` ou com um clique fora dela. Digite em **Buscar projetos**, no topo da lista, para encontrar um projeto pelo nome (maiúsculas e acentos não importam; `Esc` limpa a caixa), pressione `Enter` para escolher a primeira correspondência e clique em **Ativos nas últimas 2 horas** para mostrar só os projetos com um chat que espera, está em execução, terminou sem ser visto ou mudou nas últimas 2 horas (fica salvo neste dispositivo). **Nova tarefa** (ou `n`) abre o próprio novo chat do dsh no projeto que o quadro mostra (com **Todos os projetos**, o projeto que a Nova sessão do dsh escolhe), então você pode adicionar arquivos, usar comandos e escolher o modelo como em qualquer chat. Quando a sua primeira mensagem é enviada, o quadro volta sozinho. Até lá, o chat espera no topo de **Fazendo** como **Nova tarefa**: clique nele para escrever a primeira mensagem. Um projeto com um chat que espera por você tem um ponto laranja na lista de projetos (o nome do projeto no topo também tem, enquanto algum chat espera). O dsh dá nome ao chat e o modelo do chat escreve até 3 etiquetas a partir dessa mensagem. Clique em um cartão para abrir o chat dele. Clique em um cartão laranja (ou em **Responder**) para responder no quadro; o painel tem **Abrir chat** para ver o chat inteiro: **Rejeitar** ou **Permitir uma vez**, **Aprovar** ou **Solicitar alterações** para um plano, ou as opções e o seu próprio texto para uma pergunta. Clique em **×** em um cartão concluído para tirá-lo do quadro, ou abra **Concluídos recentemente** e clique em **Limpar tudo**, no topo de **Concluído**, para tirar esses cartões do quadro: primeiro ele mostra quantos cartões de qual projeto saem, e os cartões não lidos (verdes) ficam. Nos 8 segundos seguintes, **Desfazer** devolve os cartões; **Retirados (N)**, abaixo de **Concluído**, lista os cartões que estão fora do quadro, e **Devolver** mostra um deles de novo em **Concluído**. Nenhum chat é apagado: os chats continuam na barra lateral do dsh, o quadro se lembra disso depois de reiniciar (o Tether mostra o mesmo quadro) e um chat que é executado de novo volta ao quadro. Aponte para um cartão em **Fazendo** (ou mova o foco do teclado até ele) para ver o progresso: há quanto tempo ele está em execução, a etapa da sua lista de tarefas pendentes, a ferramenta que está em execução agora e a última linha do agente. Em Configurações → Composer Plus → Quadro de tarefas, **Progresso ao passar o cursor** escolhe **Rápido (sem IA)** (o padrão: só lê o chat) ou **Resumo com IA** (uma chamada curta ao modelo do chat também escreve uma ou duas frases). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Captura de tela: Quadro de tarefas"></a> |
78
- | **Assistente** | <a id="feature-assistant"></a>Desativado por padrão: ative em **Configurações → Composer Plus**. Depois clique em **Assistente** na barra lateral esquerda (logo abaixo de **Quadro de tarefas**): ele abre um chat permanente que você usa como seu assistente pessoal, como um chat do ChatGPT ou do Grok. O primeiro clique cria a pasta `~/Assistant`, a adiciona como o projeto "Assistant" e inicia o chat com o modo de permissão workspace-write e o modelo padrão do dsh; cada clique seguinte abre o mesmo chat (um chat arquivado volta, um excluído é criado de novo). Peça um lembrete (“me lembre de beber água daqui a 2 minutos”): ele usa as tarefas agendadas do dsh, então o lembrete executa o chat nessa hora, e o Tether envia a notificação "Turn finished" quando a Conexão móvel está ativada. Peça uma pesquisa na web ou pergunte sobre seus outros chats: ele pode listar os chats de todos os projetos (em execução, esperando por você ou ociosos) e ler as mensagens mais recentes de um deles. Ele também pode enviar uma mensagem a um chat, iniciar um novo chat em um projeto, parar um chat em execução ou arquivar um: cada uma dessas quatro ações mostra primeiro o cartão de aprovação do dsh (também no Tether), e nada acontece até você clicar em **Permitir uma vez**. Ele não tem ferramenta de exclusão. Só este chat tem essas ferramentas e suas instruções curtas; um texto que ele lê em uma página web ou em outro chat conta como dado, não como ordem. Guarde seu perfil na memória deste projeto (**Memória do projeto**, tema "profil") em vez de contar a ele toda vez. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Captura de tela: Assistente"></a> |
78
+ | **Assistente** | <a id="feature-assistant"></a>Ativado por padrão (desative em **Configurações → Composer Plus**). Clique em **Assistente** na barra lateral esquerda (logo abaixo de **Quadro de tarefas**): ele abre um chat permanente que você usa como seu assistente pessoal, como um chat do ChatGPT ou do Grok. O primeiro clique cria a pasta `~/Assistant`, a adiciona como o projeto "Assistant" e inicia o chat com o modo de permissão workspace-write e o modelo padrão do dsh; cada clique seguinte abre o mesmo chat (um chat arquivado volta, um excluído é criado de novo). Enquanto o chat ainda não tem mensagens, um cartão curto acima do campo de entrada explica o que o assistente faz e mostra três pedidos de exemplo; ele some com a sua primeira mensagem. Peça um lembrete (“me lembre de beber água daqui a 2 minutos”): ele usa as tarefas agendadas do dsh, então o lembrete executa o chat nessa hora, e o Tether envia a notificação "Turn finished" quando a Conexão móvel está ativada. Fale com ele como com um amigo que trabalha em segundo plano: uma tarefa mais demorada (uma pesquisa, várias etapas) vai para um subagente próprio em segundo plano, e o chat diz em uma linha o que iniciou e fica livre na hora. Abra um segundo assunto enquanto o primeiro ainda está em execução: cada assunto ganha o próprio subagente, e cada resultado volta a este chat quando fica pronto. Peça uma pesquisa na web ou pergunte sobre seus outros chats: ele pode listar os chats de todos os projetos (em execução, esperando por você ou ociosos) e ler as mensagens mais recentes de um deles. Ele também pode enviar uma mensagem a um chat, iniciar um novo chat em um projeto, parar um chat em execução ou arquivar um: cada uma dessas quatro ações mostra primeiro o cartão de aprovação do dsh (também no Tether), e nada acontece até você clicar em **Permitir uma vez**. Ele não tem ferramenta de exclusão. Só este chat tem essas ferramentas e suas instruções curtas; um texto que ele lê em uma página web ou em outro chat conta como dado, não como ordem. Guarde seu perfil na memória deste projeto (**Memória do projeto**, tema "profil") em vez de contar a ele toda vez. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Captura de tela: Assistente"></a> |
79
+ | **Assistente separado dos chats** | <a id="feature-assistantapart"></a>Ativado por padrão (desative em **Configurações → Composer Plus**). O chat do assistente sai da lista de chats da barra lateral esquerda, então ele não fica entre os chats dos seus projetos: abra-o com **Assistente**. O projeto "Assistant" também sai enquanto não tiver outro chat; a pesquisa da barra lateral ainda encontra o chat. Um ponto na linha **Assistente** mostra o estado do assistente: trabalhando (também enquanto um assunto em segundo plano está em execução), esperando por você (laranja: uma aprovação, uma pergunta ou uma revisão de plano) ou nova resposta (verde). Enquanto o chat do assistente está aberto, a linha **Assistente** aparece como aberta. Com o recurso desativado, o chat volta à lista e a linha fica sem ponto. | <a href="assets/features/assistantApart.webp"><img src="assets/features/assistantApart.webp" width="160" alt="Captura de tela: Assistente separado dos chats"></a> |
80
+ | **Só mensagens no Assistente** | <a id="feature-assistantchatview"></a>Ativado por padrão (desative em **Configurações → Composer Plus**). O chat do assistente parece um chat com um bot: chamadas de ferramentas, raciocínio, grupos de etapas e a linha "Completed in" ficam ocultos, e você vê suas mensagens, as respostas dele, os erros e os cartões de aprovação. Os outros chats não mudam. Desative para ver de novo as etapas de trabalho do assistente. | <a href="assets/features/assistantChatView.webp"><img src="assets/features/assistantChatView.webp" width="160" alt="Captura de tela: Só mensagens no Assistente"></a> |
81
+ | **Assistente sempre livre** | <a id="feature-assistantfree"></a>Ativado por padrão (desative em **Configurações → Composer Plus**). O chat do assistente responde na hora e nunca fica ocupado com um trabalho longo: ele chama só as próprias ferramentas curtas (seus chats, lembretes, memória e subagentes). Qualquer outra etapa, como uma pesquisa na web, uma página web, um arquivo ou um comando, vai para um subagente em segundo plano; o chat diz em uma linha o que iniciou e fica livre para sua próxima mensagem, e o resultado volta ao chat quando fica pronto. Os subagentes dele trabalham normalmente. Quando o chat do assistente não tem a ferramenta de subagentes (pelo modo de permissão ou pelo perfil dele), a regra não faz nada e **Configurações** avisa isso. | <a href="assets/features/assistantFree.webp"><img src="assets/features/assistantFree.webp" width="160" alt="Captura de tela: Assistente sempre livre"></a> |
82
+ | **Avisos de chats no Assistente** | <a id="feature-assistantnotify"></a>Desativado por padrão: cada aviso é um turno do modelo no chat do assistente, então usa tokens. Ative em **Configurações → Composer Plus**. Depois disso, o assistente avisa você, no próprio chat, quando outro chat termina um turno longo (1 minuto ou mais), falha ou espera por você (uma aprovação, uma pergunta ou uma revisão de plano) durante 30 segundos: uma linha curta por chat, com o título e o projeto do chat. Os avisos são reunidos durante 15 segundos e chegam no máximo a cada 2 minutos; enquanto o assistente trabalha, eles esperam esse turno terminar. Um chat que você parou, um turno curto e o próprio chat do assistente não geram aviso. Com **Conexão móvel (iPhone)** ativada, o Tether recebe a notificação "Turn finished" de sempre do assistente. | <a href="assets/features/assistantNotify.webp"><img src="assets/features/assistantNotify.webp" width="160" alt="Captura de tela: Avisos de chats no Assistente"></a> |
79
83
  | **Memória do projeto** | <a id="feature-projectmemory"></a>Desativado por padrão: ative em **Configurações → Composer Plus**. Cada pasta de projeto tem a própria memória, que os chats seguintes desse projeto leem, como o DS Bot guarda uma por Bot. Depois de cada turno concluído, uma chamada ao modelo do chat lê as mensagens novas (não as revertidas), guarda suas preferências, decisões e fatos duradouros como notas curtas, e muda ou remove as antigas. O agente também pode salvar, remover e buscar notas sozinho (`memory_remember`, `memory_forget`, `memory_recall`). Uma nota também pode ser global: todos os projetos a leem. Um chat novo recebe as notas no prompt de sistema; uma nota salva depois aparece a partir do chat seguinte. Os arquivos são Markdown na pasta inicial do dsh (`storages/dsh-composer-plus/memory/`), nunca na pasta do projeto. **Abrir memória**, na mesma linha, mostra todas as notas salvas agrupadas por projeto (e a memória global), com um filtro. Escreva com suas palavras o que mudar (por exemplo "troquei yarn por pnpm") e toque em **Ver prévia das mudanças**: o modelo padrão do dsh propõe as mudanças e só **Aplicar** as salva. No Tether: menu do título do chat → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Captura de tela: Memória do projeto"></a> |
80
84
  | **Histórico de versões da memória** | <a id="feature-memoryhistory"></a>Ativado por padrão enquanto **Memória do projeto** está ativada. Antes de cada gravação da memória (o agente, a revisão após um turno, **Abrir memória**), uma cópia das notas como estavam é guardada. Em **Abrir memória**, selecione um projeto ou **Memória global** e depois **Histórico**: as versões por data e quem mudou a memória depois de cada uma. Selecione uma versão para ver como diff o que uma restauração muda e depois **Restaurar**. As notas de antes de uma restauração também são guardadas, então você pode desfazê-la. As 50 versões mais recentes de cada memória ficam guardadas. No Tether: menu do título do chat → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Captura de tela: Histórico de versões da memória"></a> |
81
85
  | **Exportar a memória para AGENTS.md** | <a id="feature-memoryexport"></a>Em **Abrir memória**, selecione um projeto e depois **Exportar para AGENTS.md**: as notas desse projeto vão para uma seção marcada de `AGENTS.md` na pasta dele, para você fazer commit e compartilhar com a equipe e outras ferramentas de agentes. Primeiro você vê a mudança como diff; só **Gravar AGENTS.md** salva. A próxima exportação substitui só essa seção. A memória global, as fontes e as datas ficam de fora. No Tether: menu do título do chat → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Captura de tela: Exportar a memória para AGENTS.md"></a> |
@@ -104,7 +108,7 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
104
108
  | **Botões de opções** | <a id="feature-optionpicks"></a>Quando uma resposta termina com uma lista de opções (uma lista numerada de 1 a 9 itens sob um título "Opções" ou uma linha em negrito "Opções", também "Próximos passos" e as mesmas palavras nos idiomas do aplicativo), aparece um botão para cada opção abaixo da resposta. Um clique envia "Option N: …" com a opção inteira como sua mensagem, como se você a tivesse digitado. A opção marcada "(recomendada)" fica destacada. Os botões só aparecem abaixo da resposta mais recente, enquanto o chat está ocioso e a caixa de mensagem está vazia; uma resposta já escolhida e uma resposta retirada por uma reversão não mostram botões. Enquanto eles aparecem, a previsão da próxima mensagem não sugere nada. Em um cartão de pergunta do agente, as teclas 1–9 escolhem essa opção, como um clique (não no campo de resposta, nem nos primeiros 0,8 segundo depois que a pergunta aparece). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Captura de tela: Botões de opções"></a> |
105
109
  | **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> |
106
110
  | **Conexão móvel (iPhone)** | <a id="feature-mobileconnect"></a>Use o dsh no seu iPhone com o app [Tether](tether/), na mesma rede Wi-Fi ou pelo [Tailscale](https://tailscale.com). Ative em **Configurações → Composer Plus** (o recurso vem desativado por padrão, porque abre uma porta de rede neste Mac). Depois, clique em **Conexão móvel** no canto inferior esquerdo da barra lateral: leia o código QR com a Câmera do iPhone (toque em **Open in Tether**) ou com **Scan code** no Tether, toque em **Connect** e clique em **Approve**. Instale o Tether antes: sem ele, a Câmera não consegue abrir o código. O celular mostra seus chats, envia mensagens (com fotos: o **+** do editor de mensagens → Camera, Photos ou Paste image), responde a aprovações e perguntas, e troca de modelo e de agente. Pareie quantos Macs quiser: o nome do Mac no canto superior esquerdo do app alterna entre eles. O painel **Conexão móvel** lista os iPhones pareados com a última conexão de cada um: **Remove** desconecta um deles na hora. “Tailscale only” recusa a rede local (para um Wi-Fi compartilhado), e o registro de acesso mostra quem tentou se conectar. No Tether, “Settings → Privacy” bloqueia o app com o Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura de tela: Conexão móvel (iPhone)"></a> |
107
- | **Computadores remotos** | <a id="feature-remotecomputers"></a>Abra o dsh dos seus outros Macs pelo [Tailscale](https://tailscale.com) e use-os nesta janela do dsh. Ative em **Configurações → Composer Plus** em cada Mac (o recurso vem desativado por padrão, porque abre portas de rede). No Mac que você quer abrir, ative **Permitir que outros computadores abram este Mac**, clique em **Criar link de pareamento** e copie o link. Neste Mac, escolha **Adicionar um computador…** no seletor de computadores da barra lateral esquerda (à direita do nome da marca, acima de **Nova sessão**), cole o link, digite um **Nome** (diferente do nome deste Mac e dos outros computadores) e clique em **Conectar**. Depois, clique em **Aprovar** no outro Mac. A partir daí, o seletor lista **Este Mac** e os seus computadores: escolha um, e o dsh dele ocupa esta janela, com os próprios chats, barra lateral, ferramentas e arquivos, enquanto este Mac continua em execução por trás. O seletor fica no mesmo lugar e mostra **Voltar para este Mac**: clique nele para voltar. Com mais de um computador, o clique abre o menu, onde você escolhe **Este Mac** ou outro computador. O painel de Configurações renomeia e remove computadores, e lista os computadores que podem abrir este Mac (**Remover** desconecta um deles na hora). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Captura de tela: Computadores remotos"></a> |
111
+ | **Computadores remotos** | <a id="feature-remotecomputers"></a>Abra o dsh dos seus outros Macs pelo [Tailscale](https://tailscale.com) e use-os nesta janela do dsh. Ative em **Configurações → Composer Plus** em cada Mac (o recurso vem desativado por padrão, porque abre portas de rede). No Mac que você quer abrir, ative **Permitir que outros computadores abram este Mac**, clique em **Criar link de pareamento** e copie o link. Neste Mac, escolha **Adicionar um computador…** no seletor de computadores da barra lateral esquerda (à direita do nome da marca, acima de **Nova sessão**), cole o link, digite um **Nome** (diferente do nome deste Mac e dos outros computadores) e clique em **Conectar**. Depois, clique em **Aprovar** no outro Mac. A partir daí, o seletor lista **Este Mac** e os seus computadores: escolha um, e o dsh dele ocupa esta janela, com os próprios chats, barra lateral, ferramentas e arquivos, enquanto este Mac continua em execução por trás. O seletor fica no mesmo lugar e mostra **Voltar para este Mac**: clique nele para voltar. Com um só computador, um clique no seletor alterna na hora entre este Mac e esse computador (sem menu); clique com o botão direito no seletor para abrir o menu completo (**Adicionar um computador…**). Com mais de um computador, o clique abre o menu, onde você escolhe **Este Mac** ou outro computador. O painel de Configurações renomeia e remove computadores, e lista os computadores que podem abrir este Mac (**Remover** desconecta um deles na hora). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Captura de tela: Computadores remotos"></a> |
108
112
  | **Atualizações automáticas** | <a id="feature-autoupdate"></a>Quando o dsh inicia, o plugin verifica a [versão mais recente no GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Se ela for mais nova e já estiver no npm, o plugin instala exatamente essa versão pelo próprio gerenciador de plugins do dsh (o mesmo caminho de Configurações → Plugins) e avisa você. Reinicie o dsh para carregá-la. **Configurações → Composer Plus → Atualizações do Composer Plus** mostra a versão e tem **Verificar atualizações** / **Atualizar agora**. Na primeira vez que o dsh abre com a nova versão, uma janela **Novidades do Composer Plus N** mostra uma vez as notas dessa versão no idioma de **Idioma do aplicativo** (elas vêm com a nova versão, sem outra chamada de rede; um idioma sem notas mostra as notas em inglês); **Fechar** ou `Esc` a fecha. Abaixo das notas, uma linha pede uma estrela no GitHub, no máximo uma vez a cada 30 dias (sem chamada de rede); depois de **Dar uma estrela no GitHub** ou **Não perguntar de novo**, ela não aparece mais. A janela também aparece após uma atualização por Configurações → Plugins ou por uma pasta copiada, uma vez por versão nova; não na primeira instalação. **Novidades desta versão** na linha de atualizações a abre de novo. Se houver no disco uma versão mais nova que a que está em execução, a linha pede para reiniciar o dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura de tela: Atualizações automáticas"></a> |
109
113
  | **Filtro ativados/desativados** | <a id="feature-featurefilter"></a>Ao lado de **Pesquisar recursos** em **Configurações → Composer Plus**: **Todos** mostra todos os recursos, **Ativados** só os que estão com a chave ativada e **Desativados** só os que estão com ela desativada. Quem decide é a chave de cada linha, também uma chave que o Host do dsh guarda (por exemplo **Conexão móvel**). Funciona junto com a pesquisa: digite uma palavra e escolha **Desativados** para achar um recurso que você desativou. Uma linha que você alterna com **Ativados** ou **Desativados** escolhido fica até você escolher um filtro de novo, assim o foco continua na chave dela. **Ativados** e **Desativados** ocultam as linhas **Idioma do aplicativo** e **Atualizações do Composer Plus** (elas não têm chave). Configurações sempre abre com **Todos**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Captura de tela: Filtro ativados/desativados"></a> |
110
114
  | **Relatar uma issue** | <a id="feature-issuereport"></a>Configurações → Composer Plus → **Relatar uma issue…** (abaixo da introdução), ou clique com o botão direito em um chat na barra lateral (ou abra o menu **…** dele) → **Relatar uma issue do Composer Plus…**. Escolha um tipo: **Bug**, **Pedido de recurso**, **Melhoria**, **Tradução** ou **Pergunta**. Descreva-o com suas próprias palavras e no seu idioma e depois clique em **Escrever rascunho** (ou `Cmd/Ctrl+Enter`). Uma chamada ao modelo padrão do dsh escreve uma issue em inglês: um título com o prefixo do tipo (por exemplo `[Bug]`) e as seções desse tipo (para um bug: What happened, Steps to reproduce, Expected, Actual), mais uma linha com as versões do Composer Plus, do dsh e do sistema. Leia e edite o título e a descrição; **Escrever de novo** escreve um novo rascunho. **Abrir issue** a abre no repositório do GitHub do Composer Plus com o seu login do GitHub CLI (`gh`) e mostra o link dela. A issue é pública: um texto que parece uma chave ou uma senha é recusado. Quando o `gh` não consegue abri-la, **Abrir no GitHub em vez disso** abre a própria página do GitHub com o rascunho preenchido. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Captura de tela: Relatar uma issue"></a> |
@@ -199,7 +203,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
199
203
  - **Continuar em um novo chat:** nada é executado até você clicar. Então a parte Host envia o chat (como a Verificação da meta o lê: sem raciocínio e sem passos revertidos) para o próprio modelo do chat e mostra a nota de passagem; só **Iniciar novo chat** cria um novo chat. Nada é gravado no projeto.
200
204
  - **Detalhamento do contexto:** a parte Host lê só o log do chat; nenhuma chamada ao modelo, nenhum arquivo do projeto.
201
205
  - **Quadro de tarefas:** o quadro mostra os próprios chats do dsh, a partir das próprias listas do dsh nesta janela; ele não adiciona dados de chat próprios. **Nova tarefa** abre o próprio novo chat do dsh, e você escreve a primeira mensagem no editor de mensagens do dsh, então as aprovações, o sandbox e o modelo do chat valem como de costume. A parte Host guarda a primeira mensagem desse chat como o prompt do cartão e a envia (os primeiros 4.000 caracteres dela, nada mais) ao modelo desse chat em mais uma solicitação, sem ferramentas, para obter até 3 etiquetas. O prompt, as etiquetas e a hora de início de cada tarefa ficam em `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (arquivo só para o dono, as 2.000 mais recentes), junto com os IDs dos chats que você tirou do quadro com **×** ou **Limpar tudo** (os 5.000 mais recentes); a chave fica em `board-switch.json`, ao lado. Nada é gravado em uma pasta de projeto. **Responder** envia a sua resposta para a solicitação pendente do próprio dsh, do mesmo jeito que o cartão do próprio chat. A lista de tarefas antiga das versões anteriores (`board.json`) fica no disco como estava e não é lida. **Progresso ao passar o cursor** lê o registro do chat neste Mac. Com **Rápido (sem IA)** (o padrão), nada é enviado. Com **Resumo com IA**, enquanto a caixa de progresso de um cartão em andamento aparece (ou enquanto o quadro do Tether está aberto, para até 8 cartões em andamento), a parte Host envia a parte mais recente desse chat (no máximo cerca de 6.000 caracteres: suas mensagens, as respostas em texto do agente, as chamadas de ferramentas e o fim dos resultados delas; sem raciocínio e sem mensagens revertidas) ao modelo do chat, em uma única solicitação sem ferramentas. Ela só envia de novo depois que o chat avançou, no máximo uma vez a cada 20 segundos por chat. A nota fica só na memória; a configuração fica em `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (arquivo só para o dono).
202
- - **Assistente:** o chat do assistente é um chat comum do dsh em `~/Assistant`; as chamadas de modelo dele vão para o modelo padrão do dsh, como em qualquer chat. As ferramentas dele leem os registros dos seus outros chats neste Mac (títulos, projetos, status e, com chat_read, as mensagens mais recentes) e os passam a esse modelo só quando ele chama uma ferramenta. Enviar, iniciar, parar e arquivar um chat esperam, cada um, a sua aprovação. O ID do chat fica em `$DSH_HOME/storages/dsh-composer-plus/assistant.json` e a chave em `assistant-switch.json` (arquivos só para o dono). Lembretes e automações são as próprias tarefas agendadas do dsh. Nada sai deste Mac, exceto as solicitações ao modelo e as pesquisas na web que o chat faz.
206
+ - **Assistente:** o chat do assistente é um chat comum do dsh em `~/Assistant`; as chamadas de modelo dele vão para o modelo padrão do dsh, como em qualquer chat. As ferramentas dele leem os registros dos seus outros chats neste Mac (títulos, projetos, status e, com chat_read, as mensagens mais recentes) e os passam a esse modelo só quando ele chama uma ferramenta. Enviar, iniciar, parar e arquivar um chat esperam, cada um, a sua aprovação. O ID do chat fica em `$DSH_HOME/storages/dsh-composer-plus/assistant.json` e a chave em `assistant-switch.json` (arquivos só para o dono). Lembretes e automações são as próprias tarefas agendadas do dsh. Nada sai deste Mac, exceto as solicitações ao modelo e as pesquisas na web que o chat faz. As chaves do assistente como bot guardam o estado em `assistant-free.json` e `assistant-notify.json` (arquivos só para o dono). **Avisos de chats no Assistente** coloca no chat do assistente uma linha curta sobre outro chat (o título, o projeto e no máximo 300 caracteres da última resposta ou do último erro dele), então esse texto também vai para o modelo do assistente; os avisos esperam só na memória.
203
207
  - **Arquivos protegidos:** a lista e a chave ficam em `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (arquivo só para o dono). A verificação lê só o caminho de cada chamada de ferramenta de arquivo (e o caminho real dele), nunca o arquivo.
204
208
  - **Comandos bloqueados:** as regras e a chave ficam em `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (arquivo só para o dono). A verificação lê só o texto do comando de cada chamada de `bash` e `pwsh`; não executa nada e não envia nada.
205
209
  - **Entrada secreta:** o valor vai do cartão (ou do Tether, pelo gateway, que não registra o corpo das solicitações) para o Host só na solicitação de resposta. O Host o grava em `$DSH_HOME/storages/dsh-composer-plus/secrets/<nome aleatório>` (pasta 0700, arquivo 0600); nada vai para o projeto, o registro do chat ou o resultado da ferramenta. O Host mantém o valor na memória para substituí-lo por `[secret]` nos resultados de ferramenta posteriores desse chat. O arquivo e essa cópia são apagados quando o turno do chat termina e quando o dsh inicia. A chave fica em `secrets.json`, ao lado. Um comando que o agente executa com o arquivo pode enviar o valor para onde esse comando envia: esse é o propósito.
@@ -226,7 +230,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
226
230
  - **Nenhuma etiqueta de branch em uma linha de chat:** a barra lateral não está em “Em uma única lista” (em “Workspace” e “Árvore de workspaces”, nenhuma linha de chat mostra uma etiqueta), o chat não teve nenhum turno desde que você instalou esta versão, a pasta dele não é um repositório git, ou **Branch do Git nas linhas de chat** está desativado. Depois de uma atualização, reinicie o dsh (a parte Host registra o branch).
227
231
  - **Verificação da meta diz que o teste saiu com o código 127 ou "not found":** o dsh iniciado pelo Finder ou pelo Dock pode ter um PATH mais curto que o do seu terminal, então ele não encontra `npm`, `pnpm` ou `cargo`. Inicie o dsh a partir de um terminal ou defina o seu próprio comando de teste com o caminho completo em **Verificação da meta** → **Editar**. **Executar agora** mostra o resultado na hora.
228
232
  - **A meta não fecha e o agente continua trabalhando:** **Verificação da meta** encontrou um teste com falha ou trabalho faltando; a linha abaixo da meta mostra o motivo (passe o mouse sobre o resultado para ver os detalhes). Corrija a causa ou o comando de teste, ou conclua a meta você mesmo com `/goal` ou com a barra da meta (isso não é verificado).
229
- - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.24.0`); veja a nota de instalação acima.
233
+ - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.25.0`); veja a nota de instalação acima.
230
234
  - **Fazer backup agora diz "Outra ação de backup está em andamento":** uma ação está em execução em outra janela do dsh ou no console de resgate (eles compartilham um arquivo de bloqueio, `.composer-plus.lock`, na pasta de backups). Aguarde até ela terminar. Se nenhuma ação estiver em execução, o próximo clique assume o bloqueio de um processo encerrado.
231
235
  - **O console de resgate diz "dsh is running":** feche o dsh primeiro. Se o dsh estiver mesmo fechado, o arquivo citado na mensagem sobrou de uma falha: remova-o e tente de novo.
232
236
  - **Depois de uma restauração, o dsh não inicia ou falta um plugin:** os pacotes de plugin de um perfil precisam ser instalados de novo. O console de resgate oferece isso depois de uma restauração; ou execute `pnpm install` em cada pasta de `$DSH_HOME/profiles/` que ele listar. Os segredos que não estavam no vault (outro computador) precisam ser informados de novo: o console os lista.
@@ -260,7 +264,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
260
264
  - **Ajustar o cartão de pergunta à janela** muda só o cartão de pergunta do dsh, não o cartão de revisão do plano. Ele encontra o cartão pela marcação do dsh (`data-question-key`, `data-question-scroll`); se uma atualização do dsh mudar essa marcação, o cartão aparece como o dsh o desenha. A altura do cartão segue a janela, não o chat: em um chat dentro de um painel lateral estreito, um cartão alto ainda pode passar do topo do chat.
261
265
  - **Ajustar o cabeçalho do chat à janela** encontra o cabeçalho do chat do dsh pelos nomes de classe gerados (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), porque o dsh não oferece um ponto de extensão para o layout dele. Se uma atualização do dsh mudar esses nomes, o cabeçalho aparece como o dsh o desenha. Em uma coluna de chat muito estreita o cabeçalho pode ocupar duas ou três linhas, então sobra menos espaço acima das mensagens.
262
266
  - **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). Com uma chave APNs em `apns.json` (veja `tether/README.md`), o Mac envia as notificações pelo serviço de push da Apple, então elas chegam também com o Tether fechado; o Mac precisa estar ativo e com o dsh aberto. Sem a chave, o celular só as recebe enquanto o Tether está aberto ou acabou de ir para segundo plano. O Tether só as envia depois que você ativa "Settings → Notifications → Send notifications" no Tether. O Tether guarda essa opção e o horário dela separadamente para cada Mac pareado. Ela vem desativada por padrão em cada Mac, e o iOS pede a permissão quando você a ativa. O app iOS ainda não está na App Store: compile-o a partir de `tether/ios` com o Xcode. "Tailscale only" ainda precisa de um endereço de Wi-Fi ou Ethernet no Mac (o gateway só inicia com um). O registro de acesso é de cada Mac e guarda só as 200 tentativas mais recentes; uma tentativa repetida em até um minuto soma um na mesma linha. Cada notificação mostra o Mac e o projeto do chat (`Studio Mac · recipe-box`), o título do chat e o texto: Turn finished mostra a última resposta do agente. Com a chave do APNs, esse texto passa pelo serviço de push da Apple. 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.
263
- - **Computadores remotos** precisa do Tailscale nos dois Macs, e do Composer Plus com este recurso ativado no Mac que você abre. Esse Mac não pode estar em repouso, e o dsh precisa estar em execução nele. O seletor só aparece quando a barra lateral esquerda está aberta (não quando ela mostra só ícones). Se a página do outro Mac não tiver um seletor próprio (Composer Plus anterior à 1.23.0 nele), o seletor deste Mac aparece sobre essa página, no mesmo lugar. Com a 1.23.0 nele, o seletor mostra o nome desse Mac: escolha **Este Mac** no menu dele para voltar. Cada computador que você abriu mantém a página dele na memória até você desativar o recurso ou reiniciar o dsh. No app para desktop, a página do outro Mac é uma página incorporada: os atalhos de teclado do próprio dsh (por exemplo, um novo chat) não funcionam nela, e downloads de arquivos, microfone e notificações também não funcionam ali. Ele usa a porta 19392 (só um dsh em cada Mac pode deixar outros computadores entrarem). Na página de outro Mac, o seletor só troca entre os computadores deste Mac: você não pode abrir um terceiro Mac por meio do outro Mac.
267
+ - **Computadores remotos** precisa do Tailscale nos dois Macs, e do Composer Plus com este recurso ativado no Mac que você abre. Esse Mac não pode estar em repouso, e o dsh precisa estar em execução nele. O seletor só aparece quando a barra lateral esquerda está aberta (não quando ela mostra só ícones). Se a página do outro Mac não tiver um seletor próprio (Composer Plus anterior à 1.23.0 nele), o seletor deste Mac aparece sobre essa página, no mesmo lugar. Com a 1.23.0 nele, o seletor mostra o nome desse Mac: escolha **Este Mac** no menu dele para voltar. Cada computador que você abriu mantém a página dele na memória até você desativar o recurso ou reiniciar o dsh. Se o computador não respondeu (estava em repouso ou o Tailscale estava desligado), a página dele não é mantida: escolha-o de novo e ela carrega outra vez. No app para desktop, a página do outro Mac é uma página incorporada: os atalhos de teclado do próprio dsh (por exemplo, um novo chat) não funcionam nela, e downloads de arquivos, microfone e notificações também não funcionam ali. Ele usa a porta 19392 (só um dsh em cada Mac pode deixar outros computadores entrarem). Na página de outro Mac, o seletor só troca entre os computadores deste Mac: você não pode abrir um terceiro Mac por meio do outro Mac. A troca com um clique conta só os computadores pareados e acessíveis (um computador que precisa ser pareado de novo não conta); com um só computador assim, **Adicionar um computador…** fica no menu do clique com o botão direito (em tela sensível ao toque: toque e segure) ou em **Configurações → Composer Plus → Computadores remotos**.
264
268
  - 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.
265
269
  - **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.
266
270
  - **Editar mensagem na fila no lugar** não altera uma mensagem que começou a ser enviada nesse meio-tempo nem sobrescreve uma mensagem que mudou nesse meio-tempo (por exemplo, no Tether do iPhone): um aviso informa isso. Uma imagem nova precisa de um modelo que aceite imagens (valem os limites de imagem do próprio dsh), e um arquivo novo precisa terminar o upload antes que você possa salvar. Só as suas próprias mensagens na fila podem ser editadas: uma rodada de meta ou uma resposta a uma pergunta na fila, não. Depois de uma atualização do plugin, só as edições de texto funcionam na hora: reinicie o dsh antes de salvar uma mensagem com imagens ou arquivos (a parte Host carrega na inicialização).
@@ -296,7 +300,8 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
296
300
  - **Pacote de skill em turco** instala um skill de terceiros: as regras vêm do repositório do autor no GitHub, não do Composer Plus, e uma versão nova é usada a partir da próxima verificação diária sem uma revisão nossa. A verificação prova que os arquivos são os que o GitHub lista para aquele commit, não que as regras sejam boas. O modelo decide quando carregar o skill (você também pode chamá-lo pelo nome); as regras valem só para textos em turco. A parte Host usa o idioma que um navegador informou por último: quando dois navegadores usam idiomas diferentes, vale o mais recente. O GitHub permite 60 chamadas de API por hora sem login; uma verificação recusada mantém a cópia instalada e mostra o motivo nas Configurações.
297
301
  - **Desembaraçar o código** traz uma cópia fixa da skill (caldoai/skills, commit f3cf477): uma mudança no original só chega com uma nova versão do Composer Plus. A skill executa uma meta longa que pode alterar muitos arquivos, e seus subagentes e verificações gastam muitos tokens. Onde o projeto não tem testes, ela pode mudar o comportamento sem aviso: inicie-a em um branch e leia o diff antes de fazer o merge. Uma skill com o mesmo nome no projeto, em uma pasta de skills personalizada ou em `~/.dsh/skills` a substitui. Com o interruptor desligado, `/untangle-codebase` vai para o modelo como texto comum.
298
302
  - **Quadro de tarefas** mostra os chats que o dsh lista nesta janela: um chat fora de um projeto aparece só em **Todos os projetos**, e uma pasta de “Um branch por chat” (`<project>/.worktrees/<name>`) conta como o projeto dela. A coluna de um cartão é o estado ao vivo do chat, então os cartões não podem ser arrastados: um chat vai para **Concluído** quando o turno dele termina, também depois de um erro ou de uma parada, e volta para **Fazendo** quando é executado de novo. O ponto verde é o próprio ponto de concluído do dsh, que o dsh mantém só nesta janela: depois de recarregar, os chats concluídos aparecem sem ele. **Concluído** mostra os 50 chats mais recentes (**Mostrar N mais antigas** mostra o resto). **Buscar projetos** encontra um projeto só pelo nome, não pelo caminho da pasta. **Ativos nas últimas 2 horas** oculta um projeto quando todos os chats dele têm mais de 2 horas, estão ociosos e lidos; o quadro continua mostrando o projeto que você escolheu. **Nova tarefa** lembra só o novo chat mais recente desta janela: quando você abre outro chat antes da primeira mensagem, esse chat fica no topo de **Fazendo** como **Nova tarefa** até você escrever nele, mas o quadro volta sozinho só para o mais recente. Depois de recarregar, um novo chat sem mensagem não aparece no quadro (o dsh o mantém como a Nova sessão vazia dele). As etiquetas vêm de uma chamada ao modelo por tarefa, a partir da primeira mensagem dela: elas podem estar erradas, e um chat que você não iniciou no quadro não tem nenhuma. O título é o próprio título do chat no dsh (o serviço de títulos do dsh, com o modelo do chat); até ele chegar, o cartão mostra a primeira linha da primeira mensagem. **×** e **Limpar tudo** só tiram cartões do quadro: nenhum chat é apagado. **Desfazer** aparece só por 8 segundos, nesta janela; depois, **Retirados (N)** → **Devolver** traz um cartão de volta, e um chat que é executado de novo volta sozinho. **Limpar tudo** pergunta antes e tira os cartões concluídos e lidos do projeto mostrado (de todos os projetos com **Todos os projetos**), também os que estão atrás de **Mostrar N mais antigas**; um cartão não lido (verde) fica. O dsh mantém o ponto verde só nesta janela, então, depois de recarregar, o Limpar tudo pode tirar um cartão cuja resposta você não leu. A lista fica neste Mac para todas as janelas e para o Tether; quando ela chega a 5.000 chats, os mais antigos voltam. **Responder** responde só à solicitação mais recente do chat: quando o chat a respondeu em outro lugar (outra janela, Tether, Revisão automática) ou pergunta algo novo, o painel avisa e não envia nada. As versões anteriores tinham uma lista de tarefas com comentários e ferramentas para agentes; elas não existem mais, e o `board.json` antigo não é mostrado. A ideia e a aparência vêm do [Kanzo](https://github.com/emanuele-em/kanzo), de emanuele-em (AGPL-3.0); o Composer Plus não usa código dele. `Cmd+Shift+K` é um atalho do dsh: em um navegador no Linux, ele não tem tecla padrão (defina uma na página de atalhos de teclado do dsh), e uma extensão do navegador ou outro aplicativo pode usá-la antes. Um cartão sai de **Concluído** quando o ponto verde do dsh some (você abriu o chat) ou, para um chat que terminou atrás do quadro enquanto era o chat aberto, quando esse chat aparece sem um painel por cima. Esse estado de lido fica só nesta janela do dsh, como os pontos do dsh: depois de recarregar ou em outra janela, todo chat concluído conta como lido, então fica em **Concluídos recentemente**.
299
- - **Assistente** tem um só chat para todas as janelas deste Mac. Ele roda com o modo de permissão workspace-write: grava arquivos só em `~/Assistant`, e um comando fora dessa pasta pergunta primeiro. Quando você muda o chat para um modo sem aprovações (Acesso total), o dsh recusa cada aprovação, então o assistente não consegue enviar, iniciar, parar nem arquivar um chat. O cartão de aprovação protege só as seis ferramentas: um comando de shell do assistente ainda pode acessar a rede, como em qualquer chat com esse modo. No dsh 0.2.0 e 0.2.1, as ferramentas de agendamento do dsh veem só os lembretes do próprio chat do assistente, não as automações de outros chats; a partir do dsh 0.2.2, elas listam e mudam todas as tarefas agendadas. chats_list deixa de fora chats arquivados, vazios e de subagentes, e o próprio chat do assistente; “esperando por você” significa uma aprovação, pergunta ou revisão de plano em aberto em um chat em execução. chat_read dá as mensagens do usuário e as respostas do agente (sem saída de ferramentas), no máximo 50 mensagens e cerca de 24.000 caracteres. chat_archive recusa um chat que ainda está em execução ou que tem lembretes ativos. Um texto que o modelo lê ainda pode enganá-lo: o cartão de aprovação é a última verificação, então leia-o antes de clicar em **Permitir uma vez**.
303
+ - **Assistente** tem um só chat para todas as janelas deste Mac. Ele roda com o modo de permissão workspace-write: grava arquivos só em `~/Assistant`, e um comando fora dessa pasta pergunta primeiro. Quando você muda o chat para um modo sem aprovações (Acesso total), o dsh recusa cada aprovação, então o assistente não consegue enviar, iniciar, parar nem arquivar um chat. O cartão de aprovação protege só as seis ferramentas: um comando de shell do assistente ainda pode acessar a rede, como em qualquer chat com esse modo. No dsh 0.2.0 e 0.2.1, as ferramentas de agendamento do dsh veem só os lembretes do próprio chat do assistente, não as automações de outros chats; a partir do dsh 0.2.2, elas listam e mudam todas as tarefas agendadas. chats_list deixa de fora chats arquivados, vazios e de subagentes, e o próprio chat do assistente; “esperando por você” significa uma aprovação, pergunta ou revisão de plano em aberto em um chat em execução. chat_read dá as mensagens do usuário e as respostas do agente (sem saída de ferramentas), no máximo 50 mensagens e cerca de 24.000 caracteres. chat_archive recusa um chat que ainda está em execução ou que tem lembretes ativos. Um texto que o modelo lê ainda pode enganá-lo: o cartão de aprovação é a última verificação, então leia-o antes de clicar em **Permitir uma vez**. Os assuntos em paralelo usam a ferramenta de subagentes do dsh: um perfil ou modo de permissão sem ela mantém o comportamento antigo (um assunto por vez; a próxima mensagem espera na fila ou direciona o turno em execução). O modelo decide o que conta como tarefa longa, então uma pergunta curta ainda pode ocupar um turno. O subagente de cada assunto roda com os próprios tokens; quando o dsh reinicia, um assunto em execução para (o resultado dele não volta). Um resultado volta como um novo turno do chat do assistente, então ele espera enquanto você digita no meio de um turno.
304
+ - **Assistente separado dos chats** e **Só mensagens no Assistente** ocultam as próprias linhas do dsh com uma regra de estilo, que as encontra pela marcação da barra lateral e do chat do dsh (`data-row-key`, `data-chat-flow-kind`): quando uma atualização do dsh muda essa marcação, o chat do assistente volta a aparecer na lista, ou as etapas de trabalho dele voltam a aparecer. As linhas ficam ocultas, não removidas: a navegação por teclado do dsh na barra lateral ainda pode chegar a uma linha oculta. **Assistente sempre livre** recusa cada chamada de ferramenta do chat do assistente que não seja uma das ferramentas curtas dele; então o modelo passa a etapa a um subagente, mas pode tentar primeiro a chamada recusada, o que custa uma etapa do modelo. Enquanto um cartão de aprovação espera por você, o chat do assistente ainda conta como ocupado. Quando a solicitação mais recente dele não tem a ferramenta de subagentes (um modo de permissão ou perfil sem ela), a regra não faz nada. **Avisos de chats no Assistente** inicia um turno do modelo no chat do assistente para cada lote de avisos, então usa tokens; com **Conexão móvel (iPhone)** ativada, seu celular pode receber duas notificações por um chat concluído (a do próprio chat e a do assistente). Os avisos que estão esperando se perdem quando o dsh reinicia. O recurso vê só os chats deste Mac.
300
305
  - **Prioridade à mensagem enviada após Parar** só age depois que você interrompe o chat (ou depois de um turno que falhou, ou ao abrir um chat que ainda tem fila): uma mensagem enviada enquanto um turno é executado continua esperando no fim da fila. Ela só passa à frente das suas próprias mensagens na fila: se uma rodada de meta ou uma resposta a uma pergunta espera na fila, a ordem do dsh fica. Ela lê uma parte do dsh que não é uma API pública (se o turno interrompido ainda está terminando); se uma atualização do dsh mudar esse nome, a mensagem só passa à frente depois que esse turno terminar. Chats de subagentes mantêm a ordem do dsh.
301
306
  - **Memória do projeto** pertence à primeira pasta do chat (a pasta de projeto do dsh): um chat que muda de pasta com `cd` continua com a memória do primeiro projeto, e a mesma pasta aberta por outro caminho para os mesmos arquivos a compartilha. Um chat congela sua seção de memória quando começa, então uma nota salva depois aparece a partir do chat seguinte (`memory_recall` a encontra na hora). A revisão guarda só o que o modelo decide guardar: pode deixar passar um fato ou guardar um errado; confira em **Abrir memória** e mude lá, ou edite os arquivos à mão com o dsh fechado. **Abrir memória** envia as notas do projeto selecionado e as notas globais (todos os projetos quando você seleciona Todas as notas; no máximo cerca de 60.000 caracteres, o resto só é contado e não pode mudar nesse pedido) e o seu texto ao modelo padrão do dsh, não ao modelo do chat. Uma prévia fica no Mac por 30 minutos e até o dsh reiniciar; se uma revisão ou o agente mudar as notas nesse meio-tempo, **Aplicar** recusa e você pede a prévia de novo. **Aplicar** grava todas as mudanças de uma prévia ou nenhuma: se uma mudança não puder ser gravada (por exemplo, MEMORY.md está cheio), as notas ficam como estavam e o motivo aparece. Cada turno concluído com uma mensagem sua custa uma chamada ao modelo; uma chamada com falha lê as mesmas mensagens de novo depois do turno seguinte. Chats de subagentes não são revisados. A ideia e o formato de arquivo vêm do [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); o Composer Plus não usa o código dele e nunca lê nem escreve a memória do próprio DS Bot.
302
307
  - **Histórico de versões da memória** guarda as 50 versões mais recentes de cada memória (cada projeto e a memória global); as mais antigas são apagadas. Uma versão guarda toda a memória daquele projeto, não uma nota. **Restaurar** devolve todos os arquivos daquela versão (tópicos incluídos) e recusa quando a memória mudou depois que você abriu a versão; a memória de antes da restauração vira uma nova versão, então você pode desfazê-la. Com a chave desativada, nenhuma versão nova é guardada e **Restaurar** recusa; as versões guardadas ficam. Não há versões de antes deste recurso: o histórico começa com a primeira gravação depois de instalá-lo.
@@ -350,7 +355,9 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
350
355
 
351
356
  **Posso ver todos os meus chats como um quadro kanban e iniciar novos chats a partir dele?** Sim, com **Quadro de tarefas** (ativado por padrão): abra-o na barra lateral esquerda. Cada chat é um cartão em **Fazendo**, **Em revisão** (ele espera por você) ou **Concluído**. **Nova tarefa** abre o novo chat do dsh no projeto, e o quadro volta quando a sua primeira mensagem é enviada; clique em **Responder** em um cartão laranja para responder sem abrir o chat. **Limpar tudo**, em **Concluído**, pergunta antes e tira do quadro os cartões concluídos que você leu; **Desfazer** e **Retirados (N)** os trazem de volta, e os chats continuam no dsh.
352
357
 
353
- **Posso ter um chat de assistente pessoal que me lembra de coisas e gerencia meus outros chats?** Sim, com **Assistente** (desativado por padrão): ative em Configurações → Composer Plus e depois clique em **Assistente** na barra lateral esquerda. Ele cria lembretes com as tarefas agendadas do dsh, pesquisa na web, lista e lê seus chats, e envia uma mensagem a um chat ou inicia, para ou arquiva um só depois que você aprova. Guarde seu perfil na memória do projeto dele, tema "profil".
358
+ **Posso ter um chat de assistente pessoal que me lembra de coisas e gerencia meus outros chats?** Sim, com **Assistente** (ativado por padrão): clique em **Assistente** na barra lateral esquerda. Ele cria lembretes com as tarefas agendadas do dsh, pesquisa na web, lista e lê seus chats, e envia uma mensagem a um chat ou inicia, para ou arquiva um só depois que você aprova. Guarde seu perfil na memória do projeto dele, tema "profil".
359
+
360
+ **O assistente pode ficar fora da minha lista de chats e funcionar como um bot?** Sim. **Assistente separado dos chats** tira o chat dele da lista da barra lateral e mostra o estado na linha **Assistente** (laranja enquanto espera por você). **Só mensagens no Assistente** oculta as etapas de trabalho dele. **Assistente sempre livre** faz com que ele passe cada etapa mais longa a um subagente em segundo plano, então ele responde na hora. **Avisos de chats no Assistente** (desativado por padrão, usa tokens) faz com que ele avise você quando outro chat termina, falha ou espera por você.
354
361
 
355
362
  **O dsh consegue fazer backup dos meus chats e configurações, como o dsh-backup?** Sim: **Configurações → Composer Plus → Backup → Fazer backup agora**. Ele grava o mesmo formato de arquivo compactado na mesma pasta (`~/Desktop/dsh-backups`), então os arquivos compactados do dsh-backup também aparecem e podem ser restaurados, e você pode remover o dsh-backup. Ative **Backup automático** para ter backups agendados.
356
363
 
@@ -504,8 +511,10 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
504
511
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
505
512
  # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
506
513
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
- # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
514
+ # Assistant: on by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
515
  SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
516
+ # Assistant welcome card: shows above the input on the first open of the assistant chat, goes with the switch and with the first message, not in other chats
517
+ PLAYWRIGHT=/path/to/playwright node test/browser-assistant-welcome.mjs /path/to/dsh/lib/bin.js
509
518
  ```
510
519
 
511
520
  ```sh
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.24.0`.
32
+ > pnpm в dsh пропускает версии, которые вышли меньше 24 часов назад. Сразу после выпуска укажите версию: `dsh-composer-plus@1.25.0`.
33
33
 
34
34
  ## Функции
35
35
 
@@ -75,7 +75,11 @@ dsh plugin --profile web add dsh-composer-plus
75
75
  | **Защищённые файлы** | <a id="feature-protectedfiles"></a>Включено по умолчанию. Собственные файловые инструменты агента не могут читать или изменять файлы, подходящие под ваши шаблоны: `read`, `read_image` и `grep` по файлу отклоняются для шаблонов **чтение и запись**, а `write`, `edit` и `str_replace_editor` — для обоих видов. Агент читает причину, и ему предлагается спросить вас. Шаблоны по умолчанию: `.env*`, `*.pem` и `*.key`. Настройки → Composer Plus → **Защищённые файлы**: добавьте шаблон (например, `published/**` или `config/*.yml`), нажмите на его вид, чтобы переключить между **чтение и запись** и **только запись**, удалите его кнопкой ✕ или нажмите **Использовать значения по умолчанию**. Шаблон без `/` подходит к имени файла в любой папке. Это ограждение, а не песочница: команда оболочки (`cat .env`), скрипт или инструмент MCP всё равно могут добраться до файла (см. «Ограничения»). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Снимок экрана: Защищённые файлы"></a> |
76
76
  | **Заблокированные команды** | <a id="feature-blockedcommands"></a>Включено по умолчанию, список изначально пуст. Команды оболочки агента (`bash`, `pwsh`) не могут запустить команду, подходящую под ваши правила: правило **блокировать** отклоняет вызов (агент читает причину, и ему предлагается спросить вас), правило **сначала спросить** показывает карточку одобрения dsh, и команда запускается, только когда вы её разрешите. Настройки → Composer Plus → **Заблокированные команды**: введите правило (например, `npm publish`, `git push --force` или `ssh *192.168.2.19`), нажмите на вид, чтобы переключить между **блокировать** и **сначала спросить**, затем нажмите **Добавить**; нажмите на вид правила, чтобы изменить его, удалите правило кнопкой ✕. Правило — это имя команды и слова, которые должны идти после него в этом порядке; `*` подходит к любому тексту. Функция также находит команду после `&&`, `;`, `\|`, внутри `$(…)`, `bash -c "…"` или `eval`, а также после `sudo` или `env`. Это ограждение, а не песочница: переменная (`$CMD`), файл скрипта или другая программа всё равно могут запустить команду (см. «Ограничения»). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Снимок экрана: Заблокированные команды"></a> |
77
77
  | **Доска задач** | <a id="feature-taskboard"></a>Левая боковая панель → **Доска задач** или `Cmd+Shift+K` (`Ctrl+Shift+K` в Windows и Linux) в любом месте dsh. Канбан-доска ваших чатов dsh с тем же живым состоянием, что показывает боковая панель: чат, который ждёт вашего одобрения, ответа или проверки плана, находится в **На проверке** с оранжевой точкой, работающий чат — в **В работе**, завершённый чат, который вы ещё не открыли, — в **Готово** (зелёный). Когда вы открываете чат, его карточка сама уходит из **Готово**; нажмите **Недавно завершённые (N)** под зелёными карточками, чтобы увидеть прочитанные завершённые чаты (10 самых новых, затем **Показать более старые: N**; открыто или закрыто — запоминается на этом устройстве). Чат, который завершился, пока был открыт за доской (**Новая задача**), остаётся зелёным, пока вы его не откроете. Нажмите на название проекта вверху доски, чтобы открыть список проектов, и выберите проект или **Все проекты**; папка ветки для каждого чата считается частью своего проекта. Список закрывается после выбора, по `Esc` или по щелчку вне его. Введите текст в **Поиск проектов** вверху списка, чтобы найти проект по названию (регистр и диакритические знаки не важны; `Esc` очищает поле), нажмите `Enter`, чтобы выбрать первое совпадение, и нажмите **Активные за последние 2 часа**, чтобы показать только проекты с чатом, который ждёт, работает, завершился и ещё не просмотрен или изменился за последние 2 часа (настройка хранится на этом устройстве). **Новая задача** (или `n`) открывает собственный новый чат dsh в проекте, который показывает доска (при **Все проекты** — в проекте, который выбирает «Новый сеанс» dsh), поэтому вы можете добавлять файлы, использовать команды и выбирать модель, как в любом чате. Когда ваше первое сообщение отправлено, доска возвращается сама. До этого чат ждёт в самом верху столбца **В работе** как **Новая задача**: нажмите на него, чтобы написать первое сообщение. У проекта с чатом, который ждёт вас, в списке проектов есть оранжевая точка (пока какой-либо чат ждёт, она есть и у названия проекта вверху). dsh даёт чату название, а модель чата пишет до 3 тегов по этому сообщению. Нажмите на карточку, чтобы открыть её чат. Нажмите на оранжевую карточку (или на её **Ответить**), чтобы ответить прямо на доске; в панели есть **Открыть чат**, чтобы увидеть весь чат: **Отклонить** или **Разрешить один раз**, **Одобрить** или **Запросить изменения** для плана, либо варианты и ваш собственный текст для вопроса. Нажмите **×** на завершённой карточке, чтобы убрать её с доски, или откройте **Недавно завершённые** и нажмите **Очистить всё** вверху столбца **Готово**, чтобы убрать эти карточки с доски: сначала окно показывает, сколько карточек какого проекта уйдёт, а непрочитанные (зелёные) карточки остаются. В течение 8 секунд после этого кнопка **Отменить** возвращает карточки; **Убранные (N)** под столбцом **Готово** показывает список карточек, убранных с доски, а **Вернуть на доску** снова показывает одну из них в **Готово**. Ни один чат не удаляется: чаты остаются на боковой панели dsh, доска помнит это и после перезапуска (Tether показывает ту же доску), а чат, который снова запускается, возвращается на доску. Наведите указатель на карточку в **В работе** (или переведите на неё фокус клавиатуры), чтобы увидеть ход работы: сколько времени работает чат, шаг его списка задач, инструмент, который работает сейчас, и последнюю строку агента. В разделе Настройки → Composer Plus → Доска задач параметр **Ход работы при наведении** выбирает **Быстро (без ИИ)** (по умолчанию: только читает чат) или **Сводка ИИ** (один короткий вызов модели чата дополнительно пишет одно-два предложения). | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Снимок экрана: Доска задач"></a> |
78
- | **Ассистент** | <a id="feature-assistant"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. Затем нажмите **Ассистент** на левой боковой панели (сразу под **Доска задач**): откроется один постоянный чат, которым вы пользуетесь как личным ассистентом, как чатом ChatGPT или Grok. Первое нажатие создаёт папку `~/Assistant`, добавляет её как проект "Assistant" и запускает чат с режимом разрешений workspace-write и моделью dsh по умолчанию; каждое следующее нажатие открывает тот же чат (архивированный возвращается, удалённый создаётся заново). Попросите его напомнить вам что-нибудь («напомни мне выпить воды через 2 минуты»): он использует запланированные задачи dsh, поэтому в нужное время напоминание запускает чат, а Tether присылает своё уведомление "Turn finished", когда включено «Мобильное подключение». Попросите его поискать в интернете или спросите о ваших других чатах: он может показать список чатов всех проектов (выполняется, ждёт вас или простаивает) и прочитать последние сообщения одного из них. Он также может отправить сообщение в чат, начать новый чат в проекте, остановить выполняющийся чат или архивировать чат: перед каждым из этих четырёх действий сначала появляется карточка подтверждения dsh (также в Tether), и ничего не происходит, пока вы не нажмёте **Разрешить один раз**. Инструмента для удаления у него нет. Эти инструменты и короткие инструкции есть только у этого чата; текст, который он читает на веб-странице или в другом чате, считается данными, а не приказом. Храните свой профиль в памяти этого проекта (**Память проекта**, тема "profil"), чтобы не рассказывать о себе каждый раз. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Снимок экрана: Ассистент"></a> |
78
+ | **Ассистент** | <a id="feature-assistant"></a>По умолчанию включено (выключить можно в **Настройки → Composer Plus**). Нажмите **Ассистент** на левой боковой панели (сразу под **Доска задач**): откроется один постоянный чат, которым вы пользуетесь как личным ассистентом, как чатом ChatGPT или Grok. Первое нажатие создаёт папку `~/Assistant`, добавляет её как проект "Assistant" и запускает чат с режимом разрешений workspace-write и моделью dsh по умолчанию; каждое следующее нажатие открывает тот же чат (архивированный возвращается, удалённый создаётся заново). Пока в чате нет сообщений, над полем ввода показывается короткая карточка: что делает ассистент и три примера запросов; она исчезает после вашего первого сообщения. Попросите его напомнить вам что-нибудь («напомни мне выпить воды через 2 минуты»): он использует запланированные задачи dsh, поэтому в нужное время напоминание запускает чат, а Tether присылает своё уведомление "Turn finished", когда включено «Мобильное подключение». Общайтесь с ним, как с другом, который работает в фоне: задача, которая занимает больше времени (исследование, несколько шагов), уходит к собственному фоновому субагенту, а чат одной строкой сообщает, что он запустил, и сразу освобождается. Откройте вторую тему, пока первая ещё выполняется: каждая тема получает своего субагента, и каждый результат приходит в этот чат, когда он готов. Попросите его поискать в интернете или спросите о ваших других чатах: он может показать список чатов всех проектов (выполняется, ждёт вас или простаивает) и прочитать последние сообщения одного из них. Он также может отправить сообщение в чат, начать новый чат в проекте, остановить выполняющийся чат или архивировать чат: перед каждым из этих четырёх действий сначала появляется карточка подтверждения dsh (также в Tether), и ничего не происходит, пока вы не нажмёте **Разрешить один раз**. Инструмента для удаления у него нет. Эти инструменты и короткие инструкции есть только у этого чата; текст, который он читает на веб-странице или в другом чате, считается данными, а не приказом. Храните свой профиль в памяти этого проекта (**Память проекта**, тема "profil"), чтобы не рассказывать о себе каждый раз. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="Снимок экрана: Ассистент"></a> |
79
+ | **Ассистент отдельно от чатов** | <a id="feature-assistantapart"></a>По умолчанию включено (выключить можно в **Настройки → Composer Plus**). Чат ассистента уходит из списка чатов на левой боковой панели и не стоит среди чатов ваших проектов: открывайте его пунктом **Ассистент**. Его проект "Assistant" тоже исчезает, пока в нём нет других чатов; поиск на боковой панели по-прежнему находит чат. Точка в строке **Ассистент** показывает состояние ассистента: работает (в том числе пока выполняется фоновая тема), ждёт вас (оранжевая: подтверждение, вопрос или проверка плана) или новый ответ (зелёная). Пока чат ассистента открыт, строка **Ассистент** отмечена как открытая. Если функцию выключить, чат возвращается в список, а у строки нет точки. | <a href="assets/features/assistantApart.webp"><img src="assets/features/assistantApart.webp" width="160" alt="Снимок экрана: Ассистент отдельно от чатов"></a> |
80
+ | **Только сообщения в чате ассистента** | <a id="feature-assistantchatview"></a>По умолчанию включено (выключить можно в **Настройки → Composer Plus**). Чат ассистента выглядит как чат с ботом: вызовы инструментов, размышления, группы шагов и строка "Completed in" скрыты, и вы видите свои сообщения, его ответы, ошибки и карточки подтверждения. Другие чаты не меняются. Выключите функцию, чтобы снова видеть рабочие шаги ассистента. | <a href="assets/features/assistantChatView.webp"><img src="assets/features/assistantChatView.webp" width="160" alt="Снимок экрана: Только сообщения в чате ассистента"></a> |
81
+ | **Ассистент всегда свободен** | <a id="feature-assistantfree"></a>По умолчанию включено (выключить можно в **Настройки → Composer Plus**). Чат ассистента отвечает сразу и никогда не занят долгой работой: он вызывает только свои короткие инструменты (ваши чаты, напоминания, память и субагенты). Любой другой шаг, например поиск в интернете, веб-страница, файл или команда, уходит к фоновому субагенту; чат одной строкой сообщает, что он запустил, и остаётся свободным для вашего следующего сообщения, а результат приходит в чат, когда он готов. Его субагенты работают как обычно. Если у чата ассистента нет инструмента субагентов (из-за режима разрешений или профиля), правило ничего не делает, и об этом сообщают **Настройки**. | <a href="assets/features/assistantFree.webp"><img src="assets/features/assistantFree.webp" width="160" alt="Снимок экрана: Ассистент всегда свободен"></a> |
82
+ | **Новости чатов от ассистента** | <a id="feature-assistantnotify"></a>По умолчанию выключено: каждая новость является ходом модели в чате ассистента, поэтому расходует токены. Включите функцию в **Настройки → Composer Plus**. Тогда ассистент сообщает в своём чате, когда другой чат завершает долгий ход (1 минута или больше), завершается с ошибкой или 30 секунд ждёт вас (подтверждения, ответа на вопрос или проверки плана): одна короткая строка на чат, с названием и проектом чата. Новости собираются 15 секунд и приходят не чаще чем раз в 2 минуты; пока ассистент работает, они ждут конца этого хода. Чат, который вы остановили, короткий ход и собственный чат ассистента новостей не дают. Если включено **Мобильное подключение (iPhone)**, Tether получает обычное уведомление ассистента "Turn finished". | <a href="assets/features/assistantNotify.webp"><img src="assets/features/assistantNotify.webp" width="160" alt="Снимок экрана: Новости чатов от ассистента"></a> |
79
83
  | **Память проекта** | <a id="feature-projectmemory"></a>По умолчанию выключено: включите функцию в **Настройки → Composer Plus**. У каждой папки проекта своя память, которую читают следующие чаты этого проекта, так же как DS Bot хранит память для каждого бота. После каждого завершённого хода один вызов модели чата читает новые сообщения (без отменённых откатом), сохраняет ваши постоянные предпочтения, решения и факты как короткие заметки и изменяет или удаляет старые. Агент также может сам сохранять, удалять и искать заметки (`memory_remember`, `memory_forget`, `memory_recall`). Заметка может быть и глобальной: её читают все проекты. Новый чат получает заметки в системном промпте; заметка, сохранённая позже, появляется со следующего чата. Файлы хранятся в формате Markdown в домашней папке dsh (`storages/dsh-composer-plus/memory/`), никогда в папке проекта. Кнопка **Открыть память** в той же строке показывает все сохранённые заметки по проектам (и глобальную память), с фильтром. Опишите своими словами, что изменить (например, «я перешёл с yarn на pnpm»), затем нажмите **Предпросмотр изменений**: модель dsh по умолчанию предлагает изменения, а сохраняет их только **Применить**. В Tether: меню заголовка чата → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Снимок экрана: Память проекта"></a> |
80
84
  | **История версий памяти** | <a id="feature-memoryhistory"></a>По умолчанию включено, пока включена **Память проекта**. Перед каждым сохранением памяти (агентом, проверкой после хода, через **Открыть память**) сохраняется копия заметок в прежнем виде. В **Открыть память** выберите проект или **Глобальная память**, затем **История**: версии по дате и кто изменил память после каждой. Выберите версию, чтобы увидеть в виде diff, что изменит восстановление, затем **Восстановить**. Заметки до восстановления тоже сохраняются, поэтому его можно отменить. Для каждой памяти остаются 50 последних версий. В Tether: меню заголовка чата → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="Снимок экрана: История версий памяти"></a> |
81
85
  | **Экспорт памяти в AGENTS.md** | <a id="feature-memoryexport"></a>В **Открыть память** выберите проект, затем **Экспорт в AGENTS.md**: заметки проекта попадут в отмеченный раздел `AGENTS.md` в его папке, чтобы вы могли закоммитить их и поделиться с командой и другими инструментами агентов. Сначала вы видите изменение в виде diff; сохраняет только **Записать AGENTS.md**. Следующий экспорт заменяет только этот раздел. Глобальная память, источники и даты не записываются. В Tether: меню заголовка чата → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="Снимок экрана: Экспорт памяти в AGENTS.md"></a> |
@@ -104,7 +108,7 @@ dsh plugin --profile web add dsh-composer-plus
104
108
  | **Кнопки вариантов** | <a id="feature-optionpicks"></a>Когда ответ заканчивается списком вариантов (нумерованный список из 1–9 пунктов под заголовком «Варианты» или жирной строкой «Варианты», а также «Следующие шаги» и те же слова на языках приложения), под ответом появляется кнопка для каждого варианта. Нажатие отправляет «Option N: …» с полным текстом варианта как ваше сообщение, как будто вы его напечатали. Вариант с пометкой «(рекомендуется)» выделен. Кнопки появляются только под самым новым ответом, пока чат простаивает и поле сообщения пусто; у уже выбранного ответа и у ответа, отозванного откатом, кнопок нет. Пока кнопки видны, прогноз следующего сообщения ничего не предлагает. На карточке вопроса агента клавиши 1–9 выбирают этот вариант, как нажатие (не в поле ответа и не в первые 0,8 секунды после появления вопроса). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="Снимок экрана: Кнопки вариантов"></a> |
105
109
  | **Язык приложения** | <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> |
106
110
  | **Мобильное подключение (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: без него камера не сможет открыть код. Телефон показывает ваши чаты, отправляет сообщения (с фото: **+** в поле ввода → Camera, Photos или Paste image), отвечает на запросы одобрения и вопросы, переключает модели и агентов. Можно связать сколько угодно 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> |
107
- | **Удалённые компьютеры** | <a id="feature-remotecomputers"></a>Открывайте dsh на других ваших Mac через [Tailscale](https://tailscale.com) и работайте с ними в этом окне dsh. Включите функцию в **Настройки → Composer Plus** на каждом Mac (по умолчанию она выключена, потому что открывает сетевые порты). На Mac, который вы хотите открыть, включите **Разрешить другим компьютерам открывать этот Mac**, нажмите **Создать ссылку для сопряжения** и скопируйте ссылку. На этом Mac выберите **Добавить компьютер…** в меню выбора компьютера на левой боковой панели (справа от названия приложения, над **Новый сеанс**), вставьте ссылку, введите **Имя** (не имя этого Mac и не имя другого компьютера) и нажмите **Подключить**. Затем нажмите **Одобрить** на другом Mac. После этого меню показывает **Этот Mac** и ваши компьютеры. Выберите компьютер, и его dsh займёт это окно со своими чатами, боковой панелью, инструментами и файлами, а этот Mac продолжит работать за ним. Меню выбора остаётся на том же месте и показывает **Вернуться к этому Mac**: нажмите, чтобы вернуться. Если компьютеров больше одного, нажатие открывает меню, где вы выбираете **Этот Mac** или другой компьютер. Панель настроек переименовывает и удаляет компьютеры и показывает компьютеры, которые могут открывать этот Mac (**Удалить** сразу отключает любой из них). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Снимок экрана: Удалённые компьютеры"></a> |
111
+ | **Удалённые компьютеры** | <a id="feature-remotecomputers"></a>Открывайте dsh на других ваших Mac через [Tailscale](https://tailscale.com) и работайте с ними в этом окне dsh. Включите функцию в **Настройки → Composer Plus** на каждом Mac (по умолчанию она выключена, потому что открывает сетевые порты). На Mac, который вы хотите открыть, включите **Разрешить другим компьютерам открывать этот Mac**, нажмите **Создать ссылку для сопряжения** и скопируйте ссылку. На этом Mac выберите **Добавить компьютер…** в меню выбора компьютера на левой боковой панели (справа от названия приложения, над **Новый сеанс**), вставьте ссылку, введите **Имя** (не имя этого Mac и не имя другого компьютера) и нажмите **Подключить**. Затем нажмите **Одобрить** на другом Mac. После этого меню показывает **Этот Mac** и ваши компьютеры. Выберите компьютер, и его dsh займёт это окно со своими чатами, боковой панелью, инструментами и файлами, а этот Mac продолжит работать за ним. Меню выбора остаётся на том же месте и показывает **Вернуться к этому Mac**: нажмите, чтобы вернуться. Если компьютер только один, нажатие на меню выбора сразу переключает окно между этим Mac и тем компьютером (меню не открывается); чтобы открыть полное меню (**Добавить компьютер…**), нажмите на меню выбора правой кнопкой мыши. Если компьютеров больше одного, нажатие открывает меню, где вы выбираете **Этот Mac** или другой компьютер. Панель настроек переименовывает и удаляет компьютеры и показывает компьютеры, которые могут открывать этот Mac (**Удалить** сразу отключает любой из них). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="Снимок экрана: Удалённые компьютеры"></a> |
108
112
  | **Автоматические обновления** | <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` закрывает его. Под примечаниями одна строка просит поставить звезду на GitHub, не чаще одного раза в 30 дней (без сетевого запроса); после **Поставить звезду на GitHub** или **Больше не спрашивать** она больше не показывается. Окно также показывается после обновления через Настройки → Плагины или скопированную папку, один раз для каждой новой версии; при первой установке оно не показывается. **Что нового в этой версии** в строке обновлений открывает его снова. Если на диске версия новее, чем запущенная, строка просит перезапустить dsh. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Снимок экрана: Автоматические обновления"></a> |
109
113
  | **Фильтр «вкл./выкл.»** | <a id="feature-featurefilter"></a>Рядом с полем **Поиск функций** в разделе **Настройки → Composer Plus**: **Все** показывает все функции, **Включённые** — только функции с включённым переключателем, **Выключенные** — только с выключенным. Решает переключатель самой строки, в том числе переключатель, который хранит Host dsh (например, **Мобильное подключение**). Фильтр работает вместе с поиском: введите слово и выберите **Выключенные**, чтобы найти функцию, которую вы выключили. Строка, которую вы переключили при выбранном фильтре **Включённые** или **Выключенные**, остаётся, пока вы снова не выберете фильтр, поэтому фокус остаётся на её переключателе. **Включённые** и **Выключенные** скрывают строки **Язык приложения** и **Обновления Composer Plus** (у них нет переключателя). Настройки каждый раз открываются с фильтром **Все**. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="Снимок экрана: Фильтр «вкл./выкл.»"></a> |
110
114
  | **Сообщить о проблеме** | <a id="feature-issuereport"></a>Настройки → Composer Plus → **Сообщить о проблеме…** (под вводным текстом) или правый щелчок по чату на боковой панели (или его меню **…**) → **Сообщить о проблеме с Composer Plus…**. Выберите тип: **Ошибка**, **Запрос функции**, **Улучшение**, **Перевод** или **Вопрос**. Напишите описание своими словами и на своём языке, затем нажмите **Написать черновик** (или `Cmd/Ctrl+Enter`). Один вызов модели dsh по умолчанию пишет issue на английском: заголовок с префиксом типа (например, `[Bug]`) и разделы этого типа (для ошибки: What happened, Steps to reproduce, Expected, Actual), а также одну строку с версиями Composer Plus, dsh и системы. Прочитайте и отредактируйте заголовок и описание; **Написать заново** пишет новый черновик. **Открыть issue** открывает issue в репозитории Composer Plus на GitHub через ваш вход в GitHub CLI (`gh`) и показывает ссылку на неё. Issue публичная: текст, похожий на ключ или пароль, отклоняется. Если `gh` не может открыть issue, **Открыть на сайте GitHub** открывает собственную страницу GitHub с заполненным черновиком. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="Снимок экрана: Сообщить о проблеме"></a> |
@@ -199,7 +203,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
199
203
  - **Продолжить в новом чате:** ничего не запускается, пока вы не нажмёте этот пункт. Затем Host-часть отправляет чат (так, как его читает Проверка цели: без рассуждений и шагов, убранных откатом) собственной модели чата и показывает заметку для передачи; новый чат создаёт только **Начать новый чат**. В проект ничего не записывается.
200
204
  - **Состав контекста:** Host-часть читает только журнал чата; без вызова модели и без файлов проекта.
201
205
  - **Доска задач:** доска показывает чаты dsh из собственных списков dsh в этом окне; своих данных о чатах она не добавляет. **Новая задача** открывает собственный новый чат dsh, и вы пишете первое сообщение в поле ввода dsh, поэтому подтверждения, песочница и модель чата действуют как обычно. Host-часть сохраняет первое сообщение этого чата как промпт карточки и отправляет его (первые 4 000 символов, больше ничего) модели этого чата ещё одним запросом, без инструментов, чтобы получить до 3 тегов. Промпт, теги и время запуска каждой задачи хранятся в `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (файл доступен только владельцу, последние 2 000), а также идентификаторы чатов, которые вы убрали с доски кнопкой **×** или **Очистить всё** (последние 5 000); переключатель хранится рядом, в `board-switch.json`. В папку проекта ничего не записывается. **Ответить** отправляет ваш ответ в ожидающий запрос dsh так же, как это делает карточка в самом чате. Старый список задач прежних версий (`board.json`) остаётся на диске без изменений и не читается. **Ход работы при наведении** читает журнал чата на этом Mac. В режиме **Быстро (без ИИ)** (по умолчанию) ничего не отправляется. В режиме **Сводка ИИ**, пока видно окно хода работы у работающей карточки (или пока доска в Tether открыта, не более чем для 8 работающих карточек), часть Host отправляет самую новую часть этого чата (не более примерно 6 000 символов: ваши сообщения, текстовые ответы агента, его вызовы инструментов и конец их результатов; без рассуждений и сообщений, убранных откатом) модели чата одним запросом без инструментов. Снова она отправляет только после того, как чат продвинулся, и не чаще одного раза в 20 секунд для каждого чата. Заметка хранится только в памяти; настройка хранится в `$DSH_HOME/storages/dsh-composer-plus/board-progress.json` (файл доступен только владельцу).
202
- - **Ассистент:** чат ассистента — это обычный чат dsh в `~/Assistant`; его вызовы модели идут к модели dsh по умолчанию, как в любом чате. Его инструменты читают журналы ваших других чатов на этом Mac (названия, проекты, состояние, а с chat_read — их последние сообщения) и передают их этой модели, только когда она вызывает инструмент. Отправка, запуск, остановка и архивирование чата каждый раз ждут вашего подтверждения. Идентификатор чата хранится в `$DSH_HOME/storages/dsh-composer-plus/assistant.json`, а переключатель — в `assistant-switch.json` (файлы доступны только владельцу). Напоминания и автоматизации — это собственные запланированные задачи dsh. Ничто не покидает этот Mac, кроме запросов к модели и веб-поиска, который делает чат.
206
+ - **Ассистент:** чат ассистента — это обычный чат dsh в `~/Assistant`; его вызовы модели идут к модели dsh по умолчанию, как в любом чате. Его инструменты читают журналы ваших других чатов на этом Mac (названия, проекты, состояние, а с chat_read — их последние сообщения) и передают их этой модели, только когда она вызывает инструмент. Отправка, запуск, остановка и архивирование чата каждый раз ждут вашего подтверждения. Идентификатор чата хранится в `$DSH_HOME/storages/dsh-composer-plus/assistant.json`, а переключатель — в `assistant-switch.json` (файлы доступны только владельцу). Напоминания и автоматизации — это собственные запланированные задачи dsh. Ничто не покидает этот Mac, кроме запросов к модели и веб-поиска, который делает чат. Переключатели ассистента в роли бота хранят своё состояние в `assistant-free.json` и `assistant-notify.json` (файлы доступны только владельцу). **Новости чатов от ассистента** добавляет в чат ассистента короткую строку о другом чате (его название, проект и не более 300 символов его последнего ответа или ошибки), поэтому этот текст тоже уходит к модели ассистента; новости ждут только в памяти.
203
207
  - **Защищённые файлы:** список и переключатель хранятся в `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (файл доступен только владельцу). Проверка читает только путь каждого вызова файлового инструмента (и его реальный путь), но никогда не сам файл.
204
208
  - **Заблокированные команды:** правила и переключатель хранятся в `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (файл доступен только владельцу). Проверка читает только текст команды каждого вызова `bash` и `pwsh`; она ничего не запускает и ничего не отправляет.
205
209
  - **Ввод секрета:** значение уходит из карточки (или из Tether через шлюз, который не записывает содержимое запросов) на Host только в запросе ответа. Host записывает его в `$DSH_HOME/storages/dsh-composer-plus/secrets/<случайное имя>` (папка 0700, файл 0600); ничего не попадает в проект, журнал чата или результат инструмента. Host хранит значение в памяти, чтобы заменять его на `[secret]` в следующих результатах инструментов этого чата. Файл и эта копия удаляются в конце хода чата и при запуске dsh. Переключатель находится рядом, в `secrets.json`. Команда, которую агент запускает с этим файлом, может отправить значение туда, куда отправляет эта команда: в этом и состоит цель.
@@ -226,7 +230,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
226
230
  - **На строке чата нет метки ветки:** боковая панель не в режиме «Одним списком» (в режимах «По рабочей области» и «Дерево рабочих областей» ни одна строка чата не показывает метку), у чата не было хода с момента установки этой версии, его папка не является репозиторием git, или функция **Ветка Git в строках чатов** выключена. После обновления перезапустите dsh (ветку записывает Host-часть).
227
231
  - **Проверка цели сообщает, что тест завершился с кодом 127 или «not found»:** у dsh, запущенного из Finder или Dock, PATH может быть короче, чем в вашем терминале, поэтому он не находит `npm`, `pnpm` или `cargo`. Запустите dsh из терминала или задайте свою тестовую команду с полным путём в **Проверка цели** → **Изменить**. **Запустить сейчас** сразу показывает результат.
228
232
  - **Цель не закрывается, и агент продолжает работать:** **Проверка цели** нашла непройденный тест или недоделанную работу; строка под целью показывает причину (наведите указатель на результат, чтобы увидеть подробности). Исправьте причину или тестовую команду либо завершите цель сами командой `/goal` или через панель цели (это не проверяется).
229
- - **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.24.0`), см. примечание об установке выше.
233
+ - **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.25.0`), см. примечание об установке выше.
230
234
  - **Кнопка «Создать копию сейчас» сообщает «Уже выполняется другое действие с резервными копиями»:** действие выполняется в другом окне dsh или в аварийной консоли (они используют общий файл блокировки `.composer-plus.lock` в папке резервных копий). Дождитесь его окончания. Если никакое действие не выполняется, блокировку закрытого процесса перехватит следующее нажатие.
231
235
  - **Аварийная консоль сообщает «dsh is running»:** сначала выйдите из dsh. Если dsh действительно закрыт, файл, названный в сообщении, остался после сбоя: удалите его и повторите попытку.
232
236
  - **После восстановления dsh не запускается или не хватает плагина:** пакеты плагинов профиля нужно установить заново. Аварийная консоль предлагает это после восстановления; или выполните `pnpm install` в каждой папке внутри `$DSH_HOME/profiles/`, которую она перечисляет. Секреты, которых не было в vault (другой компьютер), нужно ввести заново: консоль перечисляет их.
@@ -260,7 +264,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
260
264
  - **Подгонять карточку вопроса под окно** меняет только карточку вопроса dsh, а не карточку проверки плана. Она находит карточку по разметке dsh (`data-question-key`, `data-question-scroll`); если обновление dsh изменит эту разметку, карточка будет выглядеть так, как её рисует dsh. Высота карточки следует за окном, а не за чатом: в чате в узкой боковой панели высокая карточка всё ещё может выходить выше чата.
261
265
  - **Подогнать заголовок чата под окно** находит заголовок чата dsh по его сгенерированным именам классов (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), потому что dsh не даёт точки подключения для его раскладки. Если обновление dsh переименует их, заголовок показывается так, как его рисует dsh. В очень узкой колонке чата заголовок может занять две или три строки, и места над сообщениями становится меньше.
262
266
  - **Мобильное подключение** работает только в macOS (оно использует `en0`, `openssl`, `swift` и `dns-sd`). Оно использует фиксированные порты 19390 и 19391, поэтому на каждом Mac его может одновременно запускать только один dsh (каждый Mac — одна запись в списке Mac на телефоне). С ключом APNs в `apns.json` (см. `tether/README.md`) Mac отправляет уведомления через push-сервис Apple, поэтому они приходят и при закрытом Tether; Mac должен быть активен, а dsh открыт. Без ключа телефон получает уведомления, только пока Tether открыт или только что ушёл в фон. Tether отправляет их только после того, как вы включите в Tether «Settings → Notifications → Send notifications». Tether хранит этот переключатель и его часы отдельно для каждого сопряжённого Mac. По умолчанию он выключен на каждом Mac, а разрешение iOS запрашивает в момент включения. Приложения для iOS пока нет в App Store: соберите его из `tether/ios` в Xcode. «Tailscale only» всё равно требует адрес Wi-Fi или Ethernet на Mac (шлюз запускается только при таком адресе). Журнал доступа у каждого Mac свой и хранит только 200 самых новых попыток; повторная попытка в течение минуты увеличивает счётчик той же строки на один. Каждое уведомление показывает Mac и проект чата (`Studio Mac · recipe-box`), название чата и текст: Turn finished показывает последний ответ агента. С ключом APNs этот текст проходит через push-сервис Apple. Блокировка приложения Tether не скрывает превью уведомлений на экране блокировки iPhone: выключите их в настройках iOS. Зелёные точки в Tether следуют за Mac: у чата, который вы открыли в dsh, точка пропадает и на телефоне. У чата, который вы открыли в Tether, точка пропадает только на телефонах. Собственная точка dsh на Mac остаётся, пока вы не откроете чат на Mac.
263
- - **Удалённые компьютеры** требуют Tailscale на обоих Mac и Composer Plus с включённой функцией на Mac, который вы открываете. Этот Mac не должен быть в режиме сна, и на нём должен работать dsh. Меню выбора компьютера видно, только когда левая боковая панель открыта (а не свёрнута до значков). Если на странице другого Mac нет своего меню выбора (там Composer Plus версии ниже 1.23.0), меню выбора этого Mac появляется в том же месте поверх этой страницы. Если там версия 1.23.0, меню показывает имя того Mac: чтобы вернуться, выберите в нём **Этот Mac**. Каждый открытый вами компьютер держит свою страницу в памяти, пока вы не выключите функцию или не перезапустите dsh. В настольном приложении страница другого Mac — встроенная страница: собственные сочетания клавиш dsh (например, новый чат) в ней не работают, и загрузка файлов, микрофон и уведомления там тоже не работают. Функция использует порт 19392 (на каждом Mac пускать другие компьютеры может только один dsh). Со страницы другого Mac меню выбора переключает только между компьютерами этого Mac: открыть третий Mac через другой Mac нельзя.
267
+ - **Удалённые компьютеры** требуют Tailscale на обоих Mac и Composer Plus с включённой функцией на Mac, который вы открываете. Этот Mac не должен быть в режиме сна, и на нём должен работать dsh. Меню выбора компьютера видно, только когда левая боковая панель открыта (а не свёрнута до значков). Если на странице другого Mac нет своего меню выбора (там Composer Plus версии ниже 1.23.0), меню выбора этого Mac появляется в том же месте поверх этой страницы. Если там версия 1.23.0, меню показывает имя того Mac: чтобы вернуться, выберите в нём **Этот Mac**. Каждый открытый вами компьютер держит свою страницу в памяти, пока вы не выключите функцию или не перезапустите dsh. Если компьютер не ответил (он спал или Tailscale был выключен), его страница не сохраняется: выберите его снова, и она загрузится заново. В настольном приложении страница другого Mac — встроенная страница: собственные сочетания клавиш dsh (например, новый чат) в ней не работают, и загрузка файлов, микрофон и уведомления там тоже не работают. Функция использует порт 19392 (на каждом Mac пускать другие компьютеры может только один dsh). Со страницы другого Mac меню выбора переключает только между компьютерами этого Mac: открыть третий Mac через другой Mac нельзя. Переключение одним нажатием учитывает только сопряжённые и доступные компьютеры (компьютер, который нужно сопрячь заново, не учитывается); если такой компьютер один, пункт **Добавить компьютер…** доступен через правый клик (на сенсорном экране — долгое нажатие) или в **Настройки → Composer Plus → Удалённые компьютеры**.
264
268
  - Ссылка на сеанс работает внутри чатов; щелчок по ней не открывает чат. Ссылка, созданная через **Копировать ссылку на сообщение**, открывает своё сообщение только в dsh 0.2.1 и новее и только из сообщения в чате (в dsh 0.2.0 нет правил для пользовательского текста, поэтому там ссылка копируется, но показывается как обычный текст). Сообщение, которое убрал откат или которое сжатие удалило из истории, загружаемой dsh, показать нельзя: ссылка тогда сообщает об этом. Кнопки 🔗 привязаны к строкам сообщений dsh; если обновление dsh изменит эту разметку, они не появятся.
265
269
  - **Отметить все как прочитанные** меняет собственные точки непрочитанного dsh через часть dsh, которая не является публичным API (список `completionUnread` в состоянии сеансов dsh). Если обновление dsh переименует его, пункт не появится. Пункт добавляется в меню «…» проекта в dsh, где нет места для плагинов; если dsh изменит это меню, пункт тоже не появится.
266
270
  - **Правка сообщения в очереди на месте** не меняет сообщение, которое тем временем начало отправляться, и не перезаписывает сообщение, которое тем временем изменилось (например, в Tether на iPhone): об этом сообщает уведомление. Для нового изображения нужна модель, которая принимает изображения (действуют собственные ограничения dsh на изображения), а новый файл должен загрузиться до того, как вы сможете сохранить. Изменять можно только свои сообщения в очереди: раунд цели или ответ на вопрос в очереди изменить нельзя. После обновления плагина сразу работает только правка текста: перезапустите dsh, прежде чем сохранять сообщение с изображениями или файлами (Host-часть загружается при запуске).
@@ -296,7 +300,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
296
300
  - **Пакет навыка для турецкого** устанавливает сторонний навык: его правила приходят из репозитория автора на GitHub, а не из Composer Plus, и новая версия используется со следующей ежедневной проверки без нашего просмотра. Проверка доказывает, что файлы — те, которые GitHub перечисляет для этого коммита, но не то, что правила хороши. Когда загружать навык, решает модель (вы также можете вызвать его по имени); правила относятся только к турецким текстам. Host-часть использует язык, о котором браузер сообщил последним: если два браузера используют разные языки, действует более новый. Без входа GitHub разрешает 60 запросов к API в час; при отказе проверка сохраняет установленную копию и показывает причину в настройках.
297
301
  - **Распутать кодовую базу** содержит фиксированную копию навыка (caldoai/skills, коммит f3cf477): изменение в оригинале приходит только с новой версией Composer Plus. Навык выполняет долгую цель, которая может изменить много файлов, а его субагенты и проверки тратят много токенов. Там, где у проекта нет тестов, он может незаметно изменить поведение: запускайте его в отдельной ветке и читайте diff перед слиянием. Навык с тем же именем в проекте, в своей папке навыков или в `~/.dsh/skills` заменяет его. Пока переключатель выключен, `/untangle-codebase` уходит модели как обычный текст.
298
302
  - **Доска задач** показывает чаты, которые dsh перечисляет в этом окне: чат вне проекта виден только в **Все проекты**, а папка ветки для каждого чата (`<project>/.worktrees/<name>`) считается частью своего проекта. Колонка карточки — это живое состояние чата, поэтому карточки нельзя перетаскивать: чат переходит в **Готово**, когда его ход заканчивается, в том числе после ошибки или остановки, и возвращается в **В работе**, когда снова запускается. Зелёная точка — это собственная точка завершения dsh, которую dsh хранит только в этом окне: после перезагрузки завершённые чаты показываются без неё. **Готово** показывает 50 последних чатов (**Показать более старые: N** показывает остальные). **Поиск проектов** находит проект только по названию, а не по пути к его папке. **Активные за последние 2 часа** скрывает проект, если каждый его чат старше 2 часов, неактивен и прочитан; доска всё равно показывает выбранный вами проект. **Новая задача** помнит только последний новый чат этого окна: если вы открываете другой чат до первого сообщения, тот чат остаётся в самом верху колонки **В работе** как **Новая задача**, пока вы в нём не напишете, но доска возвращается сама только для последнего. После перезагрузки новый чат без сообщения не показывается на доске (dsh хранит его как свой пустой «Новый сеанс»). Теги берутся из одного вызова модели на каждую задачу, по её первому сообщению: они могут быть ошибочными, а у чата, который вы начали не на доске, их нет. Название — это собственное название чата в dsh (служба названий dsh, с моделью чата); пока его нет, карточка показывает первую строку первого сообщения. **×** и **Очистить всё** только убирают карточки с доски: ни один чат не удаляется. Кнопка **Отменить** видна только 8 секунд и только в этом окне; позже карточку возвращает **Убранные (N)** → **Вернуть на доску**, а чат, который снова запускается, возвращается сам. **Очистить всё** сначала спрашивает и убирает прочитанные завершённые карточки показанного проекта (при **Все проекты** — всех проектов), в том числе те, что скрыты за **Показать более старые: N**; непрочитанная (зелёная) карточка остаётся. dsh хранит свою зелёную точку только в этом окне, поэтому после перезагрузки «Очистить всё» может убрать карточку, ответ в которой вы не прочитали. Список хранится на этом Mac и действует для всех окон и для Tether; когда в нём 5 000 чатов, самые старые возвращаются. **Ответить** отвечает только на последний запрос чата: если на него уже ответили в другом месте (другое окно, Tether, автопроверка) или чат спрашивает что-то новое, панель сообщает об этом и ничего не отправляет. В прежних версиях был список задач с комментариями и инструментами для агентов; их больше нет, а старый `board.json` не показывается. Идея и внешний вид взяты из [Kanzo](https://github.com/emanuele-em/kanzo) от emanuele-em (AGPL-3.0); Composer Plus не использует его код. `Cmd+Shift+K` — сочетание клавиш dsh: в браузере на Linux у него нет клавиши по умолчанию (задайте её на странице сочетаний клавиш dsh), а расширение браузера или другое приложение может перехватить её раньше. Карточка уходит из **Готово**, когда исчезает зелёная точка dsh (вы открыли чат), а для чата, который завершился за доской, будучи открытым чатом, — когда этот чат показан без панели поверх него. Это состояние «прочитано» хранится только в этом окне dsh, как и точки dsh: после перезагрузки или в другом окне каждый завершённый чат считается прочитанным и находится в **Недавно завершённые**.
299
- - **Ассистент** — один чат для всех окон этого Mac. Он работает в режиме разрешений workspace-write: записывает файлы только в `~/Assistant`, а команда за пределами этой папки сначала спрашивает. Если переключить чат в режим без подтверждений (Полный доступ), dsh отклоняет каждое подтверждение, поэтому ассистент не может отправить сообщение в чат, начать, остановить или архивировать чат. Карточка подтверждения защищает только шесть инструментов: команда оболочки ассистента всё равно может обращаться к сети, как в любом чате с этим режимом. В dsh 0.2.0 и 0.2.1 инструменты расписания dsh видят только напоминания самого чата ассистента, а не автоматизации других чатов; начиная с dsh 0.2.2 они показывают и изменяют все запланированные задачи. chats_list не показывает архивированные и пустые чаты, чаты субагентов и сам чат ассистента; «ждёт вас» означает открытый запрос подтверждения, вопрос или проверку плана в выполняющемся чате. chat_read отдаёт сообщения пользователя и ответы агента (без вывода инструментов), не более 50 сообщений и примерно 24 000 символов. chat_archive отказывается архивировать чат, который ещё выполняется или у которого есть активные напоминания. Текст, который читает модель, всё же может ввести её в заблуждение: карточка подтверждения — последняя проверка, поэтому прочитайте её, прежде чем нажать **Разрешить один раз**.
303
+ - **Ассистент** — один чат для всех окон этого Mac. Он работает в режиме разрешений workspace-write: записывает файлы только в `~/Assistant`, а команда за пределами этой папки сначала спрашивает. Если переключить чат в режим без подтверждений (Полный доступ), dsh отклоняет каждое подтверждение, поэтому ассистент не может отправить сообщение в чат, начать, остановить или архивировать чат. Карточка подтверждения защищает только шесть инструментов: команда оболочки ассистента всё равно может обращаться к сети, как в любом чате с этим режимом. В dsh 0.2.0 и 0.2.1 инструменты расписания dsh видят только напоминания самого чата ассистента, а не автоматизации других чатов; начиная с dsh 0.2.2 они показывают и изменяют все запланированные задачи. chats_list не показывает архивированные и пустые чаты, чаты субагентов и сам чат ассистента; «ждёт вас» означает открытый запрос подтверждения, вопрос или проверку плана в выполняющемся чате. chat_read отдаёт сообщения пользователя и ответы агента (без вывода инструментов), не более 50 сообщений и примерно 24 000 символов. chat_archive отказывается архивировать чат, который ещё выполняется или у которого есть активные напоминания. Текст, который читает модель, всё же может ввести её в заблуждение: карточка подтверждения — последняя проверка, поэтому прочитайте её, прежде чем нажать **Разрешить один раз**. Параллельные темы используют инструмент субагентов dsh: в профиле или режиме разрешений без него остаётся старое поведение (одна тема за раз; следующее сообщение ждёт в очереди или направляет выполняющийся ход). Что считать долгой задачей, решает модель, поэтому и короткий вопрос может занять ход. Субагент каждой темы работает со своими токенами; при перезапуске dsh выполняющаяся тема останавливается (её результат не приходит). Результат приходит как новый ход чата ассистента, поэтому он ждёт, пока вы пишете посреди хода.
304
+ - **Ассистент отдельно от чатов** и **Только сообщения в чате ассистента** скрывают собственные строки dsh правилом стиля, которое находит их по разметке боковой панели и чата dsh (`data-row-key`, `data-chat-flow-kind`): если обновление dsh изменит эту разметку, чат ассистента снова появится в списке или снова появятся его рабочие шаги. Строки скрыты, а не удалены: навигация с клавиатуры по боковой панели dsh всё ещё может попасть на скрытую строку. **Ассистент всегда свободен** отклоняет каждый вызов инструмента в чате ассистента, если это не один из его коротких инструментов; тогда модель передаёт шаг субагенту, но сначала может попробовать отклонённый вызов, а это стоит одного шага модели. Пока карточка подтверждения ждёт вас, чат ассистента всё ещё считается занятым. Если в его последнем запросе нет инструмента субагентов (режим разрешений или профиль без него), правило ничего не делает. **Новости чатов от ассистента** запускает ход модели в чате ассистента для каждой пачки новостей, поэтому расходует токены; если включено **Мобильное подключение (iPhone)**, телефон может получить два уведомления об одном завершённом чате (от самого чата и от ассистента). Ожидающие новости теряются при перезапуске dsh. Функция видит только чаты на этом Mac.
300
305
  - **Приоритет сообщения после остановки** работает только после того, как вы остановили чат (или после хода с ошибкой, или когда вы открываете чат, у которого ещё есть очередь): сообщение, отправленное во время хода, по-прежнему ждёт в конце очереди. Оно обгоняет только ваши собственные сообщения в очереди: если в очереди ждёт раунд цели или ответ на вопрос, остаётся порядок dsh. Функция читает часть dsh, которая не является публичным API (завершается ли ещё остановленный ход); если обновление dsh её переименует, сообщение встанет первым только после завершения этого хода. Чаты субагентов сохраняют порядок dsh.
301
306
  - **Память проекта** принадлежит первой папке чата (папке проекта dsh): чат, который меняет папку командой `cd`, сохраняет память своего первого проекта, а та же папка, открытая по другому пути к тем же файлам, использует ту же память. Чат замораживает свой раздел памяти при запуске, поэтому заметка, сохранённая позже, появляется со следующего чата (`memory_recall` находит её сразу). Разбор сохраняет только то, что решила сохранить модель: он может пропустить факт или сохранить неверный; проверьте их в **Открыть память** и измените там, или правьте файлы вручную, когда dsh закрыт. **Открыть память** отправляет заметки выбранного проекта и глобальные заметки (все проекты, если выбрано «Все заметки»; не больше примерно 60 000 символов, остальные только считаются и не могут измениться в этом запросе) и ваш текст модели dsh по умолчанию, а не модели чата. Предпросмотр хранится на Mac 30 минут и до перезапуска dsh; если за это время разбор или агент изменят заметки, **Применить** откажет, и нужно запросить предпросмотр снова. **Применить** сохраняет все изменения предпросмотра или ни одного: если одно изменение нельзя сохранить (например, MEMORY.md заполнен), заметки остаются как были, и показывается причина. Каждый завершённый ход с вашим сообщением стоит одного вызова модели; неудачный вызов перечитывает те же сообщения после следующего хода. Чаты субагентов не разбираются. Идея и формат файлов взяты из [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus не использует его код и никогда не читает и не записывает собственную память DS Bot.
302
307
  - **История версий памяти** хранит 50 последних версий каждой памяти (каждого проекта и глобальной памяти); более старые удаляются. Версия хранит всю память проекта, а не одну заметку. **Восстановить** возвращает все файлы этой версии (включая темы) и отказывает, если память изменилась после открытия версии; память до восстановления становится новой версией, поэтому восстановление можно отменить. Пока переключатель выключен, новые версии не сохраняются и **Восстановить** отказывает; сохранённые версии остаются. Версий до появления этой функции нет: история начинается с первого сохранения после установки.
@@ -350,7 +355,9 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
350
355
 
351
356
  **Можно ли видеть все мои чаты в виде канбан-доски и начинать с неё новые?** Да, с функцией **Доска задач** (по умолчанию включена): откройте её на левой боковой панели. Каждый чат — это карточка в **В работе**, **На проверке** (он ждёт вас) или **Готово**. **Новая задача** открывает новый чат dsh в проекте, а доска возвращается, когда ваше первое сообщение отправлено; нажмите **Ответить** на оранжевой карточке, чтобы ответить, не открывая чат. **Очистить всё** в **Готово** сначала спрашивает и убирает с доски завершённые карточки, которые вы прочитали; **Отменить** и **Убранные (N)** возвращают их, а чаты остаются в dsh.
352
357
 
353
- **Можно ли завести личный чат-ассистент, который напоминает мне о делах и управляет моими другими чатами?** Да, с функцией **Ассистент** (по умолчанию выключена): включите её в Настройки → Composer Plus, затем нажмите **Ассистент** на левой боковой панели. Он создаёт напоминания с помощью запланированных задач dsh, ищет в интернете, показывает и читает ваши чаты, а отправляет сообщение в чат, начинает, останавливает или архивирует чат только после вашего подтверждения. Храните свой профиль в памяти его проекта, в теме "profil".
358
+ **Можно ли завести личный чат-ассистент, который напоминает мне о делах и управляет моими другими чатами?** Да, с функцией **Ассистент** (по умолчанию включена): нажмите **Ассистент** на левой боковой панели. Он создаёт напоминания с помощью запланированных задач dsh, ищет в интернете, показывает и читает ваши чаты, а отправляет сообщение в чат, начинает, останавливает или архивирует чат только после вашего подтверждения. Храните свой профиль в памяти его проекта, в теме "profil".
359
+
360
+ **Может ли ассистент не попадать в мой список чатов и работать как бот?** Да. **Ассистент отдельно от чатов** убирает его чат из списка на боковой панели и показывает его состояние в строке **Ассистент** (оранжевая точка, пока он ждёт вас). **Только сообщения в чате ассистента** скрывает его рабочие шаги. **Ассистент всегда свободен** заставляет его отдавать каждый долгий шаг фоновому субагенту, поэтому он отвечает сразу. **Новости чатов от ассистента** (по умолчанию выключено, расходует токены): ассистент сообщает вам, когда другой чат заканчивает работу, завершается с ошибкой или ждёт вас.
354
361
 
355
362
  **Может ли dsh создавать резервные копии моих чатов и настроек, как dsh-backup?** Да: **Настройки → Composer Plus → Резервное копирование → Создать копию сейчас**. Он записывает архив того же формата в ту же папку (`~/Desktop/dsh-backups`), поэтому архивы dsh-backup тоже показываются и восстанавливаются, а dsh-backup можно удалить. Чтобы копии создавались по расписанию, включите **Автоматическое резервное копирование**.
356
363
 
@@ -504,8 +511,10 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
504
511
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
505
512
  # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
506
513
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
- # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
514
+ # Assistant: on by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
515
  SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
516
+ # Assistant welcome card: shows above the input on the first open of the assistant chat, goes with the switch and with the first message, not in other chats
517
+ PLAYWRIGHT=/path/to/playwright node test/browser-assistant-welcome.mjs /path/to/dsh/lib/bin.js
509
518
  ```
510
519
 
511
520
  ```sh