# Angular Release Notes
> Release notes for @revrag-ai/embed-angular — what changed in each release, with upgrade steps.
URL: /embed/integration/angular/angular-releases
Markdown: /embed/integration/angular/angular-releases.md
# Angular SDK — Release Notes [#angular-sdk--release-notes]
`@revrag-ai/embed-angular` · release history, newest first. Install the latest with `npm install @revrag-ai/embed-angular@latest`; confirm the current version on [npm](https://www.npmjs.com/package/@revrag-ai/embed-angular).
***
## 2.0.0 [#200]
*Released: 26 October 2026*
The first Angular release since `1.0.7`. It brings the Angular package onto the current SDK engine: **the agent can now see and act on your pages**, and the widget reads your dashboard's widget configuration **the same way the React, React Native and Android SDKs do**. It also cuts the initial bundle, fixes a change-detection cost, and fixes the type files.
**Every app must make one code change:** pass your app's version to `initialize()`. Apps that call `embedEvent.reset()` or `embedEvent.getSessionId()` must also remove those calls. Every symbol you imported and every tag you placed in a template in `1.0.7` still exists: the ones that were never meant to be public are deprecated, not removed. Code that reached into the internals of those deprecated classes (for example `ExpandedViewComponent.elapsedTime`) may need changes.
```bash
npm install @revrag-ai/embed-angular@2.0.0
```
**Without `appVersion`, the widget never appears.** Add it to `initialize()` before you deploy `2.0.0` — see [Upgrade steps](#upgrade-steps-107--200). TypeScript will not warn you: the option is still typed as optional.
**The widget's defaults changed too.** If your widget configuration leaves out the nudge, the agent's name or the auto-collapse time, your users will see a different widget — most visibly, **the inactivity nudge stops** unless `inactivityBehavior` is `show_popup`, `nudgeDelay` is above 0 and `tooltipMessage` is set.
### Breaking changes [#breaking-changes]
| Change | What to do |
| ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`appVersion` is required in `initialize()`** | `initialize(apiKey, { appVersion: '1.2.3' })`. Without it, `initialize()` rejects, `error$` emits the message and the widget never appears. The backend picks the widget and agent configuration per app version |
| **`embedEvent.reset()` and `embedEvent.getSessionId()` removed** | Delete these calls. They no longer compile, and calling them from plain JavaScript throws. `event`, `customEvent`, `addCallback`, `removeCallback` and `getStoredAppUserId` remain |
| **Angular 16 or newer** | The package uses Angular signals, which arrived in Angular 16, and its peer range is now `>=16.0.0`. If you are on Angular 15, stay on `1.0.7` |
| **`rxjs` `^7.4.0`** is a declared peer dependency | Every Angular 16+ app already has a matching `rxjs` |
### Behaviour changes to check [#behaviour-changes-to-check]
**Fields your widget configuration leaves out now use the Android SDK's defaults:**
| Field left out | 1.0.7 | 2.0.0 | To keep 1.0.7 behaviour |
| -------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Agent name / type | "Riya" / "Loan approval agent" | "Revrag AI" / "Onboarding Agent" | Set `agentTextContent.agentName` / `agentType` |
| Nudge | after 1.5 s, with the message "Any questions? Click to connect" | **none** | Set `collapsedView.inactivityBehavior` to `show_popup`, `nudgeDelay` (seconds, above 0) and `tooltipMessage` |
| After a call connects | the card stays open | folds back to the button after 15 s (the call keeps running; not while captions are on) | Set `collapsedView.collapsedTime` (seconds) to a long time; it cannot be turned off |
| Agent output panel | stays open | closes 15 s after its text finishes | Set `collapsedView.viewCloseDelay` (ms) to a long time; it cannot be turned off |
| Tooltip colour | purple | 80% black | Set `colorPalette.tooltipBackgroundColor` |
| Corners of the open widget | round pill | 20px | Set `colorPalette.borderRadius` |
**Fields your widget configuration sets now take effect:**
| Field | 1.0.7 | 2.0.0 |
| -------------------------------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `fillType` | any value except `solid` drew a left-to-right gradient | the gradient's direction: `horizontal`, `vertical`, otherwise **diagonal** (including `gradient`). `solid`, `flat` and `color` draw `backgroundColor` |
| `textColor` | no effect; name and status always white | agent name, status line and the captions (CC) badge |
| `borderRadius` | no effect | the open widget **and the collapsed button**, which becomes a rounded square filled with your gradient; the avatar stays round |
| `tooltipBackgroundColor`, `tooltipTextColor` | tooltip only | tooltip and the live caption bubble |
| only `grad1` set | no gradient | a gradient from `grad1` into a 35% darker shade |
If a colour on your dashboard was wrong but had no visible effect in `1.0.7`, it will show now.
**Other changes:**
| Change | What to check |
| --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **The agent can act on your pages during a call** | Add `data-revrag-mask` to fields it must never read, and list screens it must never see in the provider's `excludeScreens`. While a modal dialog is open, the agent sees and acts on that dialog alone |
| **The button appears only after `initialize()` succeeds** | In `1.0.7` the button showed straight away. Now nothing shows until `initialize()` has finished, and nothing shows at all if it fails (wrong key, missing `appVersion`, network error) |
| **The floating widget moves to `
`** | With `widgetPositioning="fixed"` (the default), the widget's element is moved to the end of ``, so a parent element can no longer trap it underneath your content. If you styled it through a parent selector, check it still looks right. `embedded` mode stays where you put it |
| **The button can be dragged** | Users can drag it to another edge. `` has no input to turn this off, so in `fixed` mode its button is always draggable. The bare `` has a `draggable` input, but it is only for setups that drive Action Intelligence with `ActionIntelligenceService` and no provider ([when to use it](/embed/integration/angular#when-to-use-embedbuttoncomponent)) |
| **Status line instead of the call timer** | During a call the card shows what the agent is doing ("Speaking", "Listening" and similar) instead of an elapsed-time clock |
| **`EventKeys.SCREEN_VIEW` has a new value** | It is now `'screen_state'` (was `'screen_view'`). If you compare event types against the raw string, compare against `EventKeys.SCREEN_VIEW` instead |
| **Click analytics report real clicks only** | Clicks on controls (buttons, links, checkboxes, selects and similar) and on elements with a click handler are reported as they happen, named after the element's `data-revrag-name` when it has one. A `
` or `` that only has a CSS class is no longer reported. Your Revrag dashboard configuration can switch click tracking off |
### Deprecated [#deprecated]
Still exported and still working; they will be removed in a later major version. They were never intended as public API.
| Deprecated | Use instead |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `EmbedWidgetComponent`, `AnimatedButtonComponent`, `ExpandedViewComponent`, `CallTextPanelComponent`, `TooltipComponent`, `WaveformVisualizerComponent`, `TypewriterComponent` (and their `revrag-…` tags) | `` (`EmbedProviderComponent`), which renders the whole widget. `EmbedModule` still exports them |
| `EmbedLiveKitService` | `EmbedCallService` — `startCall()`, `endCall()`, `isCallActive()` |
| `InteractionWatcherService`, `PlatformService`, `WidgetConfigService` | Nothing — the widget wires them up itself |
| `resolveColorPalette`, `resolveAnimationData`, `resolveWidgetPosition`, `deriveWidgetConfig` | Nothing — the widget configuration is applied from the dashboard automatically |
| Type `EventPayload` | `CustomEventPayload` — the type your `embedEvent.addCallback` listeners receive |
| Types `WidgetConfig`, `WidgetSide`, `ResolvedWidgetPosition` | Nothing — look and position come from the dashboard |
### New [#new]
* **Action Intelligence** — during a call the agent reads the current screen and acts on it (tap, type, select, scroll, read).
* Starts once `initialize()` succeeds. Your Revrag dashboard configuration can switch it off.
* Fields marked with `data-revrag-mask` (exported as `MASK_ATTR`), or inside an element marked with it, never have their content sent.
* `` highlights each element the agent acts on.
* New provider inputs: `excludeScreens`, `showOnAllScreens`, `actionRoot` and `getScreenName`. Moving onto a screen in `excludeScreens` hides the widget and ends an active call. See the [advanced provider guide](/embed/integration/angular/embed-angular-provider-advanced).
* If you narrow `actionRoot`, dialogs attached to `document.body` (such as Angular CDK dialogs) stay visible to the agent.
* `ActionIntelligenceService` sets the same scope from code (type `ActionScopeInputs`).
* **`EmbedCallService`** — `startCall()`, `endCall()`, `isCallActive()`.
* **`EmbedLogout()`** — call it when your user signs out. It ends any call (including one still connecting), stops the agent, wipes that user's cached screens and forgets their `app_user_id` (with any click events still queued for it). Your API key, widget configuration and session initialization data stay, so the next user needs no new `initialize()`.
* **Widget controls** — `expandWidget`, `collapseWidget`, `isWidgetExpanded`, `subscribeWidgetExpanded`.
* **Agent events** — `AgentEvent`, `embedOnAgent`, `embedOffAgent` (types `AgentEventPayload`, `AgentEventHandler`).
* **`@revrag-ai/embed-angular/diagnostics`** — `verifyIntegration()` checks a setup in ten steps; `integrationSnapshot()` returns the current state.
* **Widget**
* A draggable button that works with touch and snaps to the nearest edge.
* Live captions (CC) during a call.
* A ring pulses around the collapsed button during a call, in `colorPalette.pulseColor` or, when that is not set, your widget's main colour.
* The fold-back after a call connects follows the dashboard's `collapsedView.collapsedTime`. `` has no input for it (the bare button's `autoCollapseMs` input is only for provider-less setups).
* The button size follows `agentAvatar.avatarSize` from your dashboard (56px when not set).
* **More widget configuration fields**, all set on the dashboard:
* `colorPalette.gradientColors` — a gradient with any number of colours.
* `colorPalette.gradientPreset` — a named gradient (`ocean`, `sunset`, `aurora`, `midnight`, …).
* `position.leftPadding` and `position.topPadding`, and the `bottom-center` and `top-center` positions.
* `collapsedView.viewCloseDelay` — how long the agent's output panel stays after its text finishes.
* **Bad colours are ignored.** A colour the browser cannot draw falls back to its default. Negative paddings count as 0.
* **`revrag-integrate.md`** ships in the package (`node_modules/@revrag-ai/embed-angular/revrag-integrate.md`) — instructions an AI coding agent can follow end to end.
### Fixed [#fixed]
* **Bundle size**
* The default avatar animation (about 400 KB) loads on demand instead of shipping in your initial bundle.
* **Performance**
* The avatar animation runs outside Angular's zone. It used to trigger change detection across the whole app on every animation frame.
* **Host app safety**
* The SDK loads when browser storage is blocked ("Block all cookies", sandboxed iframes).
* Ending a call no longer removes your page's own `