opencode-sesh 1.0.2 → 1.0.3

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/AGENTS.md CHANGED
@@ -85,7 +85,10 @@ the schema below. Keystrokes never touch the database:
85
85
  - Session and directory pins live in `${XDG_DATA_HOME:-$HOME/.local/share}/sesh/pins.json`
86
86
  (`SESH_PINS_FILE` overrides it for tests), shared by fzf and the TUI. Writes
87
87
  use a sibling lock directory and atomic rename. Ctrl-S toggles a selected
88
- session; Ctrl-D toggles its directory. Pinned directories sort before groups
88
+ session; Ctrl-D toggles its directory (terminal picker and option+o picker).
89
+ The sidebar and home lists use Option-S / Option-R instead: opencode binds
90
+ `ctrl+d` itself (composer delete-char, session delete), so ctrl pins would
91
+ shadow the composer. Pinned directories sort before groups
89
92
  containing pinned sessions, with pinned sessions first inside each group.
90
93
 
91
94
  **Output contract** (TSV, 6 fields):
package/CHANGELOG.md CHANGED
@@ -5,6 +5,12 @@ All notable changes to this project 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
+ ## [1.0.3] - 2026-10-08
9
+
10
+ ### Fixed
11
+
12
+ - **tui:** Rebind sidebar pins to option keys to stop shadowing composer
13
+
8
14
  ## [1.0.2] - 2026-10-08
9
15
 
10
16
  ### Fixed
@@ -430,6 +436,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
430
436
  - Fixture-database regression suite, TypeScript typechecking, and ShellCheck in
431
437
  CI.
432
438
 
439
+ [1.0.3]: https://github.com/ozandogrultan/opencode-sesh/compare/v1.0.2...v1.0.3
433
440
  [1.0.2]: https://github.com/ozandogrultan/opencode-sesh/compare/v1.0.1...v1.0.2
434
441
  [1.0.1]: https://github.com/ozandogrultan/opencode-sesh/compare/v1.0.0...v1.0.1
435
442
  [1.0.0]: https://github.com/ozandogrultan/opencode-sesh/compare/v0.14.1...v1.0.0
package/README.md CHANGED
@@ -24,7 +24,7 @@ Sessions (8) ▾ hide
24
24
  ├○ Retry the OAuth token refr… 2h
25
25
  ├○ Login rate limiting notes 3d
26
26
  ├○ Draft the release notes 7d
27
- ├○ Auth middleware cleanup 11d
27
+ ├○ Auth middleware cleanup 11d
28
28
  └○ Rotate the signing keys 12d
29
29
  ▾ ~/Projects/mobile (3)
30
30
  ├○ Author avatar upload retry 1d
@@ -201,7 +201,7 @@ workspace at its directory; outside cmux it shows a toast instead.
201
201
  Click the sidebar's `search…` box to filter recent sessions in place; click
202
202
  elsewhere or press Esc to leave search. Click the **Sessions** heading to drive
203
203
  the list from the keyboard instead of the mouse (`↑`/`↓` to move, Enter to open,
204
- Option-P to preview, Ctrl-S/Ctrl-D to pin, Option-D to delete, Esc to leave). Pinned
204
+ Option-P to preview, Option-S/Option-R to pin, Option-D to delete, Esc to leave). Pinned
205
205
  directories rise first, while sessions within each directory are ordered by
206
206
  last update, newest first. The section lists every session and scrolls to fill
207
207
  the sidebar, so click **▾ hide** to collapse it when you need the room.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-sesh",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Browse, search, preview and resume opencode sessions from the terminal and the TUI.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1089,6 +1089,14 @@ function SidebarSessions(props: { api: TuiPluginApi } & PinProps) {
1089
1089
  })
1090
1090
  createEffect(() => {
1091
1091
  if (props.api.ui.dialog.open) menu.close()
1092
+ // A modal dialog owns input while open: yield the sidebar's keyboard
1093
+ // captures too, so its layers cannot double-fire with the dialog's own.
1094
+ if (props.api.ui.dialog.open) {
1095
+ cancelDelete()
1096
+ setNavActive(false)
1097
+ setSearching(false)
1098
+ setHovered(undefined)
1099
+ }
1092
1100
  })
