Skip to content

feat(even-g2): adapt CanvasTTY for glasses with local pairing and voice control - #50

Merged
howdeploy merged 1 commit into
howdeploy:mainfrom
teo-nex:feat/even-g2-companion
Sep 21, 2026
Merged

howdeploy merged 1 commit into
howdeploy:mainfrom
teo-nex:feat/even-g2-companion

Conversation

@teo-nex

@teo-nex teo-nex commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

This adapts CanvasTTY's terminal and AI-agent workflows to Even G2 glasses. The opt-in desktop integration and the Even App companion live in the same repository: select a shared session, read its output on the HUD, dictate through local speech recognition, or create and manage agent sessions from the glasses.

User flow

  1. Enable Settings → Controls → Even G2 on the Mac and choose the project folder, shared sessions and allowed operations.
  2. Enter the desktop's six-digit code in the companion on the same local network, then approve the device on the computer.
  3. Use the phone controls or glasses gestures to read sessions, hold/release for dictation, create agents, and confirm rename/close operations.

Implementation

  • Bounded Bonjour discovery, short-lived SRP-6a pairing, encrypted local requests/audio, explicit device approval, per-session grants, request freshness/replay checks and bounded terminal presentation.
  • Native glasses HUD and microphone acknowledgement sequencing; terminal selection, transcript submission, session creation, rename/close confirmations and a More agents picker. Existing Codex/Terminal shortcuts are retained.
  • Creation goes through the existing desktop launcher using the configured workspace and normal profile. The current upstream provider list, including OMP and Pi, is preserved. Each CLI/account remains a prerequisite on the computer.
  • Local Nemotron recognition through the pinned transcribe.cpp helper, with model setup and checksum verification; supported existing Handy installations remain usable. Models and personal pairing/runtime state are excluded from the source and distributable.
  • Companion 0.5.6's eight literal discovery URLs match its manifest. A packaging gate rejects undeclared or dynamic URLs in emitted JS/HTML/CSS before producing an .ehpk.
  • Current setup, distribution and acceptance documentation. Based on upstream 0fb74f5, including its shutdown fixes and js-yaml/nanoid security updates.

Validation

Upstream CI has passed the 650 desktop tests, 47 companion tests, type checks, build, secret audit, browser core/helper smoke tests and macOS packaging. Windows native host validation, type checking and packaging also passed. All three CI jobs are green.

Also verified locally on macOS arm64 in an isolated publication checkout:

  • npm ci, 650 desktop tests + 47 companion tests passed.
  • Type checks, production build and native speech helper build/version check passed.
  • npm run pack:even passed, including the emitted-bundle network policy check.
  • Repository secret audit and git diff --check passed.
  • Companion tests enumerate the desktop providers for phone buttons and the glasses picker, including OMP/Pi after integration with current main.

The submitted 0.5.6 store artifact and original working checkout are preserved separately. The published Git tree matches the locally checked candidate exactly.

Acceptance and review boundaries

The user previously confirmed pairing, microphone input, terminal interaction, creation and More agents on their Mac/Android/Even G2 setup. This updated source has not had a fresh physical glasses run. Clean-Mac onboarding, detached-USB operation, phone lock/background/reconnect, Intel Mac and other desktop OS hardware acceptance remain open. The Browser action opens the desktop browser; full glasses browser navigation is future work.

The local transport currently shares one persistent computer encryption key across paired clients. Revocation invalidates API credentials but does not rotate that transport key. Per-device confidentiality and forward secrecy are not claimed; this trust model needs upstream security review before broad distribution.

Even Hub 0.5.6 is awaiting moderation. This PR does not replace that submission. A compatible public desktop installer is not yet published; the documentation provides build instructions. Mac packaging uses ad-hoc signing without notarization. The companion UI is currently Russian.

Setup and architecture · Companion source

…ce control

Add the opt-in desktop controller and Even G2 companion, six-digit local pairing, scoped terminal and agent controls, local Nemotron recognition, and explicit bundle network policy validation.

Integrate current upstream provider and shutdown changes, preserve OMP/Pi and security dependency pins, and document device acceptance and transport review boundaries.
@howdeploy
howdeploy merged commit 8ebd310 into howdeploy:main Sep 21, 2026
3 checks passed

Copy link
Copy Markdown
Owner

@teo-nex, merged separately ahead of #51 as 8ebd3105ff2acd656389bfd4bbc981cba285dc29, preserving your original commit c5f3d30 and authorship. The integration remains opt-in and disabled by default; the existing desktop browser implementation is retained.

Please follow up on:

  • The Even G2 Settings card layout: make the section spacing/insets consistent and integrate “Параметры локальной сети” cleanly instead of leaving it against the bottom border. Coordinate with the UI feedback on Integrate all open PRs (#32, #34, #35–#37, #41, #46, #50) with conflict resolution and post-merge fixes #51.
  • The documented shared transport-key limitation. A local synthetic-device check confirmed that a revoked device's own token is rejected, but its retained key can decrypt another active device's observed encrypted request, including that device's bearer token. Treat per-device transport-key isolation and effective key revocation as a security follow-up before broader distribution.
  • Bring over the explicit per-session answer-capture grant from Integrate all open PRs (#32, #34, #35–#37, #41, #46, #50) with conflict resolution and post-merge fixes #51: the standalone head currently adds lastAssistantMessage to ordinary Codex Stop reports and stores it in the lifecycle lease without that grant. Keep ordinary lifecycle reports free of answer text when capture is not enabled.

The upstream CI at c5f3d30 is green. Physical glasses/macOS speech acceptance was not rerun in this Linux session.

teo-nex pushed a commit to teo-nex/CanvasTTY that referenced this pull request Sep 24, 2026
teo-nex pushed a commit to teo-nex/CanvasTTY that referenced this pull request Sep 24, 2026
- Gate the Even G2 final-answer capture behind a per-session grant
  (CANVASTTY_RUNTIME_CAPTURE_ANSWER) decided at spawn time, mirroring
  the Codex result capture; the gateway refuses the field for any other
  lease and keeps only state in the lease.
- Read hook stdin up to a fixed cap independent of result capture so a
  large Stop payload still reports its turn.
- Centralize the answer limit in runtime-protocol and format the merged
  one-liners.
- Drop the dead single-card minimap prop; rename the local browser layer
  alias so it cannot shadow canvasSelectionGesture.browserLayerId.
- Move the Even G2 settings strings into the shared i18n dictionary.
- Add Unreleased changelog entries for howdeploy#32, howdeploy#34 and howdeploy#50.
- Extend the hook capture test for the answer grant and oversized input.
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.

2 participants