@crievo/omni 0.1.2 → 0.1.3
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/docs/onboarding.md +69 -161
- package/omnivideo.config.example.json +1 -1
- package/package.json +1 -1
- package/reference/omnichat.md +5 -4
- package/reference/publish.md +9 -9
- package/reference/studio.md +1 -1
- package/studio/api/services/onboarding.ts +242 -21
- package/studio/api/services/settings.ts +4 -2
- package/studio/shared/types/api.ts +26 -1
- package/studio/web/hooks/useOnboarding.ts +24 -6
- package/studio/web/lib/alerts.ts +10 -0
- package/studio/web/pages/GettingStartedPage/components/ComputerCard.tsx +102 -0
- package/studio/web/pages/GettingStartedPage/index.tsx +84 -58
- package/studio/web/pages/SettingsPage/components/AgentAccounts.tsx +30 -3
- package/studio/web/styles/pages/getting-started.css +46 -0
- package/studio/web/styles/pages/settings/shell.css +4 -0
- package/tools/lib/agents.mjs +24 -13
- package/tools/lib/claude-settings.mjs +32 -3
- package/tools/lib/deps.mjs +24 -0
- package/tools/lib/platforms/instagram.mjs +1 -1
- package/tools/lib/up.mjs +5 -2
- package/tools/omni.mjs +7 -5
- package/tools/omnichat.mjs +5 -7
- package/tools/package.mjs +5 -3
- package/tools/publish.mjs +40 -137
- package/tools/reference.mjs +1 -1
- package/tools/setup.mjs +16 -15
package/docs/onboarding.md
CHANGED
|
@@ -1,123 +1,51 @@
|
|
|
1
1
|
# Primeiros passos no OmniVideo
|
|
2
2
|
|
|
3
|
-
Do
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Cada passo diz o que fazer e como conferir. Com o studio aberto, a tela
|
|
8
|
-
**Primeiros passos** (`http://127.0.0.1:5432/getting-started`) mostra este mesmo guia e marca
|
|
9
|
-
sozinha o que já está pronto; no terminal, `node tools/setup.mjs check` faz a mesma
|
|
10
|
-
conferência.
|
|
11
|
-
|
|
12
|
-

