From 25e7f49bbe12a0fa80ca1650196fc48ec5de5305 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Thu, 5 Feb 2026 10:36:44 -0800 Subject: [PATCH 1/4] Auto-reply with the Observer Vault version --- ts/observervault/messageHandler.preload.ts | 61 +++++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/ts/observervault/messageHandler.preload.ts b/ts/observervault/messageHandler.preload.ts index 98bab7621..f9007b2cf 100644 --- a/ts/observervault/messageHandler.preload.ts +++ b/ts/observervault/messageHandler.preload.ts @@ -52,6 +52,9 @@ const log = createLogger('observervault/messageHandler'); // The desired disappearing messages timer (30 seconds) const DESIRED_EXPIRE_TIMER = DurationInSeconds.fromSeconds(30); +// The auto-reply message for text messages +const AUTO_REPLY_MESSAGE = 'I am running Observer Vault v{version}'; + // Default Downloads folder - use ObserverVault subfolder const DOWNLOADS_DIR = join(homedir(), 'Downloads', 'ObserverVault'); @@ -620,6 +623,46 @@ export async function ensureDisappearingMessagesTimer( * Returns true if the message was handled, * false if normal processing should continue. */ +/** + * Sends an auto-reply message to the conversation. + */ +export async function sendAutoReply( + conversation: ConversationModel +): Promise { + const logId = `sendAutoReply/${conversation.idForLogging()}`; + + log.info(`${logId}: Sending auto-reply message`); + + try { + // Get the version from SignalContext + let version = 'unknown'; + if ( + typeof window !== 'undefined' && + window.SignalContext && + window.SignalContext.getVersion + ) { + version = window.SignalContext.getVersion(); + } + const autoReplyMessage = AUTO_REPLY_MESSAGE.replace('{version}', version); + + await conversation.enqueueMessageForSend( + { + attachments: [], + body: autoReplyMessage, + }, + { + timestamp: Date.now(), + } + ); + log.info(`${logId}: Auto-reply message sent successfully`); + } catch (error) { + log.error( + `${logId}: Failed to send auto-reply:`, + error instanceof Error ? error.message : String(error) + ); + } +} + export async function handleObserverVaultIncomingMessage( message: MessageModel, conversation: ConversationModel @@ -695,6 +738,20 @@ export async function handleObserverVaultIncomingMessage( drop(downloadAllAttachments(message, conversation)); } - // Message processed (no auto-reply sent) - return true; + // Get the message body + const body = message.get('body'); + + // If the message has a text body, send an auto-reply + if (body && body.trim().length > 0) { + log.info(`${logId}: Received text message, sending auto-reply`); + drop(sendAutoReply(conversation)); + return true; + } + + // For messages without text or attachments (e.g., reactions), we still process them + // but don't send an auto-reply + log.info( + `${logId}: Received non-text/non-attachment message, no auto-reply needed` + ); + return false; } From 12c533e8c9203b1b2cca423a9f1275ac60f4f3e1 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Wed, 11 Feb 2026 12:40:37 +0100 Subject: [PATCH 2/4] Remove move jobs from CI, and use a cheaper runner for lint --- .github/workflows/ci.yml | 424 +-------------------------------------- 1 file changed, 1 insertion(+), 423 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b6c3c7f8e..4fd3593c7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ on: jobs: lint: - runs-on: ubuntu-22.04-8-cores + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -78,425 +78,3 @@ jobs: .eslintcache tsconfig.tsbuildinfo key: ${{ steps.cache-lint.outputs.cache-primary-key }} - - macos: - needs: lint - runs-on: macos-latest - if: github.ref == 'refs/heads/main' - timeout-minutes: 30 - - steps: - - run: uname -a - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - name: Setup node.js - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6 - with: - node-version-file: '.nvmrc' - cache: 'pnpm' - cache-dependency-path: 'pnpm-lock.yaml' - - name: Cache .electron-gyp - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: ~/.electron-gyp - key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} - - # - name: Setup sccache - # uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7 - # - name: Restore sccache - # uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - # with: - # path: ${{ env.SCCACHE_PATH }} - # key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }} - - - name: Install Desktop node_modules - run: pnpm install - env: - # CC: sccache clang - # CXX: sccache clang++ - # SCCACHE_GHA_ENABLED: "true" - NPM_CONFIG_LOGLEVEL: verbose - - - run: pnpm run generate - - run: pnpm run prepare-beta-build - - run: pnpm run test-node - - run: pnpm run test-electron - env: - ARTIFACTS_DIR: artifacts/macos - WORKER_COUNT: 4 - timeout-minutes: 5 - - run: touch noop.sh && chmod +x noop.sh - - run: pnpm run build - env: - # CC: sccache clang - # CXX: sccache clang++ - # SCCACHE_GHA_ENABLED: "true" - DISABLE_INSPECT_FUSE: on - SIGN_MACOS_SCRIPT: noop.sh - ARTIFACTS_DIR: artifacts/macos - - name: Upload installer size - if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' && github.ref == 'refs/heads/main' }} - run: | - node ts/scripts/dd-installer-size.node.js macos-arm64 - node ts/scripts/dd-installer-size.node.js macos-x64 - node ts/scripts/dd-installer-size.node.js macos-universal - env: - DD_API_KEY: ${{ secrets.DATADOG_API_KEY }} - - run: pnpm run test-release - env: - NODE_ENV: production - - - name: Upload artifacts on failure - if: failure() - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - path: artifacts - - linux: - needs: lint - runs-on: ubuntu-22.04-8-cores - timeout-minutes: 30 - - steps: - - run: lsb_release -a - - run: uname -a - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - name: Setup node.js - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6 - with: - node-version-file: '.nvmrc' - cache: 'pnpm' - cache-dependency-path: 'pnpm-lock.yaml' - - name: Cache .electron-gyp - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: ~/.electron-gyp - key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} - - - name: Install xvfb and libpulse0 - run: sudo apt-get install xvfb libpulse0 || (sudo apt-get update && sudo apt-get install xvfb libpulse0) - - # - name: Setup sccache - # uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7 - # - name: Restore sccache - # uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - # with: - # path: ${{ env.SCCACHE_PATH }} - # key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }} - - - name: Install Desktop node_modules - run: pnpm install - env: - # CC: sccache gcc - # CXX: sccache g++ - # SCCACHE_GHA_ENABLED: "true" - NPM_CONFIG_LOGLEVEL: verbose - - - run: pnpm run generate - - run: pnpm run prepare-beta-build - - - name: Create bundle - run: pnpm run build:esbuild:prod - - name: Create preload cache - run: xvfb-run --auto-servernum pnpm run build:preload-cache - env: - ARTIFACTS_DIR: artifacts/linux - - - name: Build with packaging .deb file - run: pnpm run build:release --publish=never - if: github.ref == 'refs/heads/main' - env: - # CC: sccache gcc - # CXX: sccache g++ - # SCCACHE_GHA_ENABLED: "true" - DISABLE_INSPECT_FUSE: on - - name: Build without packaging .deb file - run: pnpm run build:release --linux dir - if: github.ref != 'refs/heads/main' - env: - # CC: sccache gcc - # CXX: sccache g++ - # SCCACHE_GHA_ENABLED: "true" - DISABLE_INSPECT_FUSE: on - - - name: Upload installer size - if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' && github.ref == 'refs/heads/main' }} - run: node ts/scripts/dd-installer-size.node.js linux - env: - DD_API_KEY: ${{ secrets.DATADOG_API_KEY }} - - - run: xvfb-run --auto-servernum pnpm run test-node - - - name: Clone backup integration tests - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - with: - repository: 'signalapp/Signal-Message-Backup-Tests' - ref: '50336e18dc0171551b1684ff81690b2f515dd217' - path: 'backup-integration-tests' - - - run: xvfb-run --auto-servernum pnpm run test-electron - timeout-minutes: 5 - env: - ARTIFACTS_DIR: artifacts/linux - LANG: en_US - LANGUAGE: en_US - BACKUP_INTEGRATION_DIR: 'backup-integration-tests/test-cases' - WORKER_COUNT: 8 - - run: xvfb-run --auto-servernum pnpm run test-release - env: - NODE_ENV: production - - - name: Upload artifacts on failure - if: failure() - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - path: artifacts - - windows: - needs: lint - runs-on: windows-latest-8-cores - timeout-minutes: 30 - - steps: - - run: systeminfo - - run: git config --global core.autocrlf false - - run: git config --global core.eol lf - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - name: Setup node.js - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6 - with: - node-version-file: '.nvmrc' - cache: 'pnpm' - cache-dependency-path: 'pnpm-lock.yaml' - - - name: Install Desktop node_modules - run: pnpm install - env: - NPM_CONFIG_LOGLEVEL: verbose - - - run: pnpm run generate - - run: pnpm run test-node - - run: copy package.json temp.json - - run: del package.json - - run: type temp.json | findstr /v certificateSubjectName | findstr /v certificateSha1 > package.json - - run: pnpm run prepare-beta-build - - - name: Create bundle - run: pnpm run build:esbuild:prod - - name: Create preload cache - run: pnpm run build:preload-cache - env: - ARTIFACTS_DIR: artifacts/win - - - name: Build with NSIS - run: pnpm run build:release - if: github.ref == 'refs/heads/main' - env: - DISABLE_INSPECT_FUSE: on - - name: Build without NSIS - run: pnpm run build:release --win dir - if: github.ref != 'refs/heads/main' - env: - DISABLE_INSPECT_FUSE: on - - - name: Upload installer size - if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' && github.ref == 'refs/heads/main' }} - run: node ts/scripts/dd-installer-size.node.js windows - env: - DD_API_KEY: ${{ secrets.DATADOG_API_KEY }} - - - run: pnpm run test-electron - env: - ARTIFACTS_DIR: artifacts/windows - WORKER_COUNT: 4 - timeout-minutes: 5 - - run: pnpm run test-release - env: - SIGNAL_ENV: production - - - name: Upload artifacts on failure - if: failure() - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - path: artifacts - - sticker-creator: - name: Sticker Creator - runs-on: ubuntu-22.04-8-cores - timeout-minutes: 30 - - defaults: - run: - working-directory: sticker-creator - - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - name: Setup node.js - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6 - with: - node-version-file: '.nvmrc' - - - name: Install Sticker Creator node_modules - run: pnpm install - - - name: Build Sticker Creator - run: pnpm run build - - - name: Check Sticker Creator types - run: pnpm run check:types - - - name: Check Sticker Creator formatting - run: pnpm run prettier:check - - - name: Check Sticker Creator linting - run: pnpm run lint - - - name: Run tests - run: pnpm test -- --run - - mock-tests: - needs: lint - - continue-on-error: true - strategy: - matrix: - workerIndex: [0, 1, 2, 3] - - runs-on: ubuntu-latest-8-cores - if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' }} - timeout-minutes: 30 - - steps: - - name: Get system specs - run: lsb_release -a - - name: Get other system specs - run: uname -a - - - name: Clone Desktop repo - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - name: Setup node.js - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6 - with: - node-version-file: '.nvmrc' - cache: 'pnpm' - cache-dependency-path: 'pnpm-lock.yaml' - - name: Cache .electron-gyp - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: ~/.electron-gyp - key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} - - - name: Update apt - run: sudo apt-get update - - - name: Install xvfb and libpulse0 - run: sudo apt-get install -y xvfb libpulse0 - - # - name: Setup sccache - # uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7 - # - name: Restore sccache - # uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - # with: - # path: ${{ env.SCCACHE_PATH }} - # key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }} - - - name: Install Desktop node_modules - run: | - pnpm install - sudo chown root node_modules/.pnpm/electron@*/node_modules/electron/dist/chrome-sandbox - sudo chmod 4755 node_modules/.pnpm/electron@*/node_modules/electron/dist/chrome-sandbox - env: - # CC: sccache gcc - # CXX: sccache g++ - # SCCACHE_GHA_ENABLED: "true" - NPM_CONFIG_LOGLEVEL: verbose - - - name: Build typescript - run: pnpm run generate - - name: Bundle - run: pnpm run build:esbuild:prod - - name: Create preload cache - run: xvfb-run --auto-servernum pnpm run build:preload-cache - env: - ARTIFACTS_DIR: artifacts/linux - - - name: Run mock server tests - run: | - set -o pipefail - xvfb-run --auto-servernum pnpm run test-mock - timeout-minutes: 15 - env: - NODE_ENV: production - DEBUG: mock:test:* - ARTIFACTS_DIR: artifacts/mock - WORKER_INDEX: ${{ matrix.workerIndex }} - WORKER_COUNT: 4 - - - name: Run docker mock server tests - if: ${{ matrix.workerIndex == 0 }} - run: | - set -o pipefail - sudo apt-get install -y pipewire pipewire-pulse wireplumber psmisc pulseaudio-utils - systemctl --user start pipewire.service - systemctl --user start pipewire-pulse.service - xvfb-run --auto-servernum pnpm run test-mock-docker - timeout-minutes: 10 - env: - NODE_ENV: production - DEBUG: mock:test:* - ARTIFACTS_DIR: artifacts/mock-docker - - - name: Upload mock server test logs on failure - if: failure() - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - name: logs-${{ matrix.workerIndex }} - path: artifacts - - check-min-os-version: - needs: lint - - continue-on-error: true - strategy: - matrix: - os: [ubuntu-22.04-8-cores, macos-latest] - - runs-on: ${{ matrix.os }} - timeout-minutes: 30 - - steps: - - run: uname -a - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - name: Setup pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - name: Setup node.js - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6 - with: - node-version-file: '.nvmrc' - cache: 'pnpm' - cache-dependency-path: 'pnpm-lock.yaml' - - name: Cache .electron-gyp - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: ~/.electron-gyp - key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} - - - name: Install Desktop node_modules - run: pnpm install - env: - NPM_CONFIG_LOGLEVEL: verbose - - - run: pnpm generate:phase-0 - - name: Run OS version check - run: | - node ts/scripts/check-min-os-version.node.js From e92b1e15a37fc483311bffda25a2046b1efa3bcc Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Wed, 11 Feb 2026 13:19:46 +0100 Subject: [PATCH 3/4] Bump @lockdown-systems/ringrtc to 2.64.1-audiosink.0 --- ACKNOWLEDGMENTS.md | 2 +- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ACKNOWLEDGMENTS.md b/ACKNOWLEDGMENTS.md index 026a752f7..d9e363ac8 100644 --- a/ACKNOWLEDGMENTS.md +++ b/ACKNOWLEDGMENTS.md @@ -15041,7 +15041,7 @@ For more information on this, and how to apply and follow the GNU AGPL, see ``` -## libsignal-account-keys 0.1.0, libsignal-core 0.1.0, mrp 2.63.0, protobuf 2.63.0, ringrtc 2.63.0, regex-aot 0.1.0, partial-default-derive 0.1.0, partial-default 0.1.0 +## libsignal-account-keys 0.1.0, libsignal-core 0.1.0, mrp 2.64.1, protobuf 2.64.1, ringrtc 2.64.1, regex-aot 0.1.0, partial-default-derive 0.1.0, partial-default 0.1.0 ``` GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/package.json b/package.json index 148edcbcb..5b61fa1e9 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ "@indutny/simple-windows-notifications": "2.0.16", "@indutny/sneequals": "4.0.0", "@internationalized/date": "3.7.0", - "@lockdown-systems/ringrtc": "2.63.0-audiosink.2", + "@lockdown-systems/ringrtc": "2.64.1-audiosink.0", "@popperjs/core": "2.11.8", "@radix-ui/react-tooltip": "1.2.7", "@react-aria/focus": "3.19.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d94b01e97..938d142ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -102,8 +102,8 @@ importers: specifier: 3.7.0 version: 3.7.0 '@lockdown-systems/ringrtc': - specifier: 2.63.0-audiosink.2 - version: 2.63.0-audiosink.2 + specifier: 2.64.1-audiosink.0 + version: 2.64.1-audiosink.0 '@popperjs/core': specifier: 2.11.8 version: 2.11.8 @@ -1894,8 +1894,8 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - '@lockdown-systems/ringrtc@2.63.0-audiosink.2': - resolution: {integrity: sha512-QDV54h63pNeDjs+Tq9kVMeHkAOOCmFEdk6D/6S+U6ZN3k1NrVi8JDPu5umrJQb4ytz0lUxVjQnOGj7u8hdN2GA==} + '@lockdown-systems/ringrtc@2.64.1-audiosink.0': + resolution: {integrity: sha512-QeeYgC8YI26bgRVEYucRdnG0Zp2VIezQ9UicpKBmI63XVBYkvFzAwhLw3I8NhGpbSGtS4jD83gGOgpjIErTaAg==} hasBin: true '@malept/cross-spawn-promise@2.0.0': @@ -12173,7 +12173,7 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@lockdown-systems/ringrtc@2.63.0-audiosink.2': + '@lockdown-systems/ringrtc@2.64.1-audiosink.0': dependencies: https-proxy-agent: 7.0.6 tar: 7.5.2 From 21b9ba6333ab68322b7fa27e826144493d600920 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Wed, 11 Feb 2026 13:26:35 +0100 Subject: [PATCH 4/4] Fix typescript type change for ringrtc update --- ts/state/ducks/calling.preload.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/state/ducks/calling.preload.ts b/ts/state/ducks/calling.preload.ts index 7e1c7522b..ccb1c28d0 100644 --- a/ts/state/ducks/calling.preload.ts +++ b/ts/state/ducks/calling.preload.ts @@ -2991,7 +2991,7 @@ function submitCallQualitySurvey( callType, success: !isCallFailure(callSummary.callEndReasonText), callEndReason: callSummary.callEndReasonText, - connectionRttMedian: qualityStats.rttMedianConnection, + connectionRttMedian: qualityStats.rttMedianConnectionMillis, audioRttMedian: audioStats.rttMedianMillis, videoRttMedian: videoStats.rttMedianMillis, audioRecvJitterMedian: audioStats.jitterMedianRecvMillis,