vault-go 0.22.1 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +146 -387
- package/dist/local-dashboard.js +41 -6
- package/dist/local-service.js +17 -0
- package/package.json +3 -6
- package/docs/ast-and-awareness.md +0 -72
- package/docs/mode-integrations.md +0 -74
- package/docs/parity-deployment-review.md +0 -60
- package/docs/transcripts-and-context.md +0 -75
package/README.md
CHANGED
|
@@ -1,126 +1,57 @@
|
|
|
1
|
-
## Login no navegador
|
|
2
|
-
|
|
3
|
-
`bunx --bun vault-go@latest` abre o autenticador do AI Vault Memory no navegador. E-mail, senha e MFA são informados apenas no portal. Ao concluir, o terminal recebe um código de uso único por `127.0.0.1` e o troca com PKCE; tokens não aparecem na URL nem no console. O listener fecha ao concluir ou após cinco minutos.
|
|
4
|
-
|
|
5
|
-
Para trocar a conta: `bunx --bun vault-go@latest login --force`. Para chave de API explícita: `bunx --bun vault-go@latest login --force --api-key`. Se a abertura automática falhar, use o endereço exibido no mesmo computador. Requer uma sessão local com navegador para o retorno loopback.
|
|
6
|
-
|
|
7
1
|
# vault-go
|
|
8
2
|
|
|
9
|
-
|
|
3
|
+
MCP server and installer for **[Vault Memory](https://vault.resolveup.com.br)** — search, capture, and use account memory across AI clients.
|
|
10
4
|
|
|
11
|
-
|
|
12
|
-
plataforma Vault. A persistência fica no PostgreSQL do serviço Rust executado
|
|
13
|
-
no EasyPanel; o painel local mantém um cache privado das consultas recentes.
|
|
5
|
+
Memories live in your Vault Memory cloud account. This package installs the local MCP server, signs you in, registers clients, and runs an optional local worker that turns captured events into memories.
|
|
14
6
|
|
|
15
|
-
|
|
7
|
+
```sh
|
|
8
|
+
npm install -g vault-go@latest
|
|
9
|
+
vault-go setup
|
|
10
|
+
```
|
|
16
11
|
|
|
17
|
-
|
|
12
|
+
Or without a global install:
|
|
18
13
|
|
|
19
14
|
```sh
|
|
20
|
-
bun
|
|
15
|
+
bunx --bun vault-go@latest
|
|
21
16
|
```
|
|
22
17
|
|
|
23
|
-
|
|
18
|
+
Requires [Bun](https://bun.sh/) (`bun --version`) and Node.js 20+.
|
|
24
19
|
|
|
25
|
-
|
|
20
|
+
## Sign in
|
|
26
21
|
|
|
27
|
-
|
|
28
|
-
HTTP da plataforma, sem instalar runtime ou banco local. Crie em **Segurança >
|
|
29
|
-
Chaves de API** uma chave apenas com `memory:read` e configure:
|
|
22
|
+
`vault-go setup` and `vault-go login` open the Vault Memory sign-in page in your browser. Email, password, and MFA stay in the portal. The CLI receives a one-time code on `127.0.0.1` and exchanges it with PKCE. Tokens never appear in the URL or terminal. The listener closes when login finishes or after five minutes.
|
|
30
23
|
|
|
31
24
|
```sh
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
--url https://vaultmemoryai.com/api/mcp \
|
|
35
|
-
--bearer-token-env-var VAULT_GO_TOKEN
|
|
25
|
+
vault-go login --force # switch account
|
|
26
|
+
vault-go login --force --api-key # paste a scoped API key instead
|
|
36
27
|
```
|
|
37
28
|
|
|
38
|
-
|
|
29
|
+
If the browser does not open, use the loopback URL printed in the same session.
|
|
39
30
|
|
|
40
|
-
|
|
41
|
-
{
|
|
42
|
-
"mcpServers": {
|
|
43
|
-
"vault-go": {
|
|
44
|
-
"type": "http",
|
|
45
|
-
"url": "https://vaultmemoryai.com/api/mcp",
|
|
46
|
-
"headers": {
|
|
47
|
-
"Authorization": "Bearer ${VAULT_GO_TOKEN}"
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
```
|
|
31
|
+
Credentials are stored in `~/.memvault/auth.json` (`0600`). The directory is `0700`. Passwords and MFA codes are not saved.
|
|
53
32
|
|
|
54
|
-
|
|
55
|
-
linha do tempo, entrada/saída de ferramentas, contexto de arquivos, estatísticas, estado vetorial e consultas
|
|
56
|
-
às bases de conhecimento. Para captura automática, criação/reconstrução de
|
|
57
|
-
bases, escrita, importação ou exclusão, use o cliente Bun completo abaixo.
|
|
33
|
+
## Install MCP
|
|
58
34
|
|
|
59
|
-
###
|
|
35
|
+
### Full local server (capture + write)
|
|
60
36
|
|
|
61
|
-
|
|
37
|
+
The setup wizard:
|
|
62
38
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
39
|
+
1. Reuses an existing session in `~/.memvault`, or opens Vault Memory sign-in.
|
|
40
|
+
2. Detects installed clients and registers the MCP server.
|
|
41
|
+
3. Leaves other client config in place.
|
|
42
|
+
4. Installs the local dashboard on port `38850` (starts at login on macOS).
|
|
66
43
|
|
|
67
|
-
|
|
68
|
-
enquanto verifica os motores disponíveis. Em terminais pequenos, a abertura usa
|
|
69
|
-
uma versão compacta. Para desativar, execute `vault-go setup --no-animation` ou
|
|
70
|
-
defina `VAULT_GO_NO_ANIMATION=1`. `NO_COLOR`, `TERM=dumb`, CI e saídas sem terminal
|
|
71
|
-
também usam a apresentação estática, sem códigos ANSI ou espera. O modo MCP
|
|
72
|
-
`serve` não exibe a animação.
|
|
73
|
-
|
|
74
|
-
O assistente:
|
|
75
|
-
|
|
76
|
-
1. valida uma sessão existente em `~/.memvault`;
|
|
77
|
-
2. se necessário, abre o login do AI Vault Memory no navegador (chave de API somente com `--api-key`)
|
|
78
|
-
`vg_live_...`;
|
|
79
|
-
3. detecta os clientes instalados;
|
|
80
|
-
4. permite escolher onde registrar o MCP;
|
|
81
|
-
5. preserva as outras configurações dos clientes;
|
|
82
|
-
6. instala e abre o painel local na porta 38850 (início automático no macOS).
|
|
83
|
-
|
|
84
|
-
Clientes suportados:
|
|
85
|
-
|
|
86
|
-
- Codex e ChatGPT Desktop local;
|
|
87
|
-
- Claude Code e Claude Desktop;
|
|
88
|
-
- Grok (config.toml nativo e hooks em `~/.grok/hooks`);
|
|
89
|
-
- Agy / Antigravity CLI e IDE;
|
|
90
|
-
- Gemini CLI;
|
|
91
|
-
- Cursor e Windsurf;
|
|
92
|
-
- VS Code com GitHub Copilot;
|
|
93
|
-
- GitHub Copilot CLI;
|
|
94
|
-
- Roo Code;
|
|
95
|
-
- OpenCode.
|
|
96
|
-
|
|
97
|
-
O Crystal do Vault Desktop usa este mesmo servidor MCP. Ative **Crystal → MCP →
|
|
98
|
-
Ativar no Vault MCP** no Desktop atualizado e reconecte o cliente MCP. As ferramentas
|
|
99
|
-
`vault_go_crystal_list`, `read`, `search`, `write`, `delete`, `sync` e `status` ficam
|
|
100
|
-
disponíveis junto às ferramentas de memória. O Desktop deve permanecer aberto no
|
|
101
|
-
mesmo computador; a conexão local é configurada automaticamente, sem copiar um
|
|
102
|
-
segredo ou cadastrar um segundo servidor. Desativar a integração revoga essa conexão.
|
|
103
|
-
|
|
104
|
-
Comandos explícitos:
|
|
44
|
+
Supported clients: Codex, ChatGPT Desktop, Claude Code, Claude Desktop, Grok, Agy / Antigravity, Gemini CLI, Cursor, Windsurf, VS Code + GitHub Copilot, Copilot CLI, Roo Code, OpenCode, and Vault Desktop (Crystal).
|
|
105
45
|
|
|
106
46
|
```sh
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
bunx --bun vault-go@latest serve
|
|
113
|
-
bunx --bun vault-go@latest engine list
|
|
114
|
-
bunx --bun vault-go@latest engine use openrouter
|
|
115
|
-
bunx --bun vault-go@latest engine use codex --model terra
|
|
116
|
-
bunx --bun vault-go@latest engine key openrouter
|
|
47
|
+
vault-go setup
|
|
48
|
+
vault-go setup --clients codex,claude,copilot
|
|
49
|
+
vault-go setup --engine openrouter
|
|
50
|
+
vault-go setup --engine claude --model sonnet
|
|
51
|
+
vault-go serve
|
|
117
52
|
```
|
|
118
53
|
|
|
119
|
-
|
|
120
|
-
o diretório usa `0700`. Senhas e códigos MFA não são persistidos. Reinicie os
|
|
121
|
-
clientes que estavam abertos depois da primeira instalação.
|
|
122
|
-
|
|
123
|
-
Configuração MCP genérica:
|
|
54
|
+
Generic MCP config:
|
|
124
55
|
|
|
125
56
|
```json
|
|
126
57
|
{
|
|
@@ -133,262 +64,137 @@ Configuração MCP genérica:
|
|
|
133
64
|
}
|
|
134
65
|
```
|
|
135
66
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
67
|
+
Override the home directory with `VAULT_GO_HOME`. Restart clients that were already open after the first install.
|
|
68
|
+
|
|
69
|
+
### Read-only remote MCP
|
|
70
|
+
|
|
71
|
+
For search and context without a local runtime, create an API key with `memory:read` under **Security → API keys**, then:
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
export VAULT_GO_TOKEN='<memory-read-key>'
|
|
75
|
+
codex mcp add vault-go \
|
|
76
|
+
--url https://vaultmemoryai.com/api/mcp \
|
|
77
|
+
--bearer-token-env-var VAULT_GO_TOKEN
|
|
78
|
+
```
|
|
139
79
|
|
|
140
80
|
```json
|
|
141
81
|
{
|
|
142
82
|
"mcpServers": {
|
|
143
83
|
"vault-go": {
|
|
144
|
-
"
|
|
145
|
-
"
|
|
146
|
-
"
|
|
147
|
-
"
|
|
84
|
+
"type": "http",
|
|
85
|
+
"url": "https://vaultmemoryai.com/api/mcp",
|
|
86
|
+
"headers": {
|
|
87
|
+
"Authorization": "Bearer ${VAULT_GO_TOKEN}"
|
|
148
88
|
}
|
|
149
89
|
}
|
|
150
90
|
}
|
|
151
91
|
}
|
|
152
92
|
```
|
|
153
93
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
##
|
|
163
|
-
|
|
164
|
-
- `vault_go_status`: conexão e autenticação sem expor credenciais.
|
|
165
|
-
- `vault_go_cloud_health`: disponibilidade da plataforma.
|
|
166
|
-
- `vault_go_projects` e `vault_go_project_create`: projetos da conta.
|
|
167
|
-
- `vault_go_session_start` e `vault_go_session_end`: ciclo de sessão.
|
|
168
|
-
- `vault_go_event`: eventos de prompt, ferramenta e resultado.
|
|
169
|
-
- `vault_go_remember`: observações, decisões, descobertas e resumos.
|
|
170
|
-
- `vault_go_search`: busca textual com ranking e trechos.
|
|
171
|
-
- `vault_go_search_index`: índice compacto com filtros, trechos e custo estimado.
|
|
172
|
-
- `vault_go_observations`: carrega em lote somente os IDs selecionados.
|
|
173
|
-
- `vault_go_timeline`: contexto anterior e posterior a uma memória.
|
|
174
|
-
- `vault_go_context`: contexto progressivo com limite de caracteres.
|
|
175
|
-
- `vault_go_file_context`: histórico ligado aos arquivos lidos ou modificados.
|
|
176
|
-
- `vault_go_stats`: contagens isoladas da conta.
|
|
177
|
-
- `vault_go_jobs`: fila PostgreSQL da conta, sem payload sensível.
|
|
178
|
-
- `vault_go_job_retry` e `vault_go_job_cancel`: controle idempotente do processamento.
|
|
179
|
-
- `vault_go_export` e `vault_go_import`: transporte JSON tenant-scoped, atômico e idempotente.
|
|
180
|
-
- `vault_go_embedding_status` e `vault_go_embedding_backfill`: busca híbrida e fila vetorial, sem expor chaves.
|
|
181
|
-
- `vault_go_feed`: pagina memórias recentes por projeto, tipo e origem.
|
|
182
|
-
- `vault_go_knowledge_bases` e `vault_go_knowledge_base`: lista e abre bases focadas.
|
|
183
|
-
- `vault_go_knowledge_build` e `vault_go_knowledge_rebuild`: cria ou atualiza uma base a partir de filtros.
|
|
184
|
-
- `vault_go_knowledge_query`: recupera contexto fundamentado e citações dentro da base.
|
|
185
|
-
- `vault_go_knowledge_delete`: remove a base e preserva as memórias originais.
|
|
186
|
-
- `vault_go_forget`: exclusão explícita de uma memória.
|
|
187
|
-
- `vault_go_engines`: lista motores de contexto (Vault AI, Claude, OpenRouter, Gemini, ChatGPT/Codex) sem revelar chaves.
|
|
188
|
-
- `vault_go_engine_select`: escolhe o motor local (`vault-ai-resume`, `claude-subscription`, `openai-subscription`, `openrouter`, `gemini`).
|
|
189
|
-
- `vault_go_generate_context`: gera título, fatos e conceitos com o motor escolhido; não persiste memória sozinho.
|
|
190
|
-
|
|
191
|
-
O seletor oferece Codex (Terra, Luna ou Sol pela assinatura ChatGPT), Claude (CLI da assinatura), OpenRouter (chave), Gemini (chave) ou o Vault AI Resume da conta, quando disponível no servidor. Grave chaves com `vault-go engine key openrouter|gemini` ou no painel local; as ferramentas MCP não aceitam segredos.
|
|
192
|
-
|
|
193
|
-
Na instalação, o Vault Go registra hooks no Claude Code, no Codex, no Grok, no Agy e no Gemini CLI. Eles carregam contexto e capturam os eventos oferecidos pelo cliente; o serviço local (`http://localhost:38850`) gera memórias com o motor escolhido, persistindo no Vault. No OpenCode 1.x, um plugin acrescenta contexto ao sistema antes das chamadas do modelo; esse adaptador não adiciona captura automática.
|
|
194
|
-
|
|
195
|
-
Também há [captura persistente opt-in de transcripts Claude/Codex e contexto entre projetos](docs/transcripts-and-context.md), com comandos CLI e MCP, checkpoints privados e consentimento por workspace/conta. Ativar esses recursos preserva o motor/modelo escolhido.
|
|
196
|
-
|
|
197
|
-
O recurso `vault-go://status` fornece o resumo sanitizado em JSON.
|
|
198
|
-
|
|
199
|
-
Para reduzir o uso de contexto, prefira a recuperação em três camadas:
|
|
200
|
-
|
|
201
|
-
1. Pesquise com `vault_go_search_index`, usando projeto, origem, conceitos,
|
|
202
|
-
arquivos e intervalo de datas quando conhecidos.
|
|
203
|
-
2. Abra `vault_go_timeline` somente para os resultados que precisam de
|
|
204
|
-
contexto cronológico.
|
|
205
|
-
3. Envie os IDs escolhidos a `vault_go_observations` para carregar o conteúdo
|
|
206
|
-
completo em um único lote tenant-scoped.
|
|
207
|
-
|
|
208
|
-
As bases, filtros, vínculos e feed ficam exclusivamente no PostgreSQL da
|
|
209
|
-
plataforma. A consulta retorna evidências e `synthesisAvailable: false`; o
|
|
210
|
-
cliente MCP faz a síntese, evitando respostas inventadas e chaves ocultas no
|
|
211
|
-
servidor. A síntese do servidor só será habilitada quando um provedor semântico
|
|
212
|
-
for configurado explicitamente.
|
|
213
|
-
|
|
214
|
-
## Fluxo integrado
|
|
94
|
+
Remote MCP exposes projects, search, context, recents, feed, timeline, tool I/O, file context, stats, embeddings, and knowledge-base queries. Automatic capture, knowledge-base writes, import, and delete require the local Bun server.
|
|
95
|
+
|
|
96
|
+
`VAULT_GO_TOKEN` accepts a session token or a `vg_live_...` key. Use only the scopes you need: `memory:read`, `memory:write`, `memory:delete`. `VAULT_GO_API_URL` changes the API host. Browser login refreshes automatically; API keys are for scoped automation.
|
|
97
|
+
|
|
98
|
+
### Vault Desktop (Crystal)
|
|
99
|
+
|
|
100
|
+
On an updated Vault Desktop, enable **Crystal → MCP → Enable in Vault MCP** and reconnect the MCP client. Crystal note tools (`vault_go_crystal_list`, `read`, `search`, `write`, `delete`, `sync`, `status`) appear next to memory tools. Desktop must stay open on the same machine. No second server or copied secret is required. Disabling the integration revokes that connection.
|
|
101
|
+
|
|
102
|
+
## How it works
|
|
215
103
|
|
|
216
104
|
```text
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
105
|
+
AI client → vault-go (local MCP)
|
|
106
|
+
↓
|
|
107
|
+
Vault Memory API (authenticated)
|
|
108
|
+
↓
|
|
109
|
+
Memory engine → your account store
|
|
220
110
|
```
|
|
221
111
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
112
|
+
The engine has no public route. The API authenticates you, then scopes every query to that account. Clients cannot read another account’s memories.
|
|
113
|
+
|
|
114
|
+
Setup also installs session hooks on Claude Code, Codex, Grok, Agy, and Gemini CLI. Those hooks load project context and capture supported events. The local worker at `http://localhost:38850` generates memories with the selected engine and writes them to Vault Memory. OpenCode 1.x gets a context-only plugin; it does not capture automatically.
|
|
225
115
|
|
|
226
|
-
|
|
116
|
+
Prefer three-step retrieval to keep context small:
|
|
227
117
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
- Limita tamanhos, listas e janelas nos schemas das ferramentas.
|
|
232
|
-
- Reserva `stdout` exclusivamente para o protocolo MCP.
|
|
233
|
-
- O painel guarda cache de projetos/memórias e metadados de chamadas MCP em arquivos privados locais.
|
|
118
|
+
1. `vault_go_search_index` with project, type, concepts, files, or dates.
|
|
119
|
+
2. `vault_go_timeline` only around the hits that need nearby context.
|
|
120
|
+
3. `vault_go_observations` for the selected IDs.
|
|
234
121
|
|
|
235
|
-
|
|
236
|
-
busca, gravação e exclusão de memórias dentro da conta autenticada.
|
|
122
|
+
## Context engines
|
|
237
123
|
|
|
238
|
-
|
|
124
|
+
List and select engines without putting API keys in MCP tools:
|
|
239
125
|
|
|
240
126
|
```sh
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
npm run pack:check
|
|
127
|
+
vault-go engine list
|
|
128
|
+
vault-go engine use openrouter
|
|
129
|
+
vault-go engine use codex --model terra
|
|
130
|
+
vault-go engine key openrouter
|
|
246
131
|
```
|
|
247
132
|
|
|
248
|
-
|
|
133
|
+
| Engine | How it authenticates |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| Vault AI Resume | Vault account entitlement |
|
|
136
|
+
| Claude | `claude auth login` (subscription CLI) |
|
|
137
|
+
| Codex / ChatGPT | `codex login` — models `terra`, `luna`, `sol` (CLI 0.155.1+) |
|
|
138
|
+
| OpenRouter | key stored with `vault-go engine key openrouter` |
|
|
139
|
+
| Gemini | key stored with `vault-go engine key gemini` |
|
|
249
140
|
|
|
250
|
-
|
|
251
|
-
semântica, publicação no npm, tag e GitHub Release:
|
|
141
|
+
MCP tools never accept secrets. Store keys with the CLI or the local dashboard. Provider usage limits apply. Managed Vault AI generation still depends on server configuration and quota.
|
|
252
142
|
|
|
253
|
-
|
|
254
|
-
- `feat:` gera minor;
|
|
255
|
-
- `feat!:` ou `BREAKING CHANGE:` gera major.
|
|
143
|
+
## MCP tools
|
|
256
144
|
|
|
257
|
-
|
|
258
|
-
repositório ou em logs.
|
|
145
|
+
Account and health: `vault_go_status`, `vault_go_cloud_health`, `vault_go_preferences`, `vault_go_preferences_update`.
|
|
259
146
|
|
|
147
|
+
Projects and sessions: `vault_go_projects`, `vault_go_project_create`, `vault_go_session_start`, `vault_go_session_end`, `vault_go_session_start_context`.
|
|
260
148
|
|
|
261
|
-
|
|
149
|
+
Capture and recall: `vault_go_event`, `vault_go_remember`, `vault_go_forget`, `vault_go_search`, `vault_go_search_index`, `vault_go_observations`, `vault_go_timeline`, `vault_go_context`, `vault_go_file_context`, `vault_go_feed`, `vault_go_memory`, `vault_go_tool_uses`, `vault_go_stats`.
|
|
262
150
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
bunx --bun vault-go@latest local stop
|
|
269
|
-
bunx --bun vault-go@latest local uninstall
|
|
270
|
-
```
|
|
151
|
+
Knowledge bases: `vault_go_knowledge_bases`, `vault_go_knowledge_base`, `vault_go_knowledge_build`, `vault_go_knowledge_rebuild`, `vault_go_knowledge_query`, `vault_go_knowledge_delete`, `vault_go_prime_corpus`, `vault_go_query_corpus`, `vault_go_reprime_corpus`.
|
|
152
|
+
|
|
153
|
+
Jobs and backup: `vault_go_jobs`, `vault_go_job`, `vault_go_job_retry`, `vault_go_job_cancel`, `vault_go_processing_status`, `vault_go_observer_status`, `vault_go_export`, `vault_go_import`, `vault_go_backup_create`, `vault_go_backup_restore`, `vault_go_embedding_status`, `vault_go_embedding_backfill`.
|
|
154
|
+
|
|
155
|
+
Engines and updates: `vault_go_engines`, `vault_go_engine_select`, `vault_go_generate_context`, `vault_go_update_status`, `vault_go_update_check`, `vault_go_update_install`, `vault_go_update_configure`.
|
|
271
156
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
uma prova criptográfica do serviço e abre uma sessão privada no navegador;
|
|
282
|
-
o segredo local é removido do fragmento imediatamente e trocado por cookie
|
|
283
|
-
HttpOnly/SameSite=Strict. Não há CORS nem acesso direto da nuvem ao localhost.
|
|
284
|
-
O portal `/app/local` abre o painel da máquina atual.
|
|
285
|
-
|
|
286
|
-
No macOS, `local install` registra um LaunchAgent do usuário. Em Linux e
|
|
287
|
-
Windows, inicia o serviço nesta sessão; após reiniciar, use `local start`.
|
|
288
|
-
O runtime fica em `~/.memvault/local-runtime`, independente do cache bunx.
|
|
289
|
-
`local stop` para o processo; `local uninstall` remove o início automático e
|
|
290
|
-
preserva autenticação, cache e atividade. A atualização automática mantém o
|
|
291
|
-
serviço e os hooks atualizados; clientes MCP abertos precisam reconectar.
|
|
292
|
-
Após validar a nova versão do serviço, a atualização também repara os hooks do
|
|
293
|
-
Gemini e o plugin do OpenCode quando esses clientes já têm o MCP Vault configurado.
|
|
294
|
-
Plugins de terceiros são preservados. Reinicie clientes abertos para carregar
|
|
295
|
-
novos hooks ou o módulo atualizado do plugin.
|
|
296
|
-
|
|
297
|
-
A atividade registra método, rota, duração e resultado das chamadas feitas
|
|
298
|
-
pelo MCP Vault, sem argumentos, consultas ou credenciais. Não captura toda a
|
|
299
|
-
atividade da máquina nem importa automaticamente o banco do claude-mem em
|
|
300
|
-
37701. A sincronização deste painel é de leitura da nuvem; as ferramentas
|
|
301
|
-
MCP continuam responsáveis pelas gravações na API.
|
|
302
|
-
|
|
303
|
-
### Sessões, dispositivos e proteção local
|
|
304
|
-
|
|
305
|
-
**Sair** encerra a sessão desta página e cancela suas prévias de contexto.
|
|
306
|
-
**Desconectar dispositivo** pede confirmação, revoga as credenciais do agente
|
|
307
|
-
na nuvem e remove a autenticação e o cache local após sucesso. Os arquivos
|
|
308
|
-
pessoais permanecem intactos. Para reconectar, entre novamente pelo navegador.
|
|
309
|
-
O portal mostra último contato, permissões e permite revogar cada agente.
|
|
310
|
-
|
|
311
|
-
O cache e a credencial de monitoramento usam AES-256-GCM. No macOS, a chave
|
|
312
|
-
fica no Keychain; nos demais sistemas, em arquivo privado `0600`. Os tokens
|
|
313
|
-
MCP existentes continuam em arquivo privado. O painel informa essas diferenças:
|
|
314
|
-
cache cifrado não significa que todas as memórias sejam criptografadas ponta a
|
|
315
|
-
ponta. O cofre de arquivos e o canal do terminal têm seus próprios protocolos.
|
|
316
|
-
|
|
317
|
-
### Motor de contexto
|
|
318
|
-
|
|
319
|
-
Escolha **Vault AI Resume**, **Claude Subscription** ou **OpenAI Subscription**
|
|
320
|
-
no painel local. A disponibilidade é verificada antes da geração. Claude usa
|
|
321
|
-
`claude auth login`; OpenAI usa `codex login` com uma conta ChatGPT. O agente
|
|
322
|
-
não pede nem copia credenciais desses provedores. O modelo gerenciado depende
|
|
323
|
-
de configuração e quota no servidor Vault.
|
|
324
|
-
|
|
325
|
-
A prévia manual exige texto informado pelo usuário, usa diretório temporário,
|
|
326
|
-
limites de entrada/saída e timeout, e permite cancelamento. CLIs recebem apenas
|
|
327
|
-
o texto informado, com ferramentas/configurações locais desativadas conforme
|
|
328
|
-
os recursos suportados. O resultado é uma prévia privada da sessão, disponível
|
|
329
|
-
para copiar; não é salvo automaticamente como memória. Os planos e limites do
|
|
330
|
-
provedor escolhido se aplicam. Cancelar não garante estorno de uso já iniciado.
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
## Contexto automático e processamento
|
|
334
|
-
|
|
335
|
-
Os hooks SessionStart leem o contexto do projeto no início, retomada e compactação
|
|
336
|
-
conforme os eventos oferecidos pelo cliente. O hook anterior à leitura de arquivos
|
|
337
|
-
é síncrono para conseguir inserir o contexto. `vault_go_session_start_context`
|
|
338
|
-
executa o mesmo leitor, respeitando `contextItems` e `contextMaxChars` da conta.
|
|
339
|
-
|
|
340
|
-
Claude, Codex e Gemini mostram uma confirmação quando o contexto é carregado,
|
|
341
|
-
sem exibir conteúdo da memória nessa confirmação. Worktrees Git reutilizam o
|
|
342
|
-
projeto do repositório principal; se ele ainda não estiver cadastrado, um projeto
|
|
343
|
-
existente do próprio worktree continua legível. Submódulos mantêm seu projeto.
|
|
344
|
-
|
|
345
|
-
O Gemini usa `SessionStart`, `BeforeAgent`, `AfterTool` e `AfterAgent`, conforme
|
|
346
|
-
seu [contrato de hooks](https://geminicli.com/docs/hooks/reference/). Não há
|
|
347
|
-
injeção de histórico de arquivo em `BeforeTool`, pois esse evento não oferece
|
|
348
|
-
esse contrato. O plugin OpenCode usa `experimental.chat.system.transform`
|
|
349
|
-
do [contrato 1.x](https://github.com/anomalyco/opencode/blob/v1.18.31/packages/plugin/src/index.ts),
|
|
350
|
-
com prazo de três segundos e continuação normal em caso de falha. Consultas
|
|
351
|
-
simultâneas da mesma sessão são compartilhadas; respostas de uma credencial
|
|
352
|
-
substituída não são injetadas. Clientes sem esses adaptadores acessam memória
|
|
353
|
-
pelas ferramentas MCP, sem promessa de contexto automático.
|
|
354
|
-
|
|
355
|
-
A captura respeita `automaticCapture`, `captureMode` e a opção de incluir resultados
|
|
356
|
-
de ferramentas. Uma falha ao consultar preferências desativa aquela captura.
|
|
357
|
-
Eventos privados não são enviados; campos sensíveis e marcadores privados são
|
|
358
|
-
removidos antes do processamento. A redação é heurística, não uma garantia de
|
|
359
|
-
reconhecimento de qualquer formato de segredo.
|
|
360
|
-
|
|
361
|
-
O worker processa uma fila privada persistente com o motor selecionado. A geração
|
|
362
|
-
bem-sucedida é conservada para repetir somente a gravação quando a rede falha;
|
|
363
|
-
a importação usa uma chave idempotente. A troca de conta não transfere jobs entre
|
|
364
|
-
contas. Jobs antigos são adotados apenas após confirmar que o projeto pertence
|
|
365
|
-
à conta autenticada. `summaryMode=off` preserva o conteúdo capturado sem chamar
|
|
366
|
-
modelo. `vault_go_processing_status` mostra pendências e falhas sem seu conteúdo.
|
|
157
|
+
Graph and local code: `vault_go_graph`, `vault_go_graph_link`, `vault_go_graph_link_delete`, `vault_go_graph_presets`, `vault_go_graph_preset_save`, `vault_go_smart_outline`, `vault_go_smart_unfold`, `vault_go_smart_search`, `vault_go_smart_languages`.
|
|
158
|
+
|
|
159
|
+
Workflows: `vault_go_workflow`, `vault_go_modes`, `vault_go_mode`, plus named prompts such as `vault_go_babysit`. Loading a mode gives the agent instructions; it does not start a background job.
|
|
160
|
+
|
|
161
|
+
Optional local integrations (explicit consent): Telegram alerts, custom mode taxonomies, Claude/Codex transcript watchers, multi-project context chains, and Grok awareness logs. See `vault_go_capabilities` for what is configured on this machine.
|
|
162
|
+
|
|
163
|
+
The `vault-go://status` resource is a sanitized JSON summary.
|
|
164
|
+
|
|
165
|
+
## Local dashboard
|
|
367
166
|
|
|
368
167
|
```sh
|
|
369
|
-
vault-go
|
|
370
|
-
vault-go
|
|
371
|
-
vault-go
|
|
168
|
+
vault-go local install
|
|
169
|
+
vault-go local open
|
|
170
|
+
vault-go local status
|
|
171
|
+
vault-go local stop
|
|
172
|
+
vault-go local uninstall
|
|
372
173
|
```
|
|
373
174
|
|
|
374
|
-
|
|
375
|
-
`model: "terra"`, `"luna"` ou `"sol"`. Requer `codex login` com ChatGPT e a CLI
|
|
376
|
-
0.155.1 ou superior no PATH usado pelo serviço. Instalações antigas que aparecem
|
|
377
|
-
antes no PATH são detectadas antes da geração. O modelo padrão do Codex é Terra.
|
|
378
|
-
Os limites de uso da assinatura se aplicam. O processamento gerenciado Vault AI
|
|
379
|
-
continua dependendo de configuração e quota no servidor.
|
|
175
|
+
Open [http://localhost:38850](http://localhost:38850) and choose **Connect to Vault**. The service listens only on `127.0.0.1:38850`. `local open` proves the local process cryptographically, then uses an HttpOnly / SameSite=Strict cookie. There is no CORS and no inbound path from the cloud to localhost.
|
|
380
176
|
|
|
381
|
-
|
|
177
|
+
The dashboard follows the browser language (pt / en / es) and can switch locale. It shows local search, recent MCP activity, and cloud projects/memories for the signed-in account. While visible it refreshes the UI every 5 seconds and the cloud every 15 seconds. Offline, it keeps the last cache for that account.
|
|
382
178
|
|
|
383
|
-
|
|
384
|
-
uma instalação de versão exata em `~/.memvault/releases`, sem executar scripts
|
|
385
|
-
do pacote, valida a estrutura e executa um teste de inicialização. Ativa a versão
|
|
386
|
-
quando o worker e a fila estão ociosos. Uma falha na inicialização restaura o runtime
|
|
387
|
-
anterior. A autenticação, as preferências e a fila são preservadas.
|
|
179
|
+
On macOS, `local install` registers a user LaunchAgent. On Linux and Windows it starts for this session; use `local start` after reboot. Runtime files live in `~/.memvault/local-runtime`. Uninstall removes autostart and keeps auth, cache, and activity.
|
|
388
180
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
181
|
+
**Sign out** ends this browser session and cancels its context previews. **Disconnect device** revokes the cloud device credential and, after success, removes local auth and cache. Personal files are left in place. Reconnect through the browser.
|
|
182
|
+
|
|
183
|
+
## Capture and processing
|
|
184
|
+
|
|
185
|
+
SessionStart hooks load project context on start, resume, and compact when the client offers those events. File-read hooks are synchronous so context can be injected. `vault_go_session_start_context` is the same reader, using the account `contextItems` and `contextMaxChars` budget.
|
|
186
|
+
|
|
187
|
+
Claude, Codex, and Gemini confirm that context loaded without printing memory contents. Git worktrees reuse the canonical repository project. Submodules keep their own project.
|
|
188
|
+
|
|
189
|
+
Capture honors `automaticCapture`, `captureMode`, and whether tool results are included. A preference lookup failure disables that capture. Private events are not sent. Sensitive fields and private markers are stripped before processing (heuristic redaction, not a guarantee for every secret format).
|
|
190
|
+
|
|
191
|
+
The worker drains a private queue with the selected engine. Successful generation is cached so a network retry does not call the model again. Import uses an idempotency key. Account switches do not move jobs between accounts. `summaryMode=off` stores captured text without calling a model. `vault_go_processing_status` reports counts, not contents.
|
|
192
|
+
|
|
193
|
+
Opt-in Claude/Codex transcript watchers and project context chains are configured with MCP/CLI and stay bound to the current account.
|
|
194
|
+
|
|
195
|
+
## Automatic updates
|
|
196
|
+
|
|
197
|
+
The worker checks the official npm registry daily for a stable `vault-go` release, stages an exact version under `~/.memvault/releases` without running package install scripts, validates it, and activates when idle. A failed start rolls back. Auth, preferences, and the queue are kept. Open MCP clients must reconnect to load new tools.
|
|
392
198
|
|
|
393
199
|
```sh
|
|
394
200
|
vault-go update status
|
|
@@ -398,78 +204,31 @@ vault-go update off
|
|
|
398
204
|
vault-go update on
|
|
399
205
|
```
|
|
400
206
|
|
|
401
|
-
|
|
402
|
-
`vault_go_update_install` e `vault_go_update_configure`. Instalação manual pode
|
|
403
|
-
reiniciar o serviço; a atualização automática espera o processamento terminar.
|
|
404
|
-
|
|
405
|
-
## Auditoria do claude-mem e ferramentas adicionais
|
|
406
|
-
|
|
407
|
-
A comparação usa o código do claude-mem 13.25.2, commit
|
|
408
|
-
`adce0fdfaf1cd46646bbd0b22ae74cbd460ed787`. A matriz acessível em
|
|
409
|
-
`vault_go_capabilities` e no recurso `vault-go://capabilities` distingue funções
|
|
410
|
-
implementadas e suas dependências. `deploymentVerified` resulta de consultas aos
|
|
411
|
-
contratos da API/engine conectados, com cache privado de cinco minutos por conta;
|
|
412
|
-
não presume autenticação dos provedores nem entrega de notificações. O recurso
|
|
413
|
-
MCP lê somente o cache; a ferramenta verifica por padrão.
|
|
414
|
-
|
|
415
|
-
Além das ferramentas acima, o MCP inclui:
|
|
416
|
-
|
|
417
|
-
- `vault_go_workflow`: guia de recuperação progressiva.
|
|
418
|
-
- `vault_go_tool_uses`: dados originais redigidos de ferramentas, por ID do evento,
|
|
419
|
-
memória vinculada ou chave externa; depende da captura histórica disponível.
|
|
420
|
-
- `vault_go_memory`: abre uma memória por UUID.
|
|
421
|
-
- `vault_go_preferences` / `vault_go_preferences_update`: captura e orçamento de contexto.
|
|
422
|
-
- `vault_go_observer_status` / `vault_go_processing_status`: processamento remoto e local.
|
|
423
|
-
- `vault_go_graph`, `vault_go_graph_link`, `vault_go_graph_link_delete`,
|
|
424
|
-
`vault_go_graph_presets` e `vault_go_graph_preset_save`: leitura e manutenção do grafo.
|
|
425
|
-
- `vault_go_smart_outline`, `vault_go_smart_unfold` e `vault_go_smart_search`:
|
|
426
|
-
exploração AST local. Search aceita padrões estruturais como `console.log($ARG)`;
|
|
427
|
-
`filePattern` é glob. As ferramentas informam linguagens suportadas e truncamento,
|
|
428
|
-
limitam leitura ao workspace e bloqueiam caminhos privados e escapes por symlink.
|
|
429
|
-
|
|
430
|
-
A busca aceita `query` opcional, `offset` e `orderBy`. A timeline também pode
|
|
431
|
-
localizar a âncora por consulta. `vault_go_job` consulta um job individual.
|
|
432
|
-
`vault_go_prime_corpus`, `vault_go_query_corpus` e `vault_go_reprime_corpus`
|
|
433
|
-
respondem com o modelo escolhido, citações e histórico local cifrado de até 12 turnos.
|
|
434
|
-
|
|
435
|
-
`vault_go_backup_create` salva todas as páginas de um snapshot consistente em
|
|
436
|
-
arquivo privado, com SHA-256 e cobertura declarada. `vault_go_backup_restore`
|
|
437
|
-
valida hash e proprietário antes de alterar preferências ou dados. Snapshots têm
|
|
438
|
-
TTL de uma hora e limite explícito de 100 mil registros; exceder limites retorna
|
|
439
|
-
erro, sem apresentar um backup truncado como completo. O formato é próprio do
|
|
440
|
-
Vault; não equivale ao SQLite upstream nem a uma réplica offline.
|
|
441
|
-
|
|
442
|
-
Telegram, CCS Align e taxonomias herdadas têm integrações locais próprias; veja
|
|
443
|
-
[integrações de modos](docs/mode-integrations.md). Watchers de Claude/Codex e
|
|
444
|
-
contexto entre projetos são configuráveis com consentimento; veja
|
|
445
|
-
[transcripts e contexto](docs/transcripts-and-context.md). O [scan completo](docs/claude-mem-upstream-scan.md)
|
|
446
|
-
registra os contratos upstream; a matriz MCP descreve a implementação atual.
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
## Modos e skills padrão no MCP
|
|
450
|
-
|
|
451
|
-
O pacote inclui 20 workflows originais adaptados ao Vault. Liste com
|
|
452
|
-
`vault_go_modes` e carregue com `vault_go_mode`, por exemplo:
|
|
207
|
+
## Security
|
|
453
208
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
209
|
+
- Tools and resources never return access or refresh tokens.
|
|
210
|
+
- HTTPS only, except HTTP on localhost.
|
|
211
|
+
- Access tokens refresh from a private local refresh token.
|
|
212
|
+
- Tool schemas bound sizes, lists, and windows.
|
|
213
|
+
- `stdout` is reserved for the MCP protocol.
|
|
214
|
+
- The dashboard cache uses AES-256-GCM (macOS Keychain, elsewhere a `0600` file). Encrypted cache is not the same as end-to-end encryption of every memory.
|
|
457
215
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
216
|
+
Install this MCP only on clients you trust: a connected client can search, write, and delete memories in the signed-in account.
|
|
217
|
+
|
|
218
|
+
## Development
|
|
219
|
+
|
|
220
|
+
```sh
|
|
221
|
+
npm install
|
|
222
|
+
bun run typecheck
|
|
223
|
+
bun test src
|
|
224
|
+
bun run build
|
|
225
|
+
npm run pack:check
|
|
226
|
+
```
|
|
462
227
|
|
|
463
|
-
|
|
464
|
-
knowledge-agent, standup, timeline-report, weekly-digests, learn-codebase,
|
|
465
|
-
pathfinder, design-is, what-the, version-bump, oh-my-issues, cloud-sync,
|
|
466
|
-
mode-creator, ccs-align e wowerpoint.
|
|
228
|
+
Pushes to `main` run CI. Conventional commits publish to npm (`fix` → patch, `feat` → minor, `BREAKING CHANGE` → major). `NPM_TOKEN` lives only in GitHub Actions.
|
|
467
229
|
|
|
468
|
-
|
|
469
|
-
enquanto a solicitação está ativa. `mode-creator` instala taxonomias herdadas e
|
|
470
|
-
`ccs-align` mantém cache, exclusões e relatório de regras por viewer. Wowerpoint
|
|
471
|
-
ainda depende de um renderer de apresentação do cliente, e cmem.ai continua sendo
|
|
472
|
-
um serviço distinto. Ações externas seguem a autorização da tarefa; carregar um
|
|
473
|
-
prompt não envia mensagens, publica versões ou faz merge.
|
|
230
|
+
## Links
|
|
474
231
|
|
|
475
|
-
|
|
232
|
+
- Product: [https://vault.resolveup.com.br](https://vault.resolveup.com.br)
|
|
233
|
+
- Source: [https://github.com/resolveup-cloud/vault-go](https://github.com/resolveup-cloud/vault-go)
|
|
234
|
+
- npm: [https://www.npmjs.com/package/vault-go](https://www.npmjs.com/package/vault-go)
|
package/dist/local-dashboard.js
CHANGED
|
@@ -5,7 +5,7 @@ export function dashboardHtml() {
|
|
|
5
5
|
|
|
6
6
|
/* Same identity tokens and glass surfaces as the Vault portal. */
|
|
7
7
|
:root{--c-canvas:8 11 18;--c-surface:24 29 45;--c-surface-2:32 38 56;--c-line:53 61 81;--c-fg:241 243 252;--c-muted:172 180 203;--c-faint:148 159 187;--c-accent:185 182 255;color:rgb(var(--c-fg));background:rgb(var(--c-canvas))}body{background:radial-gradient(ellipse at 85% 8%,#534ca02e,transparent 45%),linear-gradient(145deg,#080b12,#101321 58%,#080b12)}[hidden]{display:none!important}.shell{grid-template-columns:258px 1fr;max-width:1600px}.rail{background:linear-gradient(160deg,#1c2135f5,#101522f5);border-color:#cdd8ff26}.brand{font-size:15px;letter-spacing:-.3px;gap:10px;white-space:nowrap}.brand img,.onboarding-logo{object-fit:contain;filter:drop-shadow(0 5px 12px #7775c533)}.brand-sub{display:block;font-size:9px;letter-spacing:1.7px;color:#acb4cb;margin-top:7px}.card,.panel,.onboarding,.step,.notice{background:linear-gradient(135deg,#272c3ed1,#131724e0);border-color:#cdd8ff26;box-shadow:0 24px 70px -30px #0009,inset 0 1px 0 #ffffff0c;backdrop-filter:blur(28px) saturate(135%)}.nav a.active,.nav a:hover{background:#b9b6ff20;color:#d3d1ff}.eyebrow,.step-number,.empty-symbol{color:#b9b6ff}p,.card-label{color:#acb4cb}.card-note,.row-meta,.rail-footer,.rail-label,.footer{color:#949fbb}.pulse{color:#b9b6ff;border-color:#b9b6ff30;background:#b9b6ff0d}.button{background:#202638;color:#f1f3fc;border-color:#cdd8ff26;text-decoration:none;justify-content:center}.button:hover{border-color:#b9b6ff88}.primary{background:linear-gradient(135deg,#c8c5ff,#9d9bed);color:#15152f;border-color:transparent;font-weight:650;padding:13px 20px;font-size:14px}.primary:hover{background:#d3d1ff}.onboarding{border:1px solid #cdd8ff26;border-radius:20px;overflow:hidden;margin-top:30px;animation:arrive .6s ease both}.onboarding-hero{position:relative;padding:38px;background:radial-gradient(ellipse at 100% 0%,#7370d02c,transparent 62%)}.onboarding-logo{width:86px;height:86px;margin-bottom:24px}.onboarding h1{font-size:36px;max-width:600px;line-height:1.12;margin:12px 0 18px}.onboarding-hero>p{max-width:570px;font-size:14px;line-height:1.8}.actions{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:25px}.link{color:#d3d1ff;text-decoration:none;font-size:12px}.link:hover{text-decoration:underline}.onboarding-hint{font-size:11px!important;color:#949fbb;margin-top:15px!important}.steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-top:1px solid #cdd8ff26}.step{padding:25px;background:#080b122b;box-shadow:none;border-right:1px solid #cdd8ff16}.step:last-child{border:0}.step-number{font-family:monospace;font-size:11px;margin-bottom:13px}.step h2{margin-bottom:9px}.step p{font-size:12px}.terminal-fallback{padding:22px 30px;border-top:1px solid #cdd8ff26;background:#080b1233}.terminal-fallback p{font-size:12px}.terminal-fallback code{display:block;margin-top:10px;font-size:12px;color:#d3d1ff;overflow-wrap:anywhere}.connection-message{margin-top:18px;font-size:12px;color:#d3d1ff;min-height:18px}.next-step{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-top:22px;padding:23px;border:1px solid #b9b6ff30;border-radius:14px;background:#b9b6ff09}.next-step h2{margin-bottom:8px}.next-step p{font-size:12px}.next-step .actions{margin:0;flex-shrink:0}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible{outline-color:#b9b6ff}.notice code{color:#d3d1ff}.search{border-color:#cdd8ff26;background:#0307117a}.breadcrumb b{color:#f1f3fc}.rail-footer .dot{background:#b9b6ff}.footer{margin-top:28px}@media(max-width:1100px){.shell{grid-template-columns:225px 1fr}.brand{font-size:13px}.main{padding:25px}.onboarding-hero{padding:30px}.next-step{align-items:flex-start;flex-direction:column}}@media(max-width:680px){.shell{display:block}.brand{font-size:16px}.onboarding{margin-top:22px}.onboarding-hero{padding:26px}.onboarding h1{font-size:30px}.onboarding-logo{width:65px;height:65px;margin-bottom:15px}.steps{grid-template-columns:1fr}.step{padding:20px 26px;border-right:0;border-bottom:1px solid #cdd8ff16}.step-number{margin-bottom:8px}.terminal-fallback{padding:22px 26px}.main{padding:20px}.next-step .actions{flex-shrink:1}.onboarding .actions .button{width:100%}.onboarding .actions .link{padding:8px 0}.card-value{overflow-wrap:anywhere}.nav{padding-bottom:2px}}
|
|
8
|
-
.danger{border-color:#ed9a9a66;color:#ffb5b5;background:#53272d55}.danger:hover{border-color:#ffb5b5}.danger-title{color:#ffb5b5}.pagination{display:flex;gap:9px;align-items:center;flex-wrap:wrap;border-top:1px solid #cdd8ff20;margin-top:15px;padding-top:15px;color:#acb4cb;font-size:11px}.pagination label{display:flex;align-items:center;gap:7px}.pagination .page-summary{flex:1;min-width:95px}.pagination select{padding:7px}.pagination .button{padding:7px 10px}.pagination button:disabled{cursor:default}.row-open{background:transparent;border:0;text-align:left;padding:0;color:#d3d1ff;cursor:pointer;font:inherit}.row-open:hover{text-decoration:underline}.row-actions{padding-top:5px}.detail-dialog{color:#f1f3fc;background:linear-gradient(135deg,#272c3e,#131724);border:1px solid #cdd8ff40;border-radius:18px;max-width:800px;width:calc(100% - 32px);max-height:85vh;padding:26px;box-shadow:0 30px 100px #0009}.detail-dialog::backdrop{background:#050710bd;backdrop-filter:blur(5px)}.detail-dialog h2{font-size:20px;overflow-wrap:anywhere}.detail-fields{margin:0}.detail-fields dt{color:#acb4cb;font-size:11px;margin:20px 0 8px}.detail-fields dd{margin:0;font-size:13px;line-height:1.7;white-space:pre-wrap;overflow-wrap:anywhere}.detail-fields pre{font:inherit;white-space:pre-wrap;margin:0}.engine-options{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-top:18px}.engine-keys{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;margin-top:16px}.engine-keys label{display:block;font-size:12px;margin-bottom:8px}.engine-keys input{width:100%;background:#0307117a;color:#f1f3fc;border:1px solid #cdd8ff26;border-radius:9px;padding:10px 12px;font:inherit;font-size:13px;margin-bottom:8px}.engine-option{display:block;padding:17px;border:1px solid #cdd8ff26;border-radius:10px;background:#080b1233;cursor:pointer}.engine-option:has(input:checked){border-color:#b9b6ff;background:#b9b6ff12}.engine-option:has(input:disabled){opacity:.7;cursor:default}.engine-option input{accent-color:#b9b6ff;margin-right:8px}.engine-option strong{font-size:12px}.engine-option p{font-size:11px;margin-top:9px}.engine-message{margin-top:13px;font-size:12px;color:#d3d1ff}.context-editor{margin-top:20px}.context-editor label{display:block;font-size:12px;margin-bottom:8px}.context-editor textarea{width:100%;min-height:130px;resize:vertical;background:#0307117a;color:#f1f3fc;border:1px solid #cdd8ff26;border-radius:9px;padding:12px;font:inherit;font-size:13px}.context-editor textarea:focus-visible{outline:2px solid #b9b6ff;outline-offset:3px}@media(max-width:800px){.engine-options{grid-template-columns:1fr}}@media(prefers-reduced-motion:reduce){.detail-dialog::backdrop{backdrop-filter:none}}</style><script src="/app.js" defer></script></head><body><div class="shell"><aside class="rail"><div class="brand"><img src="/logo.png" alt="" width="46" height="46"><div>AI Vault Memory<span class="brand-sub">LOCAL AGENT</span></div></div><div class="rail-label" data-i18n="workspace">WORKSPACE</div><nav class="nav" aria-label="Navigation"><a class="active" href="#overview"><span class="icon">◈</span><span data-i18n="overview">Overview</span></a><a href="#activity"><span class="icon">⌁</span><span data-i18n="activity">Activity</span></a><a href="#memories"><span class="icon">▤</span><span data-i18n="memories">Memories</span></a><a href="#context"><span class="icon">✧</span><span data-i18n="contextEngine">Context engine</span></a><a href="#projects"><span class="icon">▱</span><span data-i18n="projects">Projects</span></a></nav><div class="rail-footer"><span class="dot"></span><span data-i18n="localWorkspace">Your local workspace</span><br><span data-i18n="privacy">Activity metadata stays local.</span></div></aside><main class="main" id="overview"><header class="top"><div class="breadcrumb">Vault <span aria-hidden="true"> / </span><b data-i18n="localMonitor">Local monitor</b></div><div class="controls"><select id="locale" aria-label="Language"><option value="en">English</option><option value="pt">Português</option><option value="es">Español</option></select><button class="button" id="logout" type="button" hidden data-i18n="logout">Sign out of dashboard</button><button class="button" id="reconnect" type="button" hidden data-i18n="reconnect">Reconnect account</button><button class="button" id="refresh" type="button"><span aria-hidden="true">↻</span><span data-i18n="refresh">Refresh cloud</span></button></div></header><div id="error" class="error" role="status" aria-live="polite"></div><section class="onboarding" id="onboarding"><div class="onboarding-hero"><img class="onboarding-logo" src="/logo.png" alt="" width="86" height="86"><div class="eyebrow" data-i18n="connectEyebrow">AI VAULT MEMORY · LOCAL</div><h1 data-i18n="connectTitle">Your memory. Connected to this machine.</h1><p data-i18n="connectIntro">Connect your Vault account to see your memories, projects and recent activity in one place.</p><div class="actions"><button type="button" class="button primary" id="connect" data-i18n="connect">Connect to Vault</button><a class="link" href="https://vault.resolveup.com.br/app" target="_blank" rel="noopener noreferrer" data-i18n="openPortal">Open Vault portal ↗</a></div><p class="onboarding-hint" data-i18n="connectHint">Sign in securely in a separate window. Your password stays with the Vault portal.</p><div class="connection-message" id="connection-message" role="status" aria-live="polite"></div><a id="auth-fallback" class="button" hidden target="_blank" rel="noopener noreferrer" data-i18n="continueAuth">Continue sign-in ↗</a></div><div class="steps"><article class="step"><div class="step-number">01 / VAULT</div><h2 data-i18n="stepAccount">Connect your account</h2><p data-i18n="stepAccountBody">Sign in to Vault and authorize this local agent.</p></article><article class="step"><div class="step-number">02 / MCP</div><h2 data-i18n="stepClient">Connect your AI client</h2><p data-i18n="stepClientBody">Configure Vault MCP in Codex, Cursor or another compatible client.</p></article><article class="step"><div class="step-number">03 / MEMORY</div><h2 data-i18n="stepMemory">Build your first memory</h2><p data-i18n="stepMemoryBody">Ask your connected client to save useful context, then follow its activity here.</p></article></div><div class="terminal-fallback"><button class="button" id="verify-connection" type="button" data-i18n="verifyConnection">Already signed in? Check connection</button><p style="margin-top:16px" data-i18n="terminalFallback">Already connected through the CLI? Open a secure local session:</p><code>bunx --bun vault-go@latest local open</code></div></section><div id="dashboard" hidden><div class="welcome"><div><div class="eyebrow" data-i18n="eyebrow">YOUR KNOWLEDGE, CONNECTED</div><h1 data-i18n="title">Your local workspace.</h1><p data-i18n="subtitle">Your Vault account, memories and activity on this machine.</p></div><img src="/logo.png" alt="" width="56" height="56"></div><div id="session-notice" hidden></div><section class="cards" aria-label="Status"><article class="card"><div class="card-label"><span data-i18n="localService">Local service</span><span aria-hidden="true">◈</span></div><div class="card-value" id="local-status">—</div><div class="card-note" id="local-note">localhost:38850</div></article><article class="card"><div class="card-label"><span data-i18n="cloudConnection">Cloud connection</span><span aria-hidden="true">↗</span></div><div class="card-value" id="cloud-status">—</div><div class="card-note" id="cloud-note">—</div></article><article class="card"><div class="card-label"><span data-i18n="recentOperations">Recent operations</span><span aria-hidden="true">⌁</span></div><div class="card-value" id="activity-total">—</div><div class="card-note" data-i18n="operationsNote">Recent MCP request metadata</div></article></section><section class="next-step" id="first-memory"><div><h2 data-i18n="firstTitle">Create your first memory</h2><p data-i18n="firstBody">Connect Vault MCP to your AI client, then ask it to save context. Your memories will appear here after a cloud refresh.</p><code id="mcp-command" style="display:block;margin-top:12px;font-size:12px;overflow-wrap:anywhere"></code><p data-i18n="rememberPrompt" style="margin-top:10px"></p></div><div class="actions"><a class="button" href="https://vault.resolveup.com.br/mcp" target="_blank" rel="noopener noreferrer" data-i18n="setupMcp">Set up MCP ↗</a><a class="link" href="https://vault.resolveup.com.br/app/memory" target="_blank" rel="noopener noreferrer" data-i18n="openMemories">Open memories ↗</a></div></section><div class="layout"><section class="panel wide" id="security"><div class="panel-head"><h2 data-i18n="securityTitle">Security on this machine</h2></div><div id="security-facts"></div><div class="actions"><button class="button danger" id="disconnect-device" type="button" data-i18n="disconnectDevice">Disconnect device</button></div></section><section class="panel wide" id="context"><div class="panel-head"><h2 data-i18n="contextEngine">Context engine</h2></div><p data-i18n="engineIntro">Choose how Vault prepares your context.</p><div class="engine-options" id="engine-options" role="radiogroup" aria-label="Context engine"></div><div class="engine-options" id="model-options" role="radiogroup" aria-label="Context model"></div><div class="engine-keys" id="engine-keys"></div><div class="engine-message" id="engine-message" role="status" aria-live="polite"></div><div class="context-editor"><label for="context-text" data-i18n="contextText">Text to prepare</label><textarea id="context-text" maxlength="16000" aria-describedby="context-note"></textarea><p id="context-note" data-i18n="contextNote"></p><div class="actions"><button class="button primary" id="context-preview" type="button" data-i18n="contextPreview"></button><button class="button" id="context-stop" type="button" data-i18n="cancel" hidden></button></div><p id="context-progress" role="status" aria-live="polite"></p></div></section><section class="panel" id="activity"><div class="panel-head"><h2 data-i18n="activity">Activity</h2><span class="count" id="activity-count">0</span></div><input class="search" id="activity-search" type="search" data-placeholder="searchActivity" aria-label="Search activity"><div id="activity-list"></div><div class="pagination" id="activity-pagination"></div></section><section class="panel" id="memories"><div class="panel-head"><h2 data-i18n="memories">Memories</h2><span class="count" id="memory-count">0</span></div><input class="search" id="memory-search" type="search" data-placeholder="searchMemories" aria-label="Search memories"><div id="memory-list"></div><div class="pagination" id="memory-pagination"></div></section><section class="panel wide" id="projects"><div class="panel-head"><h2 data-i18n="projects">Projects</h2><span class="count" id="project-count">0</span></div><input class="search" id="project-search" type="search" data-placeholder="searchProjects" aria-label="Search projects"><div id="project-list"></div><div class="pagination" id="project-pagination"></div></section></div></div><footer class="footer"><span data-i18n="footer">Vault Local · Context with a place to call home.</span><span id="updated" aria-live="off">—</span></footer></main></div><dialog class="detail-dialog" id="detail-dialog" aria-labelledby="detail-title"><div class="panel-head"><h2 id="detail-title"></h2><button class="button" type="button" id="detail-copy" hidden data-i18n="copyResult">Copy result</button><button class="button" type="button" id="detail-close" data-i18n="close">Close</button></div><dl class="detail-fields" id="detail-fields"></dl></dialog><dialog class="detail-dialog" id="logout-dialog" aria-labelledby="logout-title" aria-describedby="logout-description"><h2 id="logout-title" data-i18n="logout"></h2><p id="logout-description" data-i18n="logoutDescription" style="margin-top:16px"></p><div class="actions"><button class="button" type="button" id="logout-cancel" data-i18n="cancel"></button><button class="button primary" type="button" id="logout-confirm" data-i18n="logoutConfirm"></button></div></dialog><dialog class="detail-dialog" id="context-confirm-dialog" aria-labelledby="context-confirm-title" aria-describedby="context-confirm-note"><h2 id="context-confirm-title" data-i18n="contextPreview"></h2><p id="context-confirm-engine" style="margin-top:16px"></p><p id="context-confirm-billing"></p><p id="context-confirm-note" data-i18n="contextConsentNote" style="margin-top:16px"></p><pre id="context-confirm-text" style="white-space:pre-wrap;overflow-wrap:anywhere;max-height:32vh;overflow:auto;font-size:12px;line-height:1.7"></pre><label style="display:flex;gap:10px;align-items:flex-start;font-size:12px"><input id="context-consent" type="checkbox"><span data-i18n="contextConsent"></span></label><div class="actions"><button class="button" id="context-cancel" type="button" data-i18n="cancel"></button><button class="button primary" id="context-generate" type="button" disabled data-i18n="contextGenerate"></button></div></dialog><dialog class="detail-dialog" id="disconnect-dialog" aria-labelledby="disconnect-title" aria-describedby="disconnect-description"><h2 class="danger-title" id="disconnect-title" data-i18n="disconnectDevice"></h2><p id="disconnect-description" data-i18n="disconnectDescription" style="margin-top:16px"></p><p id="disconnect-error" class="error" role="alert"></p><div class="actions"><button class="button" type="button" id="disconnect-cancel" data-i18n="cancel"></button><button class="button danger" type="button" id="disconnect-confirm" data-i18n="disconnectConfirm"></button></div></dialog></body></html>`;
|
|
8
|
+
.danger{border-color:#ed9a9a66;color:#ffb5b5;background:#53272d55}.danger:hover{border-color:#ffb5b5}.danger-title{color:#ffb5b5}.pagination{display:flex;gap:9px;align-items:center;flex-wrap:wrap;border-top:1px solid #cdd8ff20;margin-top:15px;padding-top:15px;color:#acb4cb;font-size:11px}.pagination label{display:flex;align-items:center;gap:7px}.pagination .page-summary{flex:1;min-width:95px}.pagination select{padding:7px}.pagination .button{padding:7px 10px}.pagination button:disabled{cursor:default}.row-open{background:transparent;border:0;text-align:left;padding:0;color:#d3d1ff;cursor:pointer;font:inherit}.row-open:hover{text-decoration:underline}.row-actions{padding-top:5px}.detail-dialog{color:#f1f3fc;background:linear-gradient(135deg,#272c3e,#131724);border:1px solid #cdd8ff40;border-radius:18px;max-width:800px;width:calc(100% - 32px);max-height:85vh;padding:26px;box-shadow:0 30px 100px #0009}.detail-dialog::backdrop{background:#050710bd;backdrop-filter:blur(5px)}.detail-dialog h2{font-size:20px;overflow-wrap:anywhere}.detail-fields{margin:0}.detail-fields dt{color:#acb4cb;font-size:11px;margin:20px 0 8px}.detail-fields dd{margin:0;font-size:13px;line-height:1.7;white-space:pre-wrap;overflow-wrap:anywhere}.detail-fields pre{font:inherit;white-space:pre-wrap;margin:0}.engine-options{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-top:18px}.engine-keys{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;margin-top:16px}.engine-keys label{display:block;font-size:12px;margin-bottom:8px}.engine-keys input{width:100%;background:#0307117a;color:#f1f3fc;border:1px solid #cdd8ff26;border-radius:9px;padding:10px 12px;font:inherit;font-size:13px;margin-bottom:8px}.engine-option{display:block;padding:17px;border:1px solid #cdd8ff26;border-radius:10px;background:#080b1233;cursor:pointer}.engine-option:has(input:checked){border-color:#b9b6ff;background:#b9b6ff12}.engine-option:has(input:disabled){opacity:.7;cursor:default}.engine-option input{accent-color:#b9b6ff;margin-right:8px}.engine-option strong{font-size:12px}.engine-option p{font-size:11px;margin-top:9px}.engine-message{margin-top:13px;font-size:12px;color:#d3d1ff}.context-editor{margin-top:20px}.context-editor label{display:block;font-size:12px;margin-bottom:8px}.context-editor textarea{width:100%;min-height:130px;resize:vertical;background:#0307117a;color:#f1f3fc;border:1px solid #cdd8ff26;border-radius:9px;padding:12px;font:inherit;font-size:13px}.context-editor textarea:focus-visible{outline:2px solid #b9b6ff;outline-offset:3px}.mcp-clients{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px;margin-top:14px}.mcp-client{display:flex;align-items:center;justify-content:space-between;gap:10px;border:1px solid #cdd8ff26;border-radius:10px;padding:10px 12px;background:#080b1233;font-size:13px;flex-wrap:wrap}.mcp-client strong{font-size:13px;font-weight:600}.mcp-state{font-size:11px;color:#8edbc8;white-space:nowrap}.mcp-dim{opacity:.75}.mcp-evidence{font-size:10px;color:#949fbb;width:100%}.mcp-note{color:#949fbb;font-size:12px}.mcp-message{color:#ed9a9a;font-size:12px;margin-top:10px}.mcp-message:empty{display:none}.mcp-fallback{color:#949fbb;font-size:11px;margin-top:12px}.mcp-fallback code{font-size:11px;color:#c7d4df;background:#0307117a;border-radius:6px;padding:2px 6px}@media(max-width:800px){.engine-options{grid-template-columns:1fr}}@media(prefers-reduced-motion:reduce){.detail-dialog::backdrop{backdrop-filter:none}}</style><script src="/app.js" defer></script></head><body><div class="shell"><aside class="rail"><div class="brand"><img src="/logo.png" alt="" width="46" height="46"><div>AI Vault Memory<span class="brand-sub">LOCAL AGENT</span></div></div><div class="rail-label" data-i18n="workspace">WORKSPACE</div><nav class="nav" aria-label="Navigation"><a class="active" href="#overview"><span class="icon">◈</span><span data-i18n="overview">Overview</span></a><a href="#activity"><span class="icon">⌁</span><span data-i18n="activity">Activity</span></a><a href="#memories"><span class="icon">▤</span><span data-i18n="memories">Memories</span></a><a href="#context"><span class="icon">✧</span><span data-i18n="contextEngine">Context engine</span></a><a href="#projects"><span class="icon">▱</span><span data-i18n="projects">Projects</span></a></nav><div class="rail-footer"><span class="dot"></span><span data-i18n="localWorkspace">Your local workspace</span><br><span data-i18n="privacy">Activity metadata stays local.</span></div></aside><main class="main" id="overview"><header class="top"><div class="breadcrumb">Vault <span aria-hidden="true"> / </span><b data-i18n="localMonitor">Local monitor</b></div><div class="controls"><select id="locale" aria-label="Language"><option value="en">English</option><option value="pt">Português</option><option value="es">Español</option></select><button class="button" id="logout" type="button" hidden data-i18n="logout">Sign out of dashboard</button><button class="button" id="reconnect" type="button" hidden data-i18n="reconnect">Reconnect account</button><button class="button" id="refresh" type="button"><span aria-hidden="true">↻</span><span data-i18n="refresh">Refresh cloud</span></button></div></header><div id="error" class="error" role="status" aria-live="polite"></div><section class="onboarding" id="onboarding"><div class="onboarding-hero"><img class="onboarding-logo" src="/logo.png" alt="" width="86" height="86"><div class="eyebrow" data-i18n="connectEyebrow">AI VAULT MEMORY · LOCAL</div><h1 data-i18n="connectTitle">Your memory. Connected to this machine.</h1><p data-i18n="connectIntro">Connect your Vault account to see your memories, projects and recent activity in one place.</p><div class="actions"><button type="button" class="button primary" id="connect" data-i18n="connect">Connect to Vault</button><a class="link" href="https://vault.resolveup.com.br/app" target="_blank" rel="noopener noreferrer" data-i18n="openPortal">Open Vault portal ↗</a></div><p class="onboarding-hint" data-i18n="connectHint">Sign in securely in a separate window. Your password stays with the Vault portal.</p><div class="connection-message" id="connection-message" role="status" aria-live="polite"></div><a id="auth-fallback" class="button" hidden target="_blank" rel="noopener noreferrer" data-i18n="continueAuth">Continue sign-in ↗</a></div><div class="steps"><article class="step"><div class="step-number">01 / VAULT</div><h2 data-i18n="stepAccount">Connect your account</h2><p data-i18n="stepAccountBody">Sign in to Vault and authorize this local agent.</p></article><article class="step"><div class="step-number">02 / MCP</div><h2 data-i18n="stepClient">Connect your AI clients</h2><p data-i18n="stepClientBody">After signing in, connect Claude, Codex and other clients with one click, right here.</p></article><article class="step"><div class="step-number">03 / MEMORY</div><h2 data-i18n="stepMemory">Build your first memory</h2><p data-i18n="stepMemoryBody">Ask your connected client to save useful context, then follow its activity here.</p></article></div><div class="terminal-fallback"><button class="button" id="verify-connection" type="button" data-i18n="verifyConnection">Already signed in? Check connection</button><p style="margin-top:16px" data-i18n="terminalFallback">Already connected through the CLI? Open a secure local session:</p><code>bunx --bun vault-go@latest local open</code></div></section><div id="dashboard" hidden><div class="welcome"><div><div class="eyebrow" data-i18n="eyebrow">YOUR KNOWLEDGE, CONNECTED</div><h1 data-i18n="title">Your local workspace.</h1><p data-i18n="subtitle">Your Vault account, memories and activity on this machine.</p></div><img src="/logo.png" alt="" width="56" height="56"></div><div id="session-notice" hidden></div><section class="cards" aria-label="Status"><article class="card"><div class="card-label"><span data-i18n="localService">Local service</span><span aria-hidden="true">◈</span></div><div class="card-value" id="local-status">—</div><div class="card-note" id="local-note">localhost:38850</div></article><article class="card"><div class="card-label"><span data-i18n="cloudConnection">Cloud connection</span><span aria-hidden="true">↗</span></div><div class="card-value" id="cloud-status">—</div><div class="card-note" id="cloud-note">—</div></article><article class="card"><div class="card-label"><span data-i18n="recentOperations">Recent operations</span><span aria-hidden="true">⌁</span></div><div class="card-value" id="activity-total">—</div><div class="card-note" data-i18n="operationsNote">Recent MCP request metadata</div></article></section><section class="next-step" id="first-memory"><div><h2 data-i18n="firstTitle">Connect your AI clients</h2><p data-i18n="firstBody">Connect Claude, Codex and other clients here in one click, then ask them to save context. Memories appear after a cloud refresh.</p><div class="mcp-clients" id="mcp-clients" role="group" aria-label="AI clients"></div><p id="mcp-message" role="status" aria-live="polite" class="mcp-message"></p><p data-i18n="rememberPrompt" style="margin-top:10px"></p><p class="mcp-fallback"><span data-i18n="mcpFallback"></span> <code>bunx --bun vault-go@latest install</code></p></div><div class="actions"><a class="link" href="https://vault.resolveup.com.br/mcp" target="_blank" rel="noopener noreferrer" data-i18n="otherClients">Other clients ↗</a><a class="link" href="https://vault.resolveup.com.br/app/memory" target="_blank" rel="noopener noreferrer" data-i18n="openMemories">Open memories ↗</a></div></section><div class="layout"><section class="panel wide" id="security"><div class="panel-head"><h2 data-i18n="securityTitle">Security on this machine</h2></div><div id="security-facts"></div><div class="actions"><button class="button danger" id="disconnect-device" type="button" data-i18n="disconnectDevice">Disconnect device</button></div></section><section class="panel wide" id="context"><div class="panel-head"><h2 data-i18n="contextEngine">Context engine</h2></div><p data-i18n="engineIntro">Choose how Vault prepares your context.</p><div class="engine-options" id="engine-options" role="radiogroup" aria-label="Context engine"></div><div class="engine-options" id="model-options" role="radiogroup" aria-label="Context model"></div><div class="engine-keys" id="engine-keys"></div><div class="engine-message" id="engine-message" role="status" aria-live="polite"></div><div class="context-editor"><label for="context-text" data-i18n="contextText">Text to prepare</label><textarea id="context-text" maxlength="16000" aria-describedby="context-note"></textarea><p id="context-note" data-i18n="contextNote"></p><div class="actions"><button class="button primary" id="context-preview" type="button" data-i18n="contextPreview"></button><button class="button" id="context-stop" type="button" data-i18n="cancel" hidden></button></div><p id="context-progress" role="status" aria-live="polite"></p></div></section><section class="panel" id="activity"><div class="panel-head"><h2 data-i18n="activity">Activity</h2><span class="count" id="activity-count">0</span></div><input class="search" id="activity-search" type="search" data-placeholder="searchActivity" aria-label="Search activity"><div id="activity-list"></div><div class="pagination" id="activity-pagination"></div></section><section class="panel" id="memories"><div class="panel-head"><h2 data-i18n="memories">Memories</h2><span class="count" id="memory-count">0</span></div><input class="search" id="memory-search" type="search" data-placeholder="searchMemories" aria-label="Search memories"><div id="memory-list"></div><div class="pagination" id="memory-pagination"></div></section><section class="panel wide" id="projects"><div class="panel-head"><h2 data-i18n="projects">Projects</h2><span class="count" id="project-count">0</span></div><input class="search" id="project-search" type="search" data-placeholder="searchProjects" aria-label="Search projects"><div id="project-list"></div><div class="pagination" id="project-pagination"></div></section></div></div><footer class="footer"><span data-i18n="footer">Vault Local · Context with a place to call home.</span><span id="updated" aria-live="off">—</span></footer></main></div><dialog class="detail-dialog" id="detail-dialog" aria-labelledby="detail-title"><div class="panel-head"><h2 id="detail-title"></h2><button class="button" type="button" id="detail-copy" hidden data-i18n="copyResult">Copy result</button><button class="button" type="button" id="detail-close" data-i18n="close">Close</button></div><dl class="detail-fields" id="detail-fields"></dl></dialog><dialog class="detail-dialog" id="logout-dialog" aria-labelledby="logout-title" aria-describedby="logout-description"><h2 id="logout-title" data-i18n="logout"></h2><p id="logout-description" data-i18n="logoutDescription" style="margin-top:16px"></p><div class="actions"><button class="button" type="button" id="logout-cancel" data-i18n="cancel"></button><button class="button primary" type="button" id="logout-confirm" data-i18n="logoutConfirm"></button></div></dialog><dialog class="detail-dialog" id="context-confirm-dialog" aria-labelledby="context-confirm-title" aria-describedby="context-confirm-note"><h2 id="context-confirm-title" data-i18n="contextPreview"></h2><p id="context-confirm-engine" style="margin-top:16px"></p><p id="context-confirm-billing"></p><p id="context-confirm-note" data-i18n="contextConsentNote" style="margin-top:16px"></p><pre id="context-confirm-text" style="white-space:pre-wrap;overflow-wrap:anywhere;max-height:32vh;overflow:auto;font-size:12px;line-height:1.7"></pre><label style="display:flex;gap:10px;align-items:flex-start;font-size:12px"><input id="context-consent" type="checkbox"><span data-i18n="contextConsent"></span></label><div class="actions"><button class="button" id="context-cancel" type="button" data-i18n="cancel"></button><button class="button primary" id="context-generate" type="button" disabled data-i18n="contextGenerate"></button></div></dialog><dialog class="detail-dialog" id="disconnect-dialog" aria-labelledby="disconnect-title" aria-describedby="disconnect-description"><h2 class="danger-title" id="disconnect-title" data-i18n="disconnectDevice"></h2><p id="disconnect-description" data-i18n="disconnectDescription" style="margin-top:16px"></p><p id="disconnect-error" class="error" role="alert"></p><div class="actions"><button class="button" type="button" id="disconnect-cancel" data-i18n="cancel"></button><button class="button danger" type="button" id="disconnect-confirm" data-i18n="disconnectConfirm"></button></div></dialog></body></html>`;
|
|
9
9
|
}
|
|
10
10
|
export function dashboardScript() {
|
|
11
11
|
return `"use strict";
|
|
@@ -19,9 +19,9 @@ export function dashboardScript() {
|
|
|
19
19
|
es: {workspace:'ESPACIO DE TRABAJO',overview:'Resumen',activity:'Actividad',memories:'Memorias',projects:'Proyectos',localWorkspace:'Tu espacio local',privacy:'Los metadatos de actividad quedan locales.',localMonitor:'Monitor local',refresh:'Actualizar nube',eyebrow:'TU CONOCIMIENTO, CONECTADO',title:'Un poco más de contexto.',subtitle:'Una vista clara de tu Vault local y de la conexión con la nube.',session:'Abre una sesión local segura desde tu terminal:',localService:'Servicio local',cloudConnection:'Conexión con la nube',recentOperations:'Operaciones recientes',operationsNote:'Metadatos recientes de llamadas MCP',searchMemories:'Buscar memorias…',searchProjects:'Buscar proyectos…',footer:'Vault Local · Un hogar para tu contexto.',online:'En ejecución',offline:'No disponible',connected:'Conectada',disconnected:'Desconectada',checking:'Comprobando…',signedOut:'Inicia sesión desde la CLI para conectar.',activityEmpty:'Aún no hay operaciones registradas. La actividad aparecerá al usar este servicio local.',memoriesEmpty:'No hay memorias disponibles. Las memorias de tu cuenta en la nube aparecerán aquí.',projectsEmpty:'No hay proyectos disponibles. Los proyectos de tu cuenta en la nube aparecerán aquí.',noResults:'No se encontraron resultados.',updated:'Actualizado',waiting:'Esperando una sesión segura',fetchError:'No se pudo acceder al servicio local. Comprueba que Vault Local esté en ejecución.',syncError:'La actualización de la nube falló. Inténtalo de nuevo en unos momentos.',success:'Completada',failed:'Falló',untitled:'Sin título',unknown:'Desconocido',paused:'Actualizaciones pausadas mientras esta pestaña está oculta'}
|
|
20
20
|
};
|
|
21
21
|
const onboardingCopy = {
|
|
22
|
-
en: {reconnect:'Reconnect account',verifyConnection:'Already signed in? Check connection',rememberPrompt:'Then ask your assistant: “Use vault_go_remember to remember that…”',connectEyebrow:'AI VAULT MEMORY · LOCAL',connectTitle:'Your memory. Connected to this machine.',connectIntro:'Connect your Vault account to see your memories, projects and recent activity in one place.',connect:'Connect to Vault',openPortal:'Open Vault portal ↗',connectHint:'Sign in securely in a separate window. Your password stays with the Vault portal.',continueAuth:'Continue sign-in ↗',stepAccount:'Connect your account',stepAccountBody:'Sign in to Vault and authorize this local agent.',stepClient:'Connect your AI
|
|
23
|
-
pt: {reconnect:'Reconectar conta',verifyConnection:'Já entrei: verificar conexão',rememberPrompt:'Depois peça ao assistente: “Use vault_go_remember para lembrar que…”',connectEyebrow:'AI VAULT MEMORY · LOCAL',connectTitle:'Sua memória. Conectada a esta máquina.',connectIntro:'Conecte sua conta Vault para acompanhar memórias, projetos e atividades recentes em um só lugar.',connect:'Conectar ao Vault',openPortal:'Abrir portal Vault ↗',connectHint:'Entre com segurança em uma janela separada. Sua senha fica no portal Vault.',continueAuth:'Continuar login ↗',stepAccount:'Conecte sua conta',stepAccountBody:'Entre no Vault e autorize este agente local.',stepClient:'Conecte
|
|
24
|
-
es: {reconnect:'Reconectar cuenta',verifyConnection:'Ya inicié sesión: comprobar conexión',rememberPrompt:'Después pide a tu asistente: “Usa vault_go_remember para recordar que…”',connectEyebrow:'AI VAULT MEMORY · LOCAL',connectTitle:'Tu memoria. Conectada a esta máquina.',connectIntro:'Conecta tu cuenta Vault para consultar memorias, proyectos y actividad reciente en un solo lugar.',connect:'Conectar a Vault',openPortal:'Abrir portal Vault ↗',connectHint:'Inicia sesión de forma segura en otra ventana. Tu contraseña permanece en el portal Vault.',continueAuth:'Continuar inicio de sesión ↗',stepAccount:'Conecta tu cuenta',stepAccountBody:'Inicia sesión en Vault y autoriza este agente local.',stepClient:'Conecta
|
|
22
|
+
en: {reconnect:'Reconnect account',verifyConnection:'Already signed in? Check connection',rememberPrompt:'Then ask your assistant: “Use vault_go_remember to remember that…”',connectEyebrow:'AI VAULT MEMORY · LOCAL',connectTitle:'Your memory. Connected to this machine.',connectIntro:'Connect your Vault account to see your memories, projects and recent activity in one place.',connect:'Connect to Vault',openPortal:'Open Vault portal ↗',connectHint:'Sign in securely in a separate window. Your password stays with the Vault portal.',continueAuth:'Continue sign-in ↗',stepAccount:'Connect your account',stepAccountBody:'Sign in to Vault and authorize this local agent.',stepClient:'Connect your AI clients',stepClientBody:'After signing in, connect Claude, Codex and other clients with one click, right here.',stepMemory:'Build your first memory',stepMemoryBody:'Ask your connected client to save useful context, then follow its activity here.',terminalFallback:'Already connected through the CLI? Open a secure local session:',firstTitle:'Connect your AI clients',firstBody:'Connect Claude, Codex and other clients here in one click, then ask them to save context. Memories appear after a cloud refresh.',mcpConnected:'Connected',mcpConnect:'Connect',mcpConnecting:'Connecting…',mcpConnectFailed:'Could not connect this client. Try again, or run bunx --bun vault-go@latest install.',mcpLoadFailed:'Could not check your AI clients. Try refreshing.',mcpNotDetected:'not detected here',mcpFallback:'Client not listed?',otherClients:'Other clients ↗',openMemories:'Open memories ↗',connecting:'Opening secure sign-in…',awaitingAuth:'Complete sign-in in the Vault window. This page will update automatically.',popupBlocked:'Your browser blocked the window. Use the sign-in link below to continue.',connectFailed:'Could not connect to Vault. Try again or open a local session through the terminal.',connectExpired:'Sign-in was not completed. Click Connect to Vault to try again.',title:'Your local workspace.',subtitle:'Your Vault account, memories and activity on this machine.',memoriesEmpty:'No memories yet. Connect an AI client above and ask it to save your first memory.',projectsEmpty:'No projects yet. Projects returned by your Vault account will appear here.',footer:'AI Vault Memory · Local agent'},
|
|
23
|
+
pt: {reconnect:'Reconectar conta',verifyConnection:'Já entrei: verificar conexão',rememberPrompt:'Depois peça ao assistente: “Use vault_go_remember para lembrar que…”',connectEyebrow:'AI VAULT MEMORY · LOCAL',connectTitle:'Sua memória. Conectada a esta máquina.',connectIntro:'Conecte sua conta Vault para acompanhar memórias, projetos e atividades recentes em um só lugar.',connect:'Conectar ao Vault',openPortal:'Abrir portal Vault ↗',connectHint:'Entre com segurança em uma janela separada. Sua senha fica no portal Vault.',continueAuth:'Continuar login ↗',stepAccount:'Conecte sua conta',stepAccountBody:'Entre no Vault e autorize este agente local.',stepClient:'Conecte seus clientes de IA',stepClientBody:'Depois de entrar, conecte Claude, Codex e outros clientes em um clique, aqui mesmo.',stepMemory:'Crie sua primeira memória',stepMemoryBody:'Peça ao cliente conectado para salvar um contexto útil e acompanhe a atividade aqui.',terminalFallback:'Já conectou pela CLI? Abra uma sessão local segura:',firstTitle:'Conecte seus clientes de IA',firstBody:'Conecte Claude, Codex e outros clientes aqui em um clique e peça para salvar contexto. As memórias aparecem após atualizar a nuvem.',mcpConnected:'Conectado',mcpConnect:'Conectar',mcpConnecting:'Conectando…',mcpConnectFailed:'Não foi possível conectar este cliente. Tente novamente ou rode bunx --bun vault-go@latest install.',mcpLoadFailed:'Não foi possível verificar seus clientes de IA. Tente atualizar.',mcpNotDetected:'não detectado aqui',mcpFallback:'Cliente não listado?',otherClients:'Outros clientes ↗',openMemories:'Abrir memórias ↗',connecting:'Abrindo login seguro…',awaitingAuth:'Conclua o login na janela do Vault. Esta página será atualizada automaticamente.',popupBlocked:'O navegador bloqueou a janela. Use o link de login abaixo para continuar.',connectFailed:'Não foi possível conectar ao Vault. Tente novamente ou abra uma sessão local pelo terminal.',connectExpired:'O login não foi concluído. Clique em Conectar ao Vault para tentar novamente.',title:'Seu espaço de trabalho local.',subtitle:'Sua conta Vault, memórias e atividades nesta máquina.',memoriesEmpty:'Ainda não há memórias. Conecte um cliente de IA acima e peça para salvar a primeira.',projectsEmpty:'Ainda não há projetos. Os projetos retornados pela sua conta Vault aparecerão aqui.',footer:'AI Vault Memory · Agente local'},
|
|
24
|
+
es: {reconnect:'Reconectar cuenta',verifyConnection:'Ya inicié sesión: comprobar conexión',rememberPrompt:'Después pide a tu asistente: “Usa vault_go_remember para recordar que…”',connectEyebrow:'AI VAULT MEMORY · LOCAL',connectTitle:'Tu memoria. Conectada a esta máquina.',connectIntro:'Conecta tu cuenta Vault para consultar memorias, proyectos y actividad reciente en un solo lugar.',connect:'Conectar a Vault',openPortal:'Abrir portal Vault ↗',connectHint:'Inicia sesión de forma segura en otra ventana. Tu contraseña permanece en el portal Vault.',continueAuth:'Continuar inicio de sesión ↗',stepAccount:'Conecta tu cuenta',stepAccountBody:'Inicia sesión en Vault y autoriza este agente local.',stepClient:'Conecta tus clientes de IA',stepClientBody:'Tras iniciar sesión, conecta Claude, Codex y otros clientes con un clic, aquí mismo.',stepMemory:'Crea tu primera memoria',stepMemoryBody:'Pide al cliente conectado que guarde contexto útil y sigue su actividad aquí.',terminalFallback:'¿Ya te conectaste mediante la CLI? Abre una sesión local segura:',firstTitle:'Conecta tus clientes de IA',firstBody:'Conecta Claude, Codex y otros clientes aquí con un clic y pídeles que guarden contexto. Las memorias aparecen al actualizar la nube.',mcpConnected:'Conectado',mcpConnect:'Conectar',mcpConnecting:'Conectando…',mcpConnectFailed:'No se pudo conectar este cliente. Inténtalo de nuevo o ejecuta bunx --bun vault-go@latest install.',mcpLoadFailed:'No se pudo comprobar tus clientes de IA. Actualiza la página.',mcpNotDetected:'no detectado aquí',mcpFallback:'¿Cliente no listado?',otherClients:'Otros clientes ↗',openMemories:'Abrir memorias ↗',connecting:'Abriendo inicio de sesión seguro…',awaitingAuth:'Completa el inicio de sesión en la ventana de Vault. Esta página se actualizará automáticamente.',popupBlocked:'El navegador bloqueó la ventana. Usa el enlace de abajo para continuar.',connectFailed:'No se pudo conectar a Vault. Inténtalo de nuevo o abre una sesión local desde el terminal.',connectExpired:'No se completó el inicio de sesión. Pulsa Conectar a Vault para intentarlo de nuevo.',title:'Tu espacio de trabajo local.',subtitle:'Tu cuenta Vault, memorias y actividad en esta máquina.',memoriesEmpty:'Aún no hay memorias. Conecta un cliente de IA arriba y pídele que guarde la primera.',projectsEmpty:'Aún no hay proyectos. Los proyectos de tu cuenta Vault aparecerán aquí.',footer:'AI Vault Memory · Agente local'}
|
|
25
25
|
};
|
|
26
26
|
const detailCopy = {
|
|
27
27
|
en:{disconnectDevice:'Disconnect device',disconnectConfirm:'Revoke access and disconnect',disconnectDescription:'This revokes this agent’s cloud access and removes its local credentials and cache. Your files are preserved. MCP clients stop using this account until you sign in again.',disconnectFailed:'Could not confirm device disconnection. Nothing was cleared from this panel. Check the connection and try again.',disconnectLoginBusy:'Sign-in is in progress. Finish signing in before disconnecting this device.',contextCanceling:'Requesting cancellation…',contextCancelFailed:'Cancellation could not be confirmed. The provider may still be running and usage charges may apply.',securityTitle:'Security on this machine',cacheEncrypted:'Local cache encrypted at rest',cacheUnverified:'Local cache protection not confirmed',credentialProtection:'Account credentials protected by local file permissions',transportProtection:'Local connection: loopback HTTP. Vault cloud connection: HTTPS.',noEndToEnd:'This is not end-to-end encryption. The selected provider processes text you authorize.',device:'Device',deviceOnline:'Online',deviceOffline:'Offline',deviceRevoked:'Revoked',deviceUnregistered:'Not registered',lastSeen:'Last seen',keyStorage:'Encryption key storage',contextCanceled:'Generation canceled. Provider usage already consumed may still be charged.',contextText:'Text to prepare',contextNote:'Up to 16,000 characters. Only this text is sent; no memory is saved automatically.',contextPreview:'Review generation',contextConsentNote:'The following text will be sent to the selected provider. Review it before continuing.',contextConsent:'I authorize sending this text and using the selected engine allowance or applicable credits.',contextGenerate:'Generate context',contextRunning:'Preparing context…',contextComplete:'Context ready. Review or copy the result.',contextFailed:'Could not generate context. Check your engine login and usage limits.',contextTimedOut:'The local wait limit was reached. No further polling will occur.',contextInvalid:'Enter 1–16,000 characters and choose an available engine.',contextBilling:'Provider subscription limits or usage credits may apply.',copyResult:'Copy result',copied:'Result copied.',copyFailed:'Could not copy. Select the result text manually.',logout:'Sign out of dashboard',logoutDescription:'This ends the session in this browser. The local agent remains connected to your Vault account and keeps working.',logoutConfirm:'Sign out',cancel:'Cancel',logoutFailed:'Could not end this session. Please try again.',searchActivity:'Search activity…',previous:'Previous',next:'Next',perPage:'Per page',of:'of',page:'Page',view:'View details',close:'Close',details:'Details',contextEngine:'Context engine',engineIntro:'Choose how Vault prepares your context.',engineLoading:'Checking available engines…',engineUnavailable:'Unavailable on this machine',engineAvailable:'Available',engineSaved:'Context engine updated.',engineFailed:'Could not update the context engine. Try again.',engineLoadFailed:'Could not load context engines. Refresh to retry.'},
|
|
@@ -50,6 +50,8 @@ export function dashboardScript() {
|
|
|
50
50
|
function empty(target, message) { const box = node('div','empty'); box.append(node('span','empty-symbol','◇'),node('p','',message)); target.append(box); }
|
|
51
51
|
const pagination = {activity:{page:1,size:10},memory:{page:1,size:10},project:{page:1,size:10}};
|
|
52
52
|
let detailFocus = '', engines = null, engineBusy = false, engineMessage = '', sessionEpoch = 0, enginesChecked = 0, disconnecting = false;
|
|
53
|
+
let mcpClients = null, mcpChecked = 0, mcpMessage = '';
|
|
54
|
+
const mcpBusy = {};
|
|
53
55
|
let contextPreview=null, contextJob=null, contextTimer=null, contextStarted=0, contextMessage='', contextResult=null, contextStarting=false;
|
|
54
56
|
function showDetails(title,item,trigger) {
|
|
55
57
|
contextResult=null;el('detail-copy').hidden=true;
|
|
@@ -178,6 +180,34 @@ export function dashboardScript() {
|
|
|
178
180
|
el('context-stop').hidden=!contextJob;el('context-stop').disabled=contextStarting;
|
|
179
181
|
text('context-progress',contextMessage?t(contextMessage):'');
|
|
180
182
|
}
|
|
183
|
+
function renderMcpClients() {
|
|
184
|
+
const target=el('mcp-clients');if(!target)return;target.replaceChildren();
|
|
185
|
+
if(!mcpClients){target.append(node('div','mcp-note',sessionRequired?'':t('checking')));return;}
|
|
186
|
+
for(const item of array(mcpClients.clients)) {
|
|
187
|
+
const row=node('div','mcp-client'+(item.detected?'':' mcp-dim')),name=node('strong','',scalar(item.name)||scalar(item.client));
|
|
188
|
+
row.append(name);
|
|
189
|
+
if(item.connected===true)row.append(node('span','mcp-state','✓ '+t('mcpConnected')));
|
|
190
|
+
else {
|
|
191
|
+
const button=node('button','button',mcpBusy[item.client]?t('mcpConnecting'):t('mcpConnect'));
|
|
192
|
+
button.type='button';button.disabled=Boolean(mcpBusy[item.client]);
|
|
193
|
+
button.addEventListener('click',()=>void connectMcp(item.client));
|
|
194
|
+
row.append(button);
|
|
195
|
+
}
|
|
196
|
+
if(item.detected===false)row.append(node('span','mcp-evidence',t('mcpNotDetected')));
|
|
197
|
+
target.append(row);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async function connectMcp(clientId) {
|
|
201
|
+
if(mcpBusy[clientId])return;
|
|
202
|
+
const epoch=sessionEpoch;mcpBusy[clientId]=true;mcpMessage='';renderMcpClients();
|
|
203
|
+
try {
|
|
204
|
+
const result=await request('/api/mcp/clients',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({client:clientId})});
|
|
205
|
+
if(!result)throw new Error('connect failed');
|
|
206
|
+
const next=await request('/api/mcp/clients');
|
|
207
|
+
if(epoch===sessionEpoch&&!sessionRequired&&next){mcpClients=next;mcpChecked=Date.now();}
|
|
208
|
+
} catch {if(epoch===sessionEpoch)mcpMessage='mcpConnectFailed';}
|
|
209
|
+
finally{delete mcpBusy[clientId];render();}
|
|
210
|
+
}
|
|
181
211
|
function render() {
|
|
182
212
|
document.documentElement.lang = locale; el('locale').value = locale;
|
|
183
213
|
document.querySelectorAll('[data-i18n]').forEach(n => { n.textContent=t(n.dataset.i18n); });
|
|
@@ -186,7 +216,7 @@ export function dashboardScript() {
|
|
|
186
216
|
el('onboarding').hidden = hasSession;
|
|
187
217
|
el('dashboard').hidden = !hasSession;
|
|
188
218
|
if(!hasSession && el('detail-dialog').open)el('detail-dialog').close();
|
|
189
|
-
if(!hasSession){engines=null;enginesChecked=0;clearContext();}
|
|
219
|
+
if(!hasSession){engines=null;enginesChecked=0;mcpClients=null;mcpChecked=0;mcpMessage='';for(const key of Object.keys(mcpBusy))delete mcpBusy[key];clearContext();}
|
|
190
220
|
renderEngines();
|
|
191
221
|
const security=object(state&&state.security),cache=object(security.cache),device=object(state&&state.device),facts=el('security-facts');facts.replaceChildren();
|
|
192
222
|
if(hasSession){
|
|
@@ -208,7 +238,8 @@ export function dashboardScript() {
|
|
|
208
238
|
document.querySelector('.rail-label').hidden = !hasSession;
|
|
209
239
|
el('connect').disabled = connecting;
|
|
210
240
|
el('verify-connection').disabled = busy || connecting;
|
|
211
|
-
|
|
241
|
+
renderMcpClients();
|
|
242
|
+
text('mcp-message',mcpMessage ? t(mcpMessage) : '');
|
|
212
243
|
text('connection-message',connectionMessage ? t(connectionMessage) : '');
|
|
213
244
|
el('first-memory').hidden = array(state && state.memories).length > 0;
|
|
214
245
|
el('refresh').disabled = busy || sessionRequired || disconnecting;
|
|
@@ -241,6 +272,10 @@ export function dashboardScript() {
|
|
|
241
272
|
enginesChecked=Date.now();
|
|
242
273
|
try {const result=await request('/api/context/engines');if(result&&epoch===sessionEpoch&&!sessionRequired){engines=result;if(engineMessage==='engineLoadFailed')engineMessage='';}} catch {if(!engines&&epoch===sessionEpoch&&!sessionRequired)engineMessage='engineLoadFailed';}
|
|
243
274
|
}
|
|
275
|
+
if(state && state.authenticated && !sessionRequired && (!mcpChecked||Date.now()-mcpChecked>60000)) {
|
|
276
|
+
mcpChecked=Date.now();
|
|
277
|
+
try {const result=await request('/api/mcp/clients');if(result&&epoch===sessionEpoch&&!sessionRequired)mcpClients=result;} catch {if(!mcpClients&&epoch===sessionEpoch&&!sessionRequired)mcpMessage='mcpLoadFailed';}
|
|
278
|
+
}
|
|
244
279
|
} catch { if(epoch===sessionEpoch&&!disconnecting){failure=sync ? 'syncError' : 'fetchError'; if (!sync) state=null;} }
|
|
245
280
|
finally { busy=false; render(); if(pendingRefresh) {pendingRefresh=false; void refresh(true);} }
|
|
246
281
|
}
|
package/dist/local-service.js
CHANGED
|
@@ -15,6 +15,8 @@ import { localDevice } from "./local-device.js";
|
|
|
15
15
|
import { processGenerationQueue } from "./hook-queue.js";
|
|
16
16
|
import { startTranscriptWatchers } from './transcript-watchers.js';
|
|
17
17
|
import { transcriptStatus } from './transcript-config.js';
|
|
18
|
+
import { connectMcpClient, listMcpClients } from "./mcp-clients.js";
|
|
19
|
+
import { MCP_CLIENTS } from "./installer.js";
|
|
18
20
|
import { generateContext, isApiEngine, isContextEngine, listContextEngines, parseEngineModel, saveEngineKey, selectContextEngine, selectEngineModel, selectedContextEngine, } from "./context-engines.js";
|
|
19
21
|
export const LOCAL_PORT = 38850;
|
|
20
22
|
const safeEqual = (a, b) => a.length === b.length &&
|
|
@@ -462,6 +464,21 @@ export async function startLocalService(options = {}) {
|
|
|
462
464
|
json(200, { ok: true });
|
|
463
465
|
return;
|
|
464
466
|
}
|
|
467
|
+
if (url.pathname === "/api/mcp/clients" && req.method === "GET") {
|
|
468
|
+
json(200, { clients: listMcpClients(home) });
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
if (url.pathname === "/api/mcp/clients" && req.method === "POST") {
|
|
472
|
+
const data = (await readBody(req));
|
|
473
|
+
if (typeof data.client !== "string" ||
|
|
474
|
+
!MCP_CLIENTS.includes(data.client)) {
|
|
475
|
+
json(400, { error: "invalid_client" });
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
const result = connectMcpClient(data.client, home);
|
|
479
|
+
json(200, { ok: true, ...result, connected: true });
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
465
482
|
if (url.pathname === "/api/context/engines" && req.method === "GET") {
|
|
466
483
|
json(200, await engines());
|
|
467
484
|
return;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vault-go",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.23.0",
|
|
4
|
+
"description": "MCP server and installer for Vault Memory: search, capture, and use account memory across AI clients.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"vault-go": "dist/index.js",
|
|
@@ -78,7 +78,6 @@
|
|
|
78
78
|
"dist/server.d.ts",
|
|
79
79
|
"assets/",
|
|
80
80
|
"README.md",
|
|
81
|
-
"docs/mode-integrations.md",
|
|
82
81
|
"LICENSE",
|
|
83
82
|
"dist/mcp-result.js",
|
|
84
83
|
"dist/mcp-result.d.ts",
|
|
@@ -114,7 +113,6 @@
|
|
|
114
113
|
"dist/transcript-tools.d.ts",
|
|
115
114
|
"dist/context-chain.js",
|
|
116
115
|
"dist/context-chain.d.ts",
|
|
117
|
-
"docs/transcripts-and-context.md",
|
|
118
116
|
"dist/capture-privacy.js",
|
|
119
117
|
"dist/capture-privacy.d.ts",
|
|
120
118
|
"dist/deployment-verification.js",
|
|
@@ -123,8 +121,6 @@
|
|
|
123
121
|
"dist/grok-awareness.d.ts",
|
|
124
122
|
"dist/awareness-tools.js",
|
|
125
123
|
"dist/awareness-tools.d.ts",
|
|
126
|
-
"docs/ast-and-awareness.md",
|
|
127
|
-
"docs/parity-deployment-review.md",
|
|
128
124
|
"grammars/"
|
|
129
125
|
],
|
|
130
126
|
"scripts": {
|
|
@@ -157,6 +153,7 @@
|
|
|
157
153
|
"model-context-protocol",
|
|
158
154
|
"memory",
|
|
159
155
|
"vault",
|
|
156
|
+
"vault-memory",
|
|
160
157
|
"memvault",
|
|
161
158
|
"knowledge",
|
|
162
159
|
"codex",
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# AST completo e awareness local do Grok
|
|
2
|
-
|
|
3
|
-
## Idiomas AST
|
|
4
|
-
|
|
5
|
-
`vault_go_smart_languages` publica o catálogo e a disponibilidade real na plataforma. `smart_outline`, `smart_unfold` e `smart_search` usam grammars Tree-sitter carregadas pelo ast-grep; indisponibilidade nunca vira parsing por regex. Os limites anteriores de workspace, arquivos privados, bytes, quantidade de arquivos/símbolos e tamanho da saída continuam valendo.
|
|
6
|
-
|
|
7
|
-
| Idioma | Extensões |
|
|
8
|
-
| --- | --- |
|
|
9
|
-
| JavaScript | `.js`, `.jsx`, `.mjs`, `.cjs` |
|
|
10
|
-
| TypeScript | `.ts`, `.mts`, `.cts` |
|
|
11
|
-
| TSX | `.tsx` |
|
|
12
|
-
| HTML | `.html`, `.htm` |
|
|
13
|
-
| CSS | `.css` |
|
|
14
|
-
| Python | `.py`, `.pyw` |
|
|
15
|
-
| Go | `.go` |
|
|
16
|
-
| Rust | `.rs` |
|
|
17
|
-
| Ruby | `.rb` |
|
|
18
|
-
| Java | `.java` |
|
|
19
|
-
| C | `.c`, `.h` |
|
|
20
|
-
| C++ | `.cpp`, `.cc`, `.cxx`, `.hpp`, `.hh` |
|
|
21
|
-
| Kotlin | `.kt`, `.kts` |
|
|
22
|
-
| Swift | `.swift` |
|
|
23
|
-
| PHP | `.php` |
|
|
24
|
-
| Lua | `.lua` |
|
|
25
|
-
| Scala | `.scala`, `.sc` |
|
|
26
|
-
| Bash | `.sh`, `.bash`, `.zsh` |
|
|
27
|
-
| Haskell | `.hs` |
|
|
28
|
-
| TOML | `.toml` |
|
|
29
|
-
| YAML | `.yml`, `.yaml` |
|
|
30
|
-
| SQL | `.sql` |
|
|
31
|
-
| Markdown | `.md`, `.mdx` |
|
|
32
|
-
| Zig | `.zig` |
|
|
33
|
-
| SCSS | `.scss` |
|
|
34
|
-
|
|
35
|
-
Isso cobre os 24 idiomas do `LANG_MAP` upstream, além do HTML que o Vault já suportava. `.mdx` usa a grammar Markdown e `.zsh` usa Bash, como no upstream; não promete validar extensões próprias de MDX/Zsh.
|
|
36
|
-
|
|
37
|
-
JS/TS/TSX/HTML/CSS usam as grammars de `@ast-grep/napi`. Dezoito outras usam pacotes oficiais `@ast-grep/lang-*`, fixados no `package.json`/lock. Zig usa o prebuild de `@tree-sitter-grammars/tree-sitter-zig@1.1.2` via `node-gyp-build`. SCSS usa prebuilds empacotados em `grammars/scss/` (origem `tree-sitter-scss@1.0.0`); o pacote npm `tree-sitter-scss` não é dependência, porque puxa `tree-sitter-css` e o npm tenta compilá-lo com `node-gyp`.
|
|
38
|
-
|
|
39
|
-
O worker local e a fila não importam o parser nem essas dependências. `npm ci --ignore-scripts` é suportado nos sistemas com prebuild compatível. O prebuild SCSS cobre darwin-arm64, darwin-x64, linux-x64 e win32-x64; Linux ARM64 continua indisponível no catálogo. Outros alvos também dependem da presença e compatibilidade do prebuild: não há download ou compilação automática durante o uso.
|
|
40
|
-
|
|
41
|
-
Os nomes/símbolos, corpos e posições vêm de nós e campos da árvore. Markdown usa a árvore de seções para desdobrar uma seção completa. Buscas com metavariáveis foram verificadas também em Python, Go, Zig e SCSS, incluindo a distinção entre chamadas reais e textos em comentários/strings.
|
|
42
|
-
|
|
43
|
-
O registro segue a [API oficial do ast-grep](https://ast-grep.github.io/guide/api-usage/js-api): todas as grammars são registradas juntas uma vez por processo. Os [pacotes oficiais de grammars](https://github.com/ast-grep/langs) fornecem os parsers pré-compilados. Nenhuma biblioteca escolhida por caminho de workspace/configuração é carregada como código executável.
|
|
44
|
-
|
|
45
|
-
## Awareness do Grok
|
|
46
|
-
|
|
47
|
-
Awareness é escrita local de uma linha factual em `agents/<UUID>/memory/log/YYYY-MM.md`, consumida pelo agente Grok. Não é uma integração Telegram.
|
|
48
|
-
|
|
49
|
-
1. Use `vault_go_grok_awareness_configure` com `enabled=true`, `consent=true`, `agentDataRoot` absoluto existente, `agentIds` permitidos e ao menos um filtro em `triggerTypes` ou `triggerConcepts`.
|
|
50
|
-
2. Use `vault_go_grok_awareness_push` com `agentId` permitido e `memoryIds` UUID para enviar memórias já existentes na conta autenticada.
|
|
51
|
-
3. Consulte `vault_go_grok_awareness_status` ou desative com `enabled=false`.
|
|
52
|
-
|
|
53
|
-
Nada é ativado por padrão. Não há escolha automática de diretório ou agentes piloto. O consentimento fica em `grok-awareness.json`, privado e específico da conta. Troca de conta revoga o consentimento local. A leitura MCP confere também a credencial antes/depois da API, impedindo publicar um resultado recebido durante troca de conta.
|
|
54
|
-
|
|
55
|
-
Hooks que recebem `agent_id`/`agentId` preservam esse agente na fila. Após persistir a memória no Vault, a fila envia o fato apenas ao agente correspondente e permitido; não faz broadcast. O pipeline atual grava essas memórias como `discovery`, portanto a automação usa esse tipo e os conceitos gerados. O push por IDs preserva o `memoryType` armazenado e atende aos demais tipos, como `decision` ou `bugfix`. Sem identidade de agente, a fila não escreve awareness.
|
|
56
|
-
|
|
57
|
-
Cada linha usa a forma `- YYYY-MM-DD [awareness] tipo — título: subtítulo. primeiro fato`, com whitespace colapsado e até 500 caracteres. Flags/blocos privados são rejeitados; credenciais usam a mesma redação da captura. A deduplicação compara o corpo, ignorando a data, dentro do log mensal. O mês usa UTC. `profile.md` não é alterado.
|
|
58
|
-
|
|
59
|
-
O writer limita lotes a 100 observações e arquivos mensais a 1 MiB, valida a raiz e todos os diretórios descendentes, recusa symlinks/hardlinks de logs e usa lock entre processos e substituição atômica com arquivos 0600. Conteúdo anterior é preservado. Um log cheio ou destino inacessível produz `awareness_write_failed`, sem conteúdo sensível no status. Falha depois da persistência mantém o job para retry; o resultado do modelo já gerado é reutilizado e a importação mantém sua chave idempotente. Desativar awareness permite concluir esses jobs sem nova escrita local. Outros processos que escrevam o mesmo log precisam coordenar acesso para garantir ausência de sobrescrita concorrente.
|
|
60
|
-
|
|
61
|
-
## Fontes e validação
|
|
62
|
-
|
|
63
|
-
Contrato upstream consultado no SHA `adce0fdfaf1cd46646bbd0b22ae74cbd460ed787`:
|
|
64
|
-
|
|
65
|
-
- `src/services/smart-file-read/parser.ts`: `LANG_MAP`, grammars e queries de símbolos.
|
|
66
|
-
- `src/services/integrations/GrokBotAwarenessPusher.ts`: filtros, linha limitada, destino mensal, allowlist e deduplicação.
|
|
67
|
-
- `src/services/worker/agents/ResponseProcessor.ts`: envio vinculado a `pendingAgentId`, após persistência.
|
|
68
|
-
- `tests/integrations/grok-bot-awareness-pusher.test.ts`: casos do writer upstream.
|
|
69
|
-
|
|
70
|
-
Fixtures do Vault verificam outlines/desdobramento de todos os idiomas, busca estrutural, consentimento/filtros, privacidade, conta, concorrência, rotação, caminho malicioso, retomada sem regeneração, MCP e carregamento do worker staged sem `node_modules`. Nenhum log de agente ou configuração da instalação real foi modificado. A revisão multimodelo foi substituída por revisão manual, pois o gateway LiteLLM não está configurado neste ambiente.
|
|
71
|
-
|
|
72
|
-
Validação em 2026-09-20 sobre a base `8f08e19341eed95164ee9a77cf178486adeddb0f`: instalação limpa `npm ci --ignore-scripts`, `bun run build`, 178 testes / 1323 assertions (`bun test src`), `git diff --check` e pacote npm passaram. `npm audit --omit=dev` retornou zero vulnerabilidades. A validação posterior à instalação limpa confirmou que as grammars funcionam sem postinstall; o subprocesso staged confirmou que fila/awareness não precisam dessas dependências no worker.
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# Integrações de modos
|
|
2
|
-
|
|
3
|
-
O Vault Go implementa três superfícies locais independentes: alertas Telegram,
|
|
4
|
-
CCS Align e taxonomias customizadas. O registro MCP fica em
|
|
5
|
-
`registerModeIntegrations`, separado do servidor principal.
|
|
6
|
-
|
|
7
|
-
## Telegram
|
|
8
|
-
|
|
9
|
-
O token do bot nunca é aceito como argumento MCP. Defina
|
|
10
|
-
`VAULT_GO_TELEGRAM_BOT_TOKEN` no ambiente privado do serviço e invoque
|
|
11
|
-
`vault_go_telegram_configure` com o chat e os tipos ou conceitos aprovados.
|
|
12
|
-
A configuração é cifrada pelo armazenamento privado local; status, resources e
|
|
13
|
-
erros não retornam o token. Configurar não envia mensagem. O único envio de teste
|
|
14
|
-
ocorre por uma chamada explícita a `vault_go_telegram_test`.
|
|
15
|
-
|
|
16
|
-
Depois da persistência de uma observação, o worker envia apenas quando alertas
|
|
17
|
-
estão habilitados e o tipo ou um conceito corresponde aos gatilhos. A mensagem é
|
|
18
|
-
limitada a tipo, título, projeto e ID; narrativa e fatos não são enviados. Uma
|
|
19
|
-
falha do Telegram não repete nem invalida uma memória já persistida.
|
|
20
|
-
|
|
21
|
-
Ferramentas: `vault_go_telegram_status`, `vault_go_telegram_configure`,
|
|
22
|
-
`vault_go_telegram_disable` e `vault_go_telegram_test`.
|
|
23
|
-
|
|
24
|
-
## CCS Align
|
|
25
|
-
|
|
26
|
-
Cada viewer possui `middle.jsonl`, `exclude-marks.json`, `cursor.json` e
|
|
27
|
-
`rules-report.md` sob o diretório privado do Vault. Atualizações usam arquivo
|
|
28
|
-
temporário e rename, deduplicam por UUID e conteúdo e limitam quantidade e
|
|
29
|
-
tamanho. Excluir filtra o cache compilado; não apaga a memória cloud. Restaurar
|
|
30
|
-
remove a marca e requer um novo ciclo para reler a fonte autoritativa.
|
|
31
|
-
|
|
32
|
-
O ciclo comprova health e consulta `search_index → timeline → observations`.
|
|
33
|
-
O rules check recebe listas limitadas de regras como dados, detecta
|
|
34
|
-
`SHADOW_HOUSE`, `DENY_ALLOW`, `DRIFT` e `CLOCK_HEADER` e acrescenta uma seção ao
|
|
35
|
-
relatório. Ele nunca altera house, project ou seat rules.
|
|
36
|
-
|
|
37
|
-
Ferramentas: `vault_go_ccs_align_health`, `vault_go_ccs_align_cycle`,
|
|
38
|
-
`vault_go_ccs_align_exclude`, `vault_go_ccs_align_restore` e
|
|
39
|
-
`vault_go_ccs_align_rules_check`.
|
|
40
|
-
|
|
41
|
-
O writer de awareness do Grok Bot é outra função upstream: ele grava linhas em
|
|
42
|
-
logs mensais de um agente Grok. CCS Align não escreve nesses logs e esta mudança
|
|
43
|
-
não implementa esse writer.
|
|
44
|
-
|
|
45
|
-
## Taxonomias customizadas
|
|
46
|
-
|
|
47
|
-
`vault_go_custom_mode_save` valida identificadores, taxonomias e prompts antes
|
|
48
|
-
de gravar. A resolução rejeita pais desconhecidos e ciclos; arrays presentes
|
|
49
|
-
substituem os do pai e prompts são mesclados. O catálogo e a preferência ativa
|
|
50
|
-
ficam cifrados. `vault_go_custom_mode_select` aplica o modo à injeção de contexto
|
|
51
|
-
e à geração local futura. Memórias existentes não são reclassificadas.
|
|
52
|
-
|
|
53
|
-
Ferramentas adicionais: `vault_go_custom_modes`, `vault_go_custom_mode_get` e
|
|
54
|
-
`vault_go_custom_mode_delete`. O modo base `code` não pode ser sobrescrito ou
|
|
55
|
-
apagado, e um modo com filhos não pode ser removido.
|
|
56
|
-
|
|
57
|
-
## Auditoria dos workflows
|
|
58
|
-
|
|
59
|
-
Os 20 nomes em `vault-go://modes` correspondem aos 20 skills publicados no
|
|
60
|
-
snapshot upstream 13.25.2. Um skill é um roteiro executado pelo agente cliente;
|
|
61
|
-
carregá-lo não iniciar um agente em background não é, por si só, uma lacuna.
|
|
62
|
-
Babysit, planejamento, execução, relatórios e os demais roteiros funcionam quando
|
|
63
|
-
o cliente oferece as ferramentas indicadas. Diferenças reais permanecem para
|
|
64
|
-
knowledge-agent (sem sessão conversacional persistente), wowerpoint (sem renderer
|
|
65
|
-
PPTX/PDF embutido) e cloud-sync (cmem.ai não é o Vault cloud).
|
|
66
|
-
|
|
67
|
-
Após integrar estes módulos, a matriz global deve separar a antiga linha conjunta:
|
|
68
|
-
|
|
69
|
-
- Telegram: disponível com configuração explícita e gatilhos locais.
|
|
70
|
-
- CCS Align: disponível na variante Vault descrita acima.
|
|
71
|
-
- Modos customizados: disponíveis; atualizar a linha de privacy/capture modes.
|
|
72
|
-
- Grok awareness push: ainda não implementado e distinto de Telegram/CCS Align.
|
|
73
|
-
- Transcript watchers: avaliar separadamente com o trabalho específico de watchers.
|
|
74
|
-
- Workflows: não marcar como parciais apenas porque o agente cliente executa as instruções.
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# Revisão e implantação da paridade
|
|
2
|
-
|
|
3
|
-
Data: 20 de setembro de 2026. Referência: claude-mem 13.25.2, adce0fdf.
|
|
4
|
-
|
|
5
|
-
## Implementado
|
|
6
|
-
|
|
7
|
-
Busca sem query obrigatória, offset e ordem por data; timeline com âncora por
|
|
8
|
-
consulta; leitura individual de jobs. Backup v2 paginado e consistente por
|
|
9
|
-
snapshot materializado, privado no cliente, com hash e validação de proprietário
|
|
10
|
-
antes da restauração. O formato cobre preferências e dados de memória; o manifesto
|
|
11
|
-
explicita limites e omissões, sem declarar exportações truncadas como completas.
|
|
12
|
-
|
|
13
|
-
Conversas com corpora usam o modelo escolhido, fontes numeradas e histórico local
|
|
14
|
-
cifrado por conta/base. Respostas HTTP do corpus têm teto de 8 MiB; o JSON de
|
|
15
|
-
fontes enviado ao modelo tem teto de 16 mil caracteres. Codex Terra/Luna/Sol e
|
|
16
|
-
Claude Haiku foram executados de verdade com fontes sintéticas e citações válidas.
|
|
17
|
-
O schema estrito exige todos os campos e aceita classificação nula.
|
|
18
|
-
|
|
19
|
-
Telegram, CCS Align, taxonomias herdadas, watchers de Claude/Codex e encadeamento
|
|
20
|
-
de projetos têm ferramentas próprias no MCP. Captura adicional e envio de
|
|
21
|
-
alertas exigem configuração explícita. Caches e destinos de notificações ficam
|
|
22
|
-
vinculados à conta. O Crystal usa o mesmo servidor Vault Go.
|
|
23
|
-
|
|
24
|
-
AST real cobre os 24 idiomas upstream e HTML; o catálogo informa disponibilidade
|
|
25
|
-
por plataforma. SCSS não tem prebuild Linux ARM64. Awareness do Grok usa logs
|
|
26
|
-
mensais locais, com consentimento e allowlist de agentes.
|
|
27
|
-
|
|
28
|
-
## Evidências
|
|
29
|
-
|
|
30
|
-
- Engine 649f5f7 e API fdcc24b enviados a main e implantados no Docker Swarm.
|
|
31
|
-
- Serviços saudáveis; health/readiness, autenticação e contratos testados na API canônica.
|
|
32
|
-
- `deploymentVerified: true`: health, searchIndex, toolUses, feed, knowledgeBases,
|
|
33
|
-
observerStatus, backup e job aprovados em 20/09/2026. A verificação é dinâmica,
|
|
34
|
-
privada por conta e válida por cinco minutos; não equivale a verificar
|
|
35
|
-
credenciais externas, qualidade dos modelos ou entrega Telegram.
|
|
36
|
-
- Backup real: 4.008 registros, 81 páginas, 14.070.751 bytes. Arquivo privado
|
|
37
|
-
mantido em `~/.memvault/backups/`; conteúdo não foi publicado.
|
|
38
|
-
- Testes de snapshot cobrem alterações/remoções/criações entre páginas, expiração,
|
|
39
|
-
limites, isolamento entre contas e restauração idempotente.
|
|
40
|
-
- Testes do cliente cobrem mudança de conta durante operações, resposta HTTP
|
|
41
|
-
excessiva, substituição de lock, redaction, credenciais, MCP e fila de modelos.
|
|
42
|
-
- Auditoria de dependências de produção: zero vulnerabilidades.
|
|
43
|
-
- Crystal: 122 testes, typecheck, gates de qualidade e E2E Electron com 2.359 notas;
|
|
44
|
-
as sete operações foram exercitadas pelo MCP Vault e servidor Crystal reais.
|
|
45
|
-
|
|
46
|
-
## Revisão
|
|
47
|
-
|
|
48
|
-
APROVADO COM RESSALVAS. A revisão multimodelo foi substituída por revisão manual:
|
|
49
|
-
ANTHROPIC_BASE_URL e ANTHROPIC_AUTH_TOKEN não estavam definidos, impedindo conferir
|
|
50
|
-
os aliases dos três revisores no gateway. Não se presumiu que aliases eram órfãos.
|
|
51
|
-
A revisão manual e uma segunda leitura independente encontraram e corrigiram
|
|
52
|
-
fencing de conta, recuperação de locks, restauração de preferências e limites de
|
|
53
|
-
leitura. As correções têm testes de regressão.
|
|
54
|
-
|
|
55
|
-
Ressalvas: o servidor gerenciado está `configured:false` até receber uma credencial
|
|
56
|
-
válida; provedores locais selecionados continuam disponíveis com sua autenticação.
|
|
57
|
-
Backup v2 não é o formato SQLite upstream nem uma réplica offline/cmem.ai Pro.
|
|
58
|
-
Restauração é idempotente por página; não é uma única transação entre preferências
|
|
59
|
-
do gateway e todos os dados do engine. Os workflows/skills executam no cliente e
|
|
60
|
-
respeitam as ferramentas e autorizações disponíveis nesse cliente.
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
# Transcripts persistentes e contexto entre projetos
|
|
2
|
-
|
|
3
|
-
Vault Go pode capturar transcripts JSONL de Claude Code e Codex enquanto o serviço local está em execução. É uma opção local, desligada por padrão e vinculada à conta Vault. A preferência da conta `automaticCapture` também precisa estar ativada. A geração continua usando o motor/modelo já escolhido; ativar watchers não altera Claude Haiku, Codex ou chaves de providers.
|
|
4
|
-
|
|
5
|
-
## Ativação
|
|
6
|
-
|
|
7
|
-
```sh
|
|
8
|
-
vault-go transcripts enable --client claude --workspace /caminho/projeto --consent
|
|
9
|
-
vault-go transcripts enable --client codex --workspace /caminho/projeto --consent
|
|
10
|
-
vault-go local start
|
|
11
|
-
vault-go transcripts status
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
As raízes padrão são `~/.claude/projects` e `~/.codex/sessions`. Para outro perfil, use `--root /caminho/transcripts`. O workspace e a raiz precisam existir e ser caminhos absolutos. Registre cada workspace separadamente; no máximo 20 pares cliente/workspace. Subdiretórios de um repositório usam sua raiz Git.
|
|
15
|
-
|
|
16
|
-
Sem `--from-start`, arquivos existentes começam no fim na primeira descoberta. Eventos que chegarem antes dessa primeira leitura podem ser pulados. Arquivos novos, criados depois da ativação, são lidos desde o início. Use `--from-start` na primeira configuração apenas quando quiser importar o histórico. Uma importação histórica pode se sobrepor à captura anterior por hooks sem identificadores comuns; a opção é explícita por esse motivo. Uma troca de conta exige novo consentimento.
|
|
17
|
-
|
|
18
|
-
```sh
|
|
19
|
-
vault-go transcripts enable --client codex --workspace /projeto --root /export/rollouts --consent --from-start
|
|
20
|
-
vault-go transcripts poll
|
|
21
|
-
vault-go transcripts disable --client codex --workspace /projeto
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
`poll` executa um lote sem iniciar serviços nem modificar preferências. `disable` devolve imediatamente aos hooks nativos a captura daquele cliente/workspace. Enquanto o watcher estiver habilitado, os hooks nativos continuam injetando contexto, mas deixam a escrita para o transcript, evitando captura dupla na operação normal. Desligar o serviço local mantém o checkpoint para retomada. Para voltar à captura exclusiva por hooks, desative o watcher.
|
|
25
|
-
|
|
26
|
-
O setup aceita `--watch-transcripts claude|codex --workspace /projeto --consent`, opcionalmente `--transcript-root /raiz` e `--from-start`. Não ativa watchers implicitamente.
|
|
27
|
-
|
|
28
|
-
## Recuperação e privacidade
|
|
29
|
-
|
|
30
|
-
- `transcript-watchers.json` guarda o consentimento; `transcript-checkpoints.json` guarda offsets em bytes, identidade dos arquivos e o estado mínimo de chamadas pendentes. Arquivos usam permissão 0600 e gravação atômica. Entradas pendentes são redigidas e limitadas; esse checkpoint não é criptografado.
|
|
31
|
-
- O checkpoint avança depois do evento cloud e da fila durável de geração. Falhas de rede voltam ao mesmo identificador idempotente. Uma perda de confirmação pode repetir o envio HTTP, mas usa a mesma chave na API e na fila/importação. Não há promessa de execução exatamente uma vez do modelo após replay histórico.
|
|
32
|
-
- Um lock por processo impede dois consumidores simultâneos. Reinício, inode novo, truncamento e alteração do prefixo são detectados. Linhas parciais esperam a próxima leitura; UTF-8 usa offsets em bytes. JSON inválido e linhas acima de 256 KB são descartados.
|
|
33
|
-
- Apenas registros cujo `cwd` corresponde ao workspace consentido são enviados. Symlinks encontrados na árvore são ignorados. Trocar conta, credenciais ou consentimento durante uma operação interrompe o lote. Um refresh de credencial pode abortar um lote; a próxima leitura retoma com os mesmos IDs.
|
|
34
|
-
- `<private>` / `<vault-private>` e flags privadas bloqueiam o turno inteiro, incluindo ferramentas e resposta, até o próximo prompt público. Senhas, tokens, chaves e blocos de contexto são redigidos com a política dos hooks. `includeToolResults=false` continua omitindo resultados na API. Ao começar no fim de um arquivo existente, a leitura espera um novo prompt público antes de capturar ferramentas/respostas.
|
|
35
|
-
- Claude: `user`, `assistant`, blocos `text`, `tool_use`, `tool_result`. Codex: `session_meta`, `turn_context`, `response_item.message`, chamadas `function_call` e `custom_tool_call` e seus resultados. `event_msg` duplicados são ignorados; `task_complete.last_agent_message` é fallback para resposta final ausente. Comentários intermediários do Codex não viram resumo. Formatos desconhecidos são ignorados.
|
|
36
|
-
- Chamadas sem resultado ficam pendentes até o resultado chegar. No máximo 16 chamadas pendentes por arquivo, com entrada redigida limitada a 16 KB; excedentes antigos são descartados. Um novo prompt limpa chamadas sem resultado do turno anterior.
|
|
37
|
-
|
|
38
|
-
Cada lote processa até 200 registros, 32 arquivos e 2 MB; cada arquivo é lido em blocos de até 256 KB. A descoberta visita até 4096 entradas e 1000 arquivos, priorizando diretórios e arquivos recentes. O checkpoint mantém até 1000 arquivos e aproximadamente 4 MB. Árvores que excedam os limites podem deixar arquivos históricos fora da descoberta; selecione uma raiz mais estreita para esses casos. A descoberta não promete uma varredura exaustiva de arquivos arbitrariamente grandes. A fila de geração mantém seus limites próprios.
|
|
39
|
-
|
|
40
|
-
O worker faz polling a cada cinco segundos. `local serve`, instalação e atualizações usam o mesmo lifecycle; o serviço só se declara ocioso quando nenhuma captura está em execução e espera a captura atual ao fechar. Updates copiam os módulos novos para o runtime, preservando consentimento e checkpoints fora dele. SDK MCP e Zod ficam isolados em `transcript-tools.js`; o worker/hook staged não depende de `node_modules`.
|
|
41
|
-
|
|
42
|
-
## Cadeia de contexto
|
|
43
|
-
|
|
44
|
-
```sh
|
|
45
|
-
vault-go context-chain set --workspace /app --roots /biblioteca,/infra --consent
|
|
46
|
-
vault-go context-chain set --workspace /worktree --worktree-parent --consent
|
|
47
|
-
vault-go context-chain status
|
|
48
|
-
vault-go context-chain clear --workspace /app
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
SessionStart e `vault_go_session_start_context` passam a consultar o projeto primário e os vínculos configurados para aquele workspace. São no máximo cinco projetos, sempre descobertos na lista autenticada da conta e comparados por caminho exato. Projetos inexistentes ou marcados privados são omitidos; a leitura nunca cria projetos. O pai de worktree é resolvido pelo `.git`/`commondir`, sem executar comandos Git, e requer consentimento explícito.
|
|
52
|
-
|
|
53
|
-
`contextItems` e `contextMaxChars` são orçamentos totais compartilhados entre os projetos, incluindo os pequenos cabeçalhos que identificam cada projeto. Os limites de caracteres e itens não são multiplicados por projeto. Vínculos vivem em `context-chains.json`, com permissão privada e escopo da conta. PreToolUse permanece restrito ao projeto/arquivo em uso.
|
|
54
|
-
|
|
55
|
-
Isto fornece contexto multi-project em cadeia explícita. Não reproduz o renderer visual/token analytics do claude-mem nem escreve `AGENTS.md` automaticamente. O filtro semântico de memórias e isolamento do tenant continuam pertencendo à API Vault autenticada.
|
|
56
|
-
|
|
57
|
-
## Ferramentas MCP
|
|
58
|
-
|
|
59
|
-
| Ferramenta | Operação |
|
|
60
|
-
| --- | --- |
|
|
61
|
-
| `vault_go_transcripts_status` | Consentimento, alvos, última leitura e erro sanitizado |
|
|
62
|
-
| `vault_go_transcripts_configure` | Ativar/desativar; exige `consent=true` para ativar |
|
|
63
|
-
| `vault_go_transcripts_poll` | Processar um lote dos alvos já habilitados |
|
|
64
|
-
| `vault_go_context_chain` | Consultar vínculos da conta |
|
|
65
|
-
| `vault_go_context_chain_configure` | Definir/remover raízes e pai de worktree consentidos |
|
|
66
|
-
|
|
67
|
-
## Evidência de implementação
|
|
68
|
-
|
|
69
|
-
A descoberta upstream usou `/tmp/claude-mem-parity-20260919`, especialmente `src/services/transcripts/{processor,config,types}.ts`, `tests/transcripts/processor-codex-context.test.ts`, `tests/transcripts/watcher-start-at-end.test.ts` e o relatório `/tmp/claude-mem-parity-scan.md`. A arquitetura de watcher/runtime foi portada funcionalmente para a fila e a API Vault, sem executar scripts upstream.
|
|
70
|
-
|
|
71
|
-
Foi consultada somente a estrutura de três arquivos locais por host (tipos e nomes de campos conhecidos, sem conteúdo dos prompts) para confirmar `custom_tool_call/output`, fases `commentary` e metadados Claude/Codex. Fixtures sintéticas em `src/transcript-watchers.test.ts` reproduzem esses formatos, com HTTP local, subprocesso CLI e runtime staged isolado. `src/context-chain.test.ts` verifica consentimento, isolamento, privacidade, limites totais, worktree e integração do hook.
|
|
72
|
-
|
|
73
|
-
A revisão multimodelo foi substituída por revisão manual porque as variáveis de acesso ao gateway LiteLLM não estão disponíveis neste ambiente; nenhum alias foi chamado ou classificado como órfão sem consulta. A revisão manual conferiu fronteiras de conta/consentimento, parser, checkpoints, exclusão mútua, limites, integração e pacote. Nenhum watcher foi ativado na conta real e o worker instalado não foi alterado por estes testes.
|
|
74
|
-
|
|
75
|
-
Validação em 2026-09-20, sobre a base `8f08e19341eed95164ee9a77cf178486adeddb0f`: `bun run build` e `bun test src` passaram (169 testes, 1229 assertions). `npm pack --dry-run --json` contém os 12 arquivos `.js`/`.d.ts` novos e esta documentação, sem arquivos de teste. `git diff --check` passou. Veredito manual: aprovado com os limites operacionais declarados acima.
|