Releases: Dspofu/Pofu-Code-Studio
Release list
v1.5.2
v1.5.2 - Update
Suporte a MCP, um agente bem mais rápido em projetos grandes e a correção do ícone em branco na barra de tarefas.
Novidades
- Servidores MCP: conecte ferramentas de qualquer servidor MCP em Ajustes → Ferramentas, colando o mesmo JSON usado no Claude Desktop, Cursor e Cline. Funciona com servidores locais e remotos, mostra o estado e quanto cada servidor custa em tokens por mensagem, e pede confirmação no modo manual.
- Estrutura do código (
list_definitions): o agente vê funções, classes e métodos de um arquivo ou pasta, com a linha de cada um, sem precisar ler tudo. - Arquivo grande não é mais despejado inteiro: ao abrir um arquivo de código grande sem pedir um trecho, o agente recebe a estrutura e lê só a parte que precisa.
- Acerto de cache na tela: com llama.cpp, abaixo de cada resposta aparece quanto do contexto foi reaproveitado e a velocidade de leitura.
Desempenho
- Achar uma função num arquivo de 230 mil caracteres caiu de 182 s para 12 s, com 89% menos tokens.
- Trava contra o agente preso repetindo a mesma chamada com o mesmo resultado.
- Quando o servidor recusa por excesso de contexto, o app compacta mais e tenta de novo, em vez de encerrar a resposta.
- Estimativa de tokens calibrada pelo que o servidor informa, e reserva de contexto mais precisa: um limite de resposta muito alto não espreme mais o histórico.
Correções
- Agente usando o terminal para ler arquivos grandes: a v1.5.1 removeu instruções que pareciam repetidas, e o modelo voltou a usar
ls,wcegrep. As instruções voltaram. - Ícone branco na barra de tarefas do Windows: depois de mover a pasta do app, o atalho continuava apontando o ícone para a pasta antiga, e reinstalar não resolvia. O app agora repara o atalho sozinho ao abrir.
Validação
63 testes unitários e 51 de integração, mais testes com um modelo real (Qwen 27B local): leitura de arquivos de 5 MiB e 20 MiB, edição em lote, ferramenta MCP e busca em arquivo grande, todos sem uso do terminal.
Full Changelog: v1.5.1...v1.5.2
v1.5.1
v1.5.1 - Update
Um agente que gasta menos tokens, erra menos ao editar arquivos e não se perde mais em conversas reeditadas.
Novidades
- Várias edições de uma vez: o agente altera vários trechos de um arquivo numa única chamada. Se uma das trocas falhar, nenhuma é aplicada.
- Edição tolerante a espaços: diferenças só de indentação ou de espaço em branco não travam mais a edição, e o texto novo segue a indentação do arquivo. Trechos apenas parecidos nunca são alterados.
- Suas alterações protegidas: se o arquivo mudou depois que o agente o leu (você editou, um formatador rodou), ele relê antes de sobrescrever.
- Caminho sugerido: quando um arquivo não é encontrado, o agente recebe o caminho provável em vez de sair procurando.
- Busca mais enxuta: a busca pode devolver só os arquivos que contêm o termo, ou só a contagem.
- Comandos com aspas e scripts: os argumentos vão direto para o programa, sem interpretação do shell e sem arquivos temporários.
Menos tokens por requisição
- Definições das ferramentas e instruções do agente 19% menores, em toda requisição.
- Resultados de busca 51% a 61% menores; só a lista de arquivos, 99%.
- Reler um arquivo que não mudou não reenvia o conteúdo (97% a menos).
- Saída do terminal sem cores, barras de progresso e linhas repetidas.
Correções
- Agente lendo arquivos pelo terminal: depois de editar ou regenerar uma mensagem antiga, todo resultado de ferramenta chegava ao modelo como "compactado", e ele passava a ler arquivos pelo terminal. Conversas afetadas se corrigem sozinhas ao atualizar.
- Ícone em branco no atalho do Windows: a descrição do app era longa demais para o atalho e corrompia o caminho do ícone. Instalar esta versão recria o atalho corretamente.
Validação
50 testes unitários e 46 de integração, cobrindo edição em lote, arquivo alterado em disco, releitura sem mudanças, os novos formatos de busca e listagem, a compactação após editar mensagens e o ícone do atalho.
Full Changelog: v1.5.0...v1.5.1
v1.5.0
v1.5.0 - Update
Mais controle sobre sua IA, ferramentas aprimoradas e uma interface renovada com a identidade Pofu.
Novidades
- Vários provedores: salve diferentes conexões e alterne entre elas, mantendo modelo e nível de raciocínio por provedor.
- Novo seletor de thinking: barra horizontal com três efeitos visuais, navegação por teclado e suporte a Muito alto (
xhigh), separado de Máximo (max). - Comandos
/: acesse ações do Studio diretamente pelo compositor. - Menções
@arquivoem azul: identifique visualmente os arquivos mencionados na mensagem. - Avisos de atualização: ao iniciar, o app notifica apenas quando existe uma versão estável mais recente. As dicas aleatórias foram removidas.
Melhorias nas ferramentas
- Leitura de arquivos grandes com menos chamadas e continuação sem perda de conteúdo.
- Recuperação de resultados extensos sem repetir a operação original.
- Busca direta em trechos distantes, inclusive em arquivos com uma única linha.
- Melhor tratamento de níveis de raciocínio recusados pelo servidor.
Validação
Testes com arquivos de 12 mil linhas, 5 MiB e 20 MiB, verificando a integridade do conteúdo. Também foram validados provedores, comandos, ferramentas, notificações e acessibilidade das animações.
What's Changed
Full Changelog: v1.4.2...v1.5.0
v1.4.2
Leitura que não empurra o agente para o terminal
O agente largava a ferramenta de leitura e passava a ler arquivo por comando de
shell. Não era manha do modelo — a própria ferramenta mandava.
Quando uma linha era longa demais para caber na janela de leitura (bundle
minificado, JSON numa linha só), o read_file avisava que o resto tinha sido
cortado e sugeria buscar o que faltou com cut/sed no terminal, porque não
havia como pedir aquele pedaço à ferramenta. Medido com modelo real num arquivo
de uma linha de 90 mil caracteres: duas leituras e ele migrou para
execute_command, errando o comando no caminho e gastando um turno com a exceção.
O que mudou
read_filepagina dentro da linha, comchar_offset, e o resultado entrega
o número exato para continuar. Não há mais trecho de arquivo fora do alcance da
ferramenta.search_filesdevolve a coluna do casamento — que é ochar_offsetpara
pular direto ao trecho — e o recorte mostrado passou a ser centrado no que você
procurou. Antes era cortado a partir do começo da linha, então numa linha longa
o "resultado" podia não conter nem o termo buscado.- Caminho absoluto funciona. O agente recebe o caminho do projeto no prompt e
costuma repeti-lo; antes isso virava um caminho duplicado e a leitura respondia
"arquivo não encontrado". - Acabou o bloqueio falso na escrita. Ler
./arquivo.tse depois escrever
arquivo.tseram tratados como arquivos diferentes, e a trava acusava "arquivo
não lido" logo depois da leitura. - Resultados grandes encolhem descartando itens inteiros, em vez de cortar o
texto no meio. O corte antigo partia o JSON dentro de um objeto: com 60 achados
de busca, 44 se perdiam e o que sobrava nem era analisável. list_filesganhou teto. Era o único resultado de ferramenta sem limite:
294 entradas de umnode_modulescustavam ~3,5 mil tokens numa chamada só.
Custo
Mesma tarefa, mesmo modelo, contexto de 8k:
| Antes | Depois | |
|---|---|---|
| Requisições | 7 | 3 |
| Tokens | 39.264 | 10.696 |
| Leituras pelo terminal | 2 | 0 |
Leitura de arquivo comum não mudou — mesma janela, mesmo custo. O ganho está nos
casos que antes viravam vaivém.
Sem mudança de configuração: quem atualiza não precisa mexer em nada.
Full Changelog: v1.4.1...v1.4.2
v1.4.1
v1.4.1 - Fix
Alterações
- Visão em anexo do usuário — imagem colada (Ctrl+V) ou arrastada agora chega ao modelo:
o anexo segue o mesmo caminho do print docapture_page(bytes emuserData, data URL no
shotCache) e vira blocoimage_urlquando o modelo é multimodal.- Medido com proxy registrando o payload, mesma pergunta sobre a mesma imagem:
antes → 32 requisições (sem os pixels, o modelo instalou Pillow, escreveu scripts de
recorte/cor e improvisou um OCR); depois → 1 requisição (olhou a imagem). - A imagem continua visível após fechar e reabrir o app (
hydrateShotsrelê do disco). - Quando o modelo não é multimodal — ou "Enviar prints para o modelo" está desligado —
o chip avisa e o texto do anexo informa ao modelo que ele não recebe imagens,
em vez de deixá-lo procurando um jeito.
- Medido com proxy registrando o payload, mesma pergunta sobre a mesma imagem:
- Colar imagem (Ctrl+V) vira anexo — handler
pasteno compositor, mesmo fluxo do
drag-and-drop e do botão 📎; colar texto segue o comportamento padrão. - Miniatura da imagem anexada —
makeThumb()reduz a 140px via canvas e mostra a
thumbnail no chip de input (34px) e na bolha da mensagem (46px). - Nível de raciocínio recusado é adaptado automaticamente — se o servidor rejeita
maxe lista os aceitos ("Supported types are xhigh, medium, low"), o app reenvia com o
mais próximo na escalalow < medium < high < xhigh < maxe o menu passa a refletir os
níveis aceitos. - Versão 1.4.0 → 1.4.1 em
package.json,package-lock.jsoneREADME.md. - Removido
TASKS.md— todas as pendências listadas nele foram concluídas.
What's Changed
Full Changelog: v1.4.0...v1.4.1
v1.4.0
V1.4.0 - Feat & Rename
O app agora se chama Pofu Code Studio
Antes era Pofuserver Coder Studio. O nome mudou em toda a interface, nos instaladores, nos metadados e nas URLs do repositório (que agora é Dspofu/Pofu-Code-Studio). O package-lock.json entrou no controle de versão junto, para o build de quem clona ser reproduzível.
O agente pergunta quando trava de verdade
Quando o pedido tem duas leituras que levam a trabalhos diferentes, o agente para e pergunta em vez de escolher no escuro e refazer depois. A ferramenta é ask_user: o card mostra as opções que o modelo propôs (dá para marcar uma, ou várias quando ele pede), você escreve uma resposta própria no campo de texto, ou Pula.
Pular é uma resposta válida: o agente segue com o que já sabe e declara qual suposição adotou, em vez de ficar preso. O turno fica parado até você responder, e o Parar fecha o card junto com o resto.
As instruções pedem que ela seja usada com parcimônia — só quando a resposta muda o trabalho, nunca para o que dá para descobrir lendo o projeto, e sempre depois de já ter feito tudo que não dependia da resposta.
Skills e instruções suas
Em Ajustes → Instruções do agente há um campo de system prompt: o que você escrever entra no prompt a cada mensagem. Por padrão é somado às instruções de fábrica; o interruptor Substituir o prompt padrão descarta as de fábrica e deixa só o seu — inclusive as regras de ler antes de sobrescrever e de validar antes de dizer que terminou, então é escolha para quem vai reescrever esse comportamento.
Logo abaixo ficam as skills: arquivos de instrução (o SKILL.md do Claude Code e parecidos) que você importa e liga por chave. O name e o description saem do frontmatter YAML quando existe; sem ele, o app usa o título # e a primeira linha de texto. Reimportar o mesmo arquivo atualiza a skill em vez de duplicar, que é o fluxo de quem está escrevendo uma.
Cada linha mostra o custo em tokens por mensagem, porque é isso que uma skill ativa é: conteúdo somado ao prompt em toda requisição — não um anexo que se lê uma vez. Skill desligada não entra no prompt.
O nível de raciocínio sai do servidor, não de um palpite
Ao escolher o modelo, o app pergunta ao endpoint o que ele aceita — as capabilities do /v1/models, o chat_template do /props (llama.cpp) e o /api/show (Ollama) — e só mostra os níveis confirmados; o rodapé do menu diz de onde veio a informação.
- Modelo com raciocínio → os níveis que o servidor anuncia
- Modelo sem modo de pensar → só Padrão
- Endpoint que não responde nada disso (vLLM, OpenAI, gateways) → todos os níveis, porque silêncio não é prova de que não suporta
Um nível salvo que o servidor novo não aceita volta para Padrão sozinho, em vez de derrubar a primeira mensagem com um HTTP 400.
O agente fala a sua língua
As instruções de fábrica, as descrições das ferramentas e as mensagens de erro que voltam das tool calls passaram a ser escritas em inglês — é a língua em que os modelos foram treinados a seguir instrução e a chamar ferramenta. A interface continua em português, e o agente responde na língua em que você escrever, em vez de ficar preso ao pt-BR.
Edições de arquivo mais seguras
Três correções no edit_file, o jeito padrão de mexer num arquivo existente:
- CRLF: a busca é refeita na quebra de linha do arquivo quando o trecho veio sem o
\r— antes, num arquivo Windows a edição exata nunca casava e o modelo ficava num vaivém de reler. $$e afins: a substituição usasplit/joinem vez dereplace, que expandia$&,$$,$1dentro do texto — umnew_textcom$$var(PHP, sed, LaTeX) era gravado corrompido e ainda voltava sucesso.- Arquivo travado: erro de escrita (somente-leitura, aberto em outro programa) volta com uma dica, em vez da exceção crua.
Instalação — baixe o instalador da sua plataforma abaixo:
| Sistema | Arquivo |
|---|---|
| Windows | .exe (NSIS) |
| Debian / Ubuntu | .deb |
| Fedora | .rpm |
Full Changelog: v1.3.1...v1.4.0
v1.3.1
V1.3.1 - Fix & Feat
Fale com o agente no meio da resposta
O campo de texto não trava mais enquanto o agente trabalha. O que você escrever entra numa fila, aparece como chip acima do compositor e é entregue ao modelo na próxima virada de turno — assim que a ferramenta em execução terminar, sem abortar nada e sem perder o que já foi feito.
Serve para corrigir o rumo no meio do caminho ("na verdade mexe na outra pasta") em vez de esperar o fim ou parar tudo e recomeçar.
- Campo vazio, o botão volta a ser parar; com algo escrito, ele manda para a fila
- Um chip pode ser retirado da fila enquanto não foi entregue
- Mensagem sua reinicia a trava de iterações — o limite existe para barrar o agente em looping sozinho, não a conversa que você está conduzindo
A mensagem não é injetada na hora de propósito: ela cairia no meio de um par tool_call/tool e o servidor recusaria a requisição inteira por causa da chamada órfã.
O agente escrevendo um arquivo deixa de parecer travado
Escrever um arquivo grande é a parte mais demorada de um turno, e era exatamente quando nada chegava à tela: o texto da resposta já tinha acabado, o resultado da ferramenta ainda não existia. Dezenas de segundos parados, indistinguíveis de um travamento.
Agora o card aparece assim que o modelo começa a ditar a chamada e mostra o andamento ao vivo:
- arquivo de destino
- linhas e bytes já recebidos
- as últimas linhas do que está sendo escrito
- título da janela acompanhando ("escrever arquivo: src/x.ts")
O mesmo card vira o card definitivo quando a chamada fecha, sem piscar.
Ícone certo na barra de tarefas e nas notificações (Windows)
O app instalado mostrava o ícone do Electron na barra de tarefas e nas notificações, mas o ícone certo na janela. Não era defeito do .ico: no Windows a janela lê o ícone embutido no .exe, enquanto a barra de tarefas e os toasts resolvem por AppUserModelID → atalho do Menu Iniciar.
Como o app usava o mesmo AUMID em desenvolvimento, e o toast do Windows exige um atalho carregando esse ID, o Electron criava um atalho apontando para o electron.exe do node_modules. Ele vencia a resolução contra o atalho do instalador (por ser mais antigo) e levava o ícone junto. Em desenvolvimento o AUMID agora é outro, e as duas coisas param de se atropelar.
Junto: o caminho do ícone da janela estava quebrado desde a mudança do build para out/ (opção ignorada em silêncio), e a notificação de abertura passou a levar o ícone próprio em vez de depender do atalho.
Se a barra de tarefas ainda insistir no ícone antigo depois de atualizar, é só o cache de ícones do Windows — reiniciar o explorer resolve. Validado e testado, a versão anterior tambem precisou de um restart para ficar o icone certo
Instalação — baixe o instalador da sua plataforma abaixo:
| Sistema | Arquivo |
|---|---|
| Windows | .exe (NSIS) |
| Debian / Ubuntu | .deb |
| Fedora | .rpm |
Full Changelog: v1.3.0...v1.3.1
v1.3.0
v1.3.0
A versão mais completa até agora: o app agora checa sua própria atualização (aba Visão geral → "Verificar"), o build foi reorganizado, as ferramentas do agente ficaram mais confiáveis e o instalador para Fedora chegou.
✨ Novidades
Verificação de atualização no app
Um novo card "Atualização" na aba Visão geral consulta o último release publicado neste repositório e avisa se há versão mais nova, com link direto para a página do release. A checagem é manual (botão "Verificar") de propósito — para não consumir o rate limit da API anônima do GitHub toda vez que você abre o app.
"Informação do produto" expandida
A aba Visão geral agora mostra Autor, Licença, Repositório (clicável) e o card de atualização, além da versão e do nome.
Raciocínio: novo nível "Máximo"
O menu de raciocínio ganhou o nível max (o mais alto aceito pela API do OpenAI), e as dicas agora mostram exatamente o que cada nível envia ao servidor (reasoning_effort: low/medium/high/max).
🔧 Ferramentas do agente
execute_command: comando rápido e silencioso (ex.:git statusnum disco lento) agora devolve o resultado direto — antes era promovido a "servidor ocioso" à toa e exigia uma leitura extra. O detector de servidor só considera um processo ocioso após ele já ter impresso algo.search_files: agora informa o total de ocorrências (totalFound) mesmo quando a lista de resultados é limitada — dá para saber se a busca precisa ser refinada.read_file: a descrição dolimitdeixa claro que a janela é limitada por um orçamento de caracteres derivado do contexto do modelo.
🐧 Fedora
Novo instalador .rpm para Fedora, gerado automaticamente pelo CI junto com o .deb e o .exe. As dependências declaradas são as do Fedora (gtk3, libnotify, nss, libXtst, libXScrnSaver, at-spi2-core, libuuid, xdg-utils) — sem o at-spi2-core e o libuuid o app não abre em instalações enxutas do Fedora.
Instalar:
dnf install pofuserver-coder-studio-1.3.0-1.x86_64.rpm📦 Instaladores
- Windows:
.exe(instalador NSIS) - Ubuntu/Debian:
.deb - Fedora:
.rpm
🏗️ Por baixo dos panos
- Build reorganizado: fonte em
src/, saída emout/(o.jsgerado não polui mais a pasta de código-fonte). - Notificação de dica de vibe coding agora aparece em todas as plataformas (antes só no macOS).
- O "pingo" da sidebar exibe a versão no tooltip, e a lixeira dos recentes finalmente funciona.
What's Changed
- feat: build separado (out/), ferramentas do agente, UI expandida e release para Fedora by @Dspofu in #6
Full Changelog: v1.2.0...v1.3.0
v1.2.0
v1.2.0 — Raciocínio longo sem travar, e mais controle
Corrigido
Pico de memória durante raciocínio longo. O bloco de raciocínio era reescrito
por inteiro a cada token que chegava. Como innerText recria os nós de texto e o
scroll logo em seguida força um reflow síncrono, o custo crescia com o quadrado do
tamanho do texto — num raciocínio realmente longo o app inchava e a interface
parava de responder até o fim da geração.
Agora só o trecho novo é anexado, uma vez por quadro, e o bloco exibido tem um teto
de 200 mil caracteres. De quebra, o título da janela deixou de ser reenviado ao
processo principal a cada token.
Medido com o app real, mesmo fluxo de 15 mil tokens: antes a interface congelava e
não voltava; agora termina normalmente com cerca de 5 MB de variação de memória.
Novo
Nível de raciocínio ajustável (Configurações → Ajustes). Dá para pedir que o
modelo pense mais, menos ou nada:
| Nível | O que é enviado ao servidor |
|---|---|
| Padrão do modelo | nada — funciona em qualquer servidor |
| Desligado | enable_thinking: false + /no_think no prompt |
| Baixo / Médio / Alto | reasoning_effort: low | medium | high |
O padrão não acrescenta campo nenhum à requisição de propósito: reasoning_effort
é extensão recente e servidor antigo recusa o que não conhece. Se um nível der erro
de requisição, volte para o padrão. Quem já usava a opção "desativar raciocínio" é
migrado automaticamente para Desligado.
Troca rápida da pasta segura. O botão de pasta no cabeçalho agora abre um menu
com a pasta atual, as usadas recentemente e a opção de escolher outra. Alternar
entre projetos virou um clique, sem passar pelo diálogo do sistema toda vez. Quem
já tem chats abertos encontra as pastas deles já listadas.
Atualizando
Basta instalar por cima. Suas conversas, configurações e histórico são preservados.
Full Changelog: v1.1.0...v1.2.0