Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 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
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
7 changes: 4 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,14 @@ 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

# dylib artifacts
*.dylib

# legacy agent docs (consolidated into CLAUDE.md)
AGENTS.md
src/outlookCalendar/AGENTS.md
.gitnexus
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.
81 changes: 81 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 Expand Up @@ -103,3 +140,47 @@ git worktree add ../Rocket.Chat.Electron-worktrees/feature-name -b new-branch ma
- Use measurable descriptions: "reduced memory usage", "improved by X%"
- **Never invent metrics** — no estimated time spent, no speculated user counts. Only include numbers from actual logs, error messages, or documented sources.
- PR descriptions: straightforward language, focus on what changed and why

<!-- gitnexus:start -->
# GitNexus — Code Intelligence

This project is indexed by GitNexus as **Rocket.Chat.Electron** (4593 symbols, 7029 relationships, 103 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.

> If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first.

## Always Do

- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `gitnexus_impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
- **MUST run `gitnexus_detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows.
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
- When exploring unfamiliar code, use `gitnexus_query({query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `gitnexus_context({name: "symbolName"})`.

## Never Do

- NEVER edit a function, class, or method without first running `gitnexus_impact` on it.
- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
- NEVER rename symbols with find-and-replace — use `gitnexus_rename` which understands the call graph.
- NEVER commit changes without running `gitnexus_detect_changes()` to check affected scope.

## Resources

| Resource | Use for |
|----------|---------|
| `gitnexus://repo/Rocket.Chat.Electron/context` | Codebase overview, check index freshness |
| `gitnexus://repo/Rocket.Chat.Electron/clusters` | All functional areas |
| `gitnexus://repo/Rocket.Chat.Electron/processes` | All execution flows |
| `gitnexus://repo/Rocket.Chat.Electron/process/{name}` | Step-by-step execution trace |

## CLI

| Task | Read this skill file |
|------|---------------------|
| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` |
| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` |
| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` |
| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` |
| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` |
| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` |

<!-- gitnexus:end -->
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