|
|
3
|
+
Do plugin instalado ao primeiro vídeo, sem terminal. Enquanto o OmniVideo prepara
|
|
4
|
+
este computador (alguns minutos), você deixa a voz, as redes e o estilo visual
|
|
5
|
+
prontos aqui no studio.
|
|
13
6
|
|
|
14
7
|
O que você vai precisar ter ou criar:
|
|
15
8
|
|
|
16
|
-
-
|
|
17
|
-
- uma conta
|
|
18
|
-
-
|
|
19
|
-
- uma assinatura da Epidemic Sound, de onde vêm os efeitos sonoros;
|
|
20
|
-
- um vídeo ou fotos do estilo visual que você quer (um link ou imagens).
|
|
21
|
-
|
|
22
|
-
<!-- step: machine -->
|
|
23
|
-
## 1. Ferramentas da máquina
|
|
24
|
-
|
|
25
|
-
O OmniVideo roda inteiro na sua máquina. Ele precisa de Node.js, Bun, ffmpeg, Python
|
|
26
|
-
e um Chrome. O jeito mais rápido no Mac é o [Homebrew](https://brew.sh):
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
30
|
-
brew install node oven-sh/bun/bun ffmpeg python@3.12 yt-dlp
|
|
31
|
-
brew install --cask google-chrome
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
- **Node.js 20+** roda as ferramentas de `tools/` (render, montagem, publicação).
|
|
35
|
-
- **Bun** roda o studio.
|
|
36
|
-
- **ffmpeg** (com o `ffprobe`) mede, corta, mistura e exporta tudo.
|
|
37
|
-
- **Python 3.10+** roda a voz e a legenda (o passo 2 cria um ambiente só do projeto).
|
|
38
|
-
- **Google Chrome** é onde o motion é desenhado quadro a quadro. Chromium e Brave
|
|
39
|
-
também servem; outro caminho vai em `CHROME_PATH`.
|
|
40
|
-
- **yt-dlp** é opcional: baixa o estilo visual quando você manda um link.
|
|
41
|
-
|
|
42
|
-
Confira com `node --version`, `bun --version`, `ffmpeg -version` e `python3 --version`.
|
|
43
|
-
|
|
44
|
-
<!-- step: project -->
|
|
45
|
-
## 2. Baixar e preparar o projeto
|
|
46
|
-
|
|
47
|
-
Clone o repositório e rode o setup. Ele não sobrescreve nada que já exista:
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
git clone https://github.com/pedroflp/omni.git omnivideo
|
|
51
|
-
cd omnivideo
|
|
52
|
-
node tools/setup.mjs
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
O setup:
|
|
56
|
-
|
|
57
|
-
- cria o `.env` (as chaves, fora do git) e o `omnivideo.config.json` a partir dos exemplos;
|
|
58
|
-
- cria a biblioteca de estilos visuais vazia, ao lado do projeto (`../referencias`);
|
|
59
|
-
- cria o kit de efeitos vazio (`kit/sfx/kit.json`);
|
|
60
|
-
- cria o Python do projeto (`.venv`, com `requests`, `soundfile` e `numpy`);
|
|
61
|
-
- instala as dependências do studio (`bun install`).
|
|
62
|
-
|
|
63
|
-
No fim, ele mostra a conferência de todos os passos deste guia. Daí em diante, abra o
|
|
64
|
-
studio e siga pela tela:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
cd studio && bun start
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
O studio abre em `http://127.0.0.1:5432`. Deixe esse terminal aberto enquanto usa.
|
|
71
|
-
|
|
72
|
-
<!-- step: claude -->
|
|
73
|
-
## 3. Claude Code
|
|
74
|
-
|
|
75
|
-
Quem escreve o roteiro, compõe o motion e conduz cada etapa é o Claude Code, aberto
|
|
76
|
-
pelo studio. Instale e entre na sua conta:
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
curl -fsSL https://claude.ai/install.sh | bash
|
|
80
|
-
CLAUDE_CONFIG_DIR=~/.claude-personal claude
|
|
81
|
-
```
|
|
9
|
+
- o Claude Code com o plugin do OmniVideo instalado;
|
|
10
|
+
- uma conta num provider de voz: Fish Audio ou Cartesia;
|
|
11
|
+
- um vídeo ou fotos do estilo visual que você quer.
|
|
82
12
|
|
|
83
|
-
|
|
84
|
-
siga o login no navegador. Depois, digite `/exit`.
|
|
13
|
+
O kit de efeitos sonoros entra neste guia em breve.
|
|
85
14
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
precisa ser feito nessa pasta. Para não digitar a variável toda vez, ponha no
|
|
89
|
-
`~/.zshrc`:
|
|
15
|
+
<!-- step: computer -->
|
|
16
|
+
## Este computador
|
|
90
17
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
18
|
+
Ao abrir o Claude Code com o plugin, o OmniVideo cria a pasta `~/OmniVideo`, abre o
|
|
19
|
+
navegador para você entrar e liga o studio deste computador. Depois, baixa sozinho o
|
|
20
|
+
que o vídeo precisa: o ffmpeg e o ffprobe (cortam, misturam e exportam), um Chrome
|
|
21
|
+
sem janela (desenha o motion quadro a quadro; se você já tem Chrome, Chromium ou
|
|
22
|
+
Brave, ele usa o seu) e o Python das ferramentas (voz e legenda).
|
|
94
23
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
do Codex (o CLI que vem no app do ChatGPT, ou o `codex` no PATH). Cada sessão nova vai para a
|
|
98
|
-
próxima conta, e a que bate o limite de uso sai do rodízio até liberar. O botão **Entrar**
|
|
99
|
-
de cada conta abre o login no navegador.
|
|
24
|
+
Os itens com "preparando…" ainda estão baixando. Esta tela atualiza sozinha e
|
|
25
|
+
mostra **Computador pronto** quando tudo responder.
|
|
100
26
|
|
|
101
|
-
|
|
102
|
-
|
|
27
|
+
As skills do OmniVideo rodam no seu Claude Code e precisam de permissão uma vez. Se
|
|
28
|
+
a permissão aparecer como pendente, diga ao Claude "libere as skills do OmniVideo":
|
|
29
|
+
ele mostra as regras, pede o seu ok e grava.
|
|
103
30
|
|
|
104
|
-
|
|
105
|
-
|
|
31
|
+
<!-- step: voice-key -->
|
|
32
|
+
## Chave de um provider de voz
|
|
106
33
|
|
|
107
|
-
|
|
34
|
+
A narração é a sua voz clonada, criada na Fish Audio ou na Cartesia pela API. Você
|
|
35
|
+
só precisa da chave de uma delas:
|
|
108
36
|
|
|
109
37
|
- **Fish Audio**: [fish.audio](https://fish.audio), menu da conta → **API Keys**.
|
|
110
38
|
- **Cartesia**: [play.cartesia.ai](https://play.cartesia.ai), **API Keys**.
|
|
111
|
-
- **ElevenLabs** (opcional): [elevenlabs.io](https://elevenlabs.io), **Developers →
|
|
112
|
-
API Keys**. Nela a voz entra pelo Voice ID de uma voz que você já criou lá.
|
|
113
39
|
|
|
114
|
-
|
|
115
|
-
|
|
40
|
+
Abra **Provedores de voz** e cole a chave no provider. Ela fica só neste
|
|
41
|
+
computador.
|
|
116
42
|
|
|
117
43
|

|
|
118
44
|
|
|
119
|
-
|
|
120
|
-
|
|
45
|
+
<!-- step: voice-clone -->
|
|
46
|
+
## Clonar a voz
|
|
47
|
+
|
|
48
|
+
Em **Clonar a minha voz**:
|
|
121
49
|
|
|
122
50
|
1. escolha o idioma da fala;
|
|
123
51
|
2. grave lendo o roteiro que aparece na tela, ou envie áudios seus (de 30 s a 3 min
|
|
@@ -126,87 +54,67 @@ provider. Ela vai para o `.env`, que nunca sobe para o git.
|
|
|
126
54
|
|
|
127
55
|

|
|
128
56
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
provider e use **Já tenho voz criada nos provedores**, com o Voice ID.
|
|
57
|
+
Se o plano do provider não deixar clonar pela API, o cartão dele avisa. Nesse caso,
|
|
58
|
+
crie a voz no site do provider e use **Já tenho voz criada nos provedores**, com o
|
|
59
|
+
Voice ID.
|
|
133
60
|
|
|
134
|
-
<!-- step:
|
|
135
|
-
##
|
|
61
|
+
<!-- step: voice-default -->
|
|
62
|
+
## Voz padrão
|
|
136
63
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
nunca asset copiado.
|
|
64
|
+
A voz padrão já vem marcada em cada vídeo novo. A primeira voz que você cria vira a
|
|
65
|
+
padrão sozinha; para trocar, abra **Perfil de voz** e escolha outra na roleta.
|
|
140
66
|
|
|
141
|
-
|
|
67
|
+
<!-- step: platforms -->
|
|
68
|
+
## Conectar YouTube, Instagram e TikTok
|
|
142
69
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
3. clique em **Criar estilo visual**.
|
|
70
|
+
Opcional: só para publicar direto do studio. Dá para fazer agora ou depois do
|
|
71
|
+
primeiro vídeo.
|
|
146
72
|
|
|
147
|
-
|
|
73
|
+
Em **Configurações → Plataformas**, cada rede tem o seu cartão. O YouTube e o TikTok
|
|
74
|
+
pedem as chaves de um app de desenvolvedor seu (Google Cloud e TikTok for Developers,
|
|
75
|
+
criados uma vez) e abrem o login no navegador. O Instagram pede o token gerado no app
|
|
76
|
+
da Meta. O passo a passo de cada uma está em [`reference/publish.md`](../reference/publish.md).
|
|
148
77
|
|
|
149
|
-
|
|
150
|
-
do estilo visual mostra o andamento. A biblioteca fica em `../referencias` (o caminho está em
|
|
151
|
-
`references.dir`, na config) e serve para todos os vídeos.
|
|
78
|
+

|
|
152
79
|
|
|
153
|
-
|
|
154
|
-
|
|
80
|
+
Publicar é sempre um pedido seu: nada sobe sozinho, a menos que você ligue a
|
|
81
|
+
publicação automática em **Configurações → Publicação**.
|
|
82
|
+
|
|
83
|
+
<!-- step: style -->
|
|
84
|
+
## Escolher um estilo visual
|
|
155
85
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
buscar de novo.
|
|
86
|
+
Todo vídeo segue um estilo visual: um vídeo ou fotos de que você gosta, medidos
|
|
87
|
+
(cores, ritmo, tipografia, movimento) e transformados num guia. O estilo é princípio,
|
|
88
|
+
nunca asset copiado.
|
|
160
89
|
|
|
161
|
-
|
|
90
|
+
Em **Estilos visuais → Novo estilo visual**, envie **fotos** do estilo (telas,
|
|
91
|
+
quadros, capturas) ou cole um **link** (Instagram, YouTube…) e clique em **Criar
|
|
92
|
+
estilo visual**. Fotos e links funcionam igual: o link é baixado pelo `yt-dlp`, que o
|
|
93
|
+
OmniVideo traz junto com o ffmpeg e o Chrome sem janela.
|
|
162
94
|
|
|
163
|
-
|
|
164
|
-
Google Chrome;
|
|
165
|
-
2. instale a extensão **Claude in Chrome** (na Chrome Web Store) nesse Chrome e
|
|
166
|
-
entre com a mesma conta do Claude do passo 3;
|
|
167
|
-
3. deixe o Chrome aberto quando pedir o primeiro vídeo.
|
|
95
|
+

|
|
168
96
|
|
|
169
|
-
|
|
170
|
-
|
|
97
|
+
O Claude mede e escreve o guia em alguns minutos; a tela do estilo mostra o
|
|
98
|
+
andamento. O estilo vale para todos os vídeos.
|
|
171
99
|
|
|
172
100
|
<!-- step: first-video -->
|
|
173
|
-
##
|
|
101
|
+
## Primeiro vídeo
|
|
174
102
|
|
|
175
|
-
|
|
103
|
+
Em **Criar vídeo**:
|
|
176
104
|
|
|
177
105
|
1. cole o pedido: um roteiro pronto, um tema, um material ou um link;
|
|
178
|
-
2. escolha o formato (vertical 9:16 ou horizontal 16:9), a voz e o estilo visual
|
|
179
|
-
|
|
106
|
+
2. escolha o formato (vertical 9:16 ou horizontal 16:9), a voz e o estilo visual
|
|
107
|
+
(ou deixe o agente escolher);
|
|
180
108
|
3. clique em **Criar e começar**.
|
|
181
109
|
|
|
182
110
|

|
|
183
111
|
|
|
184
|
-
|
|
185
|
-
|
|
112
|
+
O Claude trabalha sozinho e a tela do vídeo mostra cada etapa. Ele para duas vezes
|
|
113
|
+
para você:
|
|
186
114
|
|
|
187
115
|
- **O roteiro.** Aprove, peça alteração ou edite o texto. Se ninguém mexer, ele se
|
|
188
116
|
aprova sozinho em 10 min.
|
|
189
|
-
- **As cenas.**
|
|
190
|
-
|
|
117
|
+
- **As cenas.** Cada cena aparece como um still para aprovar ou pedir alteração. Se
|
|
118
|
+
ninguém mexer, elas se aprovam sozinhas em 10 min.
|
|
191
119
|
|
|
192
|
-
Aprovadas as cenas,
|
|
193
|
-
o MP4, que aparece na
|
|
194
|
-
etapa **Exportação** e fica em `videos/<data-slug>/export/`. O tempo depende do
|
|
195
|
-
tamanho do vídeo; a tela mostra o que está rodando e a fila da máquina.
|
|
196
|
-
|
|
197
|
-
<!-- step: publish -->
|
|
198
|
-
## 8. Publicar nas redes (opcional)
|
|
199
|
-
|
|
200
|
-
Com o vídeo pronto, a etapa **Publicar** sobe o MP4 no YouTube, no Instagram e no
|
|
201
|
-
TikTok, agora ou num dia e hora marcados na **Agenda**. O título, a descrição e a
|
|
202
|
-
legenda o Claude escreve a partir do roteiro, e você edita antes.
|
|
203
|
-
|
|
204
|
-

|
|
205
|
-
|
|
206
|
-
Cada rede precisa de um app de desenvolvedor seu, criado uma vez. Conecte em
|
|
207
|
-
**Configurações → Plataformas**; o passo a passo de cada uma (Google Cloud, Meta e
|
|
208
|
-
TikTok) está em [`reference/publish.md`](../reference/publish.md). O Instagram
|
|
209
|
-
busca o vídeo por um túnel temporário do `cloudflared` (`brew install cloudflared`).
|
|
210
|
-
|
|
211
|
-
Publicar é sempre um pedido seu: nada sobe sozinho, a menos que você ligue a
|
|
212
|
-
publicação automática em **Configurações → Publicação**.
|
|
120
|
+
Aprovadas as cenas, o resto roda até o MP4, que aparece na etapa **Exportação**.
|
package/package.json
CHANGED
package/reference/omnichat.md
CHANGED
|
@@ -200,9 +200,8 @@ commented (the trigger), follows the account, tapped the button.
|
|
|
200
200
|
```bash
|
|
201
201
|
node tools/omnichat.mjs webhook setup # creates INSTAGRAM_WEBHOOK_VERIFY_TOKEN and prints the steps
|
|
202
202
|
# put the app secret in .env: INSTAGRAM_APP_SECRET (Instagram → API setup with Instagram login → App secret)
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
# Meta panel → Instagram → API setup → Configure webhooks: Callback URL = <tunnel>/webhook, Verify token = the one setup printed,
|
|
203
|
+
# Meta panel → Instagram → API setup → Configure webhooks: Callback URL = https://omnichat.<you>.workers.dev/webhook
|
|
204
|
+
# (the cloud Worker, below), Verify token = the one setup printed,
|
|
206
205
|
# fields messages and messaging_postbacks
|
|
207
206
|
node tools/omnichat.mjs webhook subscribe # signs the account up to those fields
|
|
208
207
|
node tools/omnichat.mjs webhook status
|
|
@@ -215,7 +214,9 @@ node tools/omnichat.mjs webhook status
|
|
|
215
214
|
- The tap is answered by the cloud Worker: the same `handleWebhook` (`tools/lib/omnichat/webhook.mjs`)
|
|
216
215
|
runs in a function with its own storage; `tools/lib/omnichat/gate.mjs` has the decision and the sends.
|
|
217
216
|
- The record is written under the pass lock, so the agent and the tap don't overwrite each other.
|
|
218
|
-
-
|
|
217
|
+
- `node tools/omnichat.mjs webhook serve` (127.0.0.1:5434/webhook) is the same handler on this machine, for a
|
|
218
|
+
test behind any public HTTPS address; start it only when the user asks. Enabling the rule is what authorizes
|
|
219
|
+
the replies.
|
|
219
220
|
|
|
220
221
|
## In the cloud (Cloudflare Worker + Postgres)
|
|
221
222
|
|
package/reference/publish.md
CHANGED
|
@@ -96,12 +96,13 @@ publishing, generate another one (step 4).
|
|
|
96
96
|
|
|
97
97
|
**How the video gets there.** With Instagram login, Meta doesn't accept the
|
|
98
98
|
file: it downloads the video from a public URL (direct upload is only for apps
|
|
99
|
-
with Facebook login). `publish.mjs`
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
99
|
+
with Facebook login). `publish.mjs` uploads the MP4 (and the cover) to the
|
|
100
|
+
cloud's R2 bucket through the Worker (`PUT /api/media/<slug>/<file>`), and
|
|
101
|
+
Instagram downloads it from `<cloud.url>/media/schedule/now-<slug>/<random>-<file>`. The
|
|
102
|
+
file is deleted as soon as Instagram finishes processing; the bucket's 7-day
|
|
103
|
+
rule deletes anything left. It needs the cloud (`cloud.url` in the config and
|
|
104
|
+
`OMNICHAT_CLOUD_SECRET` in `.env`, reference/omnichat.md), the same one the
|
|
105
|
+
schedule uses (ADR 0004). Nothing to install here.
|
|
105
106
|
|
|
106
107
|
The video goes as Reels, also to the feed (`share_to_feed`). The cover is the
|
|
107
108
|
selected thumbnail (below, **Cover**); without one, the frame at `cover_at_s`
|
|
@@ -116,7 +117,7 @@ accept 3 s to 15 min.
|
|
|
116
117
|
carousel's Publicar stage in the studio does the same). It uploads
|
|
117
118
|
`carousel/export/NN.jpg` (exported on the spot if the build changed after the last
|
|
118
119
|
export) as a carousel post. Images don't go up as files either: each JPEG goes
|
|
119
|
-
through the
|
|
120
|
+
through the cloud's R2, like the Reel, becomes a child container
|
|
120
121
|
(`is_carousel_item`), and the `CAROUSEL` container joins the children with the
|
|
121
122
|
caption. The caption is `carousel/publication.json`'s (the one edited in the
|
|
122
123
|
studio) or `carousel.json`'s `caption`, with the Instagram footer and the
|
|
@@ -217,8 +218,7 @@ if you switch node versions, turn it on again. The log is in
|
|
|
217
218
|
becomes **failed**, with the reason, waiting for you to schedule again or
|
|
218
219
|
publish now. The ones already up don't go up again.
|
|
219
220
|
- **Publishing by hand** a scheduled platform removes it from the schedule.
|
|
220
|
-
- **Instagram:** the
|
|
221
|
-
internet has to be up at that time, as with the button.
|
|
221
|
+
- **Instagram:** it downloads the video from the cloud's R2, like the button.
|
|
222
222
|
|
|
223
223
|
```bash
|
|
224
224
|
node tools/publish.mjs schedule videos/<slug> --when "2026-10-14 18:00" --youtube --tiktok --confirm
|
package/reference/studio.md
CHANGED
|
@@ -476,7 +476,7 @@ omnichat classifier), the screen in Configurações → Agente de IA → Contas
|
|
|
476
476
|
|
|
477
477
|
| `agents` | |
|
|
478
478
|
|---|---|
|
|
479
|
-
| `accounts` | `[{ id, provider: "claude" \| "codex", dir, label?, enabled? }]`, in rotation order. `dir` is the account's `CLAUDE_CONFIG_DIR` or `CODEX_HOME`, each with its own login (`claude auth login` / `codex login` with the variable set; the screen's "Entrar" runs it). Empty: `~/.claude
|
|
479
|
+
| `accounts` | `[{ id, provider: "claude" \| "codex", dir, label?, enabled? }]`, in rotation order. `dir` is the account's `CLAUDE_CONFIG_DIR` or `CODEX_HOME`, each with its own login (`claude auth login` / `codex login` with the variable set; the screen's "Entrar" runs it). Empty: the Claude Code this machine uses, the folder the plugin's hook recorded in `~/.omni/claude.json`, else `~/.claude` (run without `CLAUDE_CONFIG_DIR`, login in `~/.claude.json`); without a login there, the banner and Configurações → Agente de IA ask for the folder |
|
|
480
480
|
| `codex.model`, `codex.effort` | the model of every Codex session (`-m`, `model_reasoning_effort`); the options come from the account's `models_cache.json` |
|
|
481
481
|
| `codex.sandbox` | `auto` (default): workspace-write with network and the library writable, `approval_policy=on-request` with Codex's `auto_review` reviewer, so what must leave the sandbox (Chrome in the renders) asks and is decided like Claude's auto mode. `full`: no sandbox |
|
|
482
482
|
| `codex.bin` | the CLI; default `codex` on the PATH or the one the ChatGPT app ships |
|