Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
36ab2b9
docs: design account-native v0.0.12 coverage
robotlearning123 Jul 10, 2026
91dff79
docs: incorporate cross-model design review
robotlearning123 Jul 10, 2026
8111b34
docs: record current MCP SDK guidance
robotlearning123 Jul 10, 2026
b40edda
docs: plan v0.0.13 voice catalog release
robotlearning123 Jul 10, 2026
a218611
test: define voice catalog MCP contract
robotlearning123 Jul 10, 2026
2e9fbc2
feat: expose ChatGPT voice catalog
robotlearning123 Jul 10, 2026
6d49afd
test: harden voice registration and live gating
robotlearning123 Jul 10, 2026
198e77f
feat(voice): bound catalog size and cover the limit
robotlearning123 Jul 11, 2026
457672f
docs: define voice catalog and GPT-Live boundary
robotlearning123 Jul 11, 2026
8f3f5b2
chore: prepare v0.0.13 release
robotlearning123 Jul 11, 2026
e30f77b
docs: scope v0.0.14 live-voice investigation and record read-only fin…
robotlearning123 Jul 11, 2026
994f518
docs: record live GPT-Live capture attempt and mic blocker
robotlearning123 Jul 11, 2026
d302aa3
feat(voice): add voice_mode to list_voices
robotlearning123 Jul 11, 2026
99f5156
docs: design GPT-Live sidecar, connection reliability, and tool/searc…
robotlearning123 Jul 11, 2026
3390a39
fix: separate live voice from catalog modes
robotlearning123 Jul 11, 2026
24f40d4
feat(sidecar): GPT-Live voice bridge scaffold with tested reliability…
robotlearning123 Jul 11, 2026
75d3bf8
feat(sidecar): implement verified GPT-Live handshake adapter
robotlearning123 Jul 11, 2026
369104a
docs(sidecar): confirm GPT-Live handshake live end-to-end with accoun…
robotlearning123 Jul 11, 2026
b623273
feat(sidecar): live WebRTC connection to GPT-Live from Node (no brows…
robotlearning123 Jul 11, 2026
f5c3a46
chore(sidecar): pin werift via lockfile
robotlearning123 Jul 11, 2026
4fbdfd7
feat(sidecar): audio round-trip experiment (TTS->ffmpeg->werift->GPT-…
robotlearning123 Jul 11, 2026
c95a19d
fix(sidecar): correct 3 werift audio-wiring bugs; isolate remaining wall
robotlearning123 Jul 11, 2026
076970b
test(sidecar): wrapped session.update does not hold the session (nega…
robotlearning123 Jul 11, 2026
5651c62
docs(sidecar): confirm outbound envelope; runtime observation is the …
robotlearning123 Jul 11, 2026
9fc3cb8
feat(sidecar): capture full GPT-Live protocol; isolate blocker to wer…
robotlearning123 Jul 11, 2026
dcb74c2
test(sidecar): confirm werift audio egress does not reach server
robotlearning123 Jul 11, 2026
3008b58
docs(sidecar): werift sender wiring is correct; issue is SRTP/DTLS me…
robotlearning123 Jul 11, 2026
cb5d928
feat(sidecar): runnable browser sidecar for the GPT-Live round-trip
robotlearning123 Jul 11, 2026
977d576
Merge remote-tracking branch 'origin/release/v0.0.13-voice' into rele…
sandia777 Jul 11, 2026
ea2be13
fix(sidecar): correct the diagnosis — blocker is an incomplete handshake
robotlearning123 Jul 11, 2026
c052f5c
Merge remote-tracking branch 'origin/release/v0.0.14-live-voice' into…
sandia777 Jul 11, 2026
33afbd8
chore(sidecar): make experiment/demo paths cross-platform (mac)
sandia777 Jul 11, 2026
33f4e72
feat(sidecar): full authenticated handshake — pins the wall to Cloudf…
robotlearning123 Jul 11, 2026
f010d71
feat(sidecar): full handshake experiment (FormData+session+sentinel)
sandia777 Jul 11, 2026
aaaaf08
Merge remote-tracking branch 'origin/release/v0.0.14-live-voice' into…
sandia777 Jul 11, 2026
7eae090
docs(sidecar): independently confirm server-side abort (media egresse…
sandia777 Jul 11, 2026
68260b2
chore(sidecar): gitignore browser-sidecar Chrome profile dir
sandia777 Jul 11, 2026
85bc442
docs(sidecar): live-browser confirmation + anti-bot boundary note
sandia777 Jul 11, 2026
e576ecd
feat(live-voice): export GPT-Live to agents as Mode B text I/O
sandia777 Jul 11, 2026
1d0f9f5
fix(live-voice): preserve undelivered speak queue on send_text success
sandia777 Jul 11, 2026
36a799e
feat(sidecar): real consumer GPT-Live transcript parser
sandia777 Jul 11, 2026
8faae48
fix(sidecar): correct events.mjs to real consumer protocol
sandia777 Jul 11, 2026
12b2e93
feat(sidecar): human-free voice STT test double (OpenAI Realtime API)
sandia777 Jul 11, 2026
10686c1
chore(sidecar): voice→agent bridge, Chrome extension, experiment harness
sandia777 Jul 11, 2026
32a521b
docs(live-voice): GPT-Live full-pipeline + authoritative protocol spec
sandia777 Jul 11, 2026
be5f2af
docs(live-voice): changelog for v0.0.14
sandia777 Jul 11, 2026
e118bbe
chore(repo): drop stale v0.0.2 QA_REPORT.html generated artifact
robotlearning123 Jul 13, 2026
68dab90
fix(live-voice): honest human→agent GPT-Live bridge for v0.0.14
robotlearning123 Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
{
"name": "gpt2agent",
"source": "./",
"description": "ChatGPT Plus/Pro account as 25 MCP tools + the deep-research and gpt2agent skills. Requires `pipx install gpt2agent`.",
"description": "ChatGPT Plus/Pro account as 30 MCP tools, including the Voice catalog, plus the deep-research and gpt2agent skills. Requires `pipx install gpt2agent`.",
"author": { "name": "robotlearning123" },
"license": "MIT",
"keywords": ["mcp", "chatgpt", "openai", "deep-research"]
Expand Down
4 changes: 2 additions & 2 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "gpt2agent",
"displayName": "gpt2agent",
"version": "0.0.11",
"description": "Your ChatGPT Plus/Pro account (chat, deep research, image gen, code, agent mode) as 25 MCP tools — reuses your codex login. Requires the gpt2agent CLI on PATH (pipx install gpt2agent).",
"version": "0.0.14",
"description": "Your ChatGPT Plus/Pro account (chat, deep research, image gen, code, agent mode, Voice catalog) as 30 MCP tools — reuses your codex login. Requires the gpt2agent CLI on PATH (pipx install gpt2agent).",
"author": {
"name": "robotlearning123",
"url": "https://github.com/robotlearning123"
Expand Down
98 changes: 98 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,104 @@ versioning: [SemVer](https://semver.org/).

## [Unreleased]

## [0.0.14] - 2026-07-11

### Added — GPT-Live → coding-agent bridge, human → agent (lane: `sidecar/`)

- **Full GPT-Live reverse-engineering** (live capture + the 4.5 MB shipped voice
client bundle, all cited): the authoritative protocol spec at
`docs/superpowers/plans/2026-07-11-gpt-live-protocol-spec.md`, plus the bridge
design at `docs/superpowers/plans/2026-07-11-gpt-live-bridge-layer-spec.md`.
- **Human → agent voice bridge (observe-only)**: taps the real consumer GPT-Live
datachannel, reconstructs each human utterance from the real `chat_message_delta`
(`direction:"in"`) protocol, and routes it to a pluggable coding agent. The
agent's reply reaches the human **out-of-band** (a text overlay) — GPT-Live
silently drops client-injected speech, so there is no agent→Live "speak" path.
- Reliable path = real signed-in Chrome + `sidecar/extension` (TAP) +
`sidecar/agent-gateway.mjs` (runs `AGENT_CMD`, e.g. `claude -p`/`codex exec`).
- `sidecar/browser/sidecar.mjs` (puppeteer + fake WAV mic) is a **test harness**
only — synthetic audio is not transcribed by Live.
- Audio stays in the browser; only transcript text crosses to the agent.
- **MCP surface** (`voice_live_status` / `voice_live_get_transcript` /
`voice_live_end` / `voice_live_export_help`) is observe + lifecycle only. The
`voice_live_send_text` "speak" tool was **removed** — it reported false delivery
for a server-dropped operation.
- **`VoiceProvider` abstraction** (`sidecar/src/voice-provider.mjs`):
`ConsumerGptLiveVoiceProvider` (production: real mic, the irreplaceable GPT-Live
voice) and `RealtimeVoiceProvider` (test double: OpenAI Realtime API). The
agent-wiring is provider-agnostic, so the loop is regression-tested human-free.
- **Human-free voice testing stack**:
- `sidecar/src/transcript.mjs` + `test/transcript.test.mjs` — the consumer
transcript parser as pure logic (8 unit tests; no voice/human/LLM).
- `sidecar/src/realtime-provider.mjs` + `test/realtime-stt.test.mjs` — a
human-free STT test double via the Realtime API (synthetic TTS → transcript,
no mic/human/browser).
- `test/voice-loop.test.mjs` — opt-in full human-free loop (TTS → STT → agent).
- `sidecar/test/voice-test-cases.md` — the layered voice test-case suite.

### Changed

- **Bridge layer rewritten to the real protocol + honest direction.**
`sidecar/src/export.mjs` now ingests via `TranscriptAssembler` (the real
`chat_message_delta` parser) instead of the deprecated Realtime-API extractor,
filters filler (`isActionable`), and buffers the agent reply as text — the
speak-queue is gone. The agent→Live write channel (`/send_text` route,
`buildSpeakWire`/`response.create` injection, `session.mjs.speak`) is removed:
verified 2026-07-11, the consumer channel silently drops `response.create` /
`conversation.item.create` / `session.update` (5 candidates, all `dc.send→true`,
0 replies).
- **Reliability & correctness fixes:** control-plane `/end` no longer deadlocks
(respond before teardown); `agent-gateway.mjs` drops wildcard CORS and adds a
bounded body, per-call timeout, and an optional `GPTLIVE_TOKEN` gate; secret
redaction (Python + JS) now recurses arrays/strings and strips embedded
Bearer/JWT.
- **Release metadata aligned to `0.0.14`** across `pyproject.toml`,
`gpt2agent/__init__.py`, `server.json`, and `.claude-plugin/plugin.json`
(tool count 31 → 30 after removing `voice_live_send_text`).
- `sidecar` test scope narrowed to `test/*.test.mjs` so one-off experiment scripts
(`experiments/`) are no longer picked up by `npm test`.

### Findings (documented, evidence-backed)

- Consumer GPT-Live transcribes ONLY real-microphone audio. Synthetic audio —
Chrome fake-device AND `RTCRtpSender.replaceTrack` of real TTS (confirmed
`ctx.state=running`, real-speech amplitude, `sender.track===injected`, audio
egressing) — is NOT transcribed, while the real mic is. ⇒ GPT-Live's STT is not
drivable human-free; that's why the Realtime API is the test double.
- Cloudflare Turnstile gates session create; only a headed, non-automated Chrome on
a signed-in profile clears it. Headless/token-only/copied-profile + automation
flags are SCTP-aborted ~1 s after `listening`.
- Voice conversations ARE normal ChatGPT backend conversations — readable by the
existing `list_conversations`/`get_conversation` MCP tools; memory is shared.

## [0.0.13] - 2026-07-11

### Added

- `list_voices` — read-only MCP tool exposing the signed-in account's Voice
catalog from the private `GET /backend-api/settings/voices` route. Returns a
bounded, stable shape per voice (`id`, `name`, `description`, `selected`,
`has_preview`); backend voice IDs are preserved verbatim and display text is
redacted. Brings the server to 26 MCP tools.
- `list_voices(voice_mode=...)` — optional mode-specific catalog. The live
account contract accepted `standard`, `advanced`, and `wingman` on
2026-07-11; the value is charset-validated (rejected before any request) but
not hard-restricted to that set. Omitting it returns the account default.
GPT-Live audio is a separate session contract, and the catalog endpoint
currently rejects `voice_mode=live` with HTTP 422.
- `docs/roadmap.md` — version lanes, the GPT-Live boundary, the language policy
(Python core with an optional TypeScript sidecar for a future live-voice
lane), and the release gates.

### Notes

- This release adds Voice **catalog discovery only**. It does not start a Voice
session, fetch preview media, capture a microphone, synthesize speech, stream
GPT-Live realtime audio, or guarantee transcript extraction.
- The catalog route is a private, reverse-engineered website contract. A
malformed response fails closed with `voice catalog contract changed` rather
than pretending the catalog is empty.

## [0.0.11] - 2026-07-10

Recovery release carrying forward every change in the
Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ python -m gpt2agent run # start MCP server (stdio)

## Key Files

- `gpt2agent/server.py` — MCP tool registration (25 tools), config loading
- `gpt2agent/server.py` — MCP tool registration (30 tools), config loading
- `gpt2agent/sse.py` — Async SSE client for `/backend-api/conversation` (chat, DR, agent, image gen, code interpreter, canvas)
- `gpt2agent/backend.py` — Sync HTTP client (`curl_cffi`), token management, sentinel challenges
- `gpt2agent/tools/` — 10 tool modules (19 of the 25 tools; the 6 SSE chat/DR/agent tools live in server.py), each with `register(mcp, client, conv=None)`
- `gpt2agent/tools/` — 12 tool modules (24 of the 30 tools; the 6 SSE chat/DR/agent tools live in server.py), each with `register(mcp, client, conv=None)`
- `gpt2agent/sentinel.py` — POW + Turnstile solver
- `gpt2agent/install.py` — `gpt2agent install` subcommand

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ and skipped by default). Also run `ruff check gpt2agent tests scripts` and
- `BackendClient` (backend.py): synchronous HTTP via `curl_cffi`. Handles token loading, sentinel challenges, REST endpoints.
- `ConversationClient` (sse.py): async SSE streaming. Handles `/backend-api/conversation` and `/backend-api/f/conversation` for chat, DR, agent mode, image gen, code interpreter, canvas.
- `server.py`: FastMCP tool registration. Creates `BackendClient` + `ConversationClient` singletons.
- `tools/`: 10 registration modules exposing 25 MCP tools. REST-backed handlers
- `tools/`: 12 registration modules; 30 MCP tools total (6 SSE tools live in server.py). REST-backed handlers
are async and offload the synchronous `BackendClient` through the shared
tool backend helper.

Expand Down
Loading
Loading