Skip to content

Conversation

@lucas-a-pelegrino
Copy link
Contributor

@lucas-a-pelegrino lucas-a-pelegrino commented Oct 8, 2025

Proposed changes (including videos or screenshots)

This PR adds a deprecation warning for livechat:removeMonitor legacy meteor method, as well as a new endpoint to replace it; livechat/monitors.remove

Issue(s)

CORE-1415

Steps to test or reproduce

Further comments

Summary by CodeRabbit

  • New Features

    • Added a REST-based monitor deletion endpoint (POST /livechat/monitors.delete); UI deletion now calls this endpoint and refreshes the monitors list after confirmation.
  • Chores

    • Replaced legacy method-based removal with the new REST flow across the app and test helpers; adjusted deletion payload to use username.
  • Tests

    • Updated end-to-end tests and utilities to use and validate the new deletion endpoint and its responses.

✏️ Tip: You can customize this high-level summary in your review settings.

@lucas-a-pelegrino lucas-a-pelegrino added this to the 7.12.0 milestone Oct 8, 2025
@dionisio-bot
Copy link
Contributor

dionisio-bot bot commented Oct 8, 2025

Looks like this PR is not ready to merge, because of the following issues:

  • This PR is targeting the wrong base branch. It should target 7.14.0, but it targets 7.13.0

Please fix the issues and try again

If you have any trouble, please check the PR guidelines

@changeset-bot
Copy link

changeset-bot bot commented Oct 8, 2025

⚠️ No Changeset found

Latest commit: ae4b8dc

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 8, 2025

Walkthrough

Adds a new REST endpoint POST /v1/livechat/monitors.delete with request/response schemas, updates client and tests to use it, implements server handler calling LivechatEnterprise.removeMonitor, logs deprecation for the old Meteor method, and updates REST typings and test utilities.

Changes

Cohort / File(s) Summary
Client update
apps/meteor/client/views/omnichannel/monitors/MonitorsTable.tsx
Replaced useMethod with useEndpoint('POST', '/v1/livechat/monitors.delete'), call changed to deleteMonitor({ username }); closes modal and invalidates queries after deletion; add flow unchanged.
Server API (EE)
apps/meteor/ee/app/livechat-enterprise/server/api/monitors.ts
Added POST /v1/livechat/monitors.delete route with body validator and success schema; handler calls LivechatEnterprise.removeMonitor(username) with Meteor.Error-aware error mapping; reorganized create route into chained API.v1.post structure.
Server method deprecation
apps/meteor/ee/app/livechat-enterprise/server/methods/removeMonitor.ts
Added methodDeprecationLogger.method('livechat:removeMonitor','8.0.0','/v1/livechat/monitors.delete') at method start; no signature changes.
REST typings
packages/rest-typings/src/v1/omnichannel.ts
Added POSTLivechatMonitorsDeleteRequest type/schema and validator isPOSTLivechatMonitorsDeleteRequest, plus POSTLivechatMonitorsDeleteSuccessSchema and POSTLivechatMonitorsDeleteSuccessResponse validator.
Test helpers
apps/meteor/tests/e2e/utils/omnichannel/monitors.ts
Replaced RPC method removal with HTTP call to /livechat/monitors.delete; renamed parameter from id to username; added status check after create; updated delete helper.
E2E tests
apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts
Updated tests to POST to /v1/livechat/monitors.delete; expect 200 { success: true } on success and 400 with error 'Invalid user' when removing non-existent monitor.

Sequence Diagram(s)

mermaid
sequenceDiagram
autonumber
actor Client
participant REST as "API: /v1/livechat/monitors.delete"
participant Service as "LivechatEnterprise"
participant DB as "Database"
Client->>REST: POST { username }
REST->>Service: removeMonitor(username)
alt success
Service->>DB: remove monitor record
DB-->>Service: OK
Service-->>REST: success
REST-->>Client: 200 { success: true }
else failure
Service-->>REST: return falsy / throw
REST-->>Client: 400 { success: false, error }
end

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Pay extra attention to:
    • Error mapping and messages in apps/meteor/ee/.../api/monitors.ts (Meteor.Error vs generic)
    • Schema/validator correctness in packages/rest-typings/src/v1/omnichannel.ts
    • Test expectation changes in apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts
    • Query invalidation and UI state flow in MonitorsTable.tsx

Suggested reviewers

  • tassoevan
  • aleksandernsilva
  • KevLehman

Poem

🐰
I hopped from method to REST today,
Sent a username and watched it sway.
Schemas snug, the old bell tolled,
Monitors gone, a story told.
Hooray — I hopped and kept the way!

Pre-merge checks and finishing touches

✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: adding a deprecation warning to the livechat:removeMonitor method with a new endpoint to replace it, which aligns with the code changes.
Linked Issues check ✅ Passed The PR implements deprecation logging for livechat:removeMonitor and introduces a new POST endpoint /v1/livechat/monitors.delete to replace it, directly addressing the objective.
Out of Scope Changes check ✅ Passed All changes are directly related to the deprecation objective: endpoint implementation, type definitions, test updates, and deprecation logging are all in scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/v7/CTZ-77

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link

codecov bot commented Oct 8, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 68.81%. Comparing base (355d26d) to head (ae4b8dc).
⚠️ Report is 1 commits behind head on develop.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop   #37168      +/-   ##
===========================================
+ Coverage    68.79%   68.81%   +0.01%     
===========================================
  Files         3361     3361              
  Lines       114201   114204       +3     
  Branches     20619    20619              
===========================================
+ Hits         78563    78586      +23     
+ Misses       33543    33522      -21     
- Partials      2095     2096       +1     
Flag Coverage Δ
e2e 57.23% <100.00%> (-0.02%) ⬇️
e2e-api 43.22% <ø> (+0.97%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@lucas-a-pelegrino
Copy link
Contributor Author

Needs #37061 merged before this one can go to review.

@dougfabris dougfabris modified the milestones: 7.12.0, 7.13.0 Oct 18, 2025
@scuciatto scuciatto modified the milestones: 7.13.0, 7.14.0 Nov 20, 2025
…e/v7/CTZ-77

# Conflicts:
#	.changeset/many-walls-impress.md
#	apps/meteor/client/views/omnichannel/monitors/MonitorsTable.tsx
#	apps/meteor/ee/app/livechat-enterprise/server/api/monitors.ts
#	apps/meteor/tests/data/livechat/units.ts
#	apps/meteor/tests/e2e/utils/omnichannel/monitors.ts
#	apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts
#	packages/rest-typings/src/v1/omnichannel.ts
@lucas-a-pelegrino lucas-a-pelegrino added stat: ready to merge PR tested and approved waiting for merge stat: QA assured Means it has been tested and approved by a company insider labels Nov 27, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Nov 27, 2025

📦 Docker Image Size Report

📈 Changes

Service Current Baseline Change Percent
sum of all images 1.2GiB 1.2GiB +12MiB
rocketchat 359MiB 347MiB +12MiB
omnichannel-transcript-service 132MiB 132MiB +472B
queue-worker-service 132MiB 132MiB +99B
ddp-streamer-service 126MiB 126MiB -904B
account-service 113MiB 113MiB +1.5KiB
stream-hub-service 111MiB 111MiB +392B
authorization-service 111MiB 111MiB -252B
presence-service 111MiB 111MiB +95B

📊 Historical Trend

---
config:
  theme: "dark"
  xyChart:
    width: 900
    height: 400
---
xychart
  title "Image Size Evolution by Service (Last 30 Days + This PR)"
  x-axis ["11/15 22:28", "11/16 01:28", "11/17 23:50", "11/18 22:53", "11/19 23:02", "11/21 16:49", "11/24 17:34", "11/27 22:32", "11/28 19:05", "12/01 23:01", "12/02 21:57", "12/03 15:38 (PR)"]
  y-axis "Size (GB)" 0 --> 0.5
  line "account-service" [0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11]
  line "authorization-service" [0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11]
  line "ddp-streamer-service" [0.12, 0.12, 0.12, 0.12, 0.12, 0.12, 0.12, 0.12, 0.12, 0.12, 0.12, 0.12]
  line "omnichannel-transcript-service" [0.14, 0.14, 0.14, 0.14, 0.14, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13]
  line "presence-service" [0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11]
  line "queue-worker-service" [0.14, 0.14, 0.14, 0.14, 0.14, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13]
  line "rocketchat" [0.36, 0.36, 0.35, 0.35, 0.35, 0.34, 0.34, 0.34, 0.34, 0.34, 0.34, 0.35]
  line "stream-hub-service" [0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11]
Loading

Statistics (last 11 days):

  • 📊 Average: 1.5GiB
  • ⬇️ Minimum: 1.2GiB
  • ⬆️ Maximum: 1.6GiB
  • 🎯 Current PR: 1.2GiB
ℹ️ About this report

This report compares Docker image sizes from this build against the develop baseline.

  • Tag: pr-37168
  • Baseline: develop
  • Timestamp: 2025-12-03 15:38:19 UTC
  • Historical data points: 11

Updated: Wed, 03 Dec 2025 15:38:19 GMT

@lucas-a-pelegrino lucas-a-pelegrino marked this pull request as ready for review December 1, 2025 16:21
@lucas-a-pelegrino lucas-a-pelegrino requested review from a team as code owners December 1, 2025 16:21
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/meteor/ee/app/livechat-enterprise/server/api/monitors.ts (1)

1-16: Missing Meteor import causes runtime error.

The catch block at line 113 references Meteor.Error but Meteor is not imported in this file.

 import type { ILivechatMonitor } from '@rocket.chat/core-typings';
 import {
 	isPOSTLivechatMonitorCreateRequest,
 	isPOSTLivechatMonitorsDeleteRequest,
 	POSTLivechatMonitorsCreateSuccessResponse,
 	POSTLivechatMonitorsDeleteSuccessResponse,
 	validateBadRequestErrorResponse,
 	validateForbiddenErrorResponse,
 	validateUnauthorizedErrorResponse,
 } from '@rocket.chat/rest-typings';
+import { Meteor } from 'meteor/meteor';
 
 import { findMonitors, findMonitorByUsername } from './lib/monitors';
🧹 Nitpick comments (1)
apps/meteor/ee/app/livechat-enterprise/server/api/monitors.ts (1)

102-119: Consider using MeteorError from @rocket.chat/core-typings for consistency.

If you prefer not to import Meteor directly, the codebase uses MeteorError from @rocket.chat/core-typings in some places (as seen in the addMonitor implementation in LivechatEnterprise.ts). This could be an alternative approach.

+import { MeteorError } from '@rocket.chat/core-typings';
 // ... in the catch block:
-			if (error instanceof Meteor.Error) {
+			if (error instanceof MeteorError) {
 				return API.v1.failure(error.reason);
 			}
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between a20c1cc and 4100cf4.

📒 Files selected for processing (6)
  • apps/meteor/client/views/omnichannel/monitors/MonitorsTable.tsx (3 hunks)
  • apps/meteor/ee/app/livechat-enterprise/server/api/monitors.ts (2 hunks)
  • apps/meteor/ee/app/livechat-enterprise/server/methods/removeMonitor.ts (2 hunks)
  • apps/meteor/tests/e2e/utils/omnichannel/monitors.ts (2 hunks)
  • apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts (2 hunks)
  • packages/rest-typings/src/v1/omnichannel.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursor/rules/playwright.mdc)

**/*.{ts,tsx,js}: Write concise, technical TypeScript/JavaScript with accurate typing in Playwright tests
Avoid code comments in the implementation

Files:

  • packages/rest-typings/src/v1/omnichannel.ts
  • apps/meteor/ee/app/livechat-enterprise/server/methods/removeMonitor.ts
  • apps/meteor/client/views/omnichannel/monitors/MonitorsTable.tsx
  • apps/meteor/ee/app/livechat-enterprise/server/api/monitors.ts
  • apps/meteor/tests/e2e/utils/omnichannel/monitors.ts
  • apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts
apps/meteor/tests/e2e/**/*.{ts,spec.ts}

📄 CodeRabbit inference engine (.cursor/rules/playwright.mdc)

apps/meteor/tests/e2e/**/*.{ts,spec.ts}: Store commonly used locators in variables/constants for reuse
Follow Page Object Model pattern consistently in Playwright tests

Files:

  • apps/meteor/tests/e2e/utils/omnichannel/monitors.ts
🧠 Learnings (6)
📚 Learning: 2025-11-04T16:49:19.107Z
Learnt from: ricardogarim
Repo: RocketChat/Rocket.Chat PR: 37377
File: apps/meteor/ee/server/hooks/federation/index.ts:86-88
Timestamp: 2025-11-04T16:49:19.107Z
Learning: In Rocket.Chat's federation system (apps/meteor/ee/server/hooks/federation/), permission checks follow two distinct patterns: (1) User-initiated federation actions (creating rooms, adding users to federated rooms, joining from invites) should throw MeteorError to inform users they lack 'access-federation' permission. (2) Remote server-initiated federation events should silently skip/ignore when users lack permission. The beforeAddUserToRoom hook only executes for local user-initiated actions, so throwing an error there is correct. Remote federation events are handled separately by the federation Matrix package with silent skipping logic.

Applied to files:

  • apps/meteor/ee/app/livechat-enterprise/server/methods/removeMonitor.ts
📚 Learning: 2025-09-19T15:15:04.642Z
Learnt from: rodrigok
Repo: RocketChat/Rocket.Chat PR: 36991
File: apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts:219-221
Timestamp: 2025-09-19T15:15:04.642Z
Learning: The Federation_Matrix_homeserver_domain setting in apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts is part of the old federation system and is being deprecated/removed, so configuration issues with this setting should not be flagged for improvement.

Applied to files:

  • apps/meteor/ee/app/livechat-enterprise/server/methods/removeMonitor.ts
📚 Learning: 2025-11-24T17:08:17.065Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-11-24T17:08:17.065Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Ensure tests run reliably in parallel without shared state conflicts

Applied to files:

  • apps/meteor/tests/e2e/utils/omnichannel/monitors.ts
  • apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts
📚 Learning: 2025-11-24T17:08:17.065Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-11-24T17:08:17.065Z
Learning: Applies to apps/meteor/tests/e2e/page-objects/**/*.ts : Utilize existing page objects pattern from `apps/meteor/tests/e2e/page-objects/`

Applied to files:

  • apps/meteor/tests/e2e/utils/omnichannel/monitors.ts
📚 Learning: 2025-11-24T17:08:17.065Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-11-24T17:08:17.065Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Utilize Playwright fixtures (`test`, `page`, `expect`) for consistency in test files

Applied to files:

  • apps/meteor/tests/e2e/utils/omnichannel/monitors.ts
  • apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts
📚 Learning: 2025-11-24T17:08:17.065Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-11-24T17:08:17.065Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Use `expect` matchers for assertions (`toEqual`, `toContain`, `toBeTruthy`, `toHaveLength`, etc.) instead of `assert` statements in Playwright tests

Applied to files:

  • apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts
🧬 Code graph analysis (4)
packages/rest-typings/src/v1/omnichannel.ts (1)
packages/rest-typings/src/v1/Ajv.ts (1)
  • ajv (24-24)
apps/meteor/ee/app/livechat-enterprise/server/api/monitors.ts (2)
packages/rest-typings/src/v1/omnichannel.ts (4)
  • POSTLivechatMonitorsCreateSuccessResponse (546-548)
  • isPOSTLivechatMonitorCreateRequest (531-531)
  • POSTLivechatMonitorsDeleteSuccessResponse (575-575)
  • isPOSTLivechatMonitorsDeleteRequest (565-565)
apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.ts (1)
  • LivechatEnterprise (14-186)
apps/meteor/tests/e2e/utils/omnichannel/monitors.ts (1)
apps/meteor/ee/app/livechat-enterprise/server/methods/addMonitor.ts (1)
  • username (18-27)
apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts (1)
apps/meteor/tests/data/api-data.ts (2)
  • request (10-10)
  • credentials (39-42)
🔇 Additional comments (8)
packages/rest-typings/src/v1/omnichannel.ts (1)

550-575: LGTM!

The new delete request/response type definitions and schemas follow the established patterns in the codebase, with proper validation for the required username field and consistent success response structure.

apps/meteor/tests/e2e/utils/omnichannel/monitors.ts (2)

3-3: LGTM!

The deleteMonitor helper is concise and correctly uses the new REST endpoint.


17-17: data.username is guaranteed to be present in the response.

The monitors.create endpoint queries for the user with username in the projection (line 17 of LivechatEnterprise.ts) and the response schema POSTLivechatMonitorsCreateSuccess explicitly includes username as a required string field. The endpoint will throw an error if the user is not found, so data.username will always be available for the delete operation.

apps/meteor/client/views/omnichannel/monitors/MonitorsTable.tsx (2)

50-51: LGTM!

The endpoint hooks are correctly updated to use the new REST endpoints for monitor management.


98-108: LGTM!

The delete handler correctly calls the new endpoint with { username }, provides appropriate user feedback via toast messages, and invalidates the query cache to refresh the monitors list.

apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts (2)

113-117: LGTM!

The test correctly validates successful monitor removal via the new endpoint.


119-128: The test expectation is correct and consistent with the server implementation. The removeMonitor endpoint explicitly catches the Meteor.Error thrown by LivechatEnterprise.removeMonitor and passes only error.reason (which is 'Invalid user') to API.v1.failure(). This differs from the addMonitor endpoint, which lacks explicit error handling and allows errors to be caught by a global handler that formats them with the error code suffix. The test at lines 119-128 correctly expects 'Invalid user' as the error message.

apps/meteor/ee/app/livechat-enterprise/server/api/monitors.ts (1)

65-86: LGTM!

The create endpoint refactoring maintains the same behavior while adopting the cleaner chained API pattern with explicit configuration.

lucas-a-pelegrino and others added 2 commits December 1, 2025 13:29
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@lucas-a-pelegrino lucas-a-pelegrino marked this pull request as draft December 1, 2025 20:02
@lucas-a-pelegrino lucas-a-pelegrino marked this pull request as ready for review December 1, 2025 21:38
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 96a5f75 and 90bb4ce.

📒 Files selected for processing (1)
  • packages/rest-typings/src/v1/omnichannel.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursor/rules/playwright.mdc)

**/*.{ts,tsx,js}: Write concise, technical TypeScript/JavaScript with accurate typing in Playwright tests
Avoid code comments in the implementation

Files:

  • packages/rest-typings/src/v1/omnichannel.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: 📦 Build Packages
  • GitHub Check: CodeQL-Build
  • GitHub Check: CodeQL-Build
🔇 Additional comments (1)
packages/rest-typings/src/v1/omnichannel.ts (1)

550-577: LGTM! Type definitions and schemas follow established patterns.

The implementation correctly follows the codebase conventions:

  • Request schema properly validates username as a required string field
  • additionalProperties: false provides strict validation
  • Success response uses ajv.compile<void> which is consistent with other simple success responses in this file (e.g., tags remove at line 606, contact delete at line 1513)
  • Naming convention matches existing patterns

Copy link
Member

@dougfabris dougfabris left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Frontend looks good!

@kodiakhq kodiakhq bot merged commit 315c377 into develop Dec 3, 2025
48 checks passed
@kodiakhq kodiakhq bot deleted the chore/v7/CTZ-77 branch December 3, 2025 16:03
@dougfabris dougfabris modified the milestones: 7.14.0, 8.0.0 Jan 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stat: QA assured Means it has been tested and approved by a company insider stat: ready to merge PR tested and approved waiting for merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants