feat: v0.12.0 Settings window, per-session Remote Control, delete conversations
build-deb / Lint, test, package (push) Successful in 4m59s
build-deb / Deploy to CT 126 (push) Successful in 14s
build-deb / Notify on failure (push) Skipped

- Settings (⋯ → Settings…, palette): theme, terminal text size, interface
  size, notifications, Remote Control & privacy. The ⋯ menu shrinks.
- Remote Control per session: registry choice > Settings default >
  DEVDESK_REMOTE_CONTROL. Switching an idle session restarts its Claude
  on the same conversation; busy sessions change at the next start.
  rc_active comes from the running process; RC tag on sessions.
- --delete-convo: remove a conversation's local transcript and subagent
  files; refused while in use. Delete… in Search past conversations.
Closes #61

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WHRLCCdXYm41Qx5kNhehaP
This commit is contained in:
2026-11-03 21:23:29 -05:00
co-authored by Claude Opus 5.5
parent 65114165e7
commit 20134c1e58
14 changed files with 454 additions and 50 deletions
+27
View File
@@ -115,3 +115,30 @@ cmd_presence() {
setsid -f bash -c 'sleep 120; [ -n "$(find "$1" -newermt "-110 seconds" 2>/dev/null)" ] || rm -f "$1"' _ "$marker" \
</dev/null >/dev/null 2>&1 3>&- || true
}
# --delete-convo ID (devdesk#61): permanently delete a conversation's local files
# (the transcript ~/.claude/projects/<folder>/<id>.jsonl and its <id>/ folder of
# subagent transcripts and tool results). Refused while a running session uses
# it. Dormant sessions that would resume it forget it (they start fresh).
# Copies kept by Anthropic (Remote Control, the API) are not touched: those are
# deleted at claude.ai.
cmd_delete_convo() {
[ $# -eq 1 ] || dd_die "usage: devdesk attach --delete-convo ID"
local id=$1 file dir other
[[ $id =~ ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ ]] || dd_die "bad conversation id: $id"
file=$(dd_convo_file "$id") || true
{ [ -n "$file" ] && [ -f "$file" ]; } || dd_die "no conversation $id"
case "$file" in "$(dd_projects_dir)"/*/"$id.jsonl") ;; *) dd_die "unexpected path: $file" ;; esac
for other in $(jq -rM --arg id "$id" '.sessions | to_entries[] | select(.value.claude_session_id == $id) | .key' "$DEVDESK_REGISTRY" 2>/dev/null); do
if dd_server_up && dd_tmux has-session -t "=$other" 2>/dev/null; then
dd_die "session $other is using this conversation: end it first"
fi
done
dir=${file%.jsonl}
rm -f -- "$file"
[ ! -d "$dir" ] || rm -rf -- "$dir"
# shellcheck disable=SC2016 # jq variables
dd_registry_update '.sessions |= with_entries(if .value.claude_session_id == $id then .value |= (del(.claude_session_id) | del(.claude_source)) else . end)' \
--arg id "$id"
jq -cMn --arg id "$id" '{ok: true, deleted: $id}'
}