dsh-composer-plus 1.23.0 → 1.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.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.23.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.24.1`.
33
33
 
34
34
  ## Recursos
35
35
 
@@ -75,6 +75,7 @@ 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>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). 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
79
  | **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> |
79
80
  | **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> |
80
81
  | **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> |
@@ -103,7 +104,7 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
103
104
  | **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> |
104
105
  | **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> |
105
106
  | **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> |
106
- | **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 outro Mac mostra o mesmo seletor no mesmo lugar: escolha **Este Mac** ali para voltar. 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> |
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> |
107
108
  | **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> |
108
109
  | **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> |
109
110
  | **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> |
@@ -198,6 +199,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
198
199
  - **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.
199
200
  - **Detalhamento do contexto:** a parte Host lê só o log do chat; nenhuma chamada ao modelo, nenhum arquivo do projeto.
200
201
  - **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.
201
203
  - **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.
202
204
  - **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.
203
205
  - **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.
@@ -224,7 +226,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
224
226
  - **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).
225
227
  - **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.
226
228
  - **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).
227
- - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.23.0`); veja a nota de instalação acima.
229
+ - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.24.1`); veja a nota de instalação acima.
228
230
  - **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.
229
231
  - **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.
230
232
  - **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.
@@ -258,7 +260,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
258
260
  - **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.
259
261
  - **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.
260
262
  - **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.
261
- - **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). A página do outro Mac só mostra o seletor quando esse Mac tem esta versão do Composer Plus ou uma mais recente. Com uma versão mais antiga, um botão **Voltar para este Mac** aparece no topo depois de alguns segundos. 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.
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.
262
264
  - 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.
263
265
  - **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.
264
266
  - **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).
@@ -294,6 +296,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
294
296
  - **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.
295
297
  - **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.
296
298
  - **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**.
297
300
  - **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.
298
301
  - **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.
299
302
  - **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.
@@ -347,6 +350,8 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
347
350
 
348
351
  **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.
349
352
 
353
+ **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".
354
+
350
355
  **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.
351
356
 
352
357
  **O dsh não inicia mais. Como restauro um backup?** Abra a pasta de backups (`~/Desktop/dsh-backups`) e clique duas vezes em `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Escolha `3) Restore a backup`, selecione um e digite `RESTORE`. Funciona sem o dsh.
@@ -389,7 +394,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
389
394
 
390
395
  **Perdi meu iPhone. Como impeço que ele acesse meu Mac?** Clique em **Conexão móvel** no canto inferior esquerdo da barra lateral e clique em **Remove** ao lado desse iPhone. A chave dele para de funcionar na hora; ele só volta com um novo pareamento que você aprove no Mac.
391
396
 
392
- **Como continuo um chat do meu outro Mac a partir deste?** No outro Mac, ative **Configurações → Composer Plus → Computadores remotos** e **Permitir que outros computadores abram este Mac**, clique em **Criar link de pareamento** e copie o link (envie o link para você mesmo, por exemplo pelo AirDrop ou pelo Notas). Neste Mac, ative também **Computadores remotos**, escolha **Adicionar um computador…** no seletor da barra lateral esquerda (à direita do nome da marca, acima de **Nova sessão**), cole o link, digite um **Nome** e clique em **Conectar**. Depois, clique em **Aprovar** no outro Mac. A partir daí, escolha esse computador no mesmo menu: ele ocupa esta janela. Escolha **Este Mac** no mesmo lugar para voltar. Enquanto isso, os chats deste Mac continuam em execução.
397
+ **Como continuo um chat do meu outro Mac a partir deste?** No outro Mac, ative **Configurações → Composer Plus → Computadores remotos** e **Permitir que outros computadores abram este Mac**, clique em **Criar link de pareamento** e copie o link (envie o link para você mesmo, por exemplo pelo AirDrop ou pelo Notas). Neste Mac, ative também **Computadores remotos**, escolha **Adicionar um computador…** no seletor da barra lateral esquerda (à direita do nome da marca, acima de **Nova sessão**), cole o link, digite um **Nome** e clique em **Conectar**. Depois, clique em **Aprovar** no outro Mac. A partir daí, escolha esse computador no mesmo menu: ele ocupa esta janela. Clique em **Voltar para este Mac** no mesmo lugar para voltar. Enquanto isso, os chats deste Mac continuam em execução.
393
398
 
