Not this: shipping a Cursor Cloud Agent to strangers · stuffing continuous wake into iOS · letting “fix the footer” merge to main · confusing the glass ball with the dialog.
1 · The itch
aileena.xyz has a Console. People open it on a laptop and on a phone. They expect to talk, get a soft hint, maybe ask for a tiny patch sketch. What they must not get is a site that freezes on the first slide, a keyboard that covers the input, or a promise that their utterance rewrote the repo.
So the public orb is a transport. Speech-to-text lands as text. Text goes to /api/chat (DeepSeek via lib/modelRouter). Optional intents go to /api/voice-code — still DeepSeek, propose-only, five times a day. Prophecy Hall only injects copy into the Console dialog. Nothing writes the visitor's disk.
Voice is the wire. DeepSeek is the brain. The dialog is the only place answers are allowed to land.
2 · What actually ships (surfaces)
- Console chat —
AgentChat→POST /api/chat. Soft visitor topics in localStorage; hard taste from Machina memory (How the Site Remembers). - Voice orb —
AgentVoiceOrb. Caps say Whisper off → Web Speech STT; TTS via ElevenLabs when present, elsespeechSynthesis. - Summon — after one mic gesture, saying “Aileena” opens Console + voice. Continuous soft-wake is desktop-only; iOS skips it.
- Soft oracle — kind, shallow hints woven with
priorTopics. Text in the dialog, never painted inside the glass ball. - Prophecy Hall —
/prophecy. Touch an orb → personalized line →open-agent-chatevent into Console. - Voice → code — intent words (
fix/implement/ “Voice → code”) burn a separate 5/day cookie__aileena_vcode, not the chat 20. Response is a proposal string withpermission: 'propose',write_target: null,provider: 'deepseek'.
3 · Call path (happy path)
tap Voice / Summon → getUserMedia unlock (gesture) speak → Web Speech STT → text ordinary ask → POST /api/chat → DeepSeek → dialog (+ optional TTS) fix / implement… → POST /api/voice-code → DeepSeek generateText → dialog only Hall touch → CustomEvent open-agent-chat → dialog
polar-lab owns the pack under integrations/aileena-console-voice/COPY_PASTE/. The live site is aileen_machina_01. Cursor bot cannot push the site repo — apply is curl + human git push origin main.
4 · Scenario A — “完全不能用” on iPhone
The homepage is not a blank crash. SSR returns the opening slide. What fails is gesture physics:
html/body { overflow: hidden }plus scroll-snap100dvhsections — if the outer scroller glitches, the page feels frozen.- Desk rooms nest
overflow-y: autoinside a clipped snap section — classic iOS nested-scroll death. - Body
-webkit-user-select: nonewithout restoringuser-select: texton inputs — caret/typing dies in the Console. - Centered
top: 50%dialog + autofocus — iOS keyboard covers the field;overflow: hiddenmeans you cannot scroll to recover. - Continuous SpeechRecognition /
autoListenfromuseEffect— outside a user gesture. Safari kills the mic.
Fixes that match the product law: on mobile, disable snap and let sections grow; unlock form selection; Console goes inset-0 / 100dvh with safe-area; skip autofocus on coarse pointers; name-wake removed; on phone Voice mounts the orb and shows “Tap orb to speak” (autoListen disabled — Safari needs the orb gesture).
@media (max-width: 768px) {
.snap-container { scroll-snap-type: none; overflow: visible; height: auto; }
.snap-section { height: auto; min-height: 100dvh; overflow: visible; }
}
input, textarea { -webkit-user-select: text; user-select: text; }
body.site-body /* class — never inline overflow:hidden (inline wins CSS) */5 · Scenario B — Voice → code without Cursor tokens
Early pack tried Cursor Cloud Agents (CURSOR_API_KEY). Wrong product for a public orb: strangers should not burn my Cursor bill, and the site chat already runs on DeepSeek.
Current contract: same routeModel stack as chat. Propose a unified diff or numbered steps. Never claim files were written. Cap at five proposals per local day via signed cookie. Harness display_gate keeps show_in_dialog=true and write_target=null.
ASK: fix the Console footer spacing ROUTE: isVoiceCodeIntent → POST /api/voice-code BRAIN: generateText(deepseek-chat) OUT: proposal + remaining + provider:"deepseek" DISK: none
What code comes out? A sketch for review — demo of the gate, not a stranger applying to aileena.xyz. If the ask is vague, the system prompt asks for the smallest clarifying patch. Owner apply stays on my machine.
6 · Scenario C — Prophecy stays mist, not cruelty
Soft oracle and Hall share a cruel-forbid regex and positive craft. Hints weave prior topics when present. The sphere is atmosphere; the sentence always lands in Console text. That keeps the first viewport honest: brand, one mood, one action — not a fortune sticker glued on media.
7 · Quota and env (ops)
- Chat: ~20/day visitor cookie (HMAC with
CHAT_QUOTA_SECRET). - Voice-code: 5/day
__aileena_vcode(same secret family). - Brain:
DEEPSEEK_API_KEY— required for chat and voice-code. - TTS:
ELEVENLABS_API_KEYoptional; browser speech is the fallback. - No
CURSOR_API_KEYon this path.
8 · What we refuse (for now)
- Letting public voice-code merge or open PRs for visitors.
- Continuous background wake on iOS.
- Autofocus that forces the keyboard before the visitor taps.
- Inline
style={{ overflow: 'hidden' }}on<body>— it defeats every mobile CSS unlock. - Mixing hard Machina taste with soft visitor history in the orb captions.
9 · How to poke it
- Phone Safari: swipe opening → desk rooms (must not freeze).
- Open Console: type without the keyboard eating the field.
- Tap orb after a gesture: speak a short hello → dialog reply.
/prophecy: touch B → text appears in Console, not inside the glass.- Say “fix the footer spacing” → propose-only draft; check remaining counter (
voice-code n/5).
Pack apply (human Mac): integrations/aileena-console-voice/COPY_PASTE/APPLY_IOS.md · voice-code DeepSeek branch pack · ops notes in docs/guide/console-voice.md / docs/guide/voice-to-code.md.
Related: How the Site Remembers · How I Fell for Local Models.