Skip to content

Commit 684bcdb

Browse files
feat(shell): complete settings and onboarding for #361
1 parent 0809c2f commit 684bcdb

30 files changed

Lines changed: 2200 additions & 341 deletions

‎CONTEXT.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ _Avoid_: debug panel, advanced settings, developer mode
126126

127127
**Installation**:
128128
Everything the system places in files the **user** owns so the coding agents can reach it, and takes back byte for byte when asked. Done at first launch and reconciled at every launch after (ADR 0012), never by hand and never by the Control Panel — which only triggers it and, on first launch, tells the user in plain words what was placed and that it can be taken back (#345).
129-
_Avoid_: setup, configuration (that is the user's own file, which the system only reads), provisioning
129+
_Avoid_: setup, configuration (the user's own file, which the engine only reads and the Control Panel edits in place, keeping every key and comment it does not know), provisioning
130130

131131
### Reach and sessions
132132

‎README.md‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,29 @@ agents.
1414
> first-generation implementation lives at
1515
> [GPT-VoiceCoding-legacy](https://github.com/okqixiaobao727-design/GPT-VoiceCoding-legacy).
1616
17+
## Install
18+
19+
On an Apple Silicon Mac, run this in your terminal:
20+
21+
```sh
22+
curl -fsSL https://raw.githubusercontent.com/okqixiaobao727-design/GPT-VoiceCoding/main/scripts/install.sh | sh
23+
```
24+
25+
You need Apple's Command Line Tools (`xcode-select --install`), Python **3.12 or
26+
newer** available as `python3` on your PATH, and HTTPS access to GitHub and PyPI.
27+
The script checks these in order and stops with a fix if one is missing; it
28+
does not install Homebrew or Python. It builds the full ad-hoc-signed app from
29+
source under `~/Library/Application Support/GPT-VoiceCoding/source`, quits a
30+
running copy, places the new bundle in `/Applications`, and opens it. There is
31+
no notarized download.
32+
33+
**Upgrade by running the same command again.** Your existing `config.toml` and
34+
Telegram credential file stay in place. First launch creates a configuration
35+
only if none exists, then walks through Codex login, the installed helpers,
36+
Call Agent, optional Telegram, and a test call. Have Codex installed and log in
37+
with `codex login` when the guide asks. Later launches are silent. Settings that
38+
need an engine restart show one explicit **Restart now** action.
39+
1740
## What it is
1841

1942
You are away from the keyboard. A Claude Code or Codex session stops and needs

‎app_bundle/config.example.toml‎

Lines changed: 14 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,32 @@
1-
# GPT-VoiceCoding — an example engine configuration.
2-
#
3-
# The bundle SHIPS this file and never writes one. The engine's configuration is
4-
# a file the user owns and the engine only reads, so an installer that authored
5-
# it would be claiming ownership of something that is not the installer's — and
6-
# this file names adapters by import reference, which means it runs with the
7-
# privileges of whoever wrote it. That is exactly as trusted as the engine, and
8-
# it is trusted because *you* wrote it.
9-
#
10-
# Copy it into place and edit it:
11-
#
12-
# mkdir -p ~/Library/Application\ Support/GPT-VoiceCoding/engine
13-
# cp /Applications/GPT-VoiceCoding.app/Contents/Resources/config.example.toml \
14-
# ~/Library/Application\ Support/GPT-VoiceCoding/engine/config.toml
15-
#
16-
# Until it is there, the engine refuses to start and says so on the terminal that
17-
# started it (exit 2). That refusal is the design: an engine that silently loaded
18-
# nothing behind a seam looks exactly like a healthy one until it is needed.
19-
#
20-
# `docs/control-plane.md` is the canonical description of every key here.
1+
# GPT-VoiceCoding first-launch configuration.
2+
# The shell creates this only when config.toml is absent, then edits it in place.
3+
# The engine only reads it. See docs/control-plane.md for every supported key.
214

225
[engine]
23-
# Both optional; the defaults are the ones documented in docs/control-plane.md.
24-
# The socket lives in a short runtime root because Darwin caps an AF_UNIX path
25-
# at 103 bytes, and it is per-uid so two accounts do not fight over one engine.
26-
# socket_path = "/tmp/gpt-voicecoding-501/control.sock"
27-
# state_path = "~/Library/Application Support/GPT-VoiceCoding/engine/state.json"
6+
# The socket and state paths use the documented per-user defaults.
287

298
[adapters]
30-
# Each is `module:attribute`, imported by the composition root and nothing else.
31-
call = "gpt_voicecoding.adapters.call.realtime:realtime_call"
32-
companion_channel = "gpt_voicecoding.adapters.companion_channel.telegram:telegram_channel"
33-
34-
# With no text reach at all, name the null channel instead — running without a
35-
# Companion Channel is legitimate, but it has to be said out loud:
36-
# companion_channel = "gpt_voicecoding.adapters.companion_channel:null_channel"
9+
call = "gpt_voicecoding.adapters.call.realtime:realtime_call"
10+
companion_channel = "gpt_voicecoding.adapters.companion_channel:null_channel"
3711

3812
[adapters.agents]
3913
claude = "gpt_voicecoding.adapters.agent.claude:claude_agent"
40-
codex = "gpt_voicecoding.adapters.agent.codex:codex_agent"
41-
42-
[adapters.settings.companion_channel]
43-
# The token is named by variable and never written here: a configuration file is
44-
# a file that gets committed by accident, and this is the shape that cannot be.
45-
token_env = "GPTVOICECODING_TELEGRAM_TOKEN"
46-
chat_id = "000000000"
47-
48-
# One Telegram bot may have exactly one `getUpdates` consumer. If the
49-
# first-generation bridge is still running on this machine, give this engine a
50-
# DIFFERENT bot until that one is retired — otherwise the two steal each other's
51-
# inbound messages, `verify` still passes, and only inbound goes quiet.
14+
codex = "gpt_voicecoding.adapters.agent.codex:codex_agent"
5215

5316
[adapters.settings.call]
54-
# Where the bridge's own threads run. A location, so it defaults to ~.
55-
# workspace = "~/code"
56-
57-
# How the two speaking spans are derived. Neither is a measurement: the first is
58-
# how long the user's transcript may go quiet before the utterance is called
59-
# over, and the second bounds how long the Voice's stop edge waits for your
60-
# audio path to finish playing.
61-
# user_quiet_seconds = 1.5
62-
# voice_playout_wait_seconds = 180
63-
64-
# --- The external binaries, stated because this is a bundle ------------------
65-
#
66-
# The menu-bar shell reads your login shell's PATH and hands it to the engine,
67-
# so in the ordinary case these are found. State one anyway if your setup is
68-
# not ordinary — the resolution fails open, so a profile that errors or hangs
69-
# leaves the engine with launchd's PATH (/usr/bin:/bin:/usr/sbin:/sbin) and
70-
# nothing you installed on it. `which codex` in your own shell, and paste the
71-
# answer.
72-
#
73-
# You will know if you get it wrong: `bridgectl verify` fails naming the binary,
74-
# and the engine refuses to start rather than serving a seam it cannot use.
75-
76-
# The dotted seam name has to be quoted, or TOML reads it as two nested tables.
77-
[adapters.settings."agent.codex"]
78-
executable = "/opt/homebrew/bin/codex"
17+
# Voice, realtime model and timing use the engine's defaults until changed.
18+
# Codex is resolved from the login PATH on each spawn, never stored here.
7919

8020
[policy]
81-
# Optional; these are the locked defaults.
82-
# silence_end_seconds = 60
83-
# cool_down_seconds = 30
84-
# speech_settle_seconds = 5
85-
# history_page_entries = 5
86-
# first_prompt_characters = 40 # Maximum first-words length in a Session Name.
21+
# Silence and the two waits use the engine's defaults until changed.
8722

8823
[log]
89-
# REQUIRED, all three. The engine owns its log and rotates it by rename
90-
# (ADR 0004), and these three numbers have no default in code on purpose: they
91-
# are what a 68 MB outage measured, and a compiled-in fallback would quietly
92-
# reinstate a value the measurement proved matters. The values below are a
93-
# sensible starting point, not a recommendation you are excused from reading.
94-
#
95-
# `max_bytes` binds EVERY generation, so the disk this can occupy is
96-
# max_bytes x (retained_files + 1) — 32 MiB as written.
24+
# Each generation is bounded; retained generations occupy at most 32 MiB total.
9725
max_bytes = 8388608
9826
retained_files = 3
99-
# Names starting with any of these are removed from the environment once, by
100-
# every process that spawns others. `Malloc` is here because `MallocStackLogging`
101-
# — inherited from whichever shell ran an installer, set by nobody — produced
102-
# 98.1% of that outage, one line of stderr per spawned process.
10327
stripped_environment_prefixes = ["Malloc"]
104-
# The log's path is a location rather than a decision, so it defaults beside the
105-
# state file:
106-
# path = "~/Library/Application Support/GPT-VoiceCoding/engine/engine.log"
10728

10829
[delegate]
109-
# Required: the Delegated Turn's model is the cost lever, and a default here
110-
# would be a decision this project does not get to make for you.
111-
#
112-
# This is also the model the Call Agent runs on — the acting half of a Live
113-
# Call, which has no model field of its own and is simply what backs the call's
114-
# thread. Stated in one place so the two cannot diverge; left unstated, codex
115-
# fell back to whatever `~/.codex/config.toml` said and every hand-off on a call
116-
# was refused, in silence (#270).
117-
model = "the-model-you-chose"
118-
119-
# Required *for the bundle*, and only for the bundle. Left out, the engine uses
120-
# the console script installed beside its own interpreter — which is right for a
121-
# `pip install`, and wrong here, because the bundle's interpreter is inside the
122-
# .app and so is its CLI. Point this at wherever the .app really is.
123-
cli = "/Applications/GPT-VoiceCoding.app/Contents/Resources/engine/bin/bridgectl"
30+
model = "gpt-5.6-terra"
31+
effort = "low"
32+
# The shell inserts cli here from the running bundle's actual location.

0 commit comments

Comments
 (0)