From a5cfb705bc7e5065af9a9ef69ffc6889217ad328 Mon Sep 17 00:00:00 2001 From: fleet-release <80479975+fleet-release@users.noreply.github.com> Date: Mon, 20 Jul 2026 09:24:20 -0500 Subject: [PATCH] Update Fleet-maintained apps (#49558) Automated ingestion of latest Fleet-maintained app data. ## Summary by CodeRabbit * **Updates** * Updated macOS packages for ChatGPT, Windsurf, DuckDuckGo, Firefox Nightly, Krisp, PicView, Postman, Processing, Shapr3D, and Zoom. * Updated Postman for Windows to version 12.20.0. * Refreshed installer links, version detection, and integrity checks for the latest releases. * Improved uninstall cleanup for DuckDuckGo and QLMarkdown. * Updated Krisp installation and removal behavior for improved app lifecycle handling. Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com> --- ee/maintained-apps/outputs/chatgpt/darwin.json | 8 ++++---- .../outputs/devin-desktop/darwin.json | 8 ++++---- .../outputs/duckduckgo/darwin.json | 12 ++++++------ .../outputs/firefox@nightly/darwin.json | 4 ++-- ee/maintained-apps/outputs/krisp/darwin.json | 16 ++++++++-------- ee/maintained-apps/outputs/picview/darwin.json | 8 ++++---- ee/maintained-apps/outputs/postman/darwin.json | 8 ++++---- ee/maintained-apps/outputs/postman/windows.json | 8 ++++---- .../outputs/processing/darwin.json | 8 ++++---- .../outputs/qlmarkdown/darwin.json | 4 ++-- ee/maintained-apps/outputs/shapr3d/darwin.json | 8 ++++---- ee/maintained-apps/outputs/zoom/darwin.json | 4 ++-- 12 files changed, 48 insertions(+), 48 deletions(-) diff --git a/ee/maintained-apps/outputs/chatgpt/darwin.json b/ee/maintained-apps/outputs/chatgpt/darwin.json index 52125dcb1e..5cd034b0ac 100644 --- a/ee/maintained-apps/outputs/chatgpt/darwin.json +++ b/ee/maintained-apps/outputs/chatgpt/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "26.715.31925", + "version": "26.715.52143", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.chat';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.chat' AND version_compare(bundle_short_version, '26.715.31925') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.chat' AND version_compare(bundle_short_version, '26.715.52143') < 0);" }, - "installer_url": "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.715.31925.zip", + "installer_url": "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.715.52143.zip", "install_script_ref": "6872008e", "uninstall_script_ref": "678e6cf0", - "sha256": "a0cded116975c71c723dc8601c07402533b5ff23881d15e52cfb6dc71413e45b", + "sha256": "bf7878ece7131e3405041fd90dca8b3894512eeee10d727aafc75573ce2c916a", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/devin-desktop/darwin.json b/ee/maintained-apps/outputs/devin-desktop/darwin.json index fbcf04670b..c4ad4a077b 100644 --- a/ee/maintained-apps/outputs/devin-desktop/darwin.json +++ b/ee/maintained-apps/outputs/devin-desktop/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "3.4.27", + "version": "3.5.17", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.exafunction.windsurf';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.exafunction.windsurf' AND version_compare(bundle_short_version, '3.4.27') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.exafunction.windsurf' AND version_compare(bundle_short_version, '3.5.17') < 0);" }, - "installer_url": "https://windsurf-stable.codeiumdata.com/darwin-arm64-dmg/stable/0d4bf12ed4a7597cb8ae9016fe8474468aad98a2/Devin-darwin-arm64-3.4.27.dmg", + "installer_url": "https://windsurf-stable.codeiumdata.com/darwin-arm64-dmg/stable/2c489dfc762456657db8662309c0d5e76e886397/Devin-darwin-arm64-3.5.17.dmg", "install_script_ref": "917a2397", "uninstall_script_ref": "4fdaa2d1", - "sha256": "0d15df47d926a46d4afb3851433384ac8e4bbab3b47757ed0ed0881607b45303", + "sha256": "09a4c5f196367db5a669a435f2a08edd1b67a6418eefbf25a0b1befdbfef271c", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/duckduckgo/darwin.json b/ee/maintained-apps/outputs/duckduckgo/darwin.json index 2db30ff7f5..8bbe6f3d51 100644 --- a/ee/maintained-apps/outputs/duckduckgo/darwin.json +++ b/ee/maintained-apps/outputs/duckduckgo/darwin.json @@ -1,22 +1,22 @@ { "versions": [ { - "version": "1.198.0", + "version": "1.199.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.duckduckgo.macos.browser';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.duckduckgo.macos.browser' AND version_compare(bundle_short_version, '1.198.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.duckduckgo.macos.browser' AND version_compare(bundle_short_version, '1.199.0') < 0);" }, - "installer_url": "https://staticcdn.duckduckgo.com/macos-desktop-browser/duckduckgo-1.198.0.759.dmg", + "installer_url": "https://staticcdn.duckduckgo.com/macos-desktop-browser/duckduckgo-1.199.0.762.dmg", "install_script_ref": "c6bf9cce", - "uninstall_script_ref": "b6f097db", - "sha256": "e37b38f720468b884951c9c6d063f5734b133aabe29c7820b5bc18dd99fb202b", + "uninstall_script_ref": "b5d499ac", + "sha256": "388b90af43451cca2469bf3b8cde29ba1c7507ebdfb9767de02da9e6826c07f2", "default_categories": [ "Browsers" ] } ], "refs": { - "b6f097db": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/DuckDuckGo.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.duckduckgo.macos.browser'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.duckduckgo.macos.browser'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.duckduckgo.macos.browser'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.duckduckgo.macos.browser.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.duckduckgo.macos.browser.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.duckduckgo.macos.browser'\n", + "b5d499ac": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/DuckDuckGo.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/HKE973VLUW.com.duckduckgo.macos.browser*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.duckduckgo.macos.browser'\ntrash $LOGGED_IN_USER '~/Library/Application Support/DuckDuckGo'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.duckduckgo.macos.browser'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.duckduckgo.macos.browser'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/HKE973VLUW.com.duckduckgo.macos.browser*'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.duckduckgo.macos.browser'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.duckduckgo.macos.browser.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.duckduckgo.macos.browser.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.duckduckgo.macos.browser'\n", "c6bf9cce": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.duckduckgo.macos.browser'\nif [ -d \"$APPDIR/DuckDuckGo.app\" ]; then\n\tsudo mv \"$APPDIR/DuckDuckGo.app\" \"$TMPDIR/DuckDuckGo.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/DuckDuckGo.app\" \"$APPDIR\"\nrelaunch_application 'com.duckduckgo.macos.browser'\n" } } diff --git a/ee/maintained-apps/outputs/firefox@nightly/darwin.json b/ee/maintained-apps/outputs/firefox@nightly/darwin.json index e39731ec76..40ad6d79ac 100644 --- a/ee/maintained-apps/outputs/firefox@nightly/darwin.json +++ b/ee/maintained-apps/outputs/firefox@nightly/darwin.json @@ -6,10 +6,10 @@ "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.mozilla.nightly';", "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.mozilla.nightly' AND version_compare(bundle_version, '15426.7.19') < 0);" }, - "installer_url": "https://ftp.mozilla.org/pub/firefox/nightly/2026/07/2026-07-19-09-17-21-mozilla-central/firefox-154.0a1.en-US.mac.dmg", + "installer_url": "https://ftp.mozilla.org/pub/firefox/nightly/2026/07/2026-07-19-21-13-19-mozilla-central/firefox-154.0a1.en-US.mac.dmg", "install_script_ref": "418c9331", "uninstall_script_ref": "d7c711ad", - "sha256": "f24f6fc41dd57c59faa366f665b1b53463f5fee6f30807607db6414c20a196a4", + "sha256": "f32f88163197b01e44dc296ee509c06f01c3ef734c2823d5607a39b4186f7ba4", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/krisp/darwin.json b/ee/maintained-apps/outputs/krisp/darwin.json index 987538a4e4..e3948fd8b6 100644 --- a/ee/maintained-apps/outputs/krisp/darwin.json +++ b/ee/maintained-apps/outputs/krisp/darwin.json @@ -1,22 +1,22 @@ { "versions": [ { - "version": "3.13.12", + "version": "3.14.4", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'ai.krisp.krispMac';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'ai.krisp.krispMac' AND version_compare(bundle_short_version, '3.13.12') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'ai.krisp.krispMac' AND version_compare(bundle_short_version, '3.14.4') < 0);" }, - "installer_url": "https://cdn.krisp.ai/mp/mn/3.13/mac/Krisp_3.13.12_arm64.pkg", - "install_script_ref": "96f45265", - "uninstall_script_ref": "b3d58b8d", - "sha256": "42e2e83f44075fa6cb08d1c4ec2c5e94ed867cfed80e925a2cdd0ec4bfe0d6c5", + "installer_url": "https://cdn.krisp.ai/mp/mn/3.14/mac/Krisp_3.14.4_arm64.pkg", + "install_script_ref": "e15a2faa", + "uninstall_script_ref": "0d2116c2", + "sha256": "1d1fb0a2e026b5a6414d4c20c5839fde1fe1170c3edce2a1da53f2b2f6d25aa1", "default_categories": [ "Productivity" ] } ], "refs": { - "96f45265": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# install pkg files\nquit_and_track_application 'ai.krisp.krispMac'\nsudo installer -pkg \"$TMPDIR/krisp_3.13.12_arm64.pkg\" -target /\nrelaunch_application 'ai.krisp.krispMac'\n", - "b3d58b8d": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n # A wildcard label can't be used with launchctl or as a plist name, so expand\n # it to the labels of currently loaded services that match the pattern.\n local services=(\"$service\")\n if [[ \"$service\" == *\"*\"* ]]; then\n local regex\n # Escape regex metacharacters, turn '*' into '.*', and anchor the pattern so\n # it matches a full label rather than a substring.\n regex=$(printf '%s' \"$service\" | sed -e 's/[][(){}.^$+?|\\\\]/\\\\&/g' -e 's/\\*/.*/g')\n regex=\"^${regex}$\"\n services=()\n local id\n # Match every loaded job by label regardless of PID; launchctl list reports\n # loaded-but-not-running jobs with a \"-\" in the PID column.\n while read -r _ _ id; do\n [[ \"$id\" =~ $regex ]] && services+=(\"$id\")\n done < <(launchctl list 2>/dev/null | tail -n +2)\n if [[ ${#services[@]} -eq 0 ]]; then\n echo \"No loaded launchctl service matches ${service}\"\n return\n fi\n fi\n\n local service_label\n for service_label in \"${services[@]}\"; do\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service_label}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service_label}\"\n else\n launchctl remove \"${service_label}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service_label}.plist\"\n \"/Library/LaunchDaemons/${service_label}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'ai.krisp.krispMac*'\nremove_launchctl_service 'krisp'\nquit_application 'ai.krisp.krispMac'\nremove_pkg_files 'ai.krisp.krispMac*'\nforget_pkg 'ai.krisp.krispMac*'\nsudo rm -rf '/Applications/krisp.app'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/ai.krisp.krispMac.LaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/Application Support/ai.krisp.krispMac'\ntrash $LOGGED_IN_USER '~/Library/Caches/ai.krisp.krispMac'\ntrash $LOGGED_IN_USER '~/Library/Containers/ai.krisp.krispMac.LaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/ai.krisp.krispMac.*'\ntrash $LOGGED_IN_USER '~/Library/LaunchAgents/ai.krisp.krispMac.cameraAssistant.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ai.krisp.krispMac.plist'\n" + "0d2116c2": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n # A wildcard label can't be used with launchctl or as a plist name, so expand\n # it to the labels of currently loaded services that match the pattern.\n local services=(\"$service\")\n if [[ \"$service\" == *\"*\"* ]]; then\n local regex\n # Escape regex metacharacters, turn '*' into '.*', and anchor the pattern so\n # it matches a full label rather than a substring.\n regex=$(printf '%s' \"$service\" | sed -e 's/[][(){}.^$+?|\\\\]/\\\\&/g' -e 's/\\*/.*/g')\n regex=\"^${regex}$\"\n services=()\n local id\n # Match every loaded job by label regardless of PID; launchctl list reports\n # loaded-but-not-running jobs with a \"-\" in the PID column.\n while read -r _ _ id; do\n [[ \"$id\" =~ $regex ]] && services+=(\"$id\")\n done < <(launchctl list 2>/dev/null | tail -n +2)\n if [[ ${#services[@]} -eq 0 ]]; then\n echo \"No loaded launchctl service matches ${service}\"\n return\n fi\n fi\n\n local service_label\n for service_label in \"${services[@]}\"; do\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service_label}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service_label}\"\n else\n launchctl remove \"${service_label}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service_label}.plist\"\n \"/Library/LaunchDaemons/${service_label}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'ai.krisp.krispMac*'\nremove_launchctl_service 'krisp'\nquit_application 'ai.krisp.krispMac'\nremove_pkg_files 'ai.krisp.krispMac*'\nforget_pkg 'ai.krisp.krispMac*'\nsudo rm -rf '/Applications/krisp.app'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/ai.krisp.krispMac.LaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/Application Support/ai.krisp.krispMac'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/ai.krisp.krispmac.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/krisp'\ntrash $LOGGED_IN_USER '~/Library/Caches/ai.krisp.krispMac'\ntrash $LOGGED_IN_USER '~/Library/Containers/ai.krisp.krispMac.LaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/ai.krisp.krispMac.*'\ntrash $LOGGED_IN_USER '~/Library/LaunchAgents/ai.krisp.krispMac.cameraAssistant.plist'\ntrash $LOGGED_IN_USER '~/Library/LaunchAgents/krisp.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ai.krisp.krispMac.plist'\n", + "e15a2faa": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# install pkg files\nquit_and_track_application 'ai.krisp.krispMac'\nsudo installer -pkg \"$TMPDIR/krisp_3.14.4_arm64.pkg\" -target /\nrelaunch_application 'ai.krisp.krispMac'\n" } } diff --git a/ee/maintained-apps/outputs/picview/darwin.json b/ee/maintained-apps/outputs/picview/darwin.json index ebdda33635..17cd9030de 100644 --- a/ee/maintained-apps/outputs/picview/darwin.json +++ b/ee/maintained-apps/outputs/picview/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "4.2.0", + "version": "5.0.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.ruben2776.picview';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.ruben2776.picview' AND version_compare(bundle_short_version, '4.2.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.ruben2776.picview' AND version_compare(bundle_short_version, '5.0.0') < 0);" }, - "installer_url": "https://github.com/Ruben2776/PicView/releases/download/4.2.0/PicView-4.2.0-macOS-arm64.dmg", + "installer_url": "https://github.com/Ruben2776/PicView/releases/download/5.0.0/PicView-5.0.0-macOS-arm64.dmg", "install_script_ref": "f2bdc85e", "uninstall_script_ref": "48e04b56", - "sha256": "50032ae50d097a6bd1b0d57d2be15dc1448a03fade07193f0be981849b821b95", + "sha256": "b09c47db6094eb4b145df2bf417f9f4c5fb0baee6d30e5b81545a9139b87fc9a", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/postman/darwin.json b/ee/maintained-apps/outputs/postman/darwin.json index 5ebcacbdf4..ee5523f658 100644 --- a/ee/maintained-apps/outputs/postman/darwin.json +++ b/ee/maintained-apps/outputs/postman/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "12.19.6", + "version": "12.20.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac' AND version_compare(bundle_short_version, '12.19.6') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac' AND version_compare(bundle_short_version, '12.20.0') < 0);" }, - "installer_url": "https://dl.pstmn.io/download/version/12.19.6/osx_arm64", + "installer_url": "https://dl.pstmn.io/download/version/12.20.0/osx_arm64", "install_script_ref": "96d73870", "uninstall_script_ref": "966b2fa5", - "sha256": "5686c1837a40ff7670d5f0ba7f3b9def7dd3fa30f6b44dca95f62dd6e674e4f4", + "sha256": "6b2f2413a2fb3b4d202684085e262adc8f31a0aecd523ed3fcc615b8a1e74a53", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/postman/windows.json b/ee/maintained-apps/outputs/postman/windows.json index c80c1ddf8c..394f1a90c9 100644 --- a/ee/maintained-apps/outputs/postman/windows.json +++ b/ee/maintained-apps/outputs/postman/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "12.19.6", + "version": "12.20.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Postman x64 %' AND publisher = 'Postman';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Postman x64 %' AND publisher = 'Postman' AND version_compare(version, '12.19.6') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Postman x64 %' AND publisher = 'Postman' AND version_compare(version, '12.20.0') < 0);" }, - "installer_url": "https://dl.pstmn.io/download/version/12.19.6/windows_64", + "installer_url": "https://dl.pstmn.io/download/version/12.20.0/windows_64", "install_script_ref": "8594f0bc", "uninstall_script_ref": "fd59d029", - "sha256": "b9e2c820d6c29dfdc77363f3f6c0d91b85929c536001ffb1445867c48a64828d", + "sha256": "eff360d93e80cc37d1e5556f07ee5443f5e4ac80b128f0ff18da55fffcc3a7a6", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/processing/darwin.json b/ee/maintained-apps/outputs/processing/darwin.json index a953940fd1..606f73166c 100644 --- a/ee/maintained-apps/outputs/processing/darwin.json +++ b/ee/maintained-apps/outputs/processing/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "4.5.5", + "version": "4.5.6", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.processing.four';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.processing.four' AND version_compare(bundle_short_version, '4.5.5') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.processing.four' AND version_compare(bundle_short_version, '4.5.6') < 0);" }, - "installer_url": "https://github.com/processing/processing4/releases/download/processing-1433-4.5.5/processing-4.5.5-macos-aarch64.dmg", + "installer_url": "https://github.com/processing/processing4/releases/download/processing-1434-4.5.6/processing-4.5.6-macos-aarch64.dmg", "install_script_ref": "c22623fc", "uninstall_script_ref": "b69978e7", - "sha256": "5bd8e6ad2b9250921cc5d85f9dae16b1eed109ba278976da3e4f96e81d81ef48", + "sha256": "f543a70d06fa43ea4f57955368734296c49960b71b24b2220da18d14806ed3fa", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/qlmarkdown/darwin.json b/ee/maintained-apps/outputs/qlmarkdown/darwin.json index 863be24337..0c38e39ad0 100644 --- a/ee/maintained-apps/outputs/qlmarkdown/darwin.json +++ b/ee/maintained-apps/outputs/qlmarkdown/darwin.json @@ -8,7 +8,7 @@ }, "installer_url": "https://github.com/sbarex/QLMarkdown/releases/download/1.5.2/QLMarkdown.zip", "install_script_ref": "038ce2fa", - "uninstall_script_ref": "66216336", + "uninstall_script_ref": "fc5e1986", "sha256": "b111681c95355d931e72f4f8dff63565e329e8b4d5bcd95f127c4cba2b9e3ea0", "default_categories": [ "Productivity" @@ -17,6 +17,6 @@ ], "refs": { "038ce2fa": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'org.sbarex.QLMarkdown'\nif [ -d \"$APPDIR/QLMarkdown.app\" ]; then\n\tsudo mv \"$APPDIR/QLMarkdown.app\" \"$TMPDIR/QLMarkdown.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/QLMarkdown.app\" \"$APPDIR\"\nrelaunch_application 'org.sbarex.QLMarkdown'\n", - "66216336": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/QLMarkdown.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/org.sbarex.QLMarkdown'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/org.sbarex.QLMarkdown.QLExtension'\ntrash $LOGGED_IN_USER '~/Library/Containers/org.sbarex.QLMarkdown'\ntrash $LOGGED_IN_USER '~/Library/Containers/org.sbarex.QLMarkdown.QLExtension'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/org.sbarex.qlmarkdown'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/org.sbarex.QLMarkdown'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.sbarex.QLMarkdown.plist'\ntrash $LOGGED_IN_USER '~/Library/QuickLook/QLMarkdown.qlgenerator'\n" + "fc5e1986": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/QLMarkdown.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/group.org.sbarex.qlmarkdown/'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/org.sbarex.QLMarkdown'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/org.sbarex.QLMarkdown.QLExtension'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/org.sbarex.QLMarkdown.Shortcut-Extension/'\ntrash $LOGGED_IN_USER '~/Library/Application Support/QLMarkdown/'\ntrash $LOGGED_IN_USER '~/Library/Containers/org.sbarex.QLMarkdown'\ntrash $LOGGED_IN_USER '~/Library/Containers/org.sbarex.QLMarkdown.QLExtension'\ntrash $LOGGED_IN_USER '~/Library/Containers/org.sbarex.QLMarkdown.Shortcut-Extension/'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/group.org.sbarex.qlmarkdown/'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/org.sbarex.QLMarkdown'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/org.sbarex.qlmarkdown'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.sbarex.QLMarkdown.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.sbarex.QLMarkdownXPCHelper.plist'\ntrash $LOGGED_IN_USER '~/Library/QuickLook/QLMarkdown.qlgenerator'\n" } } diff --git a/ee/maintained-apps/outputs/shapr3d/darwin.json b/ee/maintained-apps/outputs/shapr3d/darwin.json index 7e73a5321c..af4f7a6d6a 100644 --- a/ee/maintained-apps/outputs/shapr3d/darwin.json +++ b/ee/maintained-apps/outputs/shapr3d/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "26.120.0.11243", + "version": "26.121.0.11316", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.shapr3d.shapr';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.shapr3d.shapr' AND version_compare(bundle_short_version, '26.120.0.11243') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.shapr3d.shapr' AND version_compare(bundle_short_version, '26.121.0.11316') < 0);" }, - "installer_url": "https://download.shapr3d.com/mac/Shapr3D-26.120.0.11243.dmg", + "installer_url": "https://download.shapr3d.com/mac/Shapr3D-26.121.0.11316.dmg", "install_script_ref": "f6e027de", "uninstall_script_ref": "261544b8", - "sha256": "4624e0360cf8e27ae438b3f7ff6c8290814bffa28456f2f6bf6a85080d9a85b7", + "sha256": "81ec55d285af9b30878dc667c117db2ba0a0f68c90bb1a087524305dd9f704cd", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/zoom/darwin.json b/ee/maintained-apps/outputs/zoom/darwin.json index 3e5298f592..939dea0a23 100644 --- a/ee/maintained-apps/outputs/zoom/darwin.json +++ b/ee/maintained-apps/outputs/zoom/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "7.1.0.83064", + "version": "7.1.5.84650", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'us.zoom.xos';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'us.zoom.xos' AND version_compare(bundle_short_version, '7.1.0.83064') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'us.zoom.xos' AND version_compare(bundle_short_version, '7.1.5.84650') < 0);" }, "installer_url": "https://zoom.us/client/latest/ZoomInstallerIT.pkg", "install_script_ref": "ab84b572",