394
399
  **Posso bloquear o Tether com o Face ID?** Sim: no Tether, ative "Settings → Privacy → Lock with Face ID". Depois disso, o Tether pede o Face ID (ou o código) quando abre e quando você volta para ele.
395
400
 
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
499
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
500
505
  # 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
501
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # 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
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
502
509
  ```
503
510
 
504
511
  ```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.23.0`.
32
+ > pnpm в dsh пропускает версии, которые вышли меньше 24 часов назад. Сразу после выпуска укажите версию: `dsh-composer-plus@1.24.1`.
33
33
 
34
34
  ## Функции
35
35
 
@@ -75,6 +75,7 @@ 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
79
  | **Память проекта** | <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> |
79
80
  | **История версий памяти** | <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> |
80
81
  | **Экспорт памяти в 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> |
@@ -103,7 +104,7 @@ dsh plugin --profile web add dsh-composer-plus
103
104
  | **Кнопки вариантов** | <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> |
104
105
  | **Язык приложения** | <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> |
105
106
  | **Мобильное подключение (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> |
106
- | **Удалённые компьютеры** | <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> |
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> |
107
108
  | **Автоматические обновления** | <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> |
108
109
  | **Фильтр «вкл./выкл.»** | <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> |
109
110
  | **Сообщить о проблеме** | <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> |
@@ -198,6 +199,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
198
199
  - **Продолжить в новом чате:** ничего не запускается, пока вы не нажмёте этот пункт. Затем Host-часть отправляет чат (так, как его читает Проверка цели: без рассуждений и шагов, убранных откатом) собственной модели чата и показывает заметку для передачи; новый чат создаёт только **Начать новый чат**. В проект ничего не записывается.
199
200
  - **Состав контекста:** Host-часть читает только журнал чата; без вызова модели и без файлов проекта.
200
201
  - **Доска задач:** доска показывает чаты 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, кроме запросов к модели и веб-поиска, который делает чат.
201
203
  - **Защищённые файлы:** список и переключатель хранятся в `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (файл доступен только владельцу). Проверка читает только путь каждого вызова файлового инструмента (и его реальный путь), но никогда не сам файл.
202
204
  - **Заблокированные команды:** правила и переключатель хранятся в `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (файл доступен только владельцу). Проверка читает только текст команды каждого вызова `bash` и `pwsh`; она ничего не запускает и ничего не отправляет.
203
205
  - **Ввод секрета:** значение уходит из карточки (или из Tether через шлюз, который не записывает содержимое запросов) на Host только в запросе ответа. Host записывает его в `$DSH_HOME/storages/dsh-composer-plus/secrets/<случайное имя>` (папка 0700, файл 0600); ничего не попадает в проект, журнал чата или результат инструмента. Host хранит значение в памяти, чтобы заменять его на `[secret]` в следующих результатах инструментов этого чата. Файл и эта копия удаляются в конце хода чата и при запуске dsh. Переключатель находится рядом, в `secrets.json`. Команда, которую агент запускает с этим файлом, может отправить значение туда, куда отправляет эта команда: в этом и состоит цель.
@@ -224,7 +226,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
224
226
  - **На строке чата нет метки ветки:** боковая панель не в режиме «Одним списком» (в режимах «По рабочей области» и «Дерево рабочих областей» ни одна строка чата не показывает метку), у чата не было хода с момента установки этой версии, его папка не является репозиторием git, или функция **Ветка Git в строках чатов** выключена. После обновления перезапустите dsh (ветку записывает Host-часть).
225
227
  - **Проверка цели сообщает, что тест завершился с кодом 127 или «not found»:** у dsh, запущенного из Finder или Dock, PATH может быть короче, чем в вашем терминале, поэтому он не находит `npm`, `pnpm` или `cargo`. Запустите dsh из терминала или задайте свою тестовую команду с полным путём в **Проверка цели** → **Изменить**. **Запустить сейчас** сразу показывает результат.
226
228
  - **Цель не закрывается, и агент продолжает работать:** **Проверка цели** нашла непройденный тест или недоделанную работу; строка под целью показывает причину (наведите указатель на результат, чтобы увидеть подробности). Исправьте причину или тестовую команду либо завершите цель сами командой `/goal` или через панель цели (это не проверяется).
227
- - **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.23.0`), см. примечание об установке выше.
229
+ - **Установка не удаётся сразу после выпуска:** укажите версию (`dsh-composer-plus@1.24.1`), см. примечание об установке выше.
228
230
  - **Кнопка «Создать копию сейчас» сообщает «Уже выполняется другое действие с резервными копиями»:** действие выполняется в другом окне dsh или в аварийной консоли (они используют общий файл блокировки `.composer-plus.lock` в папке резервных копий). Дождитесь его окончания. Если никакое действие не выполняется, блокировку закрытого процесса перехватит следующее нажатие.
