claude-code-remote-pilot 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/lib/WebServer.js +6 -2
- package/lib/ui.html +16 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.1 — 2026-05-06
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Web dashboard: **Esc**, **Ctrl+C**, and **Ctrl+D** buttons in the terminal send area — sends the raw key to the tmux session without appending Enter.
|
|
7
|
+
- `POST /api/sessions/:name/send` now accepts `{ key: "Escape" }` (or any tmux key name) in addition to `{ message: "..." }`.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
3
11
|
## 0.4.0 — 2026-05-06
|
|
4
12
|
|
|
5
13
|
### Added
|
package/lib/WebServer.js
CHANGED
|
@@ -93,8 +93,12 @@ class WebServer {
|
|
|
93
93
|
const name = decodeURIComponent(sendMatch[1]);
|
|
94
94
|
return this._readBody(req, (err, body) => {
|
|
95
95
|
if (err) return this._json(res, 400, { error: err.message });
|
|
96
|
-
const { message } = body;
|
|
97
|
-
if (
|
|
96
|
+
const { message, key } = body;
|
|
97
|
+
if (key) {
|
|
98
|
+
spawnSync('tmux', ['send-keys', '-t', name, key]);
|
|
99
|
+
return this._json(res, 200, { ok: true });
|
|
100
|
+
}
|
|
101
|
+
if (!message) return this._json(res, 400, { error: 'message or key required' });
|
|
98
102
|
spawnSync('tmux', ['send-keys', '-t', name, message, 'Enter']);
|
|
99
103
|
this._json(res, 200, { ok: true });
|
|
100
104
|
});
|
package/lib/ui.html
CHANGED
|
@@ -488,6 +488,16 @@ function SessionDetailScreen({ session, onBack, onKilled }) {
|
|
|
488
488
|
}
|
|
489
489
|
};
|
|
490
490
|
|
|
491
|
+
const sendKey = async (key) => {
|
|
492
|
+
try {
|
|
493
|
+
await fetch(`/api/sessions/${encodeURIComponent(session.name)}/send`, {
|
|
494
|
+
method: 'POST',
|
|
495
|
+
headers: { 'Content-Type': 'application/json' },
|
|
496
|
+
body: JSON.stringify({ key }),
|
|
497
|
+
});
|
|
498
|
+
} catch {}
|
|
499
|
+
};
|
|
500
|
+
|
|
491
501
|
const handleKill = async () => {
|
|
492
502
|
if (!confirm(`End session "${session.name}"?`)) return;
|
|
493
503
|
setKilling(true);
|
|
@@ -543,7 +553,7 @@ function SessionDetailScreen({ session, onBack, onKilled }) {
|
|
|
543
553
|
<div style={{ marginTop: 16 }}>
|
|
544
554
|
<div className="form-group" style={{ marginBottom: 0 }}>
|
|
545
555
|
<label className="form-label">Send message to Claude</label>
|
|
546
|
-
<div style={{ display: 'flex', gap: 8 }}>
|
|
556
|
+
<div style={{ display: 'flex', gap: 8, marginBottom: 8 }}>
|
|
547
557
|
<input
|
|
548
558
|
className="form-input"
|
|
549
559
|
placeholder="Type a message…"
|
|
@@ -557,6 +567,11 @@ function SessionDetailScreen({ session, onBack, onKilled }) {
|
|
|
557
567
|
{Icons.send} {sending ? 'Sending…' : 'Send'}
|
|
558
568
|
</button>
|
|
559
569
|
</div>
|
|
570
|
+
<div style={{ display: 'flex', gap: 6 }}>
|
|
571
|
+
<button className="btn btn-sm" onClick={() => sendKey('Escape')} title="Send Escape key">Esc</button>
|
|
572
|
+
<button className="btn btn-sm" onClick={() => sendKey('C-c')} title="Send Ctrl+C">Ctrl+C</button>
|
|
573
|
+
<button className="btn btn-sm" onClick={() => sendKey('C-d')} title="Send Ctrl+D">Ctrl+D</button>
|
|
574
|
+
</div>
|
|
560
575
|
</div>
|
|
561
576
|
</div>
|
|
562
577
|
)}
|
package/package.json
CHANGED