Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
f3bb039
feat: register callto:/tel: deep link handlers (DAMOVO-1)
jeanfbrito May 8, 2026
154293f
test: add unit tests for telephony deep link parsing and routing
jeanfbrito May 8, 2026
ab816c0
fix: attach server selection dialog to root window and guard against …
jeanfbrito May 8, 2026
8431a5f
chore: add GitNexus code intelligence config to CLAUDE.md
jeanfbrito May 9, 2026
5050a1d
feat: support sha-prefixed exception versions by git commit hash
jeanfbrito May 9, 2026
c83728f
feat: add telephony preferred server settings UI
jeanfbrito May 9, 2026
8f56445
fix: move MimeType into desktop.entry for electron-builder v26 compat
jeanfbrito May 11, 2026
6ddda80
i18n: add translations for telephony server selection dialog
jeanfbrito May 11, 2026
9d0a4d3
feat: replace native dialog with Fuselage modal for telephony server …
jeanfbrito May 12, 2026
f214798
refactor(telephony-modal): tighten vertical spacing
jeanfbrito May 12, 2026
9cdf640
test(telephony): add coverage for preload, settings dropdown, and ser…
jeanfbrito May 13, 2026
1e04a7b
fix(telephony): decode percent-encoded URI before sanitization
jeanfbrito May 13, 2026
8f1b2f4
fix(supportedVersions): make sha- exception prefix check case-insensi…
jeanfbrito May 13, 2026
3c2ab23
fix(telephony-ui): harden URL parsing and improve modal accessibility
jeanfbrito May 13, 2026
ce12206
Feat/telephony shortcut main process (#3334)
jeanfbrito May 14, 2026
9025556
Add telephony clipboard dial shortcut (#3330)
jeanfbrito May 14, 2026
029e20b
fix telephony deeplink edge cases
jeanfbrito May 14, 2026
c63b431
chore: format telephony PR lint fixes
jeanfbrito May 14, 2026
32299e4
Merge branch 'feat/telephony-deeplink' of https://github.com/RocketCh…
jeanfbrito May 14, 2026
e85a457
refactor: add marginBlock to Field components in SettingsView features
jeanfbrito May 14, 2026
87399fe
chore: polish telephony settings copy
jeanfbrito May 14, 2026
f952c6f
chore: add telephony settings translations
jeanfbrito May 14, 2026
fecce23
Merge branch 'feat/telephony-deeplink' of https://github.com/RocketCh…
jeanfbrito May 15, 2026
773cd30
feat(telephony): add master toggle and gate runtime registration
jeanfbrito May 15, 2026
9151462
feat(telephony): prompt user about default handler conflicts on opt-in
jeanfbrito May 15, 2026
19ebf61
test(app): nest PersistableValues spec into __tests__
jeanfbrito May 15, 2026
ae75fae
feat(telephony): add Voice & Video settings tab and polish diagnostic…
jeanfbrito May 20, 2026
699b85f
feat(telephony): expose diagnostics IPC and Windows capabilities regi…
jeanfbrito May 20, 2026
50090ed
fix(telephony): target app-scoped Windows default-apps deep link and …
jeanfbrito May 20, 2026
e6ee63a
fix(store): snapshot prev before invoking watcher to avoid stale re-e…
jeanfbrito May 20, 2026
8d64ce1
refactor(telephony): localize shortcut display and tighten telephony …
jeanfbrito May 20, 2026
5dcc527
chore: ignore local OpenWolf tooling state
jeanfbrito May 20, 2026
290518f
chore: apply prettier formatting to VoiceVideoTab accordion items
jeanfbrito May 20, 2026
08a9e12
fix(telephony): use Fuselage default color token for server title in …
jeanfbrito May 20, 2026
0bc2cd1
fix(telephony): switch active workspace to resolved server before pla…
jeanfbrito May 20, 2026
5220957
fix(telephony): check Windows UserChoice ProgId for isDefault diagnostic
jeanfbrito May 20, 2026
13bfec8
docs(telephony): clarify Windows default-handler prompt and diagnosti…
jeanfbrito May 20, 2026
33ccf2b
docs(telephony): split default-handler modal copy by platform
jeanfbrito May 20, 2026
632a110
fix(telephony): widen body margin in default-handler modal so buttons…
jeanfbrito May 20, 2026
1faa39c
feat(telephony): ship Windows default-app associations XML + MSI opt-…
jeanfbrito May 20, 2026
49fadfe
fix(installer): preserve default-associations policy across MSI major…
jeanfbrito May 20, 2026
a52217d
docs(windows): split default-app-associations into its own shareable …
jeanfbrito May 20, 2026
487a16e
fix(telephony): tighten default handler diagnostics
jeanfbrito May 21, 2026
7c060f8
fix(telephony): keep server selector text readable
jeanfbrito May 21, 2026
0dd7ff1
fix(i18n): complete Brazilian Portuguese translations
jeanfbrito May 21, 2026
081431c
fix(i18n): complete German translations
jeanfbrito May 21, 2026
3781620
docs(telephony): clarify default handler diagnostics
jeanfbrito May 21, 2026
20e547a
fix(installer): register telephony associations in MSI
jeanfbrito May 22, 2026
e135646
Fix telephony release blockers
jeanfbrito May 22, 2026
bc1ed73
Add telephony QA flows
jeanfbrito May 22, 2026
11478be
Make telephony QA flows Qase-ready
jeanfbrito May 22, 2026
5277983
Harden QA flow authoring guidance
jeanfbrito May 22, 2026
1c19b70
Add reusable Desktop QA flow skill
jeanfbrito May 22, 2026
e42cad2
Tighten telephony QA coverage
jeanfbrito May 22, 2026
2a44dd2
chore: add telephony picker diagnostics
jeanfbrito May 23, 2026
39382ce
fix: filter deep link process arguments
jeanfbrito May 23, 2026
c5e1264
fix(telephony): reset rememberChoice on state-driven modal close
jeanfbrito May 25, 2026
48ec5d4
Merge remote-tracking branch 'origin/master' into feat/telephony-deep…
jeanfbrito Jun 1, 2026
6b238cb
fix(telephony): expire buffered deeplink after 120s TTL
jeanfbrito Jun 1, 2026
ea9dfe3
fix(telephony): strip non-phone debris from clipboard dial shortcut
jeanfbrito Jun 1, 2026
6a2af34
chore: bump version to 4.15.0
jeanfbrito Jun 2, 2026
93a4c68
fix: share main webview session with internal video chat window
rodrigok Jun 18, 2026
c5f4cbf
fix: harden video call window session sharing for production
jeanfbrito Jun 18, 2026
070cd27
Merge video call window session sharing (#3359) into telephony branch
jeanfbrito Jun 22, 2026
536bdcc
fix: address CodeRabbit review feedback on #3370
jeanfbrito Jun 23, 2026
10f31d5
feat: openInMainWindow bridge to navigate the main window from the vi…
rodrigok Jun 23, 2026
3e93e6c
fix: route open-in-main-window to the call's origin server
jeanfbrito Jun 24, 2026
389c987
feat: add videoCallWindow.close() bridge to close the video call window
rodrigok Jun 24, 2026
c2575af
fix: focus the existing video call window when reopening the same con…
rodrigok Jun 24, 2026
6db25a2
fix: open external links from the video call window in the system bro…
rodrigok Jun 24, 2026
5e6f239
fix: address review feedback on video call session sharing
jeanfbrito Jun 24, 2026
29172a4
Merge video call window review fixes (#3359) into telephony branch
jeanfbrito Jun 24, 2026
e67f9dd
Merge master into telephony-videoconf-session
jeanfbrito Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ coderabbit-update-*/
# mastermind (local knowledge base)
.knowledge/

# OpenWolf local tooling state
.wolf/

# MSI test harness artifacts
scripts/msi-test/logs/
scripts/msi-test/.known_hosts
Expand Down
125 changes: 125 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
# Agent Instructions

These instructions apply to the repository root. More specific `AGENTS.md`
files in subdirectories override or extend this file.

`CLAUDE.md` is the historical project guide. When it changes, review it and
carry forward only durable repo guidance here; do not blindly copy
Claude-specific, stale, or unavailable-tool instructions.

## Project Basics

- TypeScript codebase. Use TypeScript for new code unless explicitly told
otherwise.
- Run root commands from the repository root. Do not run `yarn build` inside
workspace directories; it creates incorrect output structures.
- Common commands:

```sh
yarn install && yarn start
yarn build
yarn lint && yarn test
yarn workspaces:build
```

- After building `desktop-release-action`, remove
`workspaces/desktop-release-action/dist/dist`; the action only needs
`workspaces/desktop-release-action/dist/index.js`.

## Patches And Builds

- Do not confuse the two patch systems:
- Yarn patch protocol: `.yarn/patches/`, currently for `@ewsjs/xhr`.
- `patch-package`: `patches/`, currently for `@kayahr/jest-electron-runner`.
- Never add `@ewsjs/xhr` patches to `patches/`; that creates CI conflicts.
- Windows builds must include all architectures: `x64`, `ia32`, and `arm64`.
- Code signing uses Google Cloud KMS in two phases: build packages without
signing, then sign built packages with `jsign`.

## UI Work

- Use Fuselage components from `@rocket.chat/fuselage` for UI work unless the
design requires something Fuselage does not provide.
- Check `Theme.d.ts` for valid color tokens before using Fuselage colors.
- Verify library props, APIs, and tokens against official docs or local
`.d.ts` files instead of assuming.

## Testing

- Renderer specs use `*.spec.ts` / `*.spec.tsx`.
- Main-process specs use `*.main.spec.ts`.
- Renderer specs must live in a Jest-matched nested path, for example
`src/<module>/<subdir>/*.spec.ts(x)` or
`src/<module>/renderer.spec.ts(x)`. Flat `src/<module>/*.spec.ts` files are
not discovered by the current `testMatch`.
- Verify new specs with `yarn test --listTests --runTestsByPath <file>` when
discovery is uncertain.
- Tests run on Windows, macOS, and Linux CI. Keep platform behavior defensive.
- Prefer optional chaining and fallbacks for platform-specific APIs. Only mock
Linux-only APIs like `process.getuid()` when defensive coding is not enough.

## QA Flow Authoring

When creating or updating QA assets under `qa/`, read these first:

- `skills/desktop-qa-flows/SKILL.md` when the task is for a Desktop PR, branch,
or release-candidate QA pass. This file is plain Markdown and can be used by
any agent, including Codex, Claude, Hermes, Cursor, and GitHub agents, when
explicitly pointed to it.
- `qa/README.md`
- `qa/AGENTS.md`
- `qa/flow-template.md`

QA flows must be executable by a QA engineer or visual agent that knows nothing
about the feature. Do not guess where UI lives. Derive every user-facing step
from the implementation: changed React components, Fuselage icons, i18n labels,
menu definitions, modal buttons, platform branches, tests, and helper pages.

For branch-specific QA packs, lock the comparison range before deriving flows:
record the base branch, head branch or commit, and whether the whole range was
reviewed. Classify changed Desktop surfaces by user-visible risk, then turn each
risk into a falsifiable hypothesis the flow proves or disproves. Prefer the
smallest useful proof: existing tests, targeted tests, local UI repro, OS-level
repro, or code-path proof when runtime validation is not practical.

Write the visible path directly in the flow step `Action` cell. Include screen
region, relative position, icon shape, nearby UI, visible labels after
interaction, and the visual confirmation state. If a label only appears as a
tooltip or after clicking a menu, describe the visible anchor first.

Do not create separate navigation sections or helper navigation files for basic
UI discovery. Validate QA packs with:

```sh
node qa/scripts/validate-flows.mjs qa/<pack>
node qa/scripts/export-qase-csv.mjs qa/<pack>
```

## Code Style

- Use React functional components with hooks.
- Redux actions follow FSA shape.
- File naming: camelCase for files, PascalCase for components.
- Prefer clear names over unnecessary comments.
- Prefer editing existing files over creating new abstractions unless the new
abstraction removes real complexity or matches an existing pattern.

## Git And Verification

- Never commit or push without explicit user permission.
- Never commit directly to `master` or `dev`.
- Read-only git operations are fine.
- Show what will be committed before committing.
- Verify work with the narrowest meaningful checks first, then broader checks
when risk or shared behavior justifies it.
- If GitNexus tooling is available, use the GitNexus section in `CLAUDE.md` for
impact analysis and affected-scope checks. If it is unavailable, do not block
progress solely on that tool; compensate with local code search, tests, and
careful review.

## Writing

- Avoid subjective descriptors like "smart" or "excellent".
- Do not invent metrics, user counts, or time estimates.
- PR descriptions should use straightforward language focused on what changed
and why.
37 changes: 37 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,46 @@ This prevents MSI build failures from KMS CNG provider conflicts.

- `*.spec.ts` — Renderer process tests
- `*.main.spec.ts` — Main process tests
- Renderer specs must live in a Jest-matched nested path, e.g. `src/<module>/<subdir>/*.spec.ts(x)` or `src/<module>/renderer.spec.ts(x)`. Flat `src/<module>/*.spec.ts` files are not discovered by current `testMatch`; verify new specs with `yarn test --listTests --runTestsByPath <file>`.
- Uses `@kayahr/jest-electron-runner` for Electron environment simulation
- Tests run on Windows, macOS, AND Linux CI — always verify cross-platform

## QA Flow Authoring

When creating or updating QA flows under `qa/`, read `qa/README.md`,
`qa/AGENTS.md`, and `qa/flow-template.md` first. QA steps must be
self-contained and visually findable for a tester or visual agent that knows
nothing about the feature.

- For Desktop PR, branch, or release-candidate QA passes, use
`skills/desktop-qa-flows/SKILL.md` as the workflow entrypoint. The skill
decides whether to update existing flows, add new flows, or create a new
`qa/<feature-slug>/` pack based on changed user-visible risk. It is plain
Markdown and can be used by any agent, including Codex, Claude, Hermes, Cursor,
and GitHub agents, when explicitly pointed to it.
- Derive tester-facing steps from the implementation, not product intuition.
Inspect changed React components, Fuselage icons, i18n labels, menu
definitions, modal buttons, platform branches, tests, and helper pages.
- For branch-specific QA packs, lock the exact comparison range first: base
branch, head branch or commit, and whether the whole requested range was
reviewed. Do not claim complete QA coverage for a partial review.
- Convert risky Desktop changes into falsifiable user-visible hypotheses before
writing flows. Use Desktop risk surfaces such as Electron main process,
protocol handlers, OS default handlers, settings UI, menus, modals,
packaging/installers, startup, shortcuts, workspace routing, i18n, and layout.
- Put the visible path directly in the `Action` cell. Do not create separate
navigation sections or ask testers to open another file for basic UI
discovery.
- Describe screen region, relative position, icon shape, nearby UI, visible
text after interaction, and the confirmation state. If a tooltip or menu title
appears only after hover/click, describe the visible anchor first.
- Prefer the smallest useful proof for the hypothesis: existing tests, targeted
tests, local UI repro, OS-level repro, or code-path proof when runtime
validation is not practical.
- For Qase compatibility, keep the flow table columns aligned with
`qa/flow-template.md` and run `node qa/scripts/validate-flows.mjs qa/<pack>`
plus `node qa/scripts/export-qase-csv.mjs qa/<pack>` after changes.

### Cross-Platform Compatibility

Use optional chaining with fallbacks for platform-specific APIs:
Expand Down
22 changes: 22 additions & 0 deletions build/RocketChatDefaultAppAssociations.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Default app associations for Rocket.Chat Desktop on Windows 10/11.

Apply via one of:
- Group Policy: Computer Configuration -> Administrative Templates ->
Windows Components -> File Explorer -> "Set a default associations
configuration file", pointing at this file.
- Intune: ApplicationDefaults CSP with the Base64-encoded contents of
this file.
- DISM (image deployment): dism /Online /Import-DefaultAppAssociations:
<path-to-this-file>
- MSI public property: install with SET_DEFAULT_ASSOCIATIONS=1 to have
the installer wire the policy registry value at this path.

ProgIds below MUST stay in sync with build/installer.nsh
(registerTelephonyCapabilities) and the MSI Capabilities registration.
-->
<DefaultAssociations>
<Association Identifier="tel" ProgId="RocketChat.tel" ApplicationName="Rocket.Chat" />
<Association Identifier="callto" ProgId="RocketChat.callto" ApplicationName="Rocket.Chat" />
</DefaultAssociations>
55 changes: 55 additions & 0 deletions build/installer.nsh
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,67 @@
${EndIf}
!insertMacro disableAutoUpdates
Delete "$SMSTARTUP\Rocket.Chat+.lnk"
!insertMacro registerTelephonyCapabilities
!macroend

!macro customUnInstall
${IfNot} ${Silent}
Delete "$SMSTARTUP\Rocket.Chat.lnk"
${EndIf}
!insertMacro unregisterTelephonyCapabilities
!macroend

; Register Rocket.Chat in RegisteredApplications + Capabilities\URLAssociations so
; the Windows 11 Default Apps picker exposes it as a candidate for tel/callto/sip
; and the `ms-settings:defaultapps?registeredApp{User|Machine}=Rocket.Chat` deep
; link lands on the app-specific page.
!macro registerTelephonyCapabilities
${If} $installMode == "all"
!insertMacro writeTelephonyCapabilities HKLM
${Else}
!insertMacro writeTelephonyCapabilities HKCU
${EndIf}
!macroend

!macro writeTelephonyCapabilities ROOT
; Per-scheme ProgIDs that the picker references through URLAssociations.
WriteRegStr ${ROOT} "Software\Classes\RocketChat.tel" "" "URL:Rocket.Chat Telephony"
WriteRegStr ${ROOT} "Software\Classes\RocketChat.tel" "URL Protocol" ""
WriteRegStr ${ROOT} "Software\Classes\RocketChat.tel\DefaultIcon" "" "$INSTDIR\Rocket.Chat.exe,0"
WriteRegStr ${ROOT} "Software\Classes\RocketChat.tel\shell\open\command" "" '"$INSTDIR\Rocket.Chat.exe" "%1"'

WriteRegStr ${ROOT} "Software\Classes\RocketChat.callto" "" "URL:Rocket.Chat Telephony"
WriteRegStr ${ROOT} "Software\Classes\RocketChat.callto" "URL Protocol" ""
WriteRegStr ${ROOT} "Software\Classes\RocketChat.callto\DefaultIcon" "" "$INSTDIR\Rocket.Chat.exe,0"
WriteRegStr ${ROOT} "Software\Classes\RocketChat.callto\shell\open\command" "" '"$INSTDIR\Rocket.Chat.exe" "%1"'

; Capabilities surface consumed by Windows 11 Default Apps.
WriteRegStr ${ROOT} "Software\Rocket.Chat\Capabilities" "ApplicationName" "Rocket.Chat"
WriteRegStr ${ROOT} "Software\Rocket.Chat\Capabilities" "ApplicationDescription" "Rocket.Chat Desktop"
WriteRegStr ${ROOT} "Software\Rocket.Chat\Capabilities" "ApplicationIcon" "$INSTDIR\Rocket.Chat.exe,0"
WriteRegStr ${ROOT} "Software\Rocket.Chat\Capabilities\URLAssociations" "tel" "RocketChat.tel"
WriteRegStr ${ROOT} "Software\Rocket.Chat\Capabilities\URLAssociations" "callto" "RocketChat.callto"

; Entry point picked up by Default Apps and the ms-settings deep link.
WriteRegStr ${ROOT} "Software\RegisteredApplications" "Rocket.Chat" "Software\Rocket.Chat\Capabilities"
!macroend

!macro unregisterTelephonyCapabilities
${If} $installMode == "all"
!insertMacro deleteTelephonyCapabilities HKLM
${Else}
!insertMacro deleteTelephonyCapabilities HKCU
${EndIf}
!macroend

!macro deleteTelephonyCapabilities ROOT
DeleteRegValue ${ROOT} "Software\RegisteredApplications" "Rocket.Chat"
DeleteRegKey ${ROOT} "Software\Rocket.Chat\Capabilities"
DeleteRegKey /ifempty ${ROOT} "Software\Rocket.Chat"
DeleteRegKey ${ROOT} "Software\Classes\RocketChat.tel"
DeleteRegKey ${ROOT} "Software\Classes\RocketChat.callto"
; Prior versions may have created RocketChat.sip; clean it up just in case.
DeleteRegKey ${ROOT} "Software\Classes\RocketChat.sip"
!macroend

!macro disableAutoUpdates
Expand Down
Loading
Loading