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 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 (!message) return this._json(res, 400, { error: 'message required' });
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-remote-pilot",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Interactive Claude Code supervisor — spawn and monitor multiple Claude sessions from a single terminal.",
5
5
  "type": "commonjs",
6
6
  "bin": {