ponte-local 0.0.0-stage → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE.md +49 -0
- package/README.md +432 -2
- package/SECURITY.md +51 -0
- package/SKILL.md +951 -0
- package/agente/LEIA-ME.md +284 -0
- package/agente/SKILL.md +828 -0
- package/agente/agent.js +3926 -0
- package/bin/ponte-local.js +231 -0
- package/package.json +59 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 MicaelSanPedro
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/NOTICE.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Avisos de terceiros (third-party notices)
|
|
2
|
+
|
|
3
|
+
O `ponte-local` não empacota código de terceiros: o que você baixa deste
|
|
4
|
+
repositório é autoral (`agent.js`, `ponte-store.ts`, rotas do relay,
|
|
5
|
+
`ponte.py`, painel, docs). As licenças abaixo se aplicam às **dependências
|
|
6
|
+
externas opcionais** que cada componente usa em tempo de execução, quando
|
|
7
|
+
você escolhe usá-las.
|
|
8
|
+
|
|
9
|
+
## Relay (servidor Next.js)
|
|
10
|
+
|
|
11
|
+
O relay é construído sobre o esqueleto do `create-next-app` (Next.js +
|
|
12
|
+
React + TypeScript). Dependências típicas e suas licenças:
|
|
13
|
+
|
|
14
|
+
| Projeto | Uso | Licença |
|
|
15
|
+
| ------- | --- | ------- |
|
|
16
|
+
| [Next.js](https://github.com/vercel/next.js) | framework do relay e do painel | MIT |
|
|
17
|
+
| [React / React DOM](https://github.com/facebook/react) | painel de status | MIT |
|
|
18
|
+
| [lucide-react](https://github.com/lucide-icons/lucide) | ícones do painel (dependência npm declarada) | ISC |
|
|
19
|
+
| [TypeScript](https://github.com/microsoft/TypeScript) | tipagem em tempo de desenvolvimento | Apache-2.0 |
|
|
20
|
+
|
|
21
|
+
## Agente (`agente/agent.js`)
|
|
22
|
+
|
|
23
|
+
**Zero dependências.** O arquivo roda apenas com a API padrão do Node.js.
|
|
24
|
+
|
|
25
|
+
| Projeto | Uso | Licença |
|
|
26
|
+
| ------- | --- | ------- |
|
|
27
|
+
| [Node.js](https://github.com/nodejs/node) | runtime | MIT (com uso de libs de terceiros listadas em `LICENSE` do Node) |
|
|
28
|
+
|
|
29
|
+
## Operador (`operador/ponte.py`)
|
|
30
|
+
|
|
31
|
+
**Zero dependências além da biblioteca padrão.**
|
|
32
|
+
|
|
33
|
+
| Projeto | Uso | Licença |
|
|
34
|
+
| ------- | --- | ------- |
|
|
35
|
+
| [Python](https://github.com/python/cpython) | runtime da CLI | PSF License |
|
|
36
|
+
|
|
37
|
+
## Como gerar a lista completa do relay
|
|
38
|
+
|
|
39
|
+
Como o relay vive no *seu* servidor (você o cria com `create-next-app`),
|
|
40
|
+
a lista exata de dependências é a do seu `package.json`. Para auditoria:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
cd ponte-relay
|
|
44
|
+
npx license-checker --summary
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Este arquivo segue o espírito do aviso de terceiros da seção 4.4 da
|
|
48
|
+
licença MIT (retenção de aviso de copyright e permissão em
|
|
49
|
+
redistribuições): os avisos acima são retidos para cada projeto citado.
|
package/README.md
CHANGED
|
@@ -1,3 +1,433 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<img src="docs/banner.svg" alt="Ponte Local" width="100%"/>
|
|
4
|
+
|
|
5
|
+
**Sua IA opera seu PC pelo chat. As travas de segurança rodam no seu PC.**
|
|
6
|
+
|
|
7
|
+
Instale em um comando, sem instalar nada:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx ponte-local --server https://SEU-RELAY --token SEU_TOKEN --save
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
[](LICENSE)
|
|
14
|
+
[](https://www.npmjs.com/package/ponte-local)
|
|
15
|
+
[](agente/agent.js)
|
|
16
|
+
[](relay/ponte-store.ts)
|
|
17
|
+
[](https://nodejs.org)
|
|
18
|
+
[](#requisitos)
|
|
19
|
+
[](#vis%C3%A3o-geral)
|
|
20
|
+
[](SKILL.md)
|
|
21
|
+
[](#contribuindo)
|
|
22
|
+
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
> **Você é uma IA** (Claude, ChatGPT, Gemini, Cursor, agente de código)? Leia
|
|
28
|
+
> [`SKILL.md`](SKILL.md) primeiro. A skill traz o passo a passo de instalação,
|
|
29
|
+
> o que pedir ao usuário, a tabela das 31 ações e as regras de segurança.
|
|
30
|
+
> Comece pela Regra de Ouro #0: pergunte se o PC é Windows ou Linux.
|
|
31
|
+
|
|
32
|
+
## Sumário
|
|
33
|
+
|
|
34
|
+
1. [Visão geral](#visão-geral)
|
|
35
|
+
2. [Como funciona](#como-funciona)
|
|
36
|
+
3. [Destaques](#destaques)
|
|
37
|
+
4. [Segurança em camadas](#segurança-em-camadas)
|
|
38
|
+
5. [Os 4 modos do `run_command`](#os-4-modos-do-run_command)
|
|
39
|
+
6. [Requisitos](#requisitos)
|
|
40
|
+
7. [Primeiros passos](#primeiros-passos)
|
|
41
|
+
8. [As 31 ações do agente](#as-31-ações-do-agente)
|
|
42
|
+
9. [Estrutura do repositório](#estrutura-do-repositório)
|
|
43
|
+
10. [Destaques por versão](#destaques-por-versão)
|
|
44
|
+
11. [Perguntas frequentes](#perguntas-frequentes)
|
|
45
|
+
12. [Aviso legal, privacidade e uso responsável](#aviso-legal-privacidade-e-uso-responsável)
|
|
46
|
+
13. [Contribuindo](#contribuindo)
|
|
47
|
+
14. [Segurança](#segurança)
|
|
48
|
+
15. [Licença](#licença)
|
|
49
|
+
|
|
50
|
+
## Visão geral
|
|
51
|
+
|
|
52
|
+
**Ponte Local** liga a sua IA ao **seu** computador. Um agente de um arquivo só
|
|
53
|
+
(`agent.js`, Node puro, **zero dependências**) roda no seu PC e conversa com a
|
|
54
|
+
sua IA por meio de um relay — rotas de API Next.js hospedadas numa VM que
|
|
55
|
+
**você** controla. A IA enfileira comandos; o agente busca, executa
|
|
56
|
+
localmente e devolve o resultado.
|
|
57
|
+
|
|
58
|
+
O agente só abre conexões **de saída**, com poll a cada 1,5 s. Por isso
|
|
59
|
+
funciona atrás de NAT e de firewall doméstico: nenhuma porta aberta, nenhum
|
|
60
|
+
SSH, nada para configurar no roteador.
|
|
61
|
+
|
|
62
|
+
| Componente | Onde roda | Tecnologia | Papel |
|
|
63
|
+
|------------|-----------|------------|-------|
|
|
64
|
+
| **Agente** — `agent.js` | no seu PC | Node.js 18+, 1 arquivo, 0 dependências | executa as 31 ações localmente, com escopo, lixeira e trava anticatástrofe no próprio processo |
|
|
65
|
+
| **Relay** — `ponte-store.ts` + rotas | na sua VM/servidor | Next.js (API routes) | fila por máquina (lane), sequência persistida em disco, painel de status |
|
|
66
|
+
| **Operador** — `ponte.py` | na sua VM/servidor | Python 3, só biblioteca padrão | CLI para injetar comandos e ler resultados pelo terminal |
|
|
67
|
+
|
|
68
|
+
## Como funciona
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
┌──────────────────┐ poll 1,5 s ┌──────────────────────┐ admin token ┌────────────┐
|
|
72
|
+
│ SEU PC │ ──────────────► │ relay Next.js │ ────────────► │ IA │
|
|
73
|
+
│ Windows/Linux │ ◄────────────── │ /api/ponte/* │ ◄──────────── │ (chat ou │
|
|
74
|
+
│ agent.js │ POST /result │ URL pública https │ injeta cmd │ agente) │
|
|
75
|
+
│ (zero deps) │ │ fila + resultados │ + lê resposta│ │
|
|
76
|
+
└──────────────────┘ └──────────────────────┘ └────────────┘
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
1. A IA publica o comando na **lane** da máquina — cada PC tem token e fila
|
|
80
|
+
próprios; comando de uma máquina nunca executa na outra.
|
|
81
|
+
2. O agente, que faz poll a cada 1,5 s, recebe o comando em segundos.
|
|
82
|
+
3. O agente valida **localmente**, antes de executar: escopo travado na sua
|
|
83
|
+
home, destruição em massa recusada, apagar vai para a lixeira com undo.
|
|
84
|
+
4. O resultado volta para o relay; a IA lê e continua a tarefa.
|
|
85
|
+
5. A IA fecha com `task_done`: o agente grava um relatório TXT com o que foi
|
|
86
|
+
feito e **abre na sua tela** (Windows, Linux e macOS).
|
|
87
|
+
|
|
88
|
+
## Destaques
|
|
89
|
+
|
|
90
|
+
- **Zero dependências no seu PC** — o `agent.js` roda com a API padrão do
|
|
91
|
+
Node.js; nada de `npm install`, nada de build.
|
|
92
|
+
- **Funciona atrás de NAT** — só conexões de saída para o relay; nenhuma
|
|
93
|
+
porta aberta, nenhum SSH exposto.
|
|
94
|
+
- **Segurança executada no seu PC** — escopo na home, lixeira com desfazer e
|
|
95
|
+
trava anticatástrofe rodam dentro do agente, antes de cada ação.
|
|
96
|
+
- **Multi-máquina sem cruzar filas** — uma lane por máquina, autenticada por
|
|
97
|
+
token próprio; nada hardcoded: tokens só no `.env` do servidor e no
|
|
98
|
+
`ponte.config.json` de cada PC.
|
|
99
|
+
- **Lê qualquer arquivo** — `file_info` identifica o formato real por magic
|
|
100
|
+
bytes (png, pdf, exe, mp4, zip) e a leitura é por pedaços, sem teto de
|
|
101
|
+
tamanho: vídeo, ISO e log de gigabytes não estouram memória nem a ponte.
|
|
102
|
+
- **Pronto para IA** — a `SKILL.md` ensina qualquer IA com `curl` a instalar
|
|
103
|
+
e operar; o agente baixa e atualiza a skill sozinho (boot + a cada 60 s,
|
|
104
|
+
com ETag: 304 = zero bytes).
|
|
105
|
+
- **Sem telemetria** — nenhum dado vai para os autores: os únicos contatos
|
|
106
|
+
de rede do agente são o seu relay e o `raw.githubusercontent.com`.
|
|
107
|
+
|
|
108
|
+
## Segurança em camadas
|
|
109
|
+
|
|
110
|
+
| Camada | O que faz |
|
|
111
|
+
|--------|-----------|
|
|
112
|
+
| **Escopo na home** | O agente recusa qualquer caminho fora da home do usuário. `.ssh`, `.gnupg`, `.config`, `.password-store`, `.aws`, `.kube` e a própria pasta `ponte-agent` ficam inacessíveis. Desde a v1.11.0 o escopo valida `realpath`: symlink e junction não furam mais a home, e credenciais (`.env`, `.npmrc`, `.git-credentials`, config e log do agente) estão bloqueadas para leitura remota. |
|
|
113
|
+
| **Lixeira com undo** | A IA não apaga nada em definitivo: `delete` e substituições vão para a lixeira do agente, com log JSONL auditável e `undo_last`/`restore`. |
|
|
114
|
+
| **Trava anticatástrofe** | Recusa localmente, antes de executar: fork bomb, `mkfs`, `wipefs`, `dd of=/dev/*`, `shred` em disco, `rm -r` de sistema, `&&` no meio do comando, flags como `--no-preserve-root`, `find -delete`, `xargs` destrutivo, `tee`/redirect para `/dev/*`, script baixado da internet e executado direto no shell, `chmod/chown -R` em pasta do sistema, `rm` com `$VAR` ou `..`. No Windows: `format`, `diskpart`, `cipher /w`, `vssadmin delete shadows`, `rd /s`/`del /s`/`Remove-Item -Recurse` em raiz de drive, `C:\Windows`, `C:\Program Files` ou `$HOME`. |
|
|
115
|
+
| **Consentimento no modo** | `run_command` só funciona nos modos que você religa no seu terminal. O modo deus é a exceção consentida: a IA pergunta no chat e só ativa com o seu aceite. |
|
|
116
|
+
| **Mouse com Aviso** | As ações de mouse usam a ferramenta do sistema (`xdotool` no X11, `user32` no Windows, `ydotool` no Wayland). No Wayland, se cair no `xdotool` (que só mexe no cursor do XWayland), a resposta vem com `aviso` — a IA é instruída a ler e a te avisar. |
|
|
117
|
+
| **Tokens separados** | Agente e operador usam tokens distintos; **uma lane por máquina** (token e fila próprios — comando não atravessa). Tokens nunca vão para o código nem para o repo: só no `.env` do servidor e no `ponte.config.json` de cada PC (permissão 0600). |
|
|
118
|
+
| **Log JSONL** | Toda ação fica registrada em `ponte-log.jsonl`, com resumo e dados de undo. |
|
|
119
|
+
| **Entrega confiável** | Sequência persistida em disco (reiniciar o relay não perde fila), reconnect entrega pendentes com menos de 24 h, resultado reenviado com retry: rede caiu ≠ comando perdido. |
|
|
120
|
+
|
|
121
|
+
## Os 4 modos do `run_command`
|
|
122
|
+
|
|
123
|
+
| Modo | Como ativa | Comportamento |
|
|
124
|
+
|------|------------|---------------|
|
|
125
|
+
| **Desligado** (padrão) | `npx ponte-local` | Só operações de arquivo; a IA não executa comandos. |
|
|
126
|
+
| **Supervisionado** | `npx ponte-local --allow-run --save` | Cada comando aparece no seu terminal; `s`/`N` em 60 s; sem resposta, o agente rejeita. |
|
|
127
|
+
| **Autônomo** | `npx ponte-local --auto --save` | Executa direto (loga `[AUTO] $ cmd`), com a trava anticatástrofe ativa. |
|
|
128
|
+
| **modo deus** | A IA pergunta no chat depois de conectar e, com o seu aceite, envia `god_mode {"enabled":true}` | Igual ao autônomo (loga `[deus] $ cmd`); trava, lixeira e log continuam; desliga com `god_mode {"enabled":false}`. |
|
|
129
|
+
|
|
130
|
+
Os modos supervisionado e autônomo mudam só com um flag digitado por você no
|
|
131
|
+
terminal do seu PC. O modo deus fica salvo em `ponte.config.json` e sobrevive
|
|
132
|
+
a restarts; se você recusar o pedido da IA, a recusa fica registrada e ela não
|
|
133
|
+
pergunta de novo.
|
|
134
|
+
|
|
135
|
+
## Requisitos
|
|
136
|
+
|
|
137
|
+
| Onde | O quê |
|
|
138
|
+
|------|-------|
|
|
139
|
+
| **Seu PC** (Windows, Linux ou Termux/Android) | Node.js 18+, `curl` (no Windows, o `curl.exe` nativo do PowerShell) |
|
|
140
|
+
| **VM/servidor da IA** | Node.js 18+ para o relay (Next.js), Python 3 opcional para a CLI |
|
|
141
|
+
|
|
142
|
+
### Só para as ações de screenshot
|
|
143
|
+
|
|
144
|
+
O resto do agente é **zero dependências** — mas tirar print da tela depende
|
|
145
|
+
de uma ferramenta de captura que a distro já traz. Não é preciso instalar
|
|
146
|
+
nada no Windows (PowerShell + System.Drawing são nativos), mas no Linux
|
|
147
|
+
escolha **uma** das opções:
|
|
148
|
+
|
|
149
|
+
| Sessão | Pacote | Comando | Janela por título? |
|
|
150
|
+
|--------|--------|---------|--------------------|
|
|
151
|
+
| X11 (qualquer distro) | `imagemagick` | `import` | sim (com `xdotool`) |
|
|
152
|
+
| X11 | `scrot` | `scrot` | não (só tela inteira) |
|
|
153
|
+
| X11 | `maim` | `maim` | não |
|
|
154
|
+
| Wayland/KDE | `spectacle` | `spectacle` | janela em foco |
|
|
155
|
+
| Wayland/Hyprland | `hyprshot` | `hyprshot` | janela em foco |
|
|
156
|
+
| Wayland/GNOME | `gnome-screenshot` | `gnome-screenshot` | janela em foco |
|
|
157
|
+
| Termux/Android | `termux-api` | `termux-screenshot` | não |
|
|
158
|
+
|
|
159
|
+
Comandos:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
sudo pacman -S imagemagick xdotool # Arch/CachyOS
|
|
163
|
+
sudo apt install imagemagick xdotool # Debian/Ubuntu
|
|
164
|
+
sudo dnf install ImageMagick xdotool # Fedora
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
> No **Wayland** o compositor não expõe as janelas de forma genérica: a
|
|
168
|
+
> `screenshot_window` captura a janela **em foco** e avisa na resposta. No
|
|
169
|
+
> **X11** e no **Windows** a janela pedida (por `window_title`, `window_class`
|
|
170
|
+
> ou `window_id`) é capturada exatamente.
|
|
171
|
+
|
|
172
|
+
### Só para as ações de mouse
|
|
173
|
+
|
|
174
|
+
As ações de mouse (`mouse_move`, `mouse_click`, `mouse_scroll`, `mouse_drag`,
|
|
175
|
+
`mouse_position`) também são **zero dependências npm**, mas dependem do que o
|
|
176
|
+
sistema tem:
|
|
177
|
+
|
|
178
|
+
| Onde | Precisa de | Observação |
|
|
179
|
+
|------|-----------|------------|
|
|
180
|
+
| **Windows** | nada | PowerShell + `user32.dll` (nativo) |
|
|
181
|
+
| **Linux X11** | `xdotool` | `sudo pacman -S --needed xdotool` |
|
|
182
|
+
| **Linux Wayland** | `ydotool` ou `dotool` | `sudo pacman -S --needed ydotool` — e o usuário precisa estar no grupo `input` e o daemon de pé (`systemctl --user enable --now ydotool`) |
|
|
183
|
+
| **Termux** | `termux-api` | usa o `input` do Android |
|
|
184
|
+
| **macOS** | `cliclick` | `brew install cliclick` (o clique por coordenada funciona pelo AppleScript) |
|
|
185
|
+
|
|
186
|
+
> ⚠️ **No Wayland o `xdotool` NÃO serve**: ele move só o cursor do XWayland
|
|
187
|
+
> (apps X11), não o cursor real do compositor. O agente tenta o `ydotool`
|
|
188
|
+
> primeiro e, se acabar caindo no `xdotool`, a resposta vem com um aviso
|
|
189
|
+
> (`aviso`) — a IA **deve ler esse aviso** antes de agir.
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
sudo pacman -S --needed xdotool # X11
|
|
193
|
+
sudo pacman -S --needed ydotool # Wayland
|
|
194
|
+
sudo usermod -aG input $USER # permissão do /dev/uinput
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
> **Cuidado com clique:** um clique pode acionar um botão destrutivo na tela
|
|
198
|
+
> ("Apagar", "Confirmar", "Finalizar compra"). A IA deve **ler a tela antes
|
|
199
|
+
> de clicar** (`screenshot`) e confirmar com o usuário quando o alvo for
|
|
200
|
+
> destrutivo.
|
|
201
|
+
|
|
202
|
+
## Primeiros passos
|
|
203
|
+
|
|
204
|
+
### Caminho 0 — `npx` (o mais rápido)
|
|
205
|
+
|
|
206
|
+
O agente é um pacote npm. **Não precisa instalar nada** — o `npx` baixa e
|
|
207
|
+
roda:
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
npx ponte-local --server https://SEU-RELAY --token SEU_TOKEN --save
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Na **primeira vez**, se você rodar sem `--server`/`--token`, o `npx` pergunta
|
|
214
|
+
a URL do relay e o token no terminal e salva a config. Depois é só:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
npx ponte-local
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Outras opções:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
npx ponte-local --help # todas as opções
|
|
224
|
+
npx ponte-local --version # só a versão
|
|
225
|
+
npx ponte-local --auto --save # modo autônomo (executa direto)
|
|
226
|
+
npx ponte-local --allow-run --save # supervisionado (pede s/N)
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Onde os dados ficam** (fora do pacote — o cache do `npx` é efêmero e o
|
|
230
|
+
token se perderia a cada re-resolve):
|
|
231
|
+
|
|
232
|
+
| Arquivo | Caminho |
|
|
233
|
+
|---------|---------|
|
|
234
|
+
| Config (com o token, permissão 0600) | `~/ponte-agent/ponte.config.json` |
|
|
235
|
+
| Log de auditoria | `~/ponte-agent/ponte-log.jsonl` |
|
|
236
|
+
| Relatório da tarefa | `~/ponte-agent/relatorio-ponte.txt` |
|
|
237
|
+
| SKILL.md baixada | `~/ponte-agent/SKILL.md` |
|
|
238
|
+
|
|
239
|
+
Defina `PONTE_HOME` para mudar essa pasta. Ela é criada com permissão 0700 e
|
|
240
|
+
é **inteiramente bloqueada para leitura remota** (o token mora ali).
|
|
241
|
+
|
|
242
|
+
> O token da ponte é o que a sua IA te deu no chat — **não** é a senha da
|
|
243
|
+
> sua conta GitHub nem de outro serviço.
|
|
244
|
+
|
|
245
|
+
### Caminho 1 — peça para a IA instalar (recomendado)
|
|
246
|
+
|
|
247
|
+
Abra um chat com sua IA e diga: *"leia
|
|
248
|
+
https://github.com/micsxnn/ponte-local/blob/main/SKILL.md e instale a ponte
|
|
249
|
+
pra mim"*. A skill guia relay, tokens, download do agente, validação e o
|
|
250
|
+
primeiro comando. A ponte já está no ar? Diga *"leia o SKILL.md e opere minha
|
|
251
|
+
ponte"* colando URL + ADMIN_TOKEN: Claude, Manus ou qualquer IA com `curl`
|
|
252
|
+
opera sem hospedar nada.
|
|
253
|
+
|
|
254
|
+
### Caminho 2 — instalação manual
|
|
255
|
+
|
|
256
|
+
**No servidor** (detalhes completos em [`SKILL.md`](SKILL.md) e
|
|
257
|
+
[`relay/RESTAURAR.md`](relay/RESTAURAR.md)):
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
CI=1 npx create-next-app@latest ponte-relay --typescript --app --no-eslint --src-dir --import-alias "@/*"
|
|
261
|
+
cd ponte-relay
|
|
262
|
+
# copie os arquivos do repo conforme a tabela da SKILL.md:
|
|
263
|
+
# relay/ponte-store.ts → src/lib/ponte-store.ts
|
|
264
|
+
# relay/api/*/route.ts → src/app/api/ponte/*/route.ts
|
|
265
|
+
# relay/painel/page.tsx → src/app/page.tsx
|
|
266
|
+
# agente/agent.js → download/ponte-agent/agent.js
|
|
267
|
+
export PONTE_TOKEN_NETBOOK=$(openssl rand -hex 12) # vai para a máquina 1
|
|
268
|
+
export PONTE_TOKEN_WINDOWS=$(openssl rand -hex 16) # vai para a máquina 2 (se houver)
|
|
269
|
+
export PONTE_ADMIN_TOKEN=$(openssl rand -hex 16) # só para quem injeta comandos
|
|
270
|
+
npm run dev # Next.js 16+? deixe cacheComponents: false no next.config.ts (ver SKILL.md)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**No seu PC, Linux** (só se você **não** quiser usar `npx`):
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
mkdir -p ~/ponte-agent && cd ~/ponte-agent
|
|
277
|
+
curl -fso agent.js https://raw.githubusercontent.com/micsxnn/ponte-local/main/agente/agent.js
|
|
278
|
+
node agent.js --server https://SEU-RELAY --token SEU_TOKEN --save
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**No seu PC, Windows (PowerShell)** (idem):
|
|
282
|
+
|
|
283
|
+
```powershell
|
|
284
|
+
mkdir "$HOME\ponte-agent" -Force; cd "$HOME\ponte-agent"
|
|
285
|
+
curl.exe -fso agent.js https://raw.githubusercontent.com/micsxnn/ponte-local/main/agente/agent.js
|
|
286
|
+
node agent.js --server https://SEU-RELAY --token SEU_TOKEN --save
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
> Manual ou `npx`, a config cai em `~/ponte-agent/ponte.config.json` — o
|
|
290
|
+
> mesmo lugar. Dá para trocar de um pro outro sem reconfigurar nada.
|
|
291
|
+
|
|
292
|
+
> **Dicas que evitam 90% dos problemas**
|
|
293
|
+
>
|
|
294
|
+
> - No PowerShell, use sempre `curl.exe`: o `curl` sem `.exe` é um alias do
|
|
295
|
+
> `Invoke-WebRequest` e quebra o download.
|
|
296
|
+
> - Instalou o Node agora? Feche e reabra o PowerShell: o PATH só é lido por
|
|
297
|
+
> janelas novas e o `node` não aparece na janela aberta.
|
|
298
|
+
> - Próximas execuções: `npx ponte-local` (vale em todos os sistemas). Na
|
|
299
|
+
> instalação manual: `~/ponte-agent/rodar.sh` (Linux) ou
|
|
300
|
+
> `cd $HOME\ponte-agent; node agent.js` (Windows). No Windows, o
|
|
301
|
+
> `rodar.bat` manda a saída para arquivo e desliga o QuickEdit (clique no
|
|
302
|
+
> console não congela mais o agente) e o `watchdog.bat` religa o agente
|
|
303
|
+
> sozinho se ele morrer.
|
|
304
|
+
|
|
305
|
+
## As 31 ações do agente
|
|
306
|
+
|
|
307
|
+
| Grupo | Ações |
|
|
308
|
+
|-------|-------|
|
|
309
|
+
| **Explorar** | `ping` · `list` · `tree` · `search` (nome ou conteúdo) · `free_space` · `disk_usage` · `file_info` (tipo real por magic bytes) |
|
|
310
|
+
| **Arquivos** | `read_text` (qualquer tamanho, em pedaços) · `write_text` · `mkdir` · `move` · `rename` · `delete` → lixeira · `restore` · `undo_last` |
|
|
311
|
+
| **Organizar** | `organize_plan` (propõe, não executa) · `apply_plan` (lote aprovado) · `duplicates` (md5 + espaço recuperável) |
|
|
312
|
+
| **Binários** | `read_binary` (por pedaços, sem teto de tamanho) · `write_binary` (até 8 MB, via `ponte.py pegar`/`enviar`) |
|
|
313
|
+
| **Tela** | `screenshot` (tela inteira) · `screenshot_window` (uma janela, por título/classe/id) |
|
|
314
|
+
| **Mouse** | `mouse_position` (onde está o cursor) · `mouse_move` · `mouse_click` · `mouse_scroll` · `mouse_drag` |
|
|
315
|
+
| **Comando** | `run_command` (com os modos acima) |
|
|
316
|
+
| **Controle** | `god_mode` (liga/desliga as confirmações; a IA só ativa após o seu aceite no chat) · `skill_update` (força o download da SKILL.md; o agente também atualiza sozinho no boot e a cada 60 s) · `task_done` (fecha a tarefa: o agente grava o relatório TXT e abre na tela do usuário) |
|
|
317
|
+
|
|
318
|
+
A referência completa, com argumentos exatos, está na
|
|
319
|
+
[tabela de ações da SKILL.md](SKILL.md#42-as-ações).
|
|
320
|
+
|
|
321
|
+
## Estrutura do repositório
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
ponte-local/
|
|
325
|
+
├── package.json ← pacote npm: bin "ponte-local" (npx)
|
|
326
|
+
├── bin/
|
|
327
|
+
│ └── ponte-local.js ← ponto de entrada do npx (config + agente)
|
|
328
|
+
├── SKILL.md ← entrada para IAs: instale e opere (comece aqui)
|
|
329
|
+
├── SECURITY.md ← como reportar vulnerabilidades em privado
|
|
330
|
+
├── NOTICE.md ← avisos de licença de dependências de terceiros
|
|
331
|
+
├── agente/
|
|
332
|
+
│ ├── agent.js ← o agente inteiro: 1 arquivo, 0 dependências (v1.13.0)
|
|
333
|
+
│ ├── LEIA-ME.md ← manual do agente no PC do usuário
|
|
334
|
+
│ ├── rodar.sh ← religa lendo ponte.config.json (Linux)
|
|
335
|
+
│ ├── atualizar.sh ← baixa a versão nova do agente (Linux)
|
|
336
|
+
│ ├── rodar.bat ← religa com log em arquivo + QuickEdit off (Windows)
|
|
337
|
+
│ └── watchdog.bat ← vigia e religa o agente sozinho (Windows)
|
|
338
|
+
├── relay/
|
|
339
|
+
│ ├── ponte-store.ts ← estado do relay: lanes por máquina, fila, claim/lease, seq + snapshot em disco
|
|
340
|
+
│ ├── api/…/route.ts ← poll · result · cmd · results · status · download
|
|
341
|
+
│ ├── painel/page.tsx ← painel mínimo: um cartão por máquina (specs + luz)
|
|
342
|
+
│ └── RESTAURAR.md ← recriar o relay do zero numa VM nova
|
|
343
|
+
├── operador/
|
|
344
|
+
│ ├── ponte.py ← CLI do operador (injeta comandos, lê resultados)
|
|
345
|
+
│ └── teste-ponte*.sh ← testes E2E de referência
|
|
346
|
+
└── docs/banner.svg ← banner do repo
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Destaques por versão
|
|
350
|
+
|
|
351
|
+
| Componente | Versão | O que trouxe |
|
|
352
|
+
|------------|--------|--------------|
|
|
353
|
+
| Agente | **v1.14.0** (atual) | `mouse_position`, `mouse_move`, `mouse_click`, `mouse_scroll` e `mouse_drag`: a IA mexe no cursor do usuário (Windows/Linux/macOS/Termux, zero dependência npm). No X11 usa `xdotool`; no Wayland, `ydotool`/`dotool` (o `xdotool` mexe só no cursor do XWayland — a resposta avisa) |
|
|
354
|
+
| Agente | v1.13.0 | `screenshot` e `screenshot_window`: print da tela e de uma janela (Linux/Windows/macOS/Termux, zero dependência npm — usa o que a distro já tem); no Wayland a janela em foco é capturada e a resposta avisa |
|
|
355
|
+
| Agente | v1.12.0 | Continuidade das correções de segurança da v1.11.0 |
|
|
356
|
+
| Agente | v1.11.0 | Auditoria de segurança: trava cobre `&&`, `--no-preserve-root`, `find -delete`, `xargs` destrutivo, `tee`/redirect para `/dev/*`, script baixado e executado direto no bash, `chmod/chown -R` de sistema e `rm` com `$VAR`/`..`; escopo valida `realpath` (symlink não fura a home); credenciais bloqueadas para leitura remota; timeout mata o grupo de processos; token aceito via `PONTE_AGENT_TOKEN`; config com permissão 0600 |
|
|
357
|
+
| Agente | v1.10.x | Relatório obrigatório blindado (v1.10.0/1.10.5); logo no terminal; Termux/Android (v1.10.1); largura real do terminal (v1.10.4) |
|
|
358
|
+
| Agente | v1.8.0 | Relatório "O QUE FOI FEITO" (sem lista de comandos); `rodar.bat` com QuickEdit off; `watchdog.bat` religa sozinho |
|
|
359
|
+
| Agente | v1.7.0 | `task_done`: relatório TXT gravado e aberto na tela do usuário |
|
|
360
|
+
| Agente | v1.5.1 | Modo deus consentido no chat; SKILL.md baixada no boot e a cada 60 s |
|
|
361
|
+
| Agente | v1.4.0 | Leitura universal (formato por magic bytes) e por pedaços, sem teto de tamanho |
|
|
362
|
+
| Agente | v1.3.0 | Suporte a Windows (`cmd.exe`, trava com padrões Windows, lixeira interna) |
|
|
363
|
+
| Relay | **v1.5.2** (atual) | Download em pedaços chega inteiro |
|
|
364
|
+
| Relay | v1.3.0 | Lane por máquina: token e fila próprios, comando não atravessa |
|
|
365
|
+
| Relay | v1.2.0 | Estado inteiro em `.ponte-estado.json`; reconnect entrega pendentes com menos de 24 h; janela "conectado" de 45 s |
|
|
366
|
+
|
|
367
|
+
## Perguntas frequentes
|
|
368
|
+
|
|
369
|
+
**A IA pode formatar meu PC?** Não. O agente recusa comandos de destruição em
|
|
370
|
+
massa antes de executar, apaga arquivos só para a lixeira (com undo) e não
|
|
371
|
+
enxerga nada fora da sua home.
|
|
372
|
+
|
|
373
|
+
**A IA pode ligar o `run_command` sozinha?** Os modos supervisionado e
|
|
374
|
+
autônomo só mudam com um flag digitado por você no terminal do seu PC. O modo
|
|
375
|
+
deus é a exceção consentida: a IA pergunta no chat e só ativa com o seu
|
|
376
|
+
aceite; a recusa fica registrada.
|
|
377
|
+
|
|
378
|
+
**Preciso abrir portas no meu roteador?** Não. O agente faz requests de saída
|
|
379
|
+
para o relay; o que atravessa a internet é JSON de metadados. Conteúdo de
|
|
380
|
+
arquivo não fica no ar: binários vão em base64, sob demanda, por comando seu.
|
|
381
|
+
|
|
382
|
+
**Funciona no Windows?** Sim, desde o agente v1.3.0: `run_command` via
|
|
383
|
+
`cmd.exe`, trava anticatástrofe com padrões Windows e lixeira interna do
|
|
384
|
+
agente (não é a Lixeira do Windows; restaure com `restore`/`undo_last`). No
|
|
385
|
+
Windows o `rodar.bat` desliga o QuickEdit — clicar no console não congela mais
|
|
386
|
+
o agente — e o `watchdog.bat` religa o agente se ele morrer. Também roda em
|
|
387
|
+
Termux/Android (v1.10.1).
|
|
388
|
+
|
|
389
|
+
**E arquivos enormes (vídeo, ISO, log de 1 GB)?** A leitura é por pedaços:
|
|
390
|
+
`file_info` diz o formato real (magic bytes), `read_text`/`read_binary` leem
|
|
391
|
+
de `offset` em `offset` (até 6 MB por chamada) e devolvem `proximoOffset`. O
|
|
392
|
+
arquivo inteiro não precisa caber na memória nem na ponte.
|
|
393
|
+
|
|
394
|
+
## Aviso legal, privacidade e uso responsável
|
|
395
|
+
|
|
396
|
+
**Uso permitido.** A ponte existe para você operar **o seu próprio
|
|
397
|
+
computador** (ou máquina de quem te deu autorização expressa) pela sua IA. No
|
|
398
|
+
Brasil, invadir dispositivo informático alheio é crime (art. 154-A do Código
|
|
399
|
+
Penal, incluído pela Lei nº 12.737/2012), assim como impedir ou perturbar
|
|
400
|
+
serviço informático (art. 266). Use só no que é seu ou no que tiver permissão
|
|
401
|
+
— o software assume que a instalação foi feita pelo dono da máquina, de forma
|
|
402
|
+
visível e consciente (o agente roda em primeiro plano, com banner, e o
|
|
403
|
+
`run_command` só existe nos modos que você mesmo ativa).
|
|
404
|
+
|
|
405
|
+
**Privacidade (LGPD, Lei nº 13.709/2018).** O agente coleta no SEU PC
|
|
406
|
+
metadados da máquina (usuário, nome do host, CPU, RAM, versão do Node) e os
|
|
407
|
+
envia **ao relay que VOCÊ hospeda**; conteúdo de arquivos só trafega quando
|
|
408
|
+
uma ação sua pede, sempre entre o seu PC e o seu relay. **Este projeto não tem
|
|
409
|
+
telemetria**: nenhuma informação vai para os autores ou para terceiros — os
|
|
410
|
+
únicos contatos de rede do agente são o seu relay e o
|
|
411
|
+
`raw.githubusercontent.com` (auto-atualização da SKILL.md). Quem opera a ponte
|
|
412
|
+
é o controlador dos dados nos termos da LGPD; o software é uma ferramenta
|
|
413
|
+
neutra e a base legal do tratamento é do operador.
|
|
414
|
+
|
|
415
|
+
**Sem garantia.** O código vem "COMO ESTÁ", nos termos da licença MIT
|
|
416
|
+
([LICENSE](LICENSE)). Segurança é um processo: leia a
|
|
417
|
+
[política de segurança](SECURITY.md) antes de reportar vulnerabilidades e os
|
|
418
|
+
avisos de terceiros em [NOTICE.md](NOTICE.md).
|
|
419
|
+
|
|
420
|
+
## Contribuindo
|
|
421
|
+
|
|
422
|
+
Abra issues e PRs. Relatos do agente em outras distros, no Windows e no Termux
|
|
423
|
+
são os mais úteis; para mudanças maiores, descreva o caso de uso numa issue
|
|
424
|
+
antes.
|
|
425
|
+
|
|
426
|
+
## Segurança
|
|
427
|
+
|
|
428
|
+
Encontrou uma vulnerabilidade? **Não abra issue pública.** Siga a
|
|
429
|
+
[política de segurança](SECURITY.md) e reporte em privado.
|
|
430
|
+
|
|
431
|
+
## Licença
|
|
432
|
+
|
|
433
|
+
[MIT](LICENSE) © MicaelSanPedro
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Política de segurança — ponte-local
|
|
2
|
+
|
|
3
|
+
## Versões suportadas
|
|
4
|
+
|
|
5
|
+
O projeto é um único ramo (`main`): use sempre a versão mais recente.
|
|
6
|
+
O agente (`agente/agent.js`) se auto-atualiza baixando a `SKILL.md` do repo;
|
|
7
|
+
o binário do agente em si é atualizado com `agente/atualizar.sh` ou
|
|
8
|
+
baixando o `agent.js` novo. Correções de segurança saem sempre na `main`.
|
|
9
|
+
|
|
10
|
+
| Versão | Suportada |
|
|
11
|
+
| ------ | --------- |
|
|
12
|
+
| `main` (última) | ✅ |
|
|
13
|
+
| Tags/commits antigos | ❌ |
|
|
14
|
+
|
|
15
|
+
## Como reportar
|
|
16
|
+
|
|
17
|
+
- **Vulnerabilidade de segurança**: abra um **GitHub Security Advisory**
|
|
18
|
+
("Report a vulnerability" na aba Security do repo) ou entre em contato
|
|
19
|
+
pelo perfil do autor. **Não abra issue pública** com detalhes
|
|
20
|
+
exploráveis.
|
|
21
|
+
- Resposta esperada: reconhecimento em até **7 dias**, correção ou plano
|
|
22
|
+
de correção em até **30 dias** para problemas de alto impacto.
|
|
23
|
+
|
|
24
|
+
## Escopo
|
|
25
|
+
|
|
26
|
+
Valem relatos sobre os três componentes:
|
|
27
|
+
|
|
28
|
+
- `agente/agent.js` — o agente que roda no PC do usuário (travas, escopo,
|
|
29
|
+
lixeira, manipulação de comandos do relay);
|
|
30
|
+
- `relay/` — fila, autenticação por token, painel;
|
|
31
|
+
- `operador/ponte.py` — CLI que injeta comandos.
|
|
32
|
+
|
|
33
|
+
Fora de escopo: ataques que exijam acesso físico à máquina do usuário,
|
|
34
|
+
roubo do token *já* em posse do atacante com acesso à home, e relatórios
|
|
35
|
+
gerados por varreduras automáticas sem evidência explorável.
|
|
36
|
+
|
|
37
|
+
## Notas de design (por que algumas coisas são assim)
|
|
38
|
+
|
|
39
|
+
- **Tokens nunca no código**: agente e operador usam tokens distintos
|
|
40
|
+
fornecidos por variável de ambiente/flag; uma lane por máquina.
|
|
41
|
+
- **Somente conexões de saída**: o agente não escuta porta nenhuma; a
|
|
42
|
+
superfície de ataque de rede é a do poll HTTPS do próprio relay.
|
|
43
|
+
- **Escopo travado na home** e pastas sensíveis bloqueadas no agente
|
|
44
|
+
(`.ssh`, `.gnupg`, `.config`, `.password-store`, `.aws`, `.kube`,
|
|
45
|
+
`ponte-agent`).
|
|
46
|
+
- **`run_command` nunca é o padrão**: exige flag digitado no terminal do
|
|
47
|
+
dono (`--allow-run`/`--auto`) ou aceite explícito no chat para o modo de
|
|
48
|
+
confirmação reduzida, com registro de recusa.
|
|
49
|
+
- **Trava anticatástrofe local**: o agente recusa destruição em massa
|
|
50
|
+
(mkfs, dd para dispositivo, rm -r de sistema, format, diskpart etc.)
|
|
51
|
+
antes de executar, independentemente do modo.
|