1093
1101
 
1094
1102
  const moveCursor = (delta: number) => {
@@ -1357,8 +1365,8 @@ function SidebarSessions(props: { api: TuiPluginApi } & PinProps) {
1357
1365
  if (!confirmArmed()) requestDelete(entry)
1358
1366
  },
1359
1367
  },
1360
- { key: "ctrl+s", desc: "Pin session", preventDefault: true, cmd: () => props.onTogglePin("sessions", entry.id) },
1361
- { key: "ctrl+d", desc: "Pin directory", preventDefault: true, cmd: () => props.onTogglePin("directories", entry.dir) },
1368
+ { key: "alt+s", desc: "Pin session", preventDefault: true, cmd: () => props.onTogglePin("sessions", entry.id) },
1369
+ { key: "alt+r", desc: "Pin directory", preventDefault: true, cmd: () => props.onTogglePin("directories", entry.dir) },
1362
1370
  {
1363
1371
  key: "/",
1364
1372
  desc: "Search sessions",
@@ -1409,7 +1417,7 @@ function SidebarSessions(props: { api: TuiPluginApi } & PinProps) {
1409
1417
  },
1410
1418
  },
1411
1419
  {
1412
- key: "ctrl+s",
1420
+ key: "alt+s",
1413
1421
  desc: "Pin session",
1414
1422
  preventDefault: true,
1415
1423
  cmd: () => {
@@ -1418,7 +1426,7 @@ function SidebarSessions(props: { api: TuiPluginApi } & PinProps) {
1418
1426
  },
1419
1427
  },
1420
1428
  {
1421
- key: "ctrl+d",
1429
+ key: "alt+r",
1422
1430
  desc: "Pin directory",
1423
1431
  preventDefault: true,
1424
1432
  cmd: () => {
@@ -1639,7 +1647,7 @@ function SidebarSessions(props: { api: TuiPluginApi } & PinProps) {
1639
1647
  </Show>
1640
1648
  <Show when={navActive()}>
1641
1649
  <box paddingTop={1}>
1642
- <text style={{ fg: theme().textMuted }}>↑↓ move · enter open · option+p preview · ctrl+s/d pin · option+d delete · esc done</text>
1650
+ <text style={{ fg: theme().textMuted }}>↑↓ move · enter open · option+p preview · option+s/r pin · option+d delete · esc done</text>
1643
1651
  </box>
1644
1652
  </Show>
1645
1653
  </Show>
@@ -1807,6 +1815,16 @@ function HomeSessions(props: { api: TuiPluginApi } & PinProps) {
1807
1815
  if (searching()) setSearching(false)
1808
1816
  }
1809
1817
 
1818
+ // A modal dialog owns input while open: yield this list's keyboard captures
1819
+ // too, so its layers cannot double-fire with the dialog's own.
1820
+ createEffect(() => {
1821
+ if (props.api.ui.dialog.open) {
1822
+ cancelDelete()
1823
+ setSearching(false)
1824
+ setHovered(undefined)
1825
+ }
1826
+ })
1827
+
1810
1828
  onMount(() => {
1811
1829
  ensureRootMouse(props.api.renderer)
1812
1830
  rootMouseHandlers.add(onRootMouseDown)
@@ -1854,8 +1872,8 @@ function HomeSessions(props: { api: TuiPluginApi } & PinProps) {
1854
1872
  if (!confirmArmed()) requestDelete(entry)
1855
1873
  },
1856
1874
  },
1857
- { key: "ctrl+s", desc: "Pin session", preventDefault: true, cmd: () => props.onTogglePin("sessions", entry.id) },
1858
- { key: "ctrl+d", desc: "Pin directory", preventDefault: true, cmd: () => props.onTogglePin("directories", entry.dir) },
1875
+ { key: "alt+s", desc: "Pin session", preventDefault: true, cmd: () => props.onTogglePin("sessions", entry.id) },
1876
+ { key: "alt+r", desc: "Pin directory", preventDefault: true, cmd: () => props.onTogglePin("directories", entry.dir) },
1859
1877
  ],
1860
1878
  })
1861
1879
  })