claude-code-remote-pilot 0.5.5 → 0.5.6
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 +1 -0
- package/lib/ui.html +17 -13
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
- **Respawn loading no longer appears stuck**: web respawn now has a request timeout and surfaces a clear timeout error when the API call hangs, so the button always returns to clickable state.
|
|
7
7
|
- **Terminal output now feels realtime**: session detail terminal polling runs at a faster cadence and triggers immediate output refresh after sending input/keys, improving perceived connect speed and responsiveness.
|
|
8
8
|
- **"Connecting…" no longer gets stuck**: terminal detail view now clears connecting state on poll failures, shows a retrying error hint, and fixes session state initialization order for stable render behavior.
|
|
9
|
+
- **Respawn/End web actions stabilized**: removed false-positive client respawn timeout and added explicit inline error handling for End action responses, so both controls fail visibly instead of appearing stuck.
|
|
9
10
|
|
|
10
11
|
## 0.5.4 — 2026-05-06
|
|
11
12
|
|
package/lib/ui.html
CHANGED
|
@@ -580,6 +580,7 @@ function SessionDetailScreen({ session, onBack, onKilled, onRespawned }) {
|
|
|
580
580
|
const [msg, setMsg] = useState('');
|
|
581
581
|
const [sending, setSending] = useState(false);
|
|
582
582
|
const [killing, setKilling] = useState(false);
|
|
583
|
+
const [killError, setKillError] = useState('');
|
|
583
584
|
const [respawning, setRespawning] = useState(false);
|
|
584
585
|
const [respawnError, setRespawnError] = useState('');
|
|
585
586
|
const [copyOk, setCopyOk] = useState(false);
|
|
@@ -688,10 +689,18 @@ function SessionDetailScreen({ session, onBack, onKilled, onRespawned }) {
|
|
|
688
689
|
const handleKill = async () => {
|
|
689
690
|
if (!confirm(`End session "${session.name}"?`)) return;
|
|
690
691
|
setKilling(true);
|
|
692
|
+
setKillError('');
|
|
691
693
|
try {
|
|
692
|
-
await apiFetch(`/api/sessions/${encodeURIComponent(session.name)}`, { method: 'DELETE' });
|
|
694
|
+
const res = await apiFetch(`/api/sessions/${encodeURIComponent(session.name)}`, { method: 'DELETE' });
|
|
695
|
+
if (!res.ok) {
|
|
696
|
+
const d = await res.json().catch(() => ({}));
|
|
697
|
+
setKillError(d.error || 'Failed to end session');
|
|
698
|
+
setKilling(false);
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
693
701
|
onKilled();
|
|
694
|
-
} catch {
|
|
702
|
+
} catch (e) {
|
|
703
|
+
if (e && e.message !== 'Unauthorized') setKillError('Network error');
|
|
695
704
|
setKilling(false);
|
|
696
705
|
}
|
|
697
706
|
};
|
|
@@ -700,13 +709,8 @@ function SessionDetailScreen({ session, onBack, onKilled, onRespawned }) {
|
|
|
700
709
|
if (respawning) return;
|
|
701
710
|
setRespawning(true);
|
|
702
711
|
setRespawnError('');
|
|
703
|
-
const controller = new AbortController();
|
|
704
|
-
const timeoutId = setTimeout(() => controller.abort(), 12000);
|
|
705
712
|
try {
|
|
706
|
-
const res = await apiFetch(`/api/sessions/${encodeURIComponent(session.name)}/respawn`, {
|
|
707
|
-
method: 'POST',
|
|
708
|
-
signal: controller.signal,
|
|
709
|
-
});
|
|
713
|
+
const res = await apiFetch(`/api/sessions/${encodeURIComponent(session.name)}/respawn`, { method: 'POST' });
|
|
710
714
|
const data = await res.json();
|
|
711
715
|
if (!res.ok) {
|
|
712
716
|
setRespawnError(data.error || 'Failed to respawn');
|
|
@@ -714,13 +718,8 @@ function SessionDetailScreen({ session, onBack, onKilled, onRespawned }) {
|
|
|
714
718
|
}
|
|
715
719
|
onRespawned(data);
|
|
716
720
|
} catch (e) {
|
|
717
|
-
if (e && e.name === 'AbortError') {
|
|
718
|
-
setRespawnError('Respawn timeout. Please try again.');
|
|
719
|
-
return;
|
|
720
|
-
}
|
|
721
721
|
if (e.message !== 'Unauthorized') setRespawnError('Network error');
|
|
722
722
|
} finally {
|
|
723
|
-
clearTimeout(timeoutId);
|
|
724
723
|
setRespawning(false);
|
|
725
724
|
}
|
|
726
725
|
};
|
|
@@ -774,6 +773,11 @@ function SessionDetailScreen({ session, onBack, onKilled, onRespawned }) {
|
|
|
774
773
|
{Icons.trash} {killing ? 'Ending…' : 'End'}
|
|
775
774
|
</button>
|
|
776
775
|
)}
|
|
776
|
+
{!isOffline && killError && (
|
|
777
|
+
<span style={{ color: 'var(--error)', fontSize: 12, alignSelf: 'center' }}>
|
|
778
|
+
{killError}
|
|
779
|
+
</span>
|
|
780
|
+
)}
|
|
777
781
|
</div>
|
|
778
782
|
</div>
|
|
779
783
|
|
package/package.json
CHANGED