kovidgoyal/kitty · error

got a remote data response form the terminal without an open

Error message

got a remote data response form the terminal without an open remote dir

What it means

The kitten received a remote drop-data response from the terminal while drop_status.open_remote_dir is nil, i.e. no remote directory drop is in progress. This indicates a protocol/state desync or an unexpected response.

Source

Thrown at kittens/dnd/drop.go:808

		dnd.drop_status.data_requests.in_flight_count++
	} else {
		dnd.drop_status.data_requests.pending = append(dnd.drop_status.data_requests.pending, cmd)
	}
}

func (dnd *dnd) data_request_completed() {
	dnd.drop_status.data_requests.in_flight_count--
	if len(dnd.drop_status.data_requests.pending) > 0 && dnd.drop_status.data_requests.in_flight_count < max_inflight_data_rquests {
		dnd.lp.QueueDnDData(dnd.drop_status.data_requests.pending[0])
		dnd.drop_status.data_requests.in_flight_count++
		dnd.drop_status.data_requests.pending = dnd.drop_status.data_requests.pending[1:]
	}
}

func (dnd *dnd) on_remote_drop_data(cmd DC) (err error) {
	drop_status := &dnd.drop_status
	if drop_status.open_remote_dir == nil {
		return fmt.Errorf("got a remote data response form the terminal without an open remote dir")
	}
	if cmd.X == 0 && cmd.Y == 0 && cmd.Yp == 0 {
		if drop_status.current_remote_entry == nil {
			return fmt.Errorf("got a remote data response form the terminal without a current remote entry")
		}
	} else {
		num := utils.IfElse(cmd.Yp != 0 && cmd.Yp != 1, cmd.X, cmd.Y) - 1
		if num < 0 || num >= len(drop_status.open_remote_dir.children) {
			return fmt.Errorf("got a remote data response from the terminal for an entry that does not exist")
		}
		drop_status.current_remote_entry = drop_status.open_remote_dir.children[num]
	}
	e := drop_status.current_remote_entry
	if e.dest == nil {
		e.item_type = cmd.Xp
		switch cmd.Xp {
		case 0:
			f, err := utils.CreateExclusiveAt(e.base_dir.handle, e.name, 0o666)

View on GitHub (pinned to 6d5d0c4406)

Solutions

  1. Update kitty so kitten and terminal protocol versions match
  2. Retry the drop; a late/stale response after an aborted drop is often transient
  3. Report upstream with --debug-input logs if reproducible
Defensive patterns

Strategy: type-guard

Type guard

func hasOpenRemoteDir(ds *drop_status) bool { return ds.open_remote_dir != nil }

Try / catch

Ignore stale responses when no remote dir is open (log-and-continue) instead of propagating the error.

Prevention

When it happens

Trigger: on_remote_drop_data(cmd) is called via on_drop_data (root_remote_dir != nil) but open_remote_dir was never set — e.g. the open-dir request failed or was reset before the response arrived.

Common situations: Terminal/kitten version mismatch, late response arriving after the drop was aborted, or a bug in remote directory traversal state management.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of kovidgoyal/kitty@6d5d0c4406 (2026-08-27). Data as JSON: /api/errors/92e2922b1546400f. Report an issue: GitHub.