229
231
  - **Аварийная консоль сообщает «dsh is running»:** сначала выйдите из dsh. Если dsh действительно закрыт, файл, названный в сообщении, остался после сбоя: удалите его и повторите попытку.
230
232
  - **После восстановления dsh не запускается или не хватает плагина:** пакеты плагинов профиля нужно установить заново. Аварийная консоль предлагает это после восстановления; или выполните `pnpm install` в каждой папке внутри `$DSH_HOME/profiles/`, которую она перечисляет. Секреты, которых не было в vault (другой компьютер), нужно ввести заново: консоль перечисляет их.
@@ -258,7 +260,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
258
260
  - **Подгонять карточку вопроса под окно** меняет только карточку вопроса dsh, а не карточку проверки плана. Она находит карточку по разметке dsh (`data-question-key`, `data-question-scroll`); если обновление dsh изменит эту разметку, карточка будет выглядеть так, как её рисует dsh. Высота карточки следует за окном, а не за чатом: в чате в узкой боковой панели высокая карточка всё ещё может выходить выше чата.
259
261
  - **Подогнать заголовок чата под окно** находит заголовок чата dsh по его сгенерированным именам классов (`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`), потому что dsh не даёт точки подключения для его раскладки. Если обновление dsh переименует их, заголовок показывается так, как его рисует dsh. В очень узкой колонке чата заголовок может занять две или три строки, и места над сообщениями становится меньше.
260
262
  - **Мобильное подключение** работает только в 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.
261
- - **Удалённые компьютеры** требуют Tailscale на обоих Mac и Composer Plus с включённой функцией на Mac, который вы открываете. Этот Mac не должен быть в режиме сна, и на нём должен работать dsh. Меню выбора компьютера видно, только когда левая боковая панель открыта (а не свёрнута до значков). Страница другого Mac показывает меню выбора, только если на том Mac стоит эта или более новая версия Composer Plus. Если версия старее, через несколько секунд вверху появляется кнопка **Вернуться к этому Mac**. Каждый открытый вами компьютер держит свою страницу в памяти, пока вы не выключите функцию или не перезапустите dsh. В настольном приложении страница другого Mac — встроенная страница: собственные сочетания клавиш dsh (например, новый чат) в ней не работают, и загрузка файлов, микрофон и уведомления там тоже не работают. Функция использует порт 19392 (на каждом Mac пускать другие компьютеры может только один dsh). Со страницы другого Mac меню выбора переключает только между компьютерами этого Mac: открыть третий 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 нельзя.
262
264
  - Ссылка на сеанс работает внутри чатов; щелчок по ней не открывает чат. Ссылка, созданная через **Копировать ссылку на сообщение**, открывает своё сообщение только в dsh 0.2.1 и новее и только из сообщения в чате (в dsh 0.2.0 нет правил для пользовательского текста, поэтому там ссылка копируется, но показывается как обычный текст). Сообщение, которое убрал откат или которое сжатие удалило из истории, загружаемой dsh, показать нельзя: ссылка тогда сообщает об этом. Кнопки 🔗 привязаны к строкам сообщений dsh; если обновление dsh изменит эту разметку, они не появятся.
263
265
  - **Отметить все как прочитанные** меняет собственные точки непрочитанного dsh через часть dsh, которая не является публичным API (список `completionUnread` в состоянии сеансов dsh). Если обновление dsh переименует его, пункт не появится. Пункт добавляется в меню «…» проекта в dsh, где нет места для плагинов; если dsh изменит это меню, пункт тоже не появится.
264
266
  - **Правка сообщения в очереди на месте** не меняет сообщение, которое тем временем начало отправляться, и не перезаписывает сообщение, которое тем временем изменилось (например, в Tether на iPhone): об этом сообщает уведомление. Для нового изображения нужна модель, которая принимает изображения (действуют собственные ограничения dsh на изображения), а новый файл должен загрузиться до того, как вы сможете сохранить. Изменять можно только свои сообщения в очереди: раунд цели или ответ на вопрос в очереди изменить нельзя. После обновления плагина сразу работает только правка текста: перезапустите dsh, прежде чем сохранять сообщение с изображениями или файлами (Host-часть загружается при запуске).
@@ -294,6 +296,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
294
296
  - **Пакет навыка для турецкого** устанавливает сторонний навык: его правила приходят из репозитория автора на GitHub, а не из Composer Plus, и новая версия используется со следующей ежедневной проверки без нашего просмотра. Проверка доказывает, что файлы — те, которые GitHub перечисляет для этого коммита, но не то, что правила хороши. Когда загружать навык, решает модель (вы также можете вызвать его по имени); правила относятся только к турецким текстам. Host-часть использует язык, о котором браузер сообщил последним: если два браузера используют разные языки, действует более новый. Без входа GitHub разрешает 60 запросов к API в час; при отказе проверка сохраняет установленную копию и показывает причину в настройках.
295
297
  - **Распутать кодовую базу** содержит фиксированную копию навыка (caldoai/skills, коммит f3cf477): изменение в оригинале приходит только с новой версией Composer Plus. Навык выполняет долгую цель, которая может изменить много файлов, а его субагенты и проверки тратят много токенов. Там, где у проекта нет тестов, он может незаметно изменить поведение: запускайте его в отдельной ветке и читайте diff перед слиянием. Навык с тем же именем в проекте, в своей папке навыков или в `~/.dsh/skills` заменяет его. Пока переключатель выключен, `/untangle-codebase` уходит модели как обычный текст.
296
298
  - **Доска задач** показывает чаты, которые 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 отказывается архивировать чат, который ещё выполняется или у которого есть активные напоминания. Текст, который читает модель, всё же может ввести её в заблуждение: карточка подтверждения — последняя проверка, поэтому прочитайте её, прежде чем нажать **Разрешить один раз**.
297
300
  - **Приоритет сообщения после остановки** работает только после того, как вы остановили чат (или после хода с ошибкой, или когда вы открываете чат, у которого ещё есть очередь): сообщение, отправленное во время хода, по-прежнему ждёт в конце очереди. Оно обгоняет только ваши собственные сообщения в очереди: если в очереди ждёт раунд цели или ответ на вопрос, остаётся порядок dsh. Функция читает часть dsh, которая не является публичным API (завершается ли ещё остановленный ход); если обновление dsh её переименует, сообщение встанет первым только после завершения этого хода. Чаты субагентов сохраняют порядок dsh.
298
301
  - **Память проекта** принадлежит первой папке чата (папке проекта 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.
299
302
  - **История версий памяти** хранит 50 последних версий каждой памяти (каждого проекта и глобальной памяти); более старые удаляются. Версия хранит всю память проекта, а не одну заметку. **Восстановить** возвращает все файлы этой версии (включая темы) и отказывает, если память изменилась после открытия версии; память до восстановления становится новой версией, поэтому восстановление можно отменить. Пока переключатель выключен, новые версии не сохраняются и **Восстановить** отказывает; сохранённые версии остаются. Версий до появления этой функции нет: история начинается с первого сохранения после установки.
@@ -347,6 +350,8 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
347
350
 
348
351
  **Можно ли видеть все мои чаты в виде канбан-доски и начинать с неё новые?** Да, с функцией **Доска задач** (по умолчанию включена): откройте её на левой боковой панели. Каждый чат — это карточка в **В работе**, **На проверке** (он ждёт вас) или **Готово**. **Новая задача** открывает новый чат dsh в проекте, а доска возвращается, когда ваше первое сообщение отправлено; нажмите **Ответить** на оранжевой карточке, чтобы ответить, не открывая чат. **Очистить всё** в **Готово** сначала спрашивает и убирает с доски завершённые карточки, которые вы прочитали; **Отменить** и **Убранные (N)** возвращают их, а чаты остаются в dsh.
349
352
 
353
+ **Можно ли завести личный чат-ассистент, который напоминает мне о делах и управляет моими другими чатами?** Да, с функцией **Ассистент** (по умолчанию включена): нажмите **Ассистент** на левой боковой панели. Он создаёт напоминания с помощью запланированных задач dsh, ищет в интернете, показывает и читает ваши чаты, а отправляет сообщение в чат, начинает, останавливает или архивирует чат только после вашего подтверждения. Храните свой профиль в памяти его проекта, в теме "profil".
354
+
350
355
  **Может ли dsh создавать резервные копии моих чатов и настроек, как dsh-backup?** Да: **Настройки → Composer Plus → Резервное копирование → Создать копию сейчас**. Он записывает архив того же формата в ту же папку (`~/Desktop/dsh-backups`), поэтому архивы dsh-backup тоже показываются и восстанавливаются, а dsh-backup можно удалить. Чтобы копии создавались по расписанию, включите **Автоматическое резервное копирование**.
351
356
 
352
357
  **dsh больше не запускается. Как восстановить резервную копию?** Откройте папку резервных копий (`~/Desktop/dsh-backups`) и дважды щёлкните `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Выберите `3) Restore a backup`, выберите копию и введите `RESTORE`. Это работает без dsh.
@@ -389,7 +394,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
389
394
 
390
395
  **Я потерял iPhone. Как не дать ему подключаться к моему Mac?** Нажмите **Мобильное подключение** внизу слева на боковой панели и нажмите **Remove** рядом с этим iPhone. Его ключ сразу перестаёт работать; вернуться он сможет только после нового сопряжения, которое вы подтвердите на Mac.
391
396
 
392
- **Как продолжить на этом Mac чат с другого моего Mac?** На другом Mac включите **Настройки → Composer Plus → Удалённые компьютеры** и **Разрешить другим компьютерам открывать этот Mac**, нажмите **Создать ссылку для сопряжения** и скопируйте ссылку (отправьте её себе, например через AirDrop или «Заметки»). На этом Mac тоже включите **Удалённые компьютеры**, выберите **Добавить компьютер…** в меню выбора на левой боковой панели (справа от названия приложения, над **Новый сеанс**), вставьте ссылку, введите **Имя** и нажмите **Подключить**. Затем нажмите **Одобрить** на другом Mac. После этого выбирайте этот компьютер в том же меню: он займёт это окно. Чтобы вернуться, выберите **Этот Mac** в том же месте. Тем временем чаты этого Mac продолжают работать.
397
+ **Как продолжить на этом Mac чат с другого моего Mac?** На другом Mac включите **Настройки → Composer Plus → Удалённые компьютеры** и **Разрешить другим компьютерам открывать этот Mac**, нажмите **Создать ссылку для сопряжения** и скопируйте ссылку (отправьте её себе, например через AirDrop или «Заметки»). На этом Mac тоже включите **Удалённые компьютеры**, выберите **Добавить компьютер…** в меню выбора на левой боковой панели (справа от названия приложения, над **Новый сеанс**), вставьте ссылку, введите **Имя** и нажмите **Подключить**. Затем нажмите **Одобрить** на другом Mac. После этого выбирайте этот компьютер в том же меню: он займёт это окно. Чтобы вернуться, нажмите **Вернуться к этому Mac** в том же месте. Тем временем чаты этого Mac продолжают работать.
393
398
 
394
399
  **Можно ли заблокировать Tether с помощью Face ID?** Да: в Tether включите «Settings → Privacy → Lock with Face ID». После этого Tether запрашивает Face ID (или код-пароль) при открытии и при возврате в приложение.
395
400
 
@@ -499,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
499
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
500
505
  # 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
501
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # 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
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
502
509
  ```
503
510
 
504
511
  ```sh