Skip to content

Commit 7be6789

Browse files
authored
Merge pull request #9 from httpsphl/feat/headless-chat
feat: headless bots with a real chat (M4.1)
2 parents 47e2d64 + 8273427 commit 7be6789

138 files changed

Lines changed: 8592 additions & 4054 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎CLAUDE.md‎

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ Este projeto é implementação própria. Não copie nem adapte código, testes,
1717
```
1818
crates/botloft-core tipos de domínio, IDs, envelope, tipos do protocolo (exportados via ts-rs)
1919
crates/botloft-store SQLite, migrations em migrations/NNNN_nome.sql
20-
crates/botloftd daemon: rpc, supervisor, runtime, terminal, courier, tools, hooks, platform
21-
app/ Tauri v2 + React 19 + TS strict + Tailwind v4 + Zustand + xterm.js
22-
docs/ spec e ADRs
20+
crates/botloftd daemon: rpc, supervisor, runtime, chat, courier, tools, platform
21+
app/ Tauri v2 + React 19 + TS strict + Tailwind v4 + Zustand
22+
docs/ spec e ADRs (docs/adr/0001: bots headless com chat)
2323
```
2424

2525
## Comandos
@@ -50,31 +50,29 @@ Em dev, use `$env:BOTLOFT_HOME = "$PWD\.dev\home"` (caminho absoluto) no daemon
5050
- Código, identificadores, comentários, commits e README em **inglês**. Docs em `docs/` podem ser em português.
5151
- Arquivos com no máximo **~300 linhas**. Passou disso, divida por responsabilidade.
5252
- Erros: `thiserror` nos crates de biblioteca, `anyhow` só no binário.
53-
- IDs são ULID com prefixo (`crw_`, `bot_`, `msg_`, `dlv_`, `tsk_`). Tempo em ms Unix.
53+
- IDs são ULID com prefixo (`crw_`, `bot_`, `msg_`, `dlv_`, `tsk_`, `cht_`, `apr_`, `att_`). Tempo em ms Unix.
5454
- Tudo que é específico de Windows fica em `crates/botloftd/src/platform/`. O resto do daemon não chama Win32 direto.
5555
- A UI depende só da interface `BotloftApi` (`app/src/lib/api.ts`). Testes de componente usam `FakeBotloft`.
5656
- Nunca edite `app/src/lib/protocol.gen.ts` à mão.
5757
- Commits pequenos, no formato Conventional Commits (`feat(courier): ...`).
5858

5959
## Windows: armadilhas conhecidas
6060

61-
- O inbox do Claude Code no Windows é um **named pipe** criado pelo próprio Claude Code. O daemon é cliente. A primeira linha tem que ser o auth com `CLAUDE_CODE_MESSAGING_TOKEN`, senão a conexão é descartada. Abra o pipe só com a mensagem pronta.
62-
- Hooks usam **exec form** (`"args": [...]`) chamando `botloftd.exe hook <evento>`. Nada de hook em bash ou PowerShell. O subcomando sai sempre com 0 e nunca escreve no stdout.
63-
- Só o `claude.exe` nativo roda. O `claude.cmd` do npm é recusado: passar por `cmd.exe` estraga o quoting na PTY.
64-
- ConPTY não tem fd para `poll`: leitura da PTY em thread dedicada + canal. Ao fim do processo, feche o pseudoconsole, senão a leitura nunca vê EOF.
65-
- O ConPTY do `portable-pty` (com `PSEUDOCONSOLE_INHERIT_CURSOR`) manda `ESC[6n` ao iniciar e trava o filho até a resposta. O daemon responde `ESC[1;1R` à primeira consulta.
61+
- Cada bot é `claude -p` com `stream-json` no stdin e no stdout (spec 7.4, 8, 9.2). O processo fica calado até a primeira mensagem; fechar o stdin o encerra. O formato de entrada não é documentado: qualquer mudança passa por teste real e vai para a seção 19.
62+
- Bots rodam com `--setting-sources project,local` e `--strict-mcp-config`: nada de hooks, skills, modo de permissão ou MCP pessoais do dono. Aprovações passam pela tool `permission_prompt` do nosso MCP.
63+
- Servidor MCP por HTTP: o Claude Code aborta a request em 60 s e a chamada em 5 min sem resposta, a menos que o `mcp.json` tenha `timeout` no servidor. A aprovação depende disso.
64+
- Só o `claude.exe` nativo roda. O `claude.cmd` do npm é recusado: passar por `cmd.exe` estraga o quoting dos argumentos.
6665
- O bot recebe o ambiente padrão do usuário (`CreateEnvironmentBlock`), nunca o do daemon: em dev o daemon herda variáveis da sessão do Claude Code (`CLAUDE_CODE_MESSAGING_SOCKET`, `ANTHROPIC_BASE_URL`...).
6766
- PATH real pode ter aspas soltas. Separe só por `;`; `std::env::split_paths` trata aspas como agrupamento e engole o resto.
68-
- Numa sessão interativa, os hooks só rodam depois de aceitar a confiança da pasta. Teste manual de bot novo começa pelo diálogo de confiança no terminal.
69-
- Todo processo de bot entra num Job Object com kill-on-close.
67+
- Todo processo de bot entra num Job Object com kill-on-close e roda sem console (`CREATE_NO_WINDOW`).
7068
- Permissão de arquivo é ACL (SID do usuário atual), não modo Unix.
7169
- Estado em `%LOCALAPPDATA%`, nunca `%APPDATA%` (roaming).
7270
- Cuidado com o limite de 260 caracteres em caminhos de workspace.
7371

7472
## Segurança e privacidade
7573

7674
- Daemon só em `127.0.0.1`.
77-
- Nunca logar token, corpo de mensagem ou saída de terminal em nível `info` ou acima. Bots podem lidar com dado pessoal e de saúde.
75+
- Nunca logar token, corpo de mensagem, anexo ou item do chat (resposta, saída de ferramenta) em nível `info` ou acima. Bots podem lidar com dado pessoal e de saúde.
7876
- Tokens de bot ficam no banco só como SHA-256.
7977
- Nada de telemetria.
8078

@@ -83,10 +81,10 @@ Em dev, use `$env:BOTLOFT_HOME = "$PWD\.dev\home"` (caminho absoluto) no daemon
8381
Uma tarefa só está pronta quando:
8482

8583
1. `cargo fmt`, `clippy -D warnings` e `cargo test` passam (e `pnpm check`, se mexeu no app);
86-
2. comportamento novo tem teste (supervisor, courier e terminal testados com `FakeRuntime`);
84+
2. comportamento novo tem teste (supervisor, courier e chat testados com `FakeRuntime`);
8785
3. a spec continua verdadeira;
8886
4. o que depende do Claude Code real está listado no PR com o passo de teste manual.
8987

9088
## Ordem de trabalho
9189

92-
Siga os marcos da spec (seção 17): M0 -> M1 -> M2 -> M3 -> M4 -> M5. Não comece rotinas, caixa de perguntas, busca ou acesso remoto antes do M5.
90+
Siga os marcos da spec (seção 17): M0 -> M1 -> M2 -> M3 -> M4 -> M4.1 -> M5. Não comece rotinas, caixa de perguntas, busca ou acesso remoto antes do M5.

‎Cargo.lock‎

Lines changed: 2 additions & 94 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎app/package.json‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@
2020
"@fontsource/ibm-plex-mono": "^5.3.0",
2121
"@fontsource/ibm-plex-sans": "^5.3.0",
2222
"@tauri-apps/api": "^2.12.0",
23-
"@xterm/addon-fit": "^0.11.0",
24-
"@xterm/addon-webgl": "^0.19.0",
25-
"@xterm/xterm": "^6.0.0",
2623
"lucide-react": "^1.48.0",
2724
"react": "^19.3.0",
2825
"react-dom": "^19.3.0",
26+
"react-markdown": "^10.1.0",
27+
"remark-gfm": "^4.0.1",
2928
"zustand": "^5.0.15"
3029
},
3130
"devDependencies": {

0 commit comments

Comments
 (0)