Skip to content

Add demo video to README - #1

Merged
sonichi merged 2 commits into
mainfrom
add-demo-video
Mar 28, 2026
Merged

sonichi merged 2 commits into
mainfrom
add-demo-video

Conversation

@sonichi

@sonichi sonichi commented Mar 28, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds clickable YouTube demo video thumbnail to README intro section

Test plan

  • Verify thumbnail renders on GitHub
  • Verify link opens the demo video

🤖 Generated with Claude Code

sonichi and others added 2 commits March 28, 2026 09:13
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@sonichi

sonichi commented Mar 28, 2026

Copy link
Copy Markdown
Owner Author

Demo video upload

@sonichi
sonichi merged commit 5d25068 into main Mar 28, 2026
@sonichi
sonichi deleted the add-demo-video branch March 28, 2026 16:31
liususan091219 added a commit that referenced this pull request Mar 31, 2026
agent-api.py:
- Add _safe_id() to sanitize task IDs against path traversal (#2-4, #8)
- Reject path traversal in /media/ before resolve (#5-7)
- Sanitize mime type to prevent HTTP response splitting (#1)

inline-tools.ts:
- Escape backslashes in shell args for openUrl and switchApp (#9-11)

conversation-server.ts:
- Mask phone number in startup log (#12)
- Escape meetingId/passcode in TwiML Play digits (#13)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
sonichi pushed a commit that referenced this pull request Mar 31, 2026
* Fix 13 CodeQL security alerts

agent-api.py:
- Add _safe_id() to sanitize task IDs against path traversal (#2-4, #8)
- Reject path traversal in /media/ before resolve (#5-7)
- Sanitize mime type to prevent HTTP response splitting (#1)

inline-tools.ts:
- Escape backslashes in shell args for openUrl and switchApp (#9-11)

conversation-server.ts:
- Mask phone number in startup log (#12)
- Escape meetingId/passcode in TwiML Play digits (#13)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add security comments to shell escaping in inline-tools

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
sonichi added a commit that referenced this pull request Apr 5, 2026
Voice agent now loads last 3 phone call summaries from calls.jsonl,
giving it awareness of recent conversations. Part of unified
cross-agent context (launch TODO #1).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
sonichi added a commit that referenced this pull request Apr 5, 2026
Voice agent now loads last 3 phone call summaries from calls.jsonl,
giving it awareness of recent conversations. Part of unified
cross-agent context (launch TODO #1).

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
sonichi added a commit that referenced this pull request Apr 9, 2026
During the Gemini 3.1 dry-run earlier today, bodhi hit a close code
1011 "exceeded your current quota" within 12 seconds of boot. Every
existing health check still said ok (port 9900 listening, watchers
registered, bodhi uptime normal, startup banner present) — the probe
layer couldn't see the upstream transport failure. I found it only by
manually tailing voice-agent.log.

Adds check_voice_transport: scans voice-agent.log from the most recent
"Sutando — Voice Interface" banner forward, tracks the tail state of
the Gemini transport. Reports:
- ok "no recent transport errors" when the latest event is
  "Gemini setup complete" with no abnormal close after it
- ok "transport recovered after earlier error" when an abnormal close
  was followed by a successful setup (auto-recovery worked)
- fail "unrecovered transport close: code=N reason=..." when the
  latest transport event is an abnormal close with no recovery

Healthy close codes: 1000 (normal), 4000 (sutando custom goodbye
disconnect, bodhi fork commit 44172b8). Everything else is flagged.

Catches:
- code=1011 Gemini quota exhaustion / tier restriction
- code=1007 "Request contains an invalid argument" (CLOSED→CLOSED
  state machine wedge — the exact pattern I saw earlier today before
  the bodhi PR #1 fixes landed)
- code=1006 abnormal / network drop

Wired into run_all_checks right after check_voice_watchers so the
voice-agent block in the report is contiguous:
  voice-agent         ok   port 9900
  voice-watchers      ok   all 3 watchers active
  voice-transport     ok   no recent transport errors

Test plan:
- ✓ Live check on current clean-boot voice-agent → ok
- ✓ 6-case simulated-log harness covering: clean boot, 1011 unrecovered,
  1011 recovered, 1000 normal close, 4000 custom goodbye, 1007 wedge
  unrecovered. All correct.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
sonichi added a commit that referenced this pull request Apr 10, 2026
…258)

During the Gemini 3.1 dry-run earlier today, bodhi hit a close code
1011 "exceeded your current quota" within 12 seconds of boot. Every
existing health check still said ok (port 9900 listening, watchers
registered, bodhi uptime normal, startup banner present) — the probe
layer couldn't see the upstream transport failure. I found it only by
manually tailing voice-agent.log.

Adds check_voice_transport: scans voice-agent.log from the most recent
"Sutando — Voice Interface" banner forward, tracks the tail state of
the Gemini transport. Reports:
- ok "no recent transport errors" when the latest event is
  "Gemini setup complete" with no abnormal close after it
- ok "transport recovered after earlier error" when an abnormal close
  was followed by a successful setup (auto-recovery worked)
- fail "unrecovered transport close: code=N reason=..." when the
  latest transport event is an abnormal close with no recovery

Healthy close codes: 1000 (normal), 4000 (sutando custom goodbye
disconnect, bodhi fork commit 44172b8). Everything else is flagged.

Catches:
- code=1011 Gemini quota exhaustion / tier restriction
- code=1007 "Request contains an invalid argument" (CLOSED→CLOSED
  state machine wedge — the exact pattern I saw earlier today before
  the bodhi PR #1 fixes landed)
- code=1006 abnormal / network drop

Wired into run_all_checks right after check_voice_watchers so the
voice-agent block in the report is contiguous:
  voice-agent         ok   port 9900
  voice-watchers      ok   all 3 watchers active
  voice-transport     ok   no recent transport errors

Test plan:
- ✓ Live check on current clean-boot voice-agent → ok
- ✓ 6-case simulated-log harness covering: clean boot, 1011 unrecovered,
  1011 recovered, 1000 normal close, 4000 custom goodbye, 1007 wedge
  unrecovered. All correct.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
sonichi added a commit that referenced this pull request Apr 10, 2026
Scripts the post-merge verification after the 3-PR Gemini 3.1 compat
stack lands:
  - bodhi fork #1 (sendClientContent → sendRealtimeInput text path)
  - bodhi fork #2 (Susan: sendAudio media → audio)
  - bodhi fork #3 (me: sendFile mimeType branching)
  - sutando #259 (Chi: deduplicate tool declarations + SDK bump)

Checks the installed bodhi dist for each wire-format fix using
awk-scoped extraction (simpler grep would false-positive on the
OpenAI realtime transport's sendAudio which also uses `audio:` as a
flat field, so the 3.1 gemini-specific check has to be scoped to the
Gemini transport's function body).

Checks sutando src for the phone conversation-server's tool dedup
comment as a PR #259 marker.

Checks .env for the 2.5 pin (exits green on 2.5, warns on 3.1 — so
the script is safe to run repeatedly before, during, and after the
rollout).

Exits non-zero with "NOT READY for 3.1 rollout" if any wire-format
fix is missing. On success, prints the manual next-steps checklist
for unpinning .env, restarting voice-agent, and running the real
3.1 session test.

Usage:
  bash src/verify-gemini-31.sh              # check current state
  bash src/verify-gemini-31.sh --install    # npm install + check

Tested on the current state: correctly reports PR #1 applied,
PR #2 + #3 + #259 not yet. Will flip to "ready" once those merge
and an `npm install` pulls the updated bodhi SHA.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
sonichi added a commit that referenced this pull request Apr 10, 2026
Scripts the post-merge verification after the 3-PR Gemini 3.1 compat
stack lands:
  - bodhi fork #1 (sendClientContent → sendRealtimeInput text path)
  - bodhi fork #2 (Susan: sendAudio media → audio)
  - bodhi fork #3 (me: sendFile mimeType branching)
  - sutando #259 (Chi: deduplicate tool declarations + SDK bump)

Checks the installed bodhi dist for each wire-format fix using
awk-scoped extraction (simpler grep would false-positive on the
OpenAI realtime transport's sendAudio which also uses `audio:` as a
flat field, so the 3.1 gemini-specific check has to be scoped to the
Gemini transport's function body).

Checks sutando src for the phone conversation-server's tool dedup
comment as a PR #259 marker.

Checks .env for the 2.5 pin (exits green on 2.5, warns on 3.1 — so
the script is safe to run repeatedly before, during, and after the
rollout).

Exits non-zero with "NOT READY for 3.1 rollout" if any wire-format
fix is missing. On success, prints the manual next-steps checklist
for unpinning .env, restarting voice-agent, and running the real
3.1 session test.

Usage:
  bash src/verify-gemini-31.sh              # check current state
  bash src/verify-gemini-31.sh --install    # npm install + check

Tested on the current state: correctly reports PR #1 applied,
PR #2 + #3 + #259 not yet. Will flip to "ready" once those merge
and an `npm install` pulls the updated bodhi SHA.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
sonichi added a commit that referenced this pull request Apr 10, 2026
…261)

* Add src/verify-gemini-31.sh — pre-rollout gate for Gemini 3.1 stack

Scripts the post-merge verification after the 3-PR Gemini 3.1 compat
stack lands:
  - bodhi fork #1 (sendClientContent → sendRealtimeInput text path)
  - bodhi fork #2 (Susan: sendAudio media → audio)
  - bodhi fork #3 (me: sendFile mimeType branching)
  - sutando #259 (Chi: deduplicate tool declarations + SDK bump)

Checks the installed bodhi dist for each wire-format fix using
awk-scoped extraction (simpler grep would false-positive on the
OpenAI realtime transport's sendAudio which also uses `audio:` as a
flat field, so the 3.1 gemini-specific check has to be scoped to the
Gemini transport's function body).

Checks sutando src for the phone conversation-server's tool dedup
comment as a PR #259 marker.

Checks .env for the 2.5 pin (exits green on 2.5, warns on 3.1 — so
the script is safe to run repeatedly before, during, and after the
rollout).

Exits non-zero with "NOT READY for 3.1 rollout" if any wire-format
fix is missing. On success, prints the manual next-steps checklist
for unpinning .env, restarting voice-agent, and running the real
3.1 session test.

Usage:
  bash src/verify-gemini-31.sh              # check current state
  bash src/verify-gemini-31.sh --install    # npm install + check

Tested on the current state: correctly reports PR #1 applied,
PR #2 + #3 + #259 not yet. Will flip to "ready" once those merge
and an `npm install` pulls the updated bodhi SHA.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

* verify-gemini-31: check VOICE_GOOGLE_SEARCH pin in .env

Extends the script to enforce the second 3.1 compat requirement
discovered in #262: VOICE_GOOGLE_SEARCH must be 'false' when
VOICE_NATIVE_AUDIO_MODEL is pinned to 3.1. Without it, voice-agent
hits a misleading 1011 close on connect.

Check matrix:
  2.5 + default (googleSearch=true)   → pass
  2.5 + VOICE_GOOGLE_SEARCH=false     → warn (unnecessarily losing search)
  3.1 + VOICE_GOOGLE_SEARCH=false     → pass
  3.1 + default (googleSearch=true)   → fail (1011 on connect)
  3.1 + unset VOICE_GOOGLE_SEARCH     → fail (defaults to true → 1011)

Also updates the 'Manual next steps' tail to tell users to set BOTH
env vars together when flipping to 3.1.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
sonichi added a commit that referenced this pull request Apr 10, 2026
… fixes)

Lockfile was pinned at 26992e3 (bodhi PR #1 only — sendClientContent
text path migration). Bodhi PR #2 (sendAudio media→audio) and PR #3
(sendFile mimeType branching) have been merged on the fork for some
time, but sutando was still running the old dist.

This caused tonight's 1007 regression: client connects, mic audio
frame → `realtime_input.media_chunks is deprecated` → session dies on
every reconnect. The bodhi-dist probe added in this PR catches this
case automatically.

Advance to 33a08c0 (bodhi PR #3 HEAD), which is the current HEAD of
the fork and contains all three compat fixes.
sonichi added a commit that referenced this pull request Apr 10, 2026
* health-check: add bodhi-dist probe to catch stale wire-format dist

The Gemini 3.1 migration's sendAudio/sendFile fixes live in the bodhi
fork. If `package-lock.json` advances to a post-fix commit via `git pull`
but `npm install` is not re-run, the dist on disk stays stale. voice-agent
boots cleanly because sendAudio isn't exercised until a client connects,
and existing probes (voice-agent port, voice-watchers log scan,
voice-transport close-code scan) all pass. The regression is invisible
until a real mic stream triggers 1007 "realtime_input.media_chunks is
deprecated" and the session dies on every reconnect.

The new probe scans node_modules/bodhi-realtime-agent/dist/index.js for
the Gemini transport's sendAudio and sendFile bodies and fails if either
still uses the deprecated `media: { data: ... }` shape. Uses a matched-
brace extractor (_extract_body) to isolate each function body, so it
ignores the OpenAI realtime transport which also defines sendAudio but
with a different shape.

Also fixes a leftover path in check_voice_transport from PR #251's
logs/ refactor: src/voice-agent.log → logs/voice-agent.log.

Repro verified: corrupting the dist to reintroduce `media: { data` in
the Gemini sendAudio body makes the probe fail with the expected detail
message and a clear fix instruction.

* chore: bump bodhi-realtime-agent to 33a08c0 (incl. sendAudio/sendFile fixes)

Lockfile was pinned at 26992e3 (bodhi PR #1 only — sendClientContent
text path migration). Bodhi PR #2 (sendAudio media→audio) and PR #3
(sendFile mimeType branching) have been merged on the fork for some
time, but sutando was still running the old dist.

This caused tonight's 1007 regression: client connects, mic audio
frame → `realtime_input.media_chunks is deprecated` → session dies on
every reconnect. The bodhi-dist probe added in this PR catches this
case automatically.

Advance to 33a08c0 (bodhi PR #3 HEAD), which is the current HEAD of
the fork and contains all three compat fixes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant