Commit Graph

24 Commits

Author SHA1 Message Date
Marc e15f841036 fix: remove 302 redirect, serve page directly with embedded token
The previous fix (84e0caa) embedded the token in HTML but still did a
302 redirect on first visit. This meant:
1. Phone opens URL with ?token=xxx
2. Server redirects to / (token stripped from URL)
3. redirected request has no token, buildHTML gets undefined
4. Token never embedded in the page

Also the old code passed the server's secret 'token' variable instead of
the URL parameter 'providedToken' — a security issue.

Fix: Remove the redirect entirely. Serve the HTML page directly on first
visit with Set-Cookie header (no Location redirect). Pass the actual
providedToken from the URL to buildHTML so it gets embedded correctly.
The JS includes the token in the WebSocket URL, so auth works even if
the cookie isn't available.
2026-04-12 05:40:05 -06:00
Marc 84e0caa1d3 fix: embed token in HTML for WebSocket auth
The WebSocket connection at /ws was not including the token parameter,
relying solely on the session cookie from the initial redirect. When
scanning the QR code on a phone, the token (longest part of URL) was
being truncated, so no cookie was ever set and all requests got 403.

Fix: embed the token directly into the page as a JS variable, and
append it to the WebSocket connection URL as a fallback. Now both
the HTTP page and the WebSocket upgrade work even if the cookie
isn't available.
2026-04-12 05:25:20 -06:00
Marc a0713e8a02 feat: add Tailscale transport mode for Android/iOS access
- Add transport mode config (surge/tailscale) to remote-control.json
- Add detectTailscaleIp() with CLI and local API fallbacks
- Add startServerTailscale() binding to 0.0.0.0 (token-protected)
- Add Transport toggle in /remote-control menu
- Update README with Tailscale setup + Android connection guide
- Update ARCHITECTURE.md with dual transport documentation
2026-04-11 13:38:04 -06:00
Yejun Su 8cffeb9e27
fix(remote-control): clear stale status badge on session reload 2026-03-22 00:51:10 +08:00
Yejun Su 9e92201206
feat(statusbar): show cwd with home abbreviated to ~ 2026-03-22 00:46:45 +08:00
Yejun Su 9207b3198a
docs: improve README with screenshot, security details, and fixes 2026-03-20 21:15:19 +08:00
Yejun Su 54267f1842
docs: rewrite README and add architecture docs 2026-03-20 20:56:53 +08:00
Yejun Su 63a879046b
fix(remote-control): send utf-8 charset for plain text errors 2026-03-20 20:12:47 +08:00
Yejun Su 9821efa370
fix(remote-control): always sync on session switch even if turn started 2026-03-20 19:05:28 +08:00
Yejun Su b77c2a57b0
fix(remote-control): re-check idle state inside delayed sync callback 2026-03-20 18:51:11 +08:00
Yejun Su aacabde7dc
fix(remote-control): avoid mid-turn model resync 2026-03-20 18:39:04 +08:00
Yejun Su 0dd6960688
fix(remote-control): resync after restored model changes 2026-03-20 18:32:15 +08:00
Yejun Su 33403bd030
fix(remote-control): resync clients on session switch 2026-03-20 18:26:22 +08:00
Yejun Su f16a5fed83
fix(remote-control): use keybinding hints in info panel 2026-03-20 18:05:53 +08:00
Yejun Su 55741ff9af
fix(remote-control): use keybindings for closing info panel 2026-03-20 17:59:44 +08:00
Yejun Su ad08d297a5
fix(server): prevent shutdown hang by forcefully terminating connections
Use client.terminate() instead of client.close() to avoid waiting for
unresponsive clients to acknowledge the WebSocket close handshake.

Add a 2-second safety timeout that closes the HTTP listener, destroys
lingering sockets, and resolves the promise so session_shutdown does not
block pi from exiting.
2026-03-19 14:37:31 +08:00
Yejun Su 37dc2b2f1e
feat(ui): add stop/abort button to web remote control
When the agent is streaming, the send button becomes a red stop button
that sends a { type: "stop" } WebSocket message. The server handles this
by calling ctx.abort() to cancel the current agent operation.
2026-03-19 13:55:08 +08:00
Yejun Su 4bc4cfa630
feat(html): add markdown table rendering to inline renderer 2026-03-19 13:29:14 +08:00
Yejun Su 98642b5b5a
fix(ui): update HTML title to "π - remote-control" 2026-03-19 13:02:26 +08:00
Yejun Su 824ae6a203
fix: replace qrencode system dependency with pure-JS qrcode package
Use the 'qrcode' npm package instead of shelling out to the 'qrencode'
binary. Load via createRequire for ESM/CJS interop. Use margin: 2 to
avoid the utf8 renderer's invalid array length bug with odd margins.
2026-03-19 12:59:05 +08:00
Yejun Su be2c015b72
refactor: extract index.ts into config, auth, messages, html, and server modules 2026-03-19 12:43:31 +08:00
Yejun Su 7080cdc34f
feat(ui): replace subcommands with interactive menu
/remote-control now opens a select menu with Turn on/off,
Configure URL, and Status instead of relying on subcommands.
Adds ability to stop the server. Shows current URL in the
Configure URL menu item and in the input dialog title.
2026-03-19 12:32:26 +08:00
Yejun Su ee3341d20c
feat: add --remote-control flag, status indicator, and fix config check ordering 2026-03-19 12:10:39 +08:00
Yejun Su 18f49a6828
chore: initial commit 2026-03-19 10:41:11 +08:00