@ciphore/radiocli 0.1.1 → 0.1.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 CHANGED
@@ -5,6 +5,15 @@ All notable changes to RadioCLI are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.2] - 2026-05-30
9
+
10
+ ### Fixed
11
+
12
+ - Ignored Kitty keyboard release events so Ghostty users do not skip multiple
13
+ tabs from one left/right arrow key press.
14
+ - Ignored Kitty release events for raw media-key transport sequences so learned
15
+ or native media keys do not double-fire on key release.
16
+
8
17
  ## [0.1.1] - 2026-05-30
9
18
 
10
19
  Initial public release.
@@ -47,4 +56,5 @@ Initial public release.
47
56
  backend/volume that already appear in the header and footer. The reclaimed
48
57
  rows go to the visualizer.
49
58
 
59
+ [0.1.2]: https://github.com/Ciphore/RadioCLI/releases/tag/v0.1.2
50
60
  [0.1.1]: https://github.com/Ciphore/RadioCLI/releases/tag/v0.1.1
@@ -188,8 +188,13 @@ export function mediaTransportActionForInput(input, mediaKeys = emptyMediaKeyBin
188
188
  if (keyCode === '20') {
189
189
  return 'next';
190
190
  }
191
- const kittyMatches = [...input.matchAll(/\u001B\[(57428|57429|57430|57431|57433|57434|57435|57436)(?:;[0-9:;]+)?u/g)];
192
- const kittyCode = kittyMatches.at(-1)?.[1];
191
+ const kittyMatches = [...input.matchAll(/\u001B\[(57428|57429|57430|57431|57433|57434|57435|57436)(?:;\d+(?::(\d+))?(?:;[\d:]+)?)?u/g)];
192
+ const kittyMatch = kittyMatches.at(-1);
193
+ const kittyCode = kittyMatch?.[1];
194
+ const kittyEventType = kittyMatch?.[2];
195
+ if (kittyEventType === '3') {
196
+ return null;
197
+ }
193
198
  if (kittyCode === '57431' || kittyCode === '57434' || kittyCode === '57436') {
194
199
  return 'previous';
195
200
  }
@@ -209,6 +214,9 @@ export function mediaTransportActionForInput(input, mediaKeys = emptyMediaKeyBin
209
214
  }
210
215
  return null;
211
216
  }
217
+ export function shouldHandleKeyboardEvent(eventType) {
218
+ return eventType !== 'release';
219
+ }
212
220
  export function normalizeMediaKeyBindings(mediaKeys) {
213
221
  return {
214
222
  previous: uniqueStrings(mediaKeys?.previous ?? []),
@@ -1,7 +1,7 @@
1
1
  import { useEffect } from 'react';
2
2
  import { useInput } from 'ink';
3
3
  import { homeItems, settingsItems } from './screen-items.js';
4
- import { applyTextInput, clamp, favoriteTarget, isEditableInput, isPlainPrintableInput, mediaTransportActionForInput } from './app-state.js';
4
+ import { applyTextInput, clamp, favoriteTarget, isEditableInput, isPlainPrintableInput, mediaTransportActionForInput, shouldHandleKeyboardEvent } from './app-state.js';
5
5
  import { parseSgrMouseEvents, primaryMousePress } from './terminal-mouse.js';
6
6
  export function useAppInput({ adjustVolume, beginLearningTransportKey, capturingTransportAction, commandMode, commandText, currentItemCount, cycleDisplayColor, cyclePlaybackBackend, cycleReceiverStyle, cycleSleepTimer, editingCountryFilter, editingSearch, executeCommand, filteredCountries, go, lastRawTransportAtRef, lastSubmittedSearchRef, loadCountry, openAdjacentTab, openScreen, playAdjacent, playStation, player, playingStation, moveExploreCursor, moveExploreCursorToCell, refreshProviderHealth, resetLearnedTransportKeys, runSearch, saveLearnedTransportKey, screen, searchQuery, selected, selectedStation, setCapturingTransportAction, setCommandMode, setCommandText, setCountryFilter, setEditingCountryFilter, setEditingSearch, setMessage, setSearchQuery, setSelected, setShowDiagnostics, settingsRef, shutdown, stdin, toggleFavorite, toggleMute, toggleNearbyLocation, toggleRadioGarden, toggleSkipBrokenStreams }) {
7
7
  useEffect(() => {
@@ -71,6 +71,9 @@ export function useAppInput({ adjustVolume, beginLearningTransportKey, capturing
71
71
  shutdown();
72
72
  return;
73
73
  }
74
+ if (!shouldHandleKeyboardEvent(key.eventType)) {
75
+ return;
76
+ }
74
77
  if (capturingTransportAction) {
75
78
  return;
76
79
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ciphore/radiocli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "A terminal-first world radio receiver built with Ink, mpv, and resilient public-radio providers.",
5
5
  "type": "module",
6
6
  "license": "MIT",