@@ -1347,7 +1347,94 @@ cmd_disable() {
13471347 docker compose " ${flags[@]} " stop " $service_id " 2> /dev/null || true
13481348 [[ -f " $cf " ]] && mv " $cf " " ${cf} .disabled"
13491349 _regenerate_compose_flags
1350- success " $service_id disabled."
1350+ local _data_dir=" $INSTALL_DIR /data/$service_id "
1351+ if [[ -d " $_data_dir " ]]; then
1352+ local _data_size
1353+ _data_size=$( du -sh " $_data_dir " 2> /dev/null | cut -f1)
1354+ success " $service_id disabled. Data preserved (${_data_size} in data/$service_id ). Use 'dream purge $service_id ' to delete."
1355+ else
1356+ success " $service_id disabled."
1357+ fi
1358+ }
1359+
1360+ cmd_purge () {
1361+ check_install
1362+ sr_load
1363+
1364+ if [[ $# -lt 1 ]]; then
1365+ error " Usage: dream purge <service>"
1366+ fi
1367+
1368+ local service_id
1369+ service_id=$( sr_resolve " $1 " )
1370+
1371+ # Validate against known service IDs
1372+ local _found=false
1373+ for _sid in " ${SERVICE_IDS[@]} " ; do
1374+ if [[ " $_sid " == " $service_id " ]]; then
1375+ _found=true
1376+ break
1377+ fi
1378+ done
1379+ if ! $_found ; then
1380+ error " Unknown service: $service_id "
1381+ fi
1382+
1383+ # Block core services
1384+ local _cat=" ${SERVICE_CATEGORIES[$service_id]:- optional} "
1385+ if [[ " $_cat " == " core" ]]; then
1386+ error " Cannot purge core service data: $service_id "
1387+ fi
1388+
1389+ # Check if service is still enabled (compose.yaml exists = enabled)
1390+ local _cf=" $INSTALL_DIR /extensions/services/$service_id /compose.yaml"
1391+ if [[ -f " $_cf " ]]; then
1392+ error " $service_id is still enabled. Run 'dream disable $service_id ' first."
1393+ fi
1394+
1395+ # Check if container is still running
1396+ local _container=" ${SERVICE_CONTAINERS[$service_id]:- dream-$service_id } "
1397+ if docker ps --format ' {{.Names}}' 2> /dev/null | grep -q " ^${_container} $" ; then
1398+ error " $service_id container is still running. Run 'dream stop $service_id ' first."
1399+ fi
1400+
1401+ # Check data directory exists
1402+ local _data_dir=" $INSTALL_DIR /data/$service_id "
1403+ if [[ ! -d " $_data_dir " ]]; then
1404+ log " No data directory found for $service_id ."
1405+ return 0
1406+ fi
1407+
1408+ # Show size and confirm
1409+ local _data_size
1410+ _data_size=$( du -sh " $_data_dir " 2> /dev/null | cut -f1)
1411+ warn " This will permanently delete all data for $service_id (${_data_size} )."
1412+ warn " Directory: $_data_dir "
1413+ log " "
1414+
1415+ local _confirm
1416+ read -p " Type '$service_id ' to confirm deletion: " -r _confirm
1417+ if [[ " $_confirm " != " $service_id " ]]; then
1418+ log " Purge cancelled."
1419+ return 0
1420+ fi
1421+
1422+ # Delete data — try direct rm first, fall back to docker for root-owned files
1423+ rm -rf " $_data_dir " 2> /dev/null || true
1424+ if [[ -d " $_data_dir " ]]; then
1425+ log " Some files are owned by root (created by Docker). Removing via container..."
1426+ if command -v docker & > /dev/null; then
1427+ docker run --rm -v " $_data_dir :/purge-target" alpine \
1428+ sh -c ' rm -rf /purge-target/* /purge-target/.[!.]* 2>/dev/null; true' 2> /dev/null \
1429+ || warn " Docker cleanup failed (non-fatal)"
1430+ rm -rf " $_data_dir " 2> /dev/null || true
1431+ fi
1432+ if [[ -d " $_data_dir " ]]; then
1433+ error " Could not fully remove $_data_dir . Try: sudo rm -rf $_data_dir "
1434+ fi
1435+ fi
1436+
1437+ success " Purged $service_id data (${_data_size} freed)."
13511438}
13521439
13531440cmd_list () {
@@ -2720,6 +2807,7 @@ ${CYAN}Commands:${NC}
27202807 list List all services and their status
27212808 enable <service> Enable an extension service
27222809 disable <service> Disable an extension service
2810+ purge <service> Permanently delete service data
27232811 preset <action> Save/load/list/delete/export/import presets
27242812 mode [local|cloud|hybrid]
27252813 Switch between local/cloud/hybrid modes
@@ -2836,6 +2924,7 @@ case "${1:-help}" in
28362924 list|ls) cmd_list ;;
28372925 enable) shift ; cmd_enable " $@ " ;;
28382926 disable) shift ; cmd_disable " $@ " ;;
2927+ purge) shift ; cmd_purge " $@ " ;;
28392928 preset|p) shift ; cmd_preset " $@ " ;;
28402929 mode|m) shift ; cmd_mode " $@ " ;;
28412930 model) shift ; cmd_model " $@ " ;;
0 commit comments