claude-code-remote-pilot 0.4.0 → 0.4.2
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 +15 -0
- package/lib/Watcher.js +1 -1
- package/lib/WebServer.js +6 -2
- package/lib/ui.html +16 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.2 — 2026-05-06
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- False limit detection when running `/usage` inside a Claude session. The `/usage` output contains "Resets 6:30pm" which was matching the `resets` keyword. Tightened `LIMIT_RE` to require more specific phrases (`hit your limit`, `usage limit`, `rate limit`, `limit reached`, `try again after`) that only appear in actual limit-hit messages.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 0.4.1 — 2026-05-06
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- 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.
|
|
14
|
+
- `POST /api/sessions/:name/send` now accepts `{ key: "Escape" }` (or any tmux key name) in addition to `{ message: "..." }`.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
3
18
|
## 0.4.0 — 2026-05-06
|
|
4
19
|
|
|
5
20
|
### Added
|
package/lib/Watcher.js
CHANGED
|
@@ -3,7 +3,7 @@ const { execSync, spawnSync } = require('child_process');
|
|
|
3
3
|
const crypto = require('crypto');
|
|
4
4
|
const notifier = require('./notifier');
|
|
5
5
|
|
|
6
|
-
const LIMIT_RE = /hit your limit|usage limit|rate limit|limit reached|try again
|
|
6
|
+
const LIMIT_RE = /hit your limit|usage limit|rate limit|limit reached|try again after/i;
|
|
7
7
|
const RESPONSE_RE = /do you want to proceed|esc to cancel|ctrl\+e to explain|❯\s*\d+\.\s*yes/i;
|
|
8
8
|
const RUNNING_RE = /esc to interrupt/i;
|
|
9
9
|
// Claude Code footer: "tokens: ↑1,234 ↓567" or "↑1.2k ↓890"